diff --git a/.cirrus.yml b/.cirrus.yml index d26a8bd9..568c34d7 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -2,17 +2,17 @@ freebsd_task: name: FreeBSD matrix: - - name: FreeBSD 14.0 + - name: FreeBSD 14.3 freebsd_instance: - image_family: freebsd-14-0 + image_family: freebsd-14-3 pkginstall_script: - pkg update -f - - pkg install -y go122 + - pkg install -y go125 - pkg install -y git setup_script: - - ln -s /usr/local/bin/go122 /usr/local/bin/go + - ln -s /usr/local/bin/go125 /usr/local/bin/go - pw groupadd sftpgo - pw useradd sftpgo -g sftpgo -w none -m - mkdir /home/sftpgo/sftpgo @@ -20,7 +20,7 @@ freebsd_task: - chown -R sftpgo:sftpgo /home/sftpgo/sftpgo compile_script: - - su sftpgo -c 'cd ~/sftpgo && go build -trimpath -tags nopgxregisterdefaulttypes -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo' + - su sftpgo -c 'cd ~/sftpgo && go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo' - su sftpgo -c 'cd ~/sftpgo/tests/eventsearcher && go build -trimpath -ldflags "-s -w" -o eventsearcher' - su sftpgo -c 'cd ~/sftpgo/tests/ipfilter && go build -trimpath -ldflags "-s -w" -o ipfilter' @@ -28,4 +28,4 @@ freebsd_task: - su sftpgo -c 'cd ~/sftpgo && ./sftpgo initprovider && ./sftpgo resetprovider --force' test_script: - - su sftpgo -c 'cd ~/sftpgo && go test -v -tags nopgxregisterdefaulttypes -p 1 -timeout 20m ./... -coverprofile=coverage.txt -covermode=atomic' + - su sftpgo -c 'cd ~/sftpgo && go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 20m ./... -coverprofile=coverage.txt -covermode=atomic' diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 74b99f7a..934cc584 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -7,8 +7,10 @@ body: attributes: value: | ### 👍 Thank you for contributing to our project! - Before asking for help please check the [support policy](https://github.com/drakkan/sftpgo#support-policy). - If you are a commercial user or a project sponsor please contact us using the dedicated [email address](mailto:support@sftpgo.com). + Before asking for help please check our [support policy](https://github.com/drakkan/sftpgo?tab=readme-ov-file#support). + If you are a [commercial user](https://sftpgo.com/) please contact us using the dedicated [email address](mailto:support@sftpgo.com). + If you'd like to contribute code, please make sure to read and understand our [Contributor License Agreement (CLA)](https://sftpgo.com/cla.html). + You’ll be asked to accept it when submitting a pull request. - type: checkboxes id: before-posting attributes: diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index f0cf871b..5fd83037 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -2,6 +2,14 @@ name: 🚀 Feature request description: Suggest an idea for SFTPGo labels: ["suggestion"] body: + - type: markdown + attributes: + value: | + ### 👍 Thank you for contributing to our project! + Before asking for help please check our [support policy](https://github.com/drakkan/sftpgo?tab=readme-ov-file#support). + If you are a [commercial user](https://sftpgo.com/) please contact us using the dedicated [email address](mailto:support@sftpgo.com). + If you'd like to contribute code, please make sure to read and understand our [Contributor License Agreement (CLA)](https://sftpgo.com/cla.html). + You’ll be asked to accept it when submitting a pull request. - type: textarea attributes: label: Is your feature request related to a problem? Please describe. diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 8cd157ff..0c90b458 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,11 +1,11 @@ version: 2 updates: - - package-ecosystem: "gomod" - directory: "/" - schedule: - interval: "weekly" - open-pull-requests-limit: 2 + #- package-ecosystem: "gomod" + # directory: "/" + # schedule: + # interval: "weekly" + # open-pull-requests-limit: 2 - package-ecosystem: "docker" directory: "/" diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 08edea2d..db26ed74 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -15,22 +15,22 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: - go-version: '1.22' + go-version: '1.25' - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@v4 with: languages: go - name: Autobuild - uses: github/codeql-action/autobuild@v3 + uses: github/codeql-action/autobuild@v4 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 \ No newline at end of file + uses: github/codeql-action/analyze@v4 \ No newline at end of file diff --git a/.github/workflows/development.yml b/.github/workflows/development.yml index 1349f87e..45769de3 100644 --- a/.github/workflows/development.yml +++ b/.github/workflows/development.yml @@ -5,34 +5,32 @@ on: branches: [main] pull_request: +permissions: + id-token: write + contents: read + jobs: test-deploy: name: Test and deploy runs-on: ${{ matrix.os }} strategy: matrix: - go: ['1.22'] + go: ['1.26'] os: [ubuntu-latest, macos-latest] - upload-coverage: [true] - include: - - go: '1.22' - os: windows-latest - upload-coverage: false steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version: ${{ matrix.go }} - name: Build for Linux/macOS x86_64 - if: startsWith(matrix.os, 'windows-') != true run: | - go build -trimpath -tags nopgxregisterdefaulttypes -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo + go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo cd tests/eventsearcher go build -trimpath -ldflags "-s -w" -o eventsearcher cd - @@ -44,68 +42,35 @@ jobs: - name: Build for macOS arm64 if: startsWith(matrix.os, 'macos-') == true - run: CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 SDKROOT=$(xcrun --sdk macosx --show-sdk-path) go build -trimpath -tags nopgxregisterdefaulttypes -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo_arm64 - - - name: Build for Windows - if: startsWith(matrix.os, 'windows-') - run: | - $GIT_COMMIT = (git describe --always --abbrev=8 --dirty) | Out-String - $DATE_TIME = ([datetime]::Now.ToUniversalTime().toString("yyyy-MM-ddTHH:mm:ssZ")) | Out-String - $LATEST_TAG = ((git describe --tags $(git rev-list --tags --max-count=1)) | Out-String).Trim() - $REV_LIST=$LATEST_TAG+"..HEAD" - $COMMITS_FROM_TAG= ((git rev-list $REV_LIST --count) | Out-String).Trim() - $FILE_VERSION = $LATEST_TAG.substring(1) + "." + $COMMITS_FROM_TAG - go install github.com/tc-hib/go-winres@latest - go-winres simply --arch amd64 --product-version $LATEST_TAG-dev-$GIT_COMMIT --file-version $FILE_VERSION --file-description "SFTPGo server" --product-name SFTPGo --copyright "AGPL-3.0" --original-filename sftpgo.exe --icon .\windows-installer\icon.ico - go build -trimpath -tags nopgxregisterdefaulttypes -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o sftpgo.exe - cd tests/eventsearcher - go build -trimpath -ldflags "-s -w" -o eventsearcher.exe - cd ../.. - cd tests/ipfilter - go build -trimpath -ldflags "-s -w" -o ipfilter.exe - cd ../.. - mkdir arm64 - $Env:CGO_ENABLED='0' - $Env:GOOS='windows' - $Env:GOARCH='arm64' - go-winres simply --arch arm64 --product-version $LATEST_TAG-dev-$GIT_COMMIT --file-version $FILE_VERSION --file-description "SFTPGo server" --product-name SFTPGo --copyright "AGPL-3.0" --original-filename sftpgo.exe --icon .\windows-installer\icon.ico - go build -trimpath -tags nopgxregisterdefaulttypes,nosqlite -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o .\arm64\sftpgo.exe - mkdir x86 - $Env:GOARCH='386' - go-winres simply --arch 386 --product-version $LATEST_TAG-dev-$GIT_COMMIT --file-version $FILE_VERSION --file-description "SFTPGo server" --product-name SFTPGo --copyright "AGPL-3.0" --original-filename sftpgo.exe --icon .\windows-installer\icon.ico - go build -trimpath -tags nopgxregisterdefaulttypes,nosqlite -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o .\x86\sftpgo.exe - Remove-Item Env:\CGO_ENABLED - Remove-Item Env:\GOOS - Remove-Item Env:\GOARCH + run: CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 SDKROOT=$(xcrun --sdk macosx --show-sdk-path) go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo_arm64 - name: Run test cases using SQLite provider - run: go test -v -tags nopgxregisterdefaulttypes -p 1 -timeout 15m ./... -coverprofile=coverage.txt -covermode=atomic + run: go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 15m ./... -coverprofile=coverage.txt -covermode=atomic - name: Upload coverage to Codecov - if: ${{ matrix.upload-coverage }} - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: - file: ./coverage.txt + files: ./coverage.txt fail_ci_if_error: false token: ${{ secrets.CODECOV_TOKEN }} - name: Run test cases using bolt provider run: | - go test -v -tags nopgxregisterdefaulttypes -p 1 -timeout 2m ./internal/config -covermode=atomic - go test -v -tags nopgxregisterdefaulttypes -p 1 -timeout 5m ./internal/common -covermode=atomic - go test -v -tags nopgxregisterdefaulttypes -p 1 -timeout 5m ./internal/httpd -covermode=atomic - go test -v -tags nopgxregisterdefaulttypes -p 1 -timeout 8m ./internal/sftpd -covermode=atomic - go test -v -tags nopgxregisterdefaulttypes -p 1 -timeout 5m ./internal/ftpd -covermode=atomic - go test -v -tags nopgxregisterdefaulttypes -p 1 -timeout 5m ./internal/webdavd -covermode=atomic - go test -v -tags nopgxregisterdefaulttypes -p 1 -timeout 2m ./internal/telemetry -covermode=atomic - go test -v -tags nopgxregisterdefaulttypes -p 1 -timeout 2m ./internal/mfa -covermode=atomic - go test -v -tags nopgxregisterdefaulttypes -p 1 -timeout 2m ./internal/command -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 2m ./internal/config -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 5m ./internal/common -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 5m ./internal/httpd -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 8m ./internal/sftpd -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 5m ./internal/ftpd -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 5m ./internal/webdavd -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 2m ./internal/telemetry -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 2m ./internal/mfa -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 2m ./internal/command -covermode=atomic env: SFTPGO_DATA_PROVIDER__DRIVER: bolt SFTPGO_DATA_PROVIDER__NAME: 'sftpgo_bolt.db' - name: Run test cases using memory provider - run: go test -v -tags nopgxregisterdefaulttypes -p 1 -timeout 15m ./... -covermode=atomic + run: go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 15m ./... -covermode=atomic env: SFTPGO_DATA_PROVIDER__DRIVER: memory SFTPGO_DATA_PROVIDER__NAME: '' @@ -126,15 +91,100 @@ jobs: ./sftpgo gen man -d output/man/man1 gzip output/man/man1/* - - name: Prepare Windows installer - if: ${{ startsWith(matrix.os, 'windows-') && github.event_name != 'pull_request' }} + - name: Upload build artifact + if: startsWith(matrix.os, 'ubuntu-') != true + uses: actions/upload-artifact@v7 + with: + name: sftpgo-${{ matrix.os }}-go-${{ matrix.go }} + path: output + + test-deploy-windows: + name: Test and deploy Windows + runs-on: windows-latest + + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Set up Go + uses: actions/setup-go@v6 + with: + go-version: '1.26' + + - name: Run test cases using SQLite provider run: | + cd tests/eventsearcher + go build -trimpath -ldflags "-s -w" -o eventsearcher.exe + cd ../.. + cd tests/ipfilter + go build -trimpath -ldflags "-s -w" -o ipfilter.exe + cd ../.. + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 15m ./... -coverprofile=coverage.txt -covermode=atomic + + - name: Run test cases using bolt provider + run: | + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 2m ./internal/config -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 5m ./internal/common -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 5m ./internal/httpd -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 8m ./internal/sftpd -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 5m ./internal/ftpd -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 5m ./internal/webdavd -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 2m ./internal/telemetry -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 2m ./internal/mfa -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 2m ./internal/command -covermode=atomic + env: + SFTPGO_DATA_PROVIDER__DRIVER: bolt + SFTPGO_DATA_PROVIDER__NAME: 'sftpgo_bolt.db' + + - name: Run test cases using memory provider + run: go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 15m ./... -covermode=atomic + env: + SFTPGO_DATA_PROVIDER__DRIVER: memory + SFTPGO_DATA_PROVIDER__NAME: '' + + - name: Build + run: | + $GIT_COMMIT = (git describe --always --abbrev=8 --dirty) | Out-String + $DATE_TIME = ([datetime]::Now.ToUniversalTime().toString("yyyy-MM-ddTHH:mm:ssZ")) | Out-String + $LATEST_TAG = ((git describe --tags $(git rev-list --tags --max-count=1)) | Out-String).Trim() + $REV_LIST=$LATEST_TAG+"..HEAD" + $COMMITS_FROM_TAG= ((git rev-list $REV_LIST --count) | Out-String).Trim() + $FILE_VERSION = $LATEST_TAG.substring(1) + "." + $COMMITS_FROM_TAG + go install github.com/tc-hib/go-winres@latest + go-winres simply --arch amd64 --product-version $LATEST_TAG-dev-$GIT_COMMIT --file-version "$FILE_VERSION" --file-description "SFTPGo server" --product-name SFTPGo --copyright "2019-2025 Nicola Murino" --original-filename sftpgo.exe --icon .\windows-installer\icon.ico + go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o sftpgo.exe + mkdir arm64 + $Env:CGO_ENABLED='0' + $Env:GOOS='windows' + $Env:GOARCH='arm64' + go-winres simply --arch arm64 --product-version $LATEST_TAG-dev-$GIT_COMMIT --file-version "$FILE_VERSION" --file-description "SFTPGo server" --product-name SFTPGo --copyright "2019-2025 Nicola Murino" --original-filename sftpgo.exe --icon .\windows-installer\icon.ico + go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules,nosqlite -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o .\arm64\sftpgo.exe + mkdir x86 + $Env:GOARCH='386' + go-winres simply --arch 386 --product-version $LATEST_TAG-dev-$GIT_COMMIT --file-version "$FILE_VERSION" --file-description "SFTPGo server" --product-name SFTPGo --copyright "2019-2025 Nicola Murino" --original-filename sftpgo.exe --icon .\windows-installer\icon.ico + go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules,nosqlite -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o .\x86\sftpgo.exe + Remove-Item Env:\CGO_ENABLED + Remove-Item Env:\GOOS + Remove-Item Env:\GOARCH + + - name: Initialize data provider + run: | + rm sftpgo.db + ./sftpgo initprovider + shell: bash + + - name: Prepare Windows installers + if: ${{ github.event_name != 'pull_request' }} + run: | + choco install innosetup Remove-Item -LiteralPath "output" -Force -Recurse -ErrorAction Ignore mkdir output copy .\sftpgo.exe .\output copy .\sftpgo.json .\output copy .\sftpgo.db .\output copy .\LICENSE .\output\LICENSE.txt + copy .\NOTICE .\output\NOTICE.txt mkdir output\templates xcopy .\templates .\output\templates\ /E mkdir output\static @@ -145,15 +195,7 @@ jobs: $REV_LIST=$LATEST_TAG+"..HEAD" $COMMITS_FROM_TAG= ((git rev-list $REV_LIST --count) | Out-String).Trim() $Env:SFTPGO_ISS_DEV_VERSION = $LATEST_TAG + "." + $COMMITS_FROM_TAG - $CERT_PATH=(Get-Location -PSProvider FileSystem).ProviderPath + "\cert.pfx" - [IO.File]::WriteAllBytes($CERT_PATH,[System.Convert]::FromBase64String($Env:CERT_DATA)) - certutil -f -p "$Env:CERT_PASS" -importpfx MY "$CERT_PATH" - rm "$CERT_PATH" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.20348.0/x86/signtool.exe' sign /sm /tr http://timestamp.sectigo.com /td sha256 /fd sha256 /n "Nicola Murino" /d "SFTPGo" .\sftpgo.exe - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.20348.0/x86/signtool.exe' sign /sm /tr http://timestamp.sectigo.com /td sha256 /fd sha256 /n "Nicola Murino" /d "SFTPGo" .\arm64\sftpgo.exe - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.20348.0/x86/signtool.exe' sign /sm /tr http://timestamp.sectigo.com /td sha256 /fd sha256 /n "Nicola Murino" /d "SFTPGo" .\x86\sftpgo.exe - $INNO_S='/Ssigntool=$qC:/Program Files (x86)/Windows Kits/10/bin/10.0.20348.0/x86/signtool.exe$q sign /sm /tr http://timestamp.sectigo.com /td sha256 /fd sha256 /n $qNicola Murino$q /d $qSFTPGo$q $f' - iscc "$INNO_S" .\windows-installer\sftpgo.iss + iscc .\windows-installer\sftpgo.iss rm .\output\sftpgo.exe rm .\output\sftpgo.db @@ -165,40 +207,35 @@ jobs: Remove-Item Env:\SFTPGO_DATA_PROVIDER__DRIVER Remove-Item Env:\SFTPGO_DATA_PROVIDER__NAME $Env:SFTPGO_ISS_ARCH='arm64' - iscc "$INNO_S" .\windows-installer\sftpgo.iss + iscc .\windows-installer\sftpgo.iss rm .\output\sftpgo.exe copy .\x86\sftpgo.exe .\output $Env:SFTPGO_ISS_ARCH='x86' - iscc "$INNO_S" .\windows-installer\sftpgo.iss - certutil -delstore MY "Nicola Murino" - env: - CERT_DATA: ${{ secrets.CERT_DATA }} - CERT_PASS: ${{ secrets.CERT_PASS }} + iscc .\windows-installer\sftpgo.iss - name: Upload Windows installer x86_64 artifact - if: ${{ startsWith(matrix.os, 'windows-') && github.event_name != 'pull_request' }} - uses: actions/upload-artifact@v4 + if: ${{ github.event_name != 'pull_request' }} + uses: actions/upload-artifact@v7 with: name: sftpgo_windows_installer_x86_64 path: ./sftpgo_windows_x86_64.exe - name: Upload Windows installer arm64 artifact - if: ${{ startsWith(matrix.os, 'windows-') && github.event_name != 'pull_request' }} - uses: actions/upload-artifact@v4 + if: ${{ github.event_name != 'pull_request' }} + uses: actions/upload-artifact@v7 with: name: sftpgo_windows_installer_arm64 path: ./sftpgo_windows_arm64.exe - name: Upload Windows installer x86 artifact - if: ${{ startsWith(matrix.os, 'windows-') && github.event_name != 'pull_request' }} - uses: actions/upload-artifact@v4 + if: ${{ github.event_name != 'pull_request' }} + uses: actions/upload-artifact@v7 with: name: sftpgo_windows_installer_x86 path: ./sftpgo_windows_x86.exe - name: Prepare build artifact for Windows - if: startsWith(matrix.os, 'windows-') run: | Remove-Item -LiteralPath "output" -Force -Recurse -ErrorAction Ignore mkdir output @@ -217,10 +254,9 @@ jobs: xcopy .\openapi .\output\openapi\ /E - name: Upload build artifact - if: startsWith(matrix.os, 'ubuntu-') != true - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: - name: sftpgo-${{ matrix.os }}-go-${{ matrix.go }} + name: sftpgo-windows-portable path: output test-build-flags: @@ -228,19 +264,19 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: - go-version: '1.22' + go-version: '1.26' - name: Build run: | - go build -trimpath -tags nopgxregisterdefaulttypes,nogcs,nos3,noportable,nobolt,nomysql,nopgsql,nosqlite,nometrics,noazblob,unixcrypt -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo + go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules,nogcs,nos3,noportable,nobolt,nomysql,nopgsql,nosqlite,nometrics,noazblob,unixcrypt -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo ./sftpgo -v cp -r openapi static templates internal/bundle/ - go build -trimpath -tags nopgxregisterdefaulttypes,bundle -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo + go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules,bundle -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo ./sftpgo -v test-postgresql-mysql-crdb: @@ -292,16 +328,16 @@ jobs: - 3308:3306 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: - go-version: '1.22' + go-version: '1.26' - name: Build run: | - go build -trimpath -tags nopgxregisterdefaulttypes -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo + go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo cd tests/eventsearcher go build -trimpath -ldflags "-s -w" -o eventsearcher cd - @@ -313,7 +349,7 @@ jobs: run: | ./sftpgo initprovider ./sftpgo resetprovider --force - go test -v -tags nopgxregisterdefaulttypes -p 1 -timeout 15m ./... -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 15m ./... -covermode=atomic env: SFTPGO_DATA_PROVIDER__DRIVER: mysql SFTPGO_DATA_PROVIDER__NAME: sftpgo @@ -326,7 +362,7 @@ jobs: run: | ./sftpgo initprovider ./sftpgo resetprovider --force - go test -v -tags nopgxregisterdefaulttypes -p 1 -timeout 15m ./... -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 15m ./... -covermode=atomic env: SFTPGO_DATA_PROVIDER__DRIVER: postgresql SFTPGO_DATA_PROVIDER__NAME: sftpgo @@ -339,7 +375,7 @@ jobs: run: | ./sftpgo initprovider ./sftpgo resetprovider --force - go test -v -tags nopgxregisterdefaulttypes -p 1 -timeout 15m ./... -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 15m ./... -covermode=atomic env: SFTPGO_DATA_PROVIDER__DRIVER: mysql SFTPGO_DATA_PROVIDER__NAME: sftpgo @@ -356,7 +392,7 @@ jobs: docker exec crdb cockroach sql --insecure -e 'create database "sftpgo"' ./sftpgo initprovider ./sftpgo resetprovider --force - go test -v -tags nopgxregisterdefaulttypes -p 1 -timeout 15m ./... -covermode=atomic + go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 15m ./... -covermode=atomic docker stop crdb env: SFTPGO_DATA_PROVIDER__DRIVER: cockroachdb @@ -391,7 +427,7 @@ jobs: go: latest go-arch: arm7 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 @@ -420,7 +456,7 @@ jobs: echo 'export PATH=$PATH:/usr/local/go/bin' >> build.sh echo 'go version' >> build.sh echo 'cd /usr/local/src' >> build.sh - echo 'go build -buildvcs=false -trimpath -tags nopgxregisterdefaulttypes -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=${{ steps.get_commit.outputs.COMMIT }} -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo' >> build.sh + echo 'go build -buildvcs=false -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=${{ steps.get_commit.outputs.COMMIT }} -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo' >> build.sh chmod 755 build.sh docker run --rm --name ubuntu-build --mount type=bind,source=`pwd`,target=/usr/local/src ${{ matrix.distro }} /usr/local/src/build.sh @@ -436,7 +472,7 @@ jobs: gzip output/man/man1/* cp sftpgo output/ - - uses: uraimo/run-on-arch-action@v2 + - uses: uraimo/run-on-arch-action@v3 if: ${{ matrix.arch != 'amd64' }} name: Build for ${{ matrix.arch }} id: build @@ -471,7 +507,7 @@ jobs: then export GOARM=7 fi - go build -buildvcs=false -trimpath -tags nopgxregisterdefaulttypes -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=${{ steps.get_commit.outputs.COMMIT }} -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo + go build -buildvcs=false -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=${{ steps.get_commit.outputs.COMMIT }} -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo mkdir -p output/{init,bash_completion,zsh_completion} cp sftpgo.json output/ cp -r templates output/ @@ -485,7 +521,7 @@ jobs: cp sftpgo output/ - name: Upload build artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: sftpgo-linux-${{ matrix.arch }}-go-${{ matrix.go }} path: output @@ -500,13 +536,13 @@ jobs: echo "pkg-version=${PKG_VERSION}" >> $GITHUB_OUTPUT - name: Upload Debian Package - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: sftpgo-${{ steps.build_linux_pkgs.outputs.pkg-version }}-${{ matrix.go-arch }}-deb path: pkgs/dist/deb/* - name: Upload RPM Package - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: sftpgo-${{ steps.build_linux_pkgs.outputs.pkg-version }}-${{ matrix.go-arch }}-rpm path: pkgs/dist/rpm/* @@ -516,11 +552,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: - go-version: '1.22' - - uses: actions/checkout@v4 + go-version: '1.26' + - uses: actions/checkout@v6 - name: Run golangci-lint - uses: golangci/golangci-lint-action@v6 + uses: golangci/golangci-lint-action@v9 with: version: latest diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 98617201..822c916e 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -33,7 +33,7 @@ jobs: optional_deps: true steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Gather image information id: info @@ -42,7 +42,7 @@ jobs: DOCKERFILE=Dockerfile MINOR="" MAJOR="" - FEATURES="nopgxregisterdefaulttypes" + FEATURES="nopgxregisterdefaulttypes,disable_grpc_modules" if [ "${{ github.event_name }}" = "schedule" ]; then VERSION=nightly elif [[ $GITHUB_REF == refs/tags/* ]]; then @@ -141,21 +141,21 @@ jobs: OPTIONAL_DEPS: ${{ matrix.optional_deps }} - name: Set up QEMU - uses: docker/setup-qemu-action@v3 + uses: docker/setup-qemu-action@v4 - name: Set up builder - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 id: builder - name: Login to Docker Hub - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} if: ${{ github.event_name != 'pull_request' }} - name: Login to GitHub Container Registry - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.repository_owner }} @@ -163,7 +163,7 @@ jobs: if: ${{ github.event_name != 'pull_request' }} - name: Build and push - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v7 with: context: . builder: ${{ steps.builder.outputs.name }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a752efed..9ac10ee5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,17 +4,21 @@ on: push: tags: 'v*' +permissions: + id-token: write + contents: write + env: - GO_VERSION: 1.22.3 + GO_VERSION: 1.25.8 jobs: prepare-sources-with-deps: name: Prepare sources with deps runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version: ${{ env.GO_VERSION }} @@ -32,23 +36,20 @@ jobs: SFTPGO_VERSION: ${{ steps.get_version.outputs.VERSION }} - name: Upload build artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: sftpgo_${{ steps.get_version.outputs.VERSION }}_src_with_deps.tar.xz path: ./sftpgo_${{ steps.get_version.outputs.VERSION }}_src_with_deps.tar.xz retention-days: 1 - prepare-window-mac: - name: Prepare binaries - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [macos-12, windows-2022] + prepare-windows: + name: Prepare Windows binaries + runs-on: windows-2022 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version: ${{ env.GO_VERSION }} @@ -57,46 +58,24 @@ jobs: run: echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_OUTPUT shell: bash - - name: Get OS name - id: get_os_name - run: | - if [[ $MATRIX_OS =~ ^macos.* ]] - then - echo "OS=macOS" >> $GITHUB_OUTPUT - else - echo "OS=windows" >> $GITHUB_OUTPUT - fi - shell: bash - env: - MATRIX_OS: ${{ matrix.os }} - - - name: Build for macOS x86_64 - if: startsWith(matrix.os, 'windows-') != true - run: go build -trimpath -tags nopgxregisterdefaulttypes -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo - - - name: Build for macOS arm64 - if: startsWith(matrix.os, 'macos-') == true - run: CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 SDKROOT=$(xcrun --sdk macosx --show-sdk-path) go build -trimpath -tags nopgxregisterdefaulttypes -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo_arm64 - - - name: Build for Windows - if: startsWith(matrix.os, 'windows-') + - name: Build run: | $GIT_COMMIT = (git describe --always --abbrev=8 --dirty) | Out-String $DATE_TIME = ([datetime]::Now.ToUniversalTime().toString("yyyy-MM-ddTHH:mm:ssZ")) | Out-String $FILE_VERSION = $Env:SFTPGO_VERSION.substring(1) + ".0" go install github.com/tc-hib/go-winres@latest - go-winres simply --arch amd64 --product-version $Env:SFTPGO_VERSION-$GIT_COMMIT --file-version $FILE_VERSION --file-description "SFTPGo server" --product-name SFTPGo --copyright "AGPL-3.0" --original-filename sftpgo.exe --icon .\windows-installer\icon.ico - go build -trimpath -tags nopgxregisterdefaulttypes -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o sftpgo.exe + go-winres simply --arch amd64 --product-version $Env:SFTPGO_VERSION-$GIT_COMMIT --file-version "$FILE_VERSION" --file-description "SFTPGo server" --product-name SFTPGo --copyright "2019-2025 Nicola Murino" --original-filename sftpgo.exe --icon .\windows-installer\icon.ico + go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o sftpgo.exe mkdir arm64 $Env:CGO_ENABLED='0' $Env:GOOS='windows' $Env:GOARCH='arm64' - go-winres simply --arch arm64 --product-version $Env:SFTPGO_VERSION-$GIT_COMMIT --file-version $FILE_VERSION --file-description "SFTPGo server" --product-name SFTPGo --copyright "AGPL-3.0" --original-filename sftpgo.exe --icon .\windows-installer\icon.ico - go build -trimpath -tags nopgxregisterdefaulttypes,nosqlite -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o .\arm64\sftpgo.exe + go-winres simply --arch arm64 --product-version $Env:SFTPGO_VERSION-$GIT_COMMIT --file-version "$FILE_VERSION" --file-description "SFTPGo server" --product-name SFTPGo --copyright "2019-2025 Nicola Murino" --original-filename sftpgo.exe --icon .\windows-installer\icon.ico + go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules,nosqlite -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o .\arm64\sftpgo.exe mkdir x86 $Env:GOARCH='386' - go-winres simply --arch 386 --product-version $Env:SFTPGO_VERSION-$GIT_COMMIT --file-version $FILE_VERSION --file-description "SFTPGo server" --product-name SFTPGo --copyright "AGPL-3.0" --original-filename sftpgo.exe --icon .\windows-installer\icon.ico - go build -trimpath -tags nopgxregisterdefaulttypes,nosqlite -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o .\x86\sftpgo.exe + go-winres simply --arch 386 --product-version $Env:SFTPGO_VERSION-$GIT_COMMIT --file-version "$FILE_VERSION" --file-description "SFTPGo server" --product-name SFTPGo --copyright "2019-2025 Nicola Murino" --original-filename sftpgo.exe --icon .\windows-installer\icon.ico + go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules,nosqlite -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o .\x86\sftpgo.exe Remove-Item Env:\CGO_ENABLED Remove-Item Env:\GOOS Remove-Item Env:\GOARCH @@ -107,14 +86,123 @@ jobs: run: ./sftpgo initprovider shell: bash - - name: Prepare Release for macOS - if: startsWith(matrix.os, 'macos-') + - name: Prepare Release + run: | + mkdir output + copy .\sftpgo.exe .\output + copy .\sftpgo.json .\output + copy .\sftpgo.db .\output + copy .\LICENSE .\output\LICENSE.txt + copy .\NOTICE .\output\NOTICE.txt + mkdir output\templates + xcopy .\templates .\output\templates\ /E + mkdir output\static + xcopy .\static .\output\static\ /E + mkdir output\openapi + xcopy .\openapi .\output\openapi\ /E + iscc .\windows-installer\sftpgo.iss + rm .\output\sftpgo.exe + rm .\output\sftpgo.db + copy .\arm64\sftpgo.exe .\output + (Get-Content .\output\sftpgo.json).replace('"sqlite"', '"bolt"') | Set-Content .\output\sftpgo.json + $Env:SFTPGO_DATA_PROVIDER__DRIVER='bolt' + $Env:SFTPGO_DATA_PROVIDER__NAME='.\output\sftpgo.db' + .\sftpgo.exe initprovider + Remove-Item Env:\SFTPGO_DATA_PROVIDER__DRIVER + Remove-Item Env:\SFTPGO_DATA_PROVIDER__NAME + $Env:SFTPGO_ISS_ARCH='arm64' + iscc .\windows-installer\sftpgo.iss + + rm .\output\sftpgo.exe + copy .\x86\sftpgo.exe .\output + $Env:SFTPGO_ISS_ARCH='x86' + iscc .\windows-installer\sftpgo.iss + env: + SFTPGO_ISS_VERSION: ${{ steps.get_version.outputs.VERSION }} + + - name: Prepare Portable Release + run: | + mkdir win-portable + copy .\sftpgo.exe .\win-portable + mkdir win-portable\arm64 + copy .\arm64\sftpgo.exe .\win-portable\arm64 + mkdir win-portable\x86 + copy .\x86\sftpgo.exe .\win-portable\x86 + copy .\sftpgo.json .\win-portable + (Get-Content .\win-portable\sftpgo.json).replace('"sqlite"', '"bolt"') | Set-Content .\win-portable\sftpgo.json + copy .\output\sftpgo.db .\win-portable + copy .\LICENSE .\win-portable\LICENSE.txt + copy .\NOTICE .\win-portable\NOTICE.txt + mkdir win-portable\templates + xcopy .\templates .\win-portable\templates\ /E + mkdir win-portable\static + xcopy .\static .\win-portable\static\ /E + mkdir win-portable\openapi + xcopy .\openapi .\win-portable\openapi\ /E + Compress-Archive .\win-portable\* sftpgo_portable.zip + + - name: Upload Windows installer x86_64 artifact + uses: actions/upload-artifact@v7 + with: + name: sftpgo_${{ steps.get_version.outputs.VERSION }}_windows_x86_64.exe + path: ./sftpgo_windows_x86_64.exe + retention-days: 1 + + - name: Upload Windows installer arm64 artifact + uses: actions/upload-artifact@v7 + with: + name: sftpgo_${{ steps.get_version.outputs.VERSION }}_windows_arm64.exe + path: ./sftpgo_windows_arm64.exe + retention-days: 1 + + - name: Upload Windows installer x86 artifact + uses: actions/upload-artifact@v7 + with: + name: sftpgo_${{ steps.get_version.outputs.VERSION }}_windows_x86.exe + path: ./sftpgo_windows_x86.exe + retention-days: 1 + + - name: Upload Windows portable artifact + uses: actions/upload-artifact@v7 + with: + name: sftpgo_${{ steps.get_version.outputs.VERSION }}_windows_portable.zip + path: ./sftpgo_portable.zip + retention-days: 1 + + prepare-mac: + name: Prepare macOS binaries + runs-on: macos-14 + + steps: + - uses: actions/checkout@v6 + - name: Set up Go + uses: actions/setup-go@v6 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Get SFTPGo version + id: get_version + run: echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_OUTPUT + shell: bash + + - name: Build for macOS x86_64 + run: go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo + + - name: Build for macOS arm64 + run: CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 SDKROOT=$(xcrun --sdk macosx --show-sdk-path) go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo_arm64 + + - name: Initialize data provider + run: ./sftpgo initprovider + shell: bash + + - name: Prepare Release run: | mkdir -p output/{init,sqlite,bash_completion,zsh_completion} echo "For documentation please take a look here:" > output/README.txt echo "" >> output/README.txt - echo "https://github.com/drakkan/sftpgo/blob/${SFTPGO_VERSION}/README.md" >> output/README.txt + echo "https://docs.sftpgo.com" >> output/README.txt cp LICENSE output/ + cp NOTICE output/ cp sftpgo output/ cp sftpgo.json output/ cp sftpgo.db output/sqlite/ @@ -127,130 +215,27 @@ jobs: ./sftpgo gen man -d output/man/man1 gzip output/man/man1/* cd output - tar cJvf ../sftpgo_${SFTPGO_VERSION}_${OS}_x86_64.tar.xz * + tar cJvf ../sftpgo_${SFTPGO_VERSION}_macOS_x86_64.tar.xz * cd .. cp sftpgo_arm64 output/sftpgo cd output - tar cJvf ../sftpgo_${SFTPGO_VERSION}_${OS}_arm64.tar.xz * + tar cJvf ../sftpgo_${SFTPGO_VERSION}_macOS_arm64.tar.xz * cd .. env: SFTPGO_VERSION: ${{ steps.get_version.outputs.VERSION }} - OS: ${{ steps.get_os_name.outputs.OS }} - - - name: Prepare Release for Windows - if: startsWith(matrix.os, 'windows-') - run: | - mkdir output - copy .\sftpgo.exe .\output - copy .\sftpgo.json .\output - copy .\sftpgo.db .\output - copy .\LICENSE .\output\LICENSE.txt - mkdir output\templates - xcopy .\templates .\output\templates\ /E - mkdir output\static - xcopy .\static .\output\static\ /E - mkdir output\openapi - xcopy .\openapi .\output\openapi\ /E - $CERT_PATH=(Get-Location -PSProvider FileSystem).ProviderPath + "\cert.pfx" - [IO.File]::WriteAllBytes($CERT_PATH,[System.Convert]::FromBase64String($Env:CERT_DATA)) - certutil -f -p "$Env:CERT_PASS" -importpfx MY "$CERT_PATH" - rm "$CERT_PATH" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.20348.0/x86/signtool.exe' sign /sm /tr http://timestamp.sectigo.com /td sha256 /fd sha256 /n "Nicola Murino" /d "SFTPGo" .\sftpgo.exe - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.20348.0/x86/signtool.exe' sign /sm /tr http://timestamp.sectigo.com /td sha256 /fd sha256 /n "Nicola Murino" /d "SFTPGo" .\arm64\sftpgo.exe - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.20348.0/x86/signtool.exe' sign /sm /tr http://timestamp.sectigo.com /td sha256 /fd sha256 /n "Nicola Murino" /d "SFTPGo" .\x86\sftpgo.exe - $INNO_S='/Ssigntool=$qC:/Program Files (x86)/Windows Kits/10/bin/10.0.20348.0/x86/signtool.exe$q sign /sm /tr http://timestamp.sectigo.com /td sha256 /fd sha256 /n $qNicola Murino$q /d $qSFTPGo$q $f' - iscc "$INNO_S" .\windows-installer\sftpgo.iss - - rm .\output\sftpgo.exe - rm .\output\sftpgo.db - copy .\arm64\sftpgo.exe .\output - (Get-Content .\output\sftpgo.json).replace('"sqlite"', '"bolt"') | Set-Content .\output\sftpgo.json - $Env:SFTPGO_DATA_PROVIDER__DRIVER='bolt' - $Env:SFTPGO_DATA_PROVIDER__NAME='.\output\sftpgo.db' - .\sftpgo.exe initprovider - Remove-Item Env:\SFTPGO_DATA_PROVIDER__DRIVER - Remove-Item Env:\SFTPGO_DATA_PROVIDER__NAME - $Env:SFTPGO_ISS_ARCH='arm64' - iscc "$INNO_S" .\windows-installer\sftpgo.iss - - rm .\output\sftpgo.exe - copy .\x86\sftpgo.exe .\output - $Env:SFTPGO_ISS_ARCH='x86' - iscc "$INNO_S" .\windows-installer\sftpgo.iss - certutil -delstore MY "Nicola Murino" - env: - SFTPGO_ISS_VERSION: ${{ steps.get_version.outputs.VERSION }} - SFTPGO_ISS_DOC_URL: https://github.com/drakkan/sftpgo/blob/${{ steps.get_version.outputs.VERSION }}/README.md - CERT_DATA: ${{ secrets.CERT_DATA }} - CERT_PASS: ${{ secrets.CERT_PASS }} - - - name: Prepare Portable Release for Windows - if: startsWith(matrix.os, 'windows-') - run: | - mkdir win-portable - copy .\sftpgo.exe .\win-portable - mkdir win-portable\arm64 - copy .\arm64\sftpgo.exe .\win-portable\arm64 - mkdir win-portable\x86 - copy .\x86\sftpgo.exe .\win-portable\x86 - copy .\sftpgo.json .\win-portable - (Get-Content .\win-portable\sftpgo.json).replace('"sqlite"', '"bolt"') | Set-Content .\win-portable\sftpgo.json - copy .\output\sftpgo.db .\win-portable - copy .\LICENSE .\win-portable\LICENSE.txt - mkdir win-portable\templates - xcopy .\templates .\win-portable\templates\ /E - mkdir win-portable\static - xcopy .\static .\win-portable\static\ /E - mkdir win-portable\openapi - xcopy .\openapi .\win-portable\openapi\ /E - Compress-Archive .\win-portable\* sftpgo_portable.zip - name: Upload macOS x86_64 artifact - if: startsWith(matrix.os, 'macos-') - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: - name: sftpgo_${{ steps.get_version.outputs.VERSION }}_${{ steps.get_os_name.outputs.OS }}_x86_64.tar.xz - path: ./sftpgo_${{ steps.get_version.outputs.VERSION }}_${{ steps.get_os_name.outputs.OS }}_x86_64.tar.xz + name: sftpgo_${{ steps.get_version.outputs.VERSION }}_macOS_x86_64.tar.xz + path: ./sftpgo_${{ steps.get_version.outputs.VERSION }}_macOS_x86_64.tar.xz retention-days: 1 - name: Upload macOS arm64 artifact - if: startsWith(matrix.os, 'macos-') - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: - name: sftpgo_${{ steps.get_version.outputs.VERSION }}_${{ steps.get_os_name.outputs.OS }}_arm64.tar.xz - path: ./sftpgo_${{ steps.get_version.outputs.VERSION }}_${{ steps.get_os_name.outputs.OS }}_arm64.tar.xz - retention-days: 1 - - - name: Upload Windows installer x86_64 artifact - if: startsWith(matrix.os, 'windows-') - uses: actions/upload-artifact@v4 - with: - name: sftpgo_${{ steps.get_version.outputs.VERSION }}_${{ steps.get_os_name.outputs.OS }}_x86_64.exe - path: ./sftpgo_windows_x86_64.exe - retention-days: 1 - - - name: Upload Windows installer arm64 artifact - if: startsWith(matrix.os, 'windows-') - uses: actions/upload-artifact@v4 - with: - name: sftpgo_${{ steps.get_version.outputs.VERSION }}_${{ steps.get_os_name.outputs.OS }}_arm64.exe - path: ./sftpgo_windows_arm64.exe - retention-days: 1 - - - name: Upload Windows installer x86 artifact - if: startsWith(matrix.os, 'windows-') - uses: actions/upload-artifact@v4 - with: - name: sftpgo_${{ steps.get_version.outputs.VERSION }}_${{ steps.get_os_name.outputs.OS }}_x86.exe - path: ./sftpgo_windows_x86.exe - retention-days: 1 - - - name: Upload Windows portable artifact - if: startsWith(matrix.os, 'windows-') - uses: actions/upload-artifact@v4 - with: - name: sftpgo_${{ steps.get_version.outputs.VERSION }}_${{ steps.get_os_name.outputs.OS }}_portable.zip - path: ./sftpgo_portable.zip + name: sftpgo_${{ steps.get_version.outputs.VERSION }}_macOS_arm64.tar.xz + path: ./sftpgo_${{ steps.get_version.outputs.VERSION }}_macOS_arm64.tar.xz retention-days: 1 prepare-linux: @@ -285,7 +270,7 @@ jobs: tar-arch: armv7 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Get versions id: get_version @@ -310,7 +295,7 @@ jobs: echo 'export PATH=$PATH:/usr/local/go/bin' >> build.sh echo 'go version' >> build.sh echo 'cd /usr/local/src' >> build.sh - echo 'go build -buildvcs=false -trimpath -tags nopgxregisterdefaulttypes -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=${{ steps.get_version.outputs.COMMIT }} -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo' >> build.sh + echo 'go build -buildvcs=false -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=${{ steps.get_version.outputs.COMMIT }} -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo' >> build.sh chmod 755 build.sh docker run --rm --name ubuntu-build --mount type=bind,source=`pwd`,target=/usr/local/src ${{ matrix.distro }} /usr/local/src/build.sh @@ -319,6 +304,7 @@ jobs: echo "" >> output/README.txt echo "https://github.com/drakkan/sftpgo/blob/${SFTPGO_VERSION}/README.md" >> output/README.txt cp LICENSE output/ + cp NOTICE output/ cp sftpgo.json output/ cp -r templates output/ cp -r static output/ @@ -337,7 +323,7 @@ jobs: env: SFTPGO_VERSION: ${{ steps.get_version.outputs.SFTPGO_VERSION }} - - uses: uraimo/run-on-arch-action@v2 + - uses: uraimo/run-on-arch-action@v3 if: ${{ matrix.arch != 'amd64' }} name: Build for ${{ matrix.arch }} id: build @@ -362,12 +348,13 @@ jobs: run: | export PATH=$PATH:/usr/local/go/bin go version - go build -buildvcs=false -trimpath -tags nopgxregisterdefaulttypes -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=${{ steps.get_version.outputs.COMMIT }} -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo + go build -buildvcs=false -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=${{ steps.get_version.outputs.COMMIT }} -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo mkdir -p output/{init,sqlite,bash_completion,zsh_completion} echo "For documentation please take a look here:" > output/README.txt echo "" >> output/README.txt echo "https://github.com/drakkan/sftpgo/blob/${{ steps.get_version.outputs.SFTPGO_VERSION }}/README.md" >> output/README.txt cp LICENSE output/ + cp NOTICE output/ cp sftpgo.json output/ cp -r templates output/ cp -r static output/ @@ -385,7 +372,7 @@ jobs: cd .. - name: Upload build artifact for ${{ matrix.arch }} - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_linux_${{ matrix.tar-arch }}.tar.xz path: ./output/sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_linux_${{ matrix.tar-arch }}.tar.xz @@ -403,14 +390,14 @@ jobs: SFTPGO_VERSION: ${{ steps.get_version.outputs.SFTPGO_VERSION }} - name: Upload Deb Package - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: sftpgo_${{ steps.build_linux_pkgs.outputs.pkg-version }}-1_${{ matrix.deb-arch}}.deb path: ./pkgs/dist/deb/sftpgo_${{ steps.build_linux_pkgs.outputs.pkg-version }}-1_${{ matrix.deb-arch}}.deb retention-days: 1 - name: Upload RPM Package - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: sftpgo-${{ steps.build_linux_pkgs.outputs.pkg-version }}-1.${{ matrix.rpm-arch}}.rpm path: ./pkgs/dist/rpm/sftpgo-${{ steps.build_linux_pkgs.outputs.pkg-version }}-1.${{ matrix.rpm-arch}}.rpm @@ -429,22 +416,22 @@ jobs: shell: bash - name: Download amd64 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_linux_x86_64.tar.xz - name: Download arm64 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_linux_arm64.tar.xz - name: Download ppc64le artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_linux_ppc64le.tar.xz - name: Download armv7 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_linux_armv7.tar.xz @@ -467,7 +454,7 @@ jobs: SFTPGO_VERSION: ${{ steps.get_version.outputs.SFTPGO_VERSION }} - name: Upload Linux bundle - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_linux_bundle.tar.xz path: ./bundle/sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_linux_bundle.tar.xz @@ -475,11 +462,11 @@ jobs: create-release: name: Release - needs: [prepare-linux-bundle, prepare-sources-with-deps, prepare-window-mac] + needs: [prepare-linux-bundle, prepare-sources-with-deps, prepare-mac, prepare-windows] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Get versions id: get_version run: | @@ -490,102 +477,102 @@ jobs: shell: bash - name: Download amd64 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_linux_x86_64.tar.xz - name: Download arm64 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_linux_arm64.tar.xz - name: Download ppc64le artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_linux_ppc64le.tar.xz - name: Download armv7 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_linux_armv7.tar.xz - name: Download Linux bundle artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_linux_bundle.tar.xz - name: Download Deb amd64 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.PKG_VERSION }}-1_amd64.deb - name: Download Deb arm64 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.PKG_VERSION }}-1_arm64.deb - name: Download Deb ppc64le artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.PKG_VERSION }}-1_ppc64el.deb - name: Download Deb armv7 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.PKG_VERSION }}-1_armhf.deb - name: Download RPM x86_64 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo-${{ steps.get_version.outputs.PKG_VERSION }}-1.x86_64.rpm - name: Download RPM aarch64 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo-${{ steps.get_version.outputs.PKG_VERSION }}-1.aarch64.rpm - name: Download RPM ppc64le artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo-${{ steps.get_version.outputs.PKG_VERSION }}-1.ppc64le.rpm - name: Download RPM armv7 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo-${{ steps.get_version.outputs.PKG_VERSION }}-1.armv7hl.rpm - name: Download macOS x86_64 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_macOS_x86_64.tar.xz - name: Download macOS arm64 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_macOS_arm64.tar.xz - name: Download Windows installer x86_64 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_windows_x86_64.exe - name: Download Windows installer arm64 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_windows_arm64.exe - name: Download Windows installer x86 artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_windows_x86.exe - name: Download Windows portable artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_windows_portable.zip - name: Download source with deps artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: sftpgo_${{ steps.get_version.outputs.SFTPGO_VERSION }}_src_with_deps.tar.xz diff --git a/.golangci.yml b/.golangci.yml index ac545673..14f9c1f9 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,52 +1,66 @@ +version: "2" run: - timeout: 10m issues-exit-code: 1 tests: true - - -linters-settings: - dupl: - threshold: 150 - errcheck: - check-type-assertions: false - check-blank: false - goconst: - min-len: 3 - min-occurrences: 3 - gocyclo: - min-complexity: 15 - gofmt: - simplify: true - goimports: - local-prefixes: github.com/drakkan/sftpgo - #govet: - # report about shadowed variables - #check-shadowing: true - #enable: - # - fieldalignment - -issues: - include: - - EXC0002 - - EXC0012 - - EXC0013 - - EXC0014 - - EXC0015 - linters: enable: - - goconst - - errcheck - - gofmt - - goimports - - revive - - unconvert - - unparam - bodyclose + - dogsled + - dupl + - goconst - gocyclo - misspell - - whitespace - - dupl + - revive - rowserrcheck - - dogsled - - govet + - unconvert + - unparam + - whitespace + settings: + dupl: + threshold: 150 + errcheck: + check-type-assertions: false + check-blank: false + goconst: + min-len: 3 + min-occurrences: 3 + gocyclo: + min-complexity: 15 + # https://golangci-lint.run/usage/linters/#revive + revive: + rules: + - name: var-naming + severity: warning + disabled: true + exclude: [""] + arguments: + - ["ID"] # AllowList + - ["VM"] # DenyList + - - upper-case-const: true + - - skip-package-name-checks: true + exclusions: + generated: lax + presets: + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - gofmt + - goimports + settings: + gofmt: + simplify: true + goimports: + local-prefixes: + - github.com/drakkan/sftpgo + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ diff --git a/Dockerfile b/Dockerfile index bd26b684..65371870 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.22-bookworm as builder +FROM golang:1.26-trixie AS builder ENV GOFLAGS="-mod=readonly" @@ -10,7 +10,7 @@ WORKDIR /workspace ARG GOPROXY COPY go.mod go.sum ./ -RUN go mod download +RUN go mod download && go mod verify ARG COMMIT_SHA @@ -30,14 +30,14 @@ ARG DOWNLOAD_PLUGINS=false RUN if [ "${DOWNLOAD_PLUGINS}" = "true" ]; then apt-get update && apt-get install --no-install-recommends -y curl && ./docker/scripts/download-plugins.sh; fi -FROM debian:bookworm-slim +FROM debian:trixie-slim -# Set to "true" to install jq and the optional git and rsync dependencies +# Set to "true" to install jq ARG INSTALL_OPTIONAL_PACKAGES=false RUN apt-get update && apt-get -y upgrade && apt-get install --no-install-recommends -y ca-certificates media-types && rm -rf /var/lib/apt/lists/* -RUN if [ "${INSTALL_OPTIONAL_PACKAGES}" = "true" ]; then apt-get update && apt-get install --no-install-recommends -y jq git rsync && rm -rf /var/lib/apt/lists/*; fi +RUN if [ "${INSTALL_OPTIONAL_PACKAGES}" = "true" ]; then apt-get update && apt-get install --no-install-recommends -y jq && rm -rf /var/lib/apt/lists/*; fi RUN mkdir -p /etc/sftpgo /var/lib/sftpgo /usr/share/sftpgo /srv/sftpgo/data /srv/sftpgo/backups diff --git a/Dockerfile.alpine b/Dockerfile.alpine index 3b9f82f5..494442dc 100644 --- a/Dockerfile.alpine +++ b/Dockerfile.alpine @@ -1,4 +1,4 @@ -FROM golang:1.22-alpine3.19 AS builder +FROM golang:1.26-alpine3.23 AS builder ENV GOFLAGS="-mod=readonly" @@ -10,7 +10,7 @@ WORKDIR /workspace ARG GOPROXY COPY go.mod go.sum ./ -RUN go mod download +RUN go mod download && go mod verify ARG COMMIT_SHA @@ -25,14 +25,14 @@ RUN set -xe && \ export COMMIT_SHA=${COMMIT_SHA:-$(git describe --always --abbrev=8 --dirty)} && \ go build $(if [ -n "${FEATURES}" ]; then echo "-tags ${FEATURES}"; fi) -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=${COMMIT_SHA} -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -v -o sftpgo -FROM alpine:3.19 +FROM alpine:3.23 -# Set to "true" to install jq and the optional git and rsync dependencies +# Set to "true" to install jq ARG INSTALL_OPTIONAL_PACKAGES=false RUN apk -U upgrade --no-cache && apk add --update --no-cache ca-certificates tzdata mailcap -RUN if [ "${INSTALL_OPTIONAL_PACKAGES}" = "true" ]; then apk add --update --no-cache jq git rsync; fi +RUN if [ "${INSTALL_OPTIONAL_PACKAGES}" = "true" ]; then apk add --update --no-cache jq; fi RUN mkdir -p /etc/sftpgo /var/lib/sftpgo /usr/share/sftpgo /srv/sftpgo/data /srv/sftpgo/backups diff --git a/Dockerfile.distroless b/Dockerfile.distroless index a88e2fc4..36bc1406 100644 --- a/Dockerfile.distroless +++ b/Dockerfile.distroless @@ -1,4 +1,4 @@ -FROM golang:1.22-bookworm as builder +FROM golang:1.26-trixie AS builder ENV CGO_ENABLED=0 GOFLAGS="-mod=readonly" @@ -10,7 +10,7 @@ WORKDIR /workspace ARG GOPROXY COPY go.mod go.sum ./ -RUN go mod download +RUN go mod download && go mod verify ARG COMMIT_SHA @@ -32,7 +32,7 @@ RUN sed -i 's|"users_base_dir": "",|"users_base_dir": "/srv/sftpgo/data",|' sftp RUN mkdir /etc/sftpgo /var/lib/sftpgo /srv/sftpgo -FROM gcr.io/distroless/static-debian12 +FROM gcr.io/distroless/static-debian13 COPY --from=builder --chown=1000:1000 /etc/sftpgo /etc/sftpgo COPY --from=builder --chown=1000:1000 /srv/sftpgo /srv/sftpgo diff --git a/NOTICE b/NOTICE new file mode 100644 index 00000000..f683d86f --- /dev/null +++ b/NOTICE @@ -0,0 +1,12 @@ +Additional terms under GNU AGPL version 3 section 7.3(b) and 13.1: + +If you have included SFTPGo so that it is offered through any network +interactions, including by means of an external user interface, or +any other integration, even without modifying its source code and then +SFTPGo is partially, fully or optionally configured via your frontend, +you must provide reasonable but clear attribution to the SFTPGo project +and its author(s), not imply any endorsement by or affiliation with the +SFTPGo project, and you must prominently offer all users interacting +with it remotely through a computer network an opportunity to receive +the Corresponding Source of the SFTPGo version you include by providing +a link to the Corresponding Source in the SFTPGo source code repository. diff --git a/README.md b/README.md index ef80d315..bee0bc4f 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,51 @@ # SFTPGo -[![CI Status](https://github.com/drakkan/sftpgo/workflows/CI/badge.svg?branch=main&event=push)](https://github.com/drakkan/sftpgo/workflows/CI/badge.svg?branch=main&event=push) -[![Code Coverage](https://codecov.io/gh/drakkan/sftpgo/branch/main/graph/badge.svg)](https://codecov.io/gh/drakkan/sftpgo/branch/main) +[![CI Status](https://github.com/drakkan/sftpgo/workflows/CI/badge.svg)](https://github.com/drakkan/sftpgo/workflows/CI/badge.svg) [![License: AGPL-3.0-only](https://img.shields.io/badge/License-AGPLv3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) [![Mentioned in Awesome Go](https://awesome.re/mentioned-badge.svg)](https://github.com/avelino/awesome-go) -Full-featured and highly configurable event-driven file transfer solution. -Server protocols: SFTP, HTTP/S, FTP/S, WebDAV. -Storage backends: local filesystem, encrypted local filesystem, S3 (compatible) Object Storage, Google Cloud Storage, Azure Blob Storage, other SFTP servers. +Full-featured and highly configurable event-driven file transfer solution. Server protocols: SFTP, HTTP/S, FTP/S, WebDAV. Storage backends: local filesystem, encrypted local filesystem, S3 (compatible) Object Storage, Google Cloud Storage, Azure Blob Storage, other SFTP servers. With SFTPGo you can leverage local and cloud storage backends for exchanging and storing files internally or with business partners using the same tools and processes you are already familiar with. -The WebAdmin UI allows to easily create and manage your users, folders, groups and other resources. +## Project Status & Editions -The WebClient UI allows end users to change their credentials, browse and manage their files in the browser and setup two-factor authentication which works with Microsoft Authenticator, Google Authenticator, Authy and other compatible apps. +SFTPGo is an open-source project with a sustainable business model. We offer two editions to suit different requirements, ensuring the project remains healthy and maintained for everyone. + +### Open Source (Community) + +Free, Copyleft (AGPLv3), Community Supported. The Community edition is a fully functional, production-ready solution widely adopted worldwide. It includes all the core protocols, storage backends, and the WebAdmin/WebClient UIs. It is ideal for: + +- Standard file transfer needs. +- Integrating storage backends (S3, GCS, Azure Blob) with legacy protocols. +- Projects that are comfortable with AGPLv3 licensing. + +### SFTPGo Enterprise + +Commercial License, Professional Support, ISO 27001 Vendor. The Enterprise edition is built on the same core but extends it for mission-critical environments, compliance-heavy industries, and advanced workflows. It is a drop-in replacement (seamless upgrade). + +| Feature | Open Source (Community) | Enterprise Edition | +| :--- | :--- | :--- | +| **License Type** | AGPLv3 (Copyleft) | **Commercial License**
Proprietary/No Copyleft | +| **Vendor Compliance** | Not Applicable
Community Project | **Certified Vendor**
ISO 27001 & Supply Chain Validation | +| **Support** | Community (GitHub) | **Direct from Authors** | +| **Cloud Storage Engine** | Standard | **High Performance & Scalable**
In-memory streaming (no local temp files) and up to 70% faster | +| **High Availability (HA)** | Standard
Shared DB & Storage | **Advanced**
Enhanced event handling and optimized instance coordination | +| **Automation Logic** | Simple Placeholders | **Dynamic Logic & Virtual Folders**
Conditions, loops, route data across storage backends | +| **Data Lifecycle** | Delete / Retain | **Smart Archiving**
Move data to external Cloud/SFTP storage via Virtual Folders | +| **Email Data Ingestion** | - | **Native IMAP Integration**
Auto-extract attachments from email to storage | +| **Public Sharing** | Standard Links | **Advanced & Collaborative**
Email Authentication & Group Delegation | +| **Data Protection** | - | **Encryption & Scanning**
Automated PGP, Antivirus & DLP via ICAP | +| **Advanced Identity (SSO)** | Standard | **Extended Controls**
Advanced Single Sign-On parameters | +| **Document Editing** | - | **Included**
View, edit, and co-author in browser | + +**Note**: We are committed to keeping the Open Source edition powerful and maintained. The Enterprise edition helps fund the development of the entire SFTPGo ecosystem. ## Sponsors -We strongly believe in Open Source software model, so we decided to make SFTPGo available to everyone, but maintaining and evolving SFTPGo takes a lot of time and work. To make development and maintenance sustainable you should consider to support the project with a [sponsorship](https://github.com/sponsors/drakkan). +If you rely on SFTPGo in your projects, consider becoming a [sponsor](https://github.com/sponsors/drakkan). -We also provide [professional services](https://sftpgo.com/#pricing) to support you in using SFTPGo to the fullest. - -The open source license grant you freedom but not assurance of help. So why would you rely on free software without support or any guarantee it will stay healthy and maintained for the upcoming years? - -Supporting the project benefit businesses and the community because if the project is financially sustainable, using this business model, we don't have to restrict features and/or switch to an [Open-core](https://en.wikipedia.org/wiki/Open-core_model) model. The technology stays truly open source. Everyone wins. - -You should support the project for its ongoing maintenance, even if you don't have any questions or need new features. If SFTPGo is no longer maintained you will have troubles and your company will lose money: bugs and security vulnerabilities will no longer be fixed, new algorithms will not be added to support newer clients, and so on. You will be forced to switch to a similar proprietary product and pay for its license and the migration cost. +Your sponsorship helps cover maintenance, security updates and ongoing development of the open-source edition. ### Thank you to our sponsors @@ -45,23 +65,39 @@ You should support the project for its ongoing maintenance, even if you don't ha [7digital logo](https://www.7digital.com/)

-[VPS2day logo](https://www.vps2day.com/) - -## Support policy - -You can use SFTPGo for free, respecting the obligations of the Open Source license, but please do not ask or expect free support as well. - -Use [discussions](https://github.com/drakkan/sftpgo/discussions) to ask questions and get support from the community. - -If you report an invalid issue and/or ask for step-by-step support, your issue will be closed as invalid without further explanation. Invalid bug reports left open may confuse other users. Thanks for understanding. +[servinga logo](https://servinga.com/) +

+[ReUI logo](https://www.reui.io/) ## Documentation -You can read more about supported features and documentation at [sftpgo.github.io](https://sftpgo.github.io/). +You can explore all supported features and configuration options at [docs.sftpgo.com](https://docs.sftpgo.com/latest/). + +**Note:** The link above refers to the **Community Edition**. +For details on **Enterprise Edition**, please refer to the [Enterprise Documentation](https://docs.sftpgo.com/enterprise/). + +## Support + +- **Community Support**: use [GitHub Discussions](https://github.com/drakkan/sftpgo/discussions) to ask questions, share feedback, and engage with other users. +- **Commercial Support**: If you require guaranteed SLAs, expert guidance, or the advanced features listed above, check out [SFTPGo Enterprise](https://sftpgo.com). + +SFTPGo Enterprise is available as: + +- On-premises: Full control on your infrastructure. More details: [sftpgo.com/on-premises](https://sftpgo.com/on-premises) +- Fully managed SaaS: We handle the infrastructure. More details: [sftpgo.com/saas](https://sftpgo.com/saas) + +## Internationalization + +The translations are available via [Crowdin](https://crowdin.com/project/sftpgo), who have granted us an open source license. + +Before translating please take a look at our contribution [guidelines](https://docs.sftpgo.com/latest/web-interfaces/#internationalization). ## Release Cadence -SFTPGo releases are feature-driven, we don't have a fixed time based schedule. As a rough estimate, you can expect 1 or 2 new releases per year. +SFTPGo follows a feature-driven release cycle. + +- Enterprise Edition: Receives major new features first and follows a faster [release cadence](https://docs.sftpgo.com/enterprise/changelog/). +- Community Edition: Remains maintained, receiving bug fixes, security updates, and updates to core features. ## Acknowledgements @@ -71,7 +107,7 @@ We are very grateful to all the people who contributed with ideas and/or pull re Thank you to [ysura](https://www.ysura.com/) for granting us stable access to a test AWS S3 account. -Thank you to [KeenThemes](https://keenthemes.com/) for granting us a custom license to use their amazing [Mega Bundle](https://keenthemes.com/products/templates-mega-bundle) for SFTPGo UI. +Thank you to [KeenThemes](https://keenthemes.com/) for granting us a custom license to use their amazing [themes](https://keenthemes.com/bootstrap-templates) for the SFTPGo WebAdmin and WebClient user interfaces, across both the Open Source and Open Core versions. Thank you to [Crowdin](https://crowdin.com/) for granting us an Open Source License. @@ -79,15 +115,17 @@ Thank you to [Incode](https://www.incode.it/) for helping us to improve the UI/U ## License -SFTPGo source code is licensed under the GNU AGPL-3.0-only. +SFTPGo source code is licensed under the GNU AGPL-3.0-only with [additional terms](./NOTICE). -The [theme](https://keenthemes.com/products/templates-mega-bundle) used in WebAdmin and WebClient user interfaces is proprietary, this means: +The [theme](https://keenthemes.com/bootstrap-templates) used in WebAdmin and WebClient user interfaces is proprietary, this means: - KeenThemes HTML/CSS/JS components are allowed for use only within the SFTPGo product and restricted to be used in a resealable HTML template that can compete with KeenThemes products anyhow. - The SFTPGo WebAdmin and WebClient user interfaces (HTML, CSS and JS components) based on this theme are allowed for use only within the SFTPGo product and therefore cannot be used in derivative works/products without an explicit grant from the [SFTPGo Team](mailto:support@sftpgo.com). More information about [compliance](https://sftpgo.com/compliance.html). +**Note:** We do not provide legal advice. If you have questions about license compliance or whether your use case is permitted under the license terms, please consult your legal team. + ## Copyright -Copyright (C) 2019 Nicola Murino +Copyright (C) 2019 - 2026 Nicola Murino diff --git a/SECURITY.md b/SECURITY.md index 05e5daf7..01650ca6 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,8 +2,18 @@ ## Supported Versions -Only the current release of the software is actively supported. -[Contact us](mailto:support@sftpgo.com) if you need early security patches and enterprise-grade security. +We actively maintain the latest stable release of SFTPGo. While we strive to keep the Open Source version secure and up-to-date, maintenance is performed on a best-effort basis by the community and contributors. + +## Scope and Dependency Policy + +Our security advisories focus on vulnerabilities found within the **SFTPGo codebase itself**. + +To ensure the long-term sustainability of the project, we handle upstream dependencies (like the Go standard library, external packages, or Docker base images) as follows: + +- Community Updates: For the Open Source version, vulnerabilities in upstream components (such as the Go standard library or third-party packages) are addressed during our **regular release cycles**. We generally do not provide immediate, out-of-band or ad-hoc releases to address dependency-only CVEs. +- Empowering Users: One of the strengths of SFTPGo being open-source is that you have full control. If your security scanners require an immediate fix, you can always rebuild the project using the latest patched Go toolchain or updated dependencies. +- Compatibility: We are committed to keeping SFTPGo compatible with the latest stable Go compiler. If an upstream fix breaks SFTPGo, fixing that becomes a priority for us. +- Professional Needs: We understand that some organizations have strict compliance requirements or internal SLAs that require guaranteed, immediate response times and out-of-band patches. For these cases, we offer [SFTPGo Enterprise](https://sftpgo.com/on-premises) to cover the additional maintenance and support overhead. ## Reporting a Vulnerability diff --git a/docker/scripts/download-plugins.sh b/docker/scripts/download-plugins.sh index 6d9cbdd0..7638cd56 100755 --- a/docker/scripts/download-plugins.sh +++ b/docker/scripts/download-plugins.sh @@ -1,13 +1,13 @@ #!/usr/bin/env bash -set -e +set -euo pipefail -ARCH=`uname -m` +ARCH=$(uname -m) case ${ARCH} in - "x86_64") + x86_64) SUFFIX=amd64 ;; - "aarch64") + aarch64) SUFFIX=arm64 ;; *) @@ -15,11 +15,21 @@ case ${ARCH} in ;; esac -echo "download plugins for arch ${SUFFIX}" +echo "Downloading plugins for arch ${SUFFIX}" -for PLUGIN in geoipfilter kms pubsub eventstore eventsearch auth -do - echo "download plugin from https://github.com/sftpgo/sftpgo-plugin-${PLUGIN}/releases/latest/download/sftpgo-plugin-${PLUGIN}-linux-${SUFFIX}" - curl -L "https://github.com/sftpgo/sftpgo-plugin-${PLUGIN}/releases/latest/download/sftpgo-plugin-${PLUGIN}-linux-${SUFFIX}" --output "/usr/local/bin/sftpgo-plugin-${PLUGIN}" - chmod 755 "/usr/local/bin/sftpgo-plugin-${PLUGIN}" +PLUGINS=(geoipfilter kms pubsub eventstore eventsearch auth) + +for PLUGIN in "${PLUGINS[@]}"; do + URL="https://github.com/sftpgo/sftpgo-plugin-${PLUGIN}/releases/latest/download/sftpgo-plugin-${PLUGIN}-linux-${SUFFIX}" + DEST="/usr/local/bin/sftpgo-plugin-${PLUGIN}" + + echo "Downloading ${PLUGIN}..." + if curl --fail --silent --show-error -L "${URL}" --output "${DEST}"; then + chmod 755 "${DEST}" + else + echo "Error: Failed to download ${PLUGIN}" >&2 + exit 1 + fi done + +echo "All plugins downloaded successfully" diff --git a/examples/backup/README.md b/examples/backup/README.md index d00ce1d8..3190390c 100644 --- a/examples/backup/README.md +++ b/examples/backup/README.md @@ -1,6 +1,6 @@ # Data Backup -:warning: Since v2.4.0 you can use the [EventManager](https://sftpgo.github.io/latest/eventmanager/) to schedule backups. +:warning: Since v2.4.0 you can use the [EventManager](https://docs.sftpgo.com/latest/eventmanager/) to schedule backups. The `backup` example script shows how to use the SFTPGo REST API to backup your data. diff --git a/examples/data-retention/README.md b/examples/data-retention/README.md deleted file mode 100644 index 6508c295..00000000 --- a/examples/data-retention/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# File retention policies - -:warning: Since v2.4.0 you can use the [EventManager](https://sftpgo.github.io/latest/eventmanager/) to schedule data retention checks. - -The `checkretention` example script shows how to use the SFTPGo REST API to manage data retention. - -:warning: Deleting files is an irreversible action, please make sure you fully understand what you are doing before using this feature, you may have users with overlapping home directories or virtual folders shared between multiple users, it is relatively easy to inadvertently delete files you need. - -The example shows how to setup a really simple retention policy, for each user it sends this request: - -```json -[ - { - "path": "/", - "retention": 168, - "delete_empty_dirs": true, - "ignore_user_permissions": false - } -] -``` - -so alls files with modification time older than 168 hours (7 days) will be deleted. Empty directories will be removed and the check will respect user's permissions, so if the user cannot delete a file/folder it will be skipped. - -You can define different retention policies per-user and per-folder and you can exclude a folder setting the retention to `0`. - -You can use this script as a starting point, please edit it according to your needs. - -The script is written in Python and has the following requirements: - -- python3 or python2 -- python [Requests](https://requests.readthedocs.io/en/master/) module - -The provided example tries to connect to an SFTPGo instance running on `127.0.0.1:8080` using the following credentials: - -- username: `admin` -- password: `password` diff --git a/examples/data-retention/checkretention b/examples/data-retention/checkretention deleted file mode 100755 index 1474b073..00000000 --- a/examples/data-retention/checkretention +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env python - -from datetime import datetime -import sys -import time - -import pytz -import requests - -try: - import urllib.parse as urlparse -except ImportError: - import urlparse - -# change base_url to point to your SFTPGo installation -base_url = "http://127.0.0.1:8080" -# set to False if you want to skip TLS certificate validation -verify_tls_cert = True -# set the credentials for a valid admin here -admin_user = "admin" -admin_password = "password" - - -class CheckRetention: - - def __init__(self): - self.limit = 100 - self.offset = 0 - self.access_token = "" - self.access_token_expiration = None - - def printLog(self, message): - print("{} - {}".format(datetime.now(), message)) - - def checkAccessToken(self): - if self.access_token != "" and self.access_token_expiration: - expire_diff = self.access_token_expiration - datetime.now(tz=pytz.UTC) - # we don't use total_seconds to be python 2 compatible - seconds_to_expire = expire_diff.days * 86400 + expire_diff.seconds - if seconds_to_expire > 180: - return - - auth = requests.auth.HTTPBasicAuth(admin_user, admin_password) - r = requests.get(urlparse.urljoin(base_url, "api/v2/token"), auth=auth, verify=verify_tls_cert, timeout=10) - if r.status_code != 200: - self.printLog("error getting access token: {}".format(r.text)) - sys.exit(1) - self.access_token = r.json()["access_token"] - self.access_token_expiration = pytz.timezone("UTC").localize(datetime.strptime(r.json()["expires_at"], - "%Y-%m-%dT%H:%M:%SZ")) - - def getAuthHeader(self): - self.checkAccessToken() - return {"Authorization": "Bearer " + self.access_token} - - def waitForRentionCheck(self, username): - while True: - auth_header = self.getAuthHeader() - r = requests.get(urlparse.urljoin(base_url, "api/v2/retention/users/checks"), headers=auth_header, verify=verify_tls_cert, - timeout=10) - if r.status_code != 200: - self.printLog("error getting retention checks while waiting for {}: {}".format(username, r.text)) - sys.exit(1) - - checking = False - for check in r.json(): - if check["username"] == username: - checking = True - if not checking: - break - self.printLog("waiting for the retention check to complete for user {}".format(username)) - time.sleep(2) - - self.printLog("retention check for user {} finished".format(username)) - - def checkUserRetention(self, username): - self.printLog("starting retention check for user {}".format(username)) - auth_header = self.getAuthHeader() - retention = [ - { - "path": "/", - "retention": 168, - "delete_empty_dirs": True, - "ignore_user_permissions": False - } - ] - r = requests.post(urlparse.urljoin(base_url, "api/v2/retention/users/" + username + "/check"), headers=auth_header, - json=retention, verify=verify_tls_cert, timeout=10) - if r.status_code != 202: - self.printLog("error starting retention check for user {}: {}".format(username, r.text)) - sys.exit(1) - self.waitForRentionCheck(username) - - def checkUsersRetention(self): - while True: - self.printLog("get users, limit {} offset {}".format(self.limit, self.offset)) - auth_header = self.getAuthHeader() - payload = {"limit":self.limit, "offset":self.offset} - r = requests.get(urlparse.urljoin(base_url, "api/v2/users"), headers=auth_header, params=payload, - verify=verify_tls_cert, timeout=10) - if r.status_code != 200: - self.printLog("error getting users: {}".format(r.text)) - sys.exit(1) - users = r.json() - for user in users: - self.checkUserRetention(user["username"]) - - self.offset += len(users) - if len(users) < self.limit: - break - - -if __name__ == '__main__': - c = CheckRetention() - c.checkUsersRetention() diff --git a/examples/ldapauth/go.mod b/examples/ldapauth/go.mod index 4b04e152..81df3ad5 100644 --- a/examples/ldapauth/go.mod +++ b/examples/ldapauth/go.mod @@ -1,15 +1,15 @@ module github.com/drakkan/ldapauth -go 1.22.2 +go 1.25.0 require ( - github.com/go-ldap/ldap/v3 v3.4.8 - golang.org/x/crypto v0.23.0 + github.com/go-ldap/ldap/v3 v3.4.12 + golang.org/x/crypto v0.45.0 ) require ( - github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect - github.com/go-asn1-ber/asn1-ber v1.5.7 // indirect + github.com/Azure/go-ntlmssp v0.1.0 // indirect + github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 // indirect github.com/google/uuid v1.6.0 // indirect - golang.org/x/sys v0.20.0 // indirect + golang.org/x/sys v0.38.0 // indirect ) diff --git a/examples/ldapauth/go.sum b/examples/ldapauth/go.sum index 6c72d1cd..67fe852a 100644 --- a/examples/ldapauth/go.sum +++ b/examples/ldapauth/go.sum @@ -1,20 +1,15 @@ -github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= -github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= -github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa h1:LHTHcTQiSGT7VVbI0o4wBRNQIgn917usHWOd6VAffYI= -github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/Azure/go-ntlmssp v0.1.0 h1:DjFo6YtWzNqNvQdrwEyr/e4nhU3vRiwenz5QX7sFz+A= +github.com/Azure/go-ntlmssp v0.1.0/go.mod h1:NYqdhxd/8aAct/s4qSYZEerdPuH1liG2/X9DiVTbhpk= +github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e h1:4dAU9FXIyQktpoUAgOJK3OTFc/xug0PCXYCqU0FgDKI= +github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= -github.com/go-asn1-ber/asn1-ber v1.5.7 h1:DTX+lbVTWaTw1hQ+PbZPlnDZPEIs0SS/GCZAl535dDk= -github.com/go-asn1-ber/asn1-ber v1.5.7/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= -github.com/go-ldap/ldap/v3 v3.4.8 h1:loKJyspcRezt2Q3ZRMq2p/0v8iOurlmeXDPw6fikSvQ= -github.com/go-ldap/ldap/v3 v3.4.8/go.mod h1:qS3Sjlu76eHfHGpUdWkAXQTw4beih+cHsco2jXlIXrk= +github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 h1:BP4M0CvQ4S3TGls2FvczZtj5Re/2ZzkV9VwqPHH/3Bo= +github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-ldap/ldap/v3 v3.4.12 h1:1b81mv7MagXZ7+1r7cLTWmyuTqVqdwbtJSjC0DAp9s4= +github.com/go-ldap/ldap/v3 v3.4.12/go.mod h1:+SPAGcTtOfmGsCb3h1RFiq4xpp4N636G75OEace8lNo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= @@ -31,69 +26,15 @@ github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZ github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/examples/ldapauthserver/go.mod b/examples/ldapauthserver/go.mod index 3b5fcf73..f65828cc 100644 --- a/examples/ldapauthserver/go.mod +++ b/examples/ldapauthserver/go.mod @@ -1,43 +1,37 @@ module github.com/drakkan/sftpgo/ldapauthserver -go 1.22.2 +go 1.25.0 require ( - github.com/go-chi/chi/v5 v5.0.12 + github.com/go-chi/chi/v5 v5.2.3 github.com/go-chi/render v1.0.3 - github.com/go-ldap/ldap/v3 v3.4.8 + github.com/go-ldap/ldap/v3 v3.4.12 github.com/nathanaelle/password/v2 v2.0.1 - github.com/rs/zerolog v1.32.0 - github.com/spf13/cobra v1.8.0 - github.com/spf13/viper v1.18.2 - golang.org/x/crypto v0.23.0 + github.com/rs/zerolog v1.34.0 + github.com/spf13/cobra v1.10.1 + github.com/spf13/viper v1.21.0 + golang.org/x/crypto v0.45.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) require ( - github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect + github.com/Azure/go-ntlmssp v0.1.0 // indirect github.com/ajg/form v1.5.1 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-asn1-ber/asn1-ber v1.5.7 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/magiconair/properties v1.8.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/pelletier/go-toml/v2 v2.2.2 // indirect - github.com/sagikazarmark/locafero v0.4.0 // indirect - github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/sagikazarmark/locafero v0.12.0 // indirect + github.com/spf13/afero v1.15.0 // indirect + github.com/spf13/cast v1.10.0 // indirect + github.com/spf13/pflag v1.0.10 // indirect github.com/subosito/gotenv v1.6.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/text v0.31.0 // indirect + gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect ) diff --git a/examples/ldapauthserver/go.sum b/examples/ldapauthserver/go.sum index a16640f3..99ea3a37 100644 --- a/examples/ldapauthserver/go.sum +++ b/examples/ldapauthserver/go.sum @@ -1,40 +1,34 @@ -github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= -github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= +github.com/Azure/go-ntlmssp v0.1.0 h1:DjFo6YtWzNqNvQdrwEyr/e4nhU3vRiwenz5QX7sFz+A= +github.com/Azure/go-ntlmssp v0.1.0/go.mod h1:NYqdhxd/8aAct/s4qSYZEerdPuH1liG2/X9DiVTbhpk= github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa h1:LHTHcTQiSGT7VVbI0o4wBRNQIgn917usHWOd6VAffYI= -github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= +github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e h1:4dAU9FXIyQktpoUAgOJK3OTFc/xug0PCXYCqU0FgDKI= +github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= -github.com/go-asn1-ber/asn1-ber v1.5.7 h1:DTX+lbVTWaTw1hQ+PbZPlnDZPEIs0SS/GCZAl535dDk= -github.com/go-asn1-ber/asn1-ber v1.5.7/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= -github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= -github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 h1:BP4M0CvQ4S3TGls2FvczZtj5Re/2ZzkV9VwqPHH/3Bo= +github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-chi/chi/v5 v5.2.3 h1:WQIt9uxdsAbgIYgid+BpYc+liqQZGMHRaUwp0JUcvdE= +github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4= github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0= -github.com/go-ldap/ldap/v3 v3.4.8 h1:loKJyspcRezt2Q3ZRMq2p/0v8iOurlmeXDPw6fikSvQ= -github.com/go-ldap/ldap/v3 v3.4.8/go.mod h1:qS3Sjlu76eHfHGpUdWkAXQTw4beih+cHsco2jXlIXrk= +github.com/go-ldap/ldap/v3 v3.4.12 h1:1b81mv7MagXZ7+1r7cLTWmyuTqVqdwbtJSjC0DAp9s4= +github.com/go-ldap/ldap/v3 v3.4.12/go.mod h1:+SPAGcTtOfmGsCb3h1RFiq4xpp4N636G75OEace8lNo= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= @@ -53,132 +47,68 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/nathanaelle/password/v2 v2.0.1 h1:ItoCTdsuIWzilYmllQPa3DR3YoCXcpfxScWLqr8Ii2s= github.com/nathanaelle/password/v2 v2.0.1/go.mod h1:eaoT+ICQEPNtikBRIAatN8ThWwMhVG+r1jTw60BvPJk= -github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= -github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= -github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= -github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= -github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= -github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= -github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= -github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4= +github.com/sagikazarmark/locafero v0.12.0/go.mod h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= +github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= +github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= +github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/examples/quotascan/README.md b/examples/quotascan/README.md index 0e7c0a04..0830a308 100644 --- a/examples/quotascan/README.md +++ b/examples/quotascan/README.md @@ -1,6 +1,6 @@ # Update user quota -:warning: Since v2.4.0 you can use the [EventManager](https://sftpgo.github.io/latest/eventmanager/) to schedule quota scans. +:warning: Since v2.4.0 you can use the [EventManager](https://docs.sftpgo.com/latest/eventmanager/) to schedule quota scans. The `scanuserquota` example script shows how to use the SFTPGo REST API to update the users' quota. diff --git a/go.mod b/go.mod index 667e32ed..d2fafb83 100644 --- a/go.mod +++ b/go.mod @@ -1,190 +1,185 @@ module github.com/drakkan/sftpgo/v2 -go 1.22.2 +go 1.25.0 require ( - cloud.google.com/go/storage v1.41.0 - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 + cloud.google.com/go/storage v1.60.0 + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4 github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 github.com/alexedwards/argon2id v1.0.0 github.com/amoghe/go-crypt v0.0.0-20220222110647-20eada5f5964 - github.com/aws/aws-sdk-go-v2 v1.26.1 - github.com/aws/aws-sdk-go-v2/config v1.27.13 - github.com/aws/aws-sdk-go-v2/credentials v1.17.13 - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.18 - github.com/aws/aws-sdk-go-v2/service/marketplacemetering v1.21.5 - github.com/aws/aws-sdk-go-v2/service/s3 v1.54.0 - github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.28.7 - github.com/aws/aws-sdk-go-v2/service/sts v1.28.7 - github.com/bmatcuk/doublestar/v4 v4.6.1 - github.com/cockroachdb/cockroach-go/v2 v2.3.8 - github.com/coreos/go-oidc/v3 v3.10.0 - github.com/drakkan/webdav v0.0.0-20240503091431-218ec83910bb - github.com/eikenb/pipeat v0.0.0-20210730190139-06b3e6902001 - github.com/fclairamb/ftpserverlib v0.24.0 - github.com/fclairamb/go-log v0.5.0 - github.com/go-acme/lego/v4 v4.16.1 - github.com/go-chi/chi/v5 v5.0.12 - github.com/go-chi/jwtauth/v5 v5.3.1 + github.com/aws/aws-sdk-go-v2 v1.41.3 + github.com/aws/aws-sdk-go-v2/config v1.32.11 + github.com/aws/aws-sdk-go-v2/credentials v1.19.11 + github.com/aws/aws-sdk-go-v2/service/s3 v1.96.4 + github.com/aws/aws-sdk-go-v2/service/sts v1.41.8 + github.com/bmatcuk/doublestar/v4 v4.10.0 + github.com/cockroachdb/cockroach-go/v2 v2.4.3 + github.com/coreos/go-oidc/v3 v3.17.0 + github.com/drakkan/webdav v0.0.0-20241026165615-b8b8f74ae71b + github.com/eikenb/pipeat v0.0.0-20251030185646-385cd3c3e07b + github.com/fclairamb/ftpserverlib v0.30.0 + github.com/go-acme/lego/v4 v4.32.0 + github.com/go-chi/chi/v5 v5.2.5 github.com/go-chi/render v1.0.3 - github.com/go-sql-driver/mysql v1.8.1 + github.com/go-jose/go-jose/v4 v4.1.3 + github.com/go-sql-driver/mysql v1.9.3 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/google/uuid v1.6.0 github.com/hashicorp/go-hclog v1.6.3 - github.com/hashicorp/go-plugin v1.6.1 - github.com/hashicorp/go-retryablehttp v0.7.6 - github.com/jackc/pgx/v5 v5.5.5 + github.com/hashicorp/go-plugin v1.7.0 + github.com/hashicorp/go-retryablehttp v0.7.8 + github.com/jackc/pgx/v5 v5.8.0 github.com/jlaffaye/ftp v0.2.0 - github.com/klauspost/compress v1.17.8 - github.com/lestrrat-go/jwx/v2 v2.0.21 - github.com/lithammer/shortuuid/v3 v3.0.7 - github.com/mattn/go-sqlite3 v1.14.22 + github.com/klauspost/compress v1.18.4 + github.com/lithammer/shortuuid/v4 v4.2.0 + github.com/mattn/go-sqlite3 v1.14.34 github.com/mhale/smtpd v0.8.3 - github.com/minio/sio v0.3.1 - github.com/otiai10/copy v1.14.0 - github.com/pires/go-proxyproto v0.7.0 - github.com/pkg/sftp v1.13.7-0.20240410063531-637088883317 - github.com/pquerna/otp v1.4.0 - github.com/prometheus/client_golang v1.19.1 + github.com/minio/sio v0.4.3 + github.com/otiai10/copy v1.14.1 + github.com/pires/go-proxyproto v0.11.0 + github.com/pkg/sftp v1.13.10 + github.com/pquerna/otp v1.5.0 + github.com/prometheus/client_golang v1.23.2 github.com/robfig/cron/v3 v3.0.1 - github.com/rs/cors v1.11.0 - github.com/rs/xid v1.5.0 - github.com/rs/zerolog v1.32.0 - github.com/sftpgo/sdk v0.1.7 - github.com/shirou/gopsutil/v3 v3.24.4 - github.com/spf13/afero v1.11.0 - github.com/spf13/cobra v1.8.0 - github.com/spf13/viper v1.18.2 - github.com/stretchr/testify v1.9.0 - github.com/studio-b12/gowebdav v0.9.0 + github.com/rs/cors v1.11.1 + github.com/rs/xid v1.6.0 + github.com/rs/zerolog v1.34.0 + github.com/sftpgo/sdk v0.1.9 + github.com/shirou/gopsutil/v3 v3.24.5 + github.com/spf13/afero v1.15.0 + github.com/spf13/cobra v1.10.2 + github.com/spf13/viper v1.21.0 + github.com/stretchr/testify v1.11.1 + github.com/studio-b12/gowebdav v0.12.0 github.com/subosito/gotenv v1.6.0 - github.com/unrolled/secure v1.14.0 + github.com/unrolled/secure v1.17.0 github.com/wagslane/go-password-validator v0.3.0 - github.com/wneessen/go-mail v0.4.1 + github.com/wneessen/go-mail v0.7.2 github.com/yl2chen/cidranger v1.0.3-0.20210928021809-d1cb2c52f37a - go.etcd.io/bbolt v1.3.10 - go.uber.org/automaxprocs v1.5.3 - gocloud.dev v0.37.0 - golang.org/x/crypto v0.23.0 - golang.org/x/net v0.25.0 - golang.org/x/oauth2 v0.20.0 - golang.org/x/sys v0.20.0 - golang.org/x/term v0.20.0 - golang.org/x/time v0.5.0 - google.golang.org/api v0.180.0 + go.etcd.io/bbolt v1.4.3 + gocloud.dev v0.45.0 + golang.org/x/crypto v0.49.0 + golang.org/x/net v0.52.0 + golang.org/x/oauth2 v0.36.0 + golang.org/x/sys v0.42.0 + golang.org/x/term v0.41.0 + golang.org/x/time v0.15.0 + google.golang.org/api v0.271.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) require ( - cloud.google.com/go v0.113.0 // indirect - cloud.google.com/go/auth v0.4.1 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect - cloud.google.com/go/compute/metadata v0.3.0 // indirect - cloud.google.com/go/iam v1.1.8 // indirect - filippo.io/edwards25519 v1.1.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 // indirect - github.com/ajg/form v1.5.1 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.0 // indirect - github.com/aws/smithy-go v1.20.2 // indirect + cel.dev/expr v0.25.1 // indirect + cloud.google.com/go v0.123.0 // indirect + cloud.google.com/go/auth v0.18.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect + cloud.google.com/go/iam v1.5.3 // indirect + cloud.google.com/go/monitoring v1.24.3 // indirect + filippo.io/edwards25519 v1.2.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.7.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect + github.com/ajg/form v1.7.1 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.6 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.19 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.20 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.11 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.19 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.12 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.16 // indirect + github.com/aws/smithy-go v1.24.2 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/boombuler/barcode v1.0.1 // indirect - github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/boombuler/barcode v1.1.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect + github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect - github.com/fatih/color v1.17.0 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-jose/go-jose/v4 v4.0.2 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/goccy/go-json v0.10.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/go-viper/mapstructure/v2 v2.5.0 // indirect + github.com/golang-jwt/jwt/v5 v5.3.1 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.4 // indirect + github.com/google/s2a-go v0.1.9 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect + github.com/googleapis/gax-go/v2 v2.18.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hashicorp/yamux v0.1.2 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect - github.com/jackc/puddle/v2 v2.2.1 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/kr/fs v0.1.0 // indirect - github.com/lestrrat-go/blackmagic v1.0.2 // indirect - github.com/lestrrat-go/httpcc v1.0.1 // indirect - github.com/lestrrat-go/httprc v1.0.5 // indirect - github.com/lestrrat-go/iter v1.0.2 // indirect - github.com/lestrrat-go/option v1.0.1 // indirect - github.com/lufia/plan9stats v0.0.0-20240513124658-fba389f38bae // indirect - github.com/magiconair/properties v1.8.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/kylelemons/godebug v1.1.0 // indirect + github.com/lufia/plan9stats v0.0.0-20260216142805-b3301c5f2a88 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/miekg/dns v1.1.59 // indirect - github.com/mitchellh/go-testing-interface v1.14.1 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/oklog/run v1.1.0 // indirect - github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/miekg/dns v1.1.72 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/oklog/run v1.2.0 // indirect + github.com/otiai10/mint v1.6.3 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/procfs v0.20.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sagikazarmark/locafero v0.4.0 // indirect - github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/segmentio/asm v1.2.0 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/tklauser/go-sysconf v0.3.14 // indirect - github.com/tklauser/numcpus v0.8.0 // indirect + github.com/sagikazarmark/locafero v0.12.0 // indirect + github.com/shoenig/go-m1cpu v0.2.0 // indirect + github.com/spf13/cast v1.10.0 // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect + github.com/tklauser/go-sysconf v0.3.16 // indirect + github.com/tklauser/numcpus v0.11.0 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.51.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0 // indirect - go.opentelemetry.io/otel v1.26.0 // indirect - go.opentelemetry.io/otel/metric v1.26.0 // indirect - go.opentelemetry.io/otel/trace v1.26.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/tools v0.21.0 // indirect - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - google.golang.org/genproto v0.0.0-20240513163218-0867130af1f8 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.42.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect + go.opentelemetry.io/otel v1.42.0 // indirect + go.opentelemetry.io/otel/metric v1.42.0 // indirect + go.opentelemetry.io/otel/sdk v1.42.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.42.0 // indirect + go.opentelemetry.io/otel/trace v1.42.0 // indirect + go.yaml.in/yaml/v2 v2.4.4 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/mod v0.34.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/text v0.35.0 // indirect + golang.org/x/tools v0.43.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + google.golang.org/genproto v0.0.0-20260311181403-84a4fc48630c // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c // indirect + google.golang.org/grpc v1.79.2 // indirect + google.golang.org/protobuf v1.36.11 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) replace ( - github.com/fclairamb/ftpserverlib => github.com/drakkan/ftpserverlib v0.0.0-20240510125431-4617586dfa1c github.com/jlaffaye/ftp => github.com/drakkan/ftp v0.0.0-20240430173938-7ba8270c8e7f github.com/robfig/cron/v3 => github.com/drakkan/cron/v3 v3.0.0-20230222140221-217a1e4d96c0 - golang.org/x/crypto => github.com/drakkan/crypto v0.0.0-20240509175024-33071fb6437f ) diff --git a/go.sum b/go.sum index 7e7a0ad5..d81c977d 100644 --- a/go.sum +++ b/go.sum @@ -1,222 +1,198 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.113.0 h1:g3C70mn3lWfckKBiCVsAshabrDg01pQ0pnX1MNtnMkA= -cloud.google.com/go v0.113.0/go.mod h1:glEqlogERKYeePz6ZdkcLJ28Q2I6aERgDDErBg9GzO8= -cloud.google.com/go/auth v0.4.1 h1:Z7YNIhlWRtrnKlZke7z3GMqzvuYzdc2z98F9D1NV5Hg= -cloud.google.com/go/auth v0.4.1/go.mod h1:QVBuVEKpCn4Zp58hzRGvL0tjRGU0YqdRTdCHM1IHnro= -cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= -cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= -cloud.google.com/go/compute v1.26.0 h1:uHf0NN2nvxl1Gh4QO83yRCOdMK4zivtMS5gv0dEX0hg= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/iam v1.1.8 h1:r7umDwhj+BQyz0ScZMp4QrGXjSTI3ZINnpgU2nlB/K0= -cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE= -cloud.google.com/go/kms v1.16.0 h1:1yZsRPhmargZOmY+fVAh8IKiR9HzCb0U1zsxb5g2nRY= -cloud.google.com/go/kms v1.16.0/go.mod h1:olQUXy2Xud+1GzYfiBO9N0RhjsJk5IJLU6n/ethLXVc= -cloud.google.com/go/longrunning v0.5.7 h1:WLbHekDbjK1fVFD3ibpFFVoyizlLRl73I7YKuAKilhU= -cloud.google.com/go/longrunning v0.5.7/go.mod h1:8GClkudohy1Fxm3owmBGid8W0pSgodEMwEAztp38Xng= -cloud.google.com/go/storage v1.41.0 h1:RusiwatSu6lHeEXe3kglxakAmAbfV+rhtPqA6i8RBx0= -cloud.google.com/go/storage v1.41.0/go.mod h1:J1WCa/Z2FcgdEDuPUY8DxT5I+d9mFKsCepp5vR6Sq80= -filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= -filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= +cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= +cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= +cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= +cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= +cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= +cloud.google.com/go/kms v1.26.0 h1:cK9mN2cf+9V63D3H1f6koxTatWy39aTI/hCjz1I+adU= +cloud.google.com/go/kms v1.26.0/go.mod h1:pHKOdFJm63hxBsiPkYtowZPltu9dW0MWvBa6IA4HM58= +cloud.google.com/go/logging v1.13.2 h1:qqlHCBvieJT9Cdq4QqYx1KPadCQ2noD4FK02eNqHAjA= +cloud.google.com/go/logging v1.13.2/go.mod h1:zaybliM3yun1J8mU2dVQ1/qDzjbOqEijZCn6hSBtKak= +cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= +cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= +cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= +cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= +cloud.google.com/go/storage v1.60.0 h1:oBfZrSOCimggVNz9Y/bXY35uUcts7OViubeddTTVzQ8= +cloud.google.com/go/storage v1.60.0/go.mod h1:q+5196hXfejkctrnx+VYU8RKQr/L3c0cBIlrjmiAKE0= +cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= +cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= +filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= +filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0 h1:AifHbc4mg0x9zW52WOpKbsHaDKuRhlI7TVl47thgQ70= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0/go.mod h1:T5RfihdXtBDxt1Ch2wobif3TvzTdumDy29kahv6AV9A= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 h1:YUUxeiOWgdAQE3pXt2H7QXzZs0q8UBjgRbl56qo8GYM= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2/go.mod h1:dmXQgZuiSubAecswZE+Sm8jkvEa7kQgTPVRvwL/nd0E= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 h1:fou+2+WFTib47nS+nz/ozhEBnvU96bKHy6LjRsY4E28= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0/go.mod h1:t76Ruy8AHvUAC8GfMWJMa0ElSbuIcO03NLpynfbgsPA= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1 h1:/Zt+cDPnpC3OVDm/JKLOs7M2DKmLRIIp3XIx9pHHiig= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1/go.mod h1:Ng3urmn6dYe8gnbCMoHHVl5APYz2txho3koEkV2o2HA= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4 h1:jWQK1GI+LeGGUKBADtcH2rRqPxYB1Ljwms5gFA2LqrM= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4/go.mod h1:8mwH4klAm9DUgR2EEHyEEAQlRDvLPyg5fQry3y+cDew= +github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= +github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= +github.com/AzureAD/microsoft-authentication-library-for-go v1.7.0 h1:4iB+IesclUXdP0ICgAabvq2FYLXrJWKx1fJQ+GxSo3Y= +github.com/AzureAD/microsoft-authentication-library-for-go v1.7.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 h1:IEjq88XO4PuBDcvmjQJcQGg+w+UaafSy8G5Kcb5tBhI= github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5/go.mod h1:exZ0C/1emQJAw5tHOaUDyY1ycttqBAPcxuzf7QbY6ec= -github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 h1:DHa2U07rk8syqvCge0QIGMCE1WxGj9njT44GH7zNJLQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0 h1:7t/qx5Ost0s0wbA/VDrByOooURhp+ikYwv20i9Y07TQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/ajg/form v1.7.1 h1:OsnBDzTkrWdrxvEnO68I72ZVGJGNaMwPhoAm0V+llgc= +github.com/ajg/form v1.7.1/go.mod h1:HL757PzLyNkj5AIfptT6L+iGNeXTlnrr/oDePGc/y7Q= github.com/alexedwards/argon2id v1.0.0 h1:wJzDx66hqWX7siL/SRUmgz3F8YMrd/nfX/xHHcQQP0w= github.com/alexedwards/argon2id v1.0.0/go.mod h1:tYKkqIjzXvZdzPvADMWOEZ+l6+BD6CtBXMj5fnJppiw= github.com/amoghe/go-crypt v0.0.0-20220222110647-20eada5f5964 h1:I9YN9WMo3SUh7p/4wKeNvD/IQla3U3SUa61U7ul+xM4= github.com/amoghe/go-crypt v0.0.0-20220222110647-20eada5f5964/go.mod h1:eFiR01PwTcpbzXtdMces7zxg6utvFM5puiWHpWB8D/k= -github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= -github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= -github.com/aws/aws-sdk-go-v2/config v1.27.13 h1:WbKW8hOzrWoOA/+35S5okqO/2Ap8hkkFUzoW8Hzq24A= -github.com/aws/aws-sdk-go-v2/config v1.27.13/go.mod h1:XLiyiTMnguytjRER7u5RIkhIqS8Nyz41SwAWb4xEjxs= -github.com/aws/aws-sdk-go-v2/credentials v1.17.13 h1:XDCJDzk/u5cN7Aple7D/MiAhx1Rjo/0nueJ0La8mRuE= -github.com/aws/aws-sdk-go-v2/credentials v1.17.13/go.mod h1:FMNcjQrmuBYvOTZDtOLCIu0esmxjF7RuA/89iSXWzQI= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 h1:FVJ0r5XTHSmIHJV6KuDmdYhEpvlHpiSd38RQWhut5J4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1/go.mod h1:zusuAeqezXzAB24LGuzuekqMAEgWkVYukBec3kr3jUg= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.17 h1:9b1Os1s11mF5qTIKLgSsyPG810di2+ySSLIIt9bwe9I= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.17/go.mod h1:9Wp7tDOMhv0+sb/FTRAkbHNQ7abYDnoJRzm5AAtCnTc= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.18 h1:fUHit8Pe+2dWEHtxpOVDTOSQR257iH24HjT17DAz6qs= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.18/go.mod h1:IX1n1o870YYxzqN56w26s7FrO5Zaw/hdatxhJDiEf2U= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 h1:81KE7vaZzrl7yHBYHVEzYB8sypz11NMOZ40YlWvPxsU= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5/go.mod h1:LIt2rg7Mcgn09Ygbdh/RdIm0rQ+3BNkbP1gyVMFtRK0= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 h1:ZMeFZ5yk+Ek+jNr1+uwCd2tG89t6oTS5yVWpa6yy2es= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7/go.mod h1:mxV05U+4JiHqIpGqqYXOHLPKUC6bDXC44bsUhNjOEwY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 h1:ogRAwT1/gxJBcSWDMZlgyFUM962F51A5CRhDLbxLdmo= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7/go.mod h1:YCsIZhXfRPLFFCl5xxY+1T9RKzOKjCut+28JSX2DnAk= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 h1:f9RyWNtS8oH7cZlbn+/JNPpjUk5+5fLd5lM9M0i49Ys= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5/go.mod h1:h5CoMZV2VF297/VLhRhO1WF+XYWOzXo+4HsObA4HjBQ= -github.com/aws/aws-sdk-go-v2/service/marketplacemetering v1.21.5 h1:p2PxN+OO28p2bCCXE79sJfFBaSohwxa24bQdjuyPZCs= -github.com/aws/aws-sdk-go-v2/service/marketplacemetering v1.21.5/go.mod h1:Q01yJLephuOzv6IYzcknrpVAriOqB66+qtGnpqgw9UE= -github.com/aws/aws-sdk-go-v2/service/s3 v1.53.2 h1:rq2hglTQM3yHZvOPVMtNvLS5x6hijx7JvRDgKiTNDGQ= -github.com/aws/aws-sdk-go-v2/service/s3 v1.53.2/go.mod h1:qmdkIIAC+GCLASF7R2whgNrJADz0QZPX+Seiw/i4S3o= -github.com/aws/aws-sdk-go-v2/service/s3 v1.54.0 h1:Ls94RY3P6HtB88JkzXo1lHrXzonHPpNR//OSAV63mSE= -github.com/aws/aws-sdk-go-v2/service/s3 v1.54.0/go.mod h1:qmdkIIAC+GCLASF7R2whgNrJADz0QZPX+Seiw/i4S3o= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.28.7 h1:4cziOtpDwtgcb+wTYRzz8C+GoH1XySy0p7j4oBbqPQE= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.28.7/go.mod h1:3Ba++UwWd154xtP4FRX5pUK3Gt4up5sDHCve6kVfE+g= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.6 h1:o5cTaeunSpfXiLTIBx5xo2enQmiChtu1IBbzXnfU9Hs= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.6/go.mod h1:qGzynb/msuZIE8I75DVRCUXw3o3ZyBmUvMwQ2t/BrGM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.0 h1:Qe0r0lVURDDeBQJ4yP+BOrJkvkiCo/3FH/t+wY11dmw= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.0/go.mod h1:mUYPBhaF2lGiukDEjJX2BLRRKTmoUSitGDUgM4tRxak= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.7 h1:et3Ta53gotFR4ERLXXHIHl/Uuk1qYpP5uU7cvNql8ns= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.7/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/aws/aws-sdk-go-v2 v1.41.3 h1:4kQ/fa22KjDt13QCy1+bYADvdgcxpfH18f0zP542kZA= +github.com/aws/aws-sdk-go-v2 v1.41.3/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.6 h1:N4lRUXZpZ1KVEUn6hxtco/1d2lgYhNn1fHkkl8WhlyQ= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.6/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= +github.com/aws/aws-sdk-go-v2/config v1.32.11 h1:ftxI5sgz8jZkckuUHXfC/wMUc8u3fG1vQS0plr2F2Zs= +github.com/aws/aws-sdk-go-v2/config v1.32.11/go.mod h1:twF11+6ps9aNRKEDimksp923o44w/Thk9+8YIlzWMmo= +github.com/aws/aws-sdk-go-v2/credentials v1.19.11 h1:NdV8cwCcAXrCWyxArt58BrvZJ9pZ9Fhf9w6Uh5W3Uyc= +github.com/aws/aws-sdk-go-v2/credentials v1.19.11/go.mod h1:30yY2zqkMPdrvxBqzI9xQCM+WrlrZKSOpSJEsylVU+8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.19 h1:INUvJxmhdEbVulJYHI061k4TVuS3jzzthNvjqvVvTKM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.19/go.mod h1:FpZN2QISLdEBWkayloda+sZjVJL+e9Gl0k1SyTgcswU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19 h1:/sECfyq2JTifMI2JPyZ4bdRN77zJmr6SrS1eL3augIA= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19/go.mod h1:dMf8A5oAqr9/oxOfLkC/c2LU/uMcALP0Rgn2BD5LWn0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19 h1:AWeJMk33GTBf6J20XJe6qZoRSJo0WfUhsMdUKhoODXE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19/go.mod h1:+GWrYoaAsV7/4pNHpwh1kiNLXkKaSoppxQq9lbH8Ejw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.5 h1:clHU5fm//kWS1C2HgtgWxfQbFbx4b6rx+5jzhgX9HrI= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.5/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.20 h1:qi3e/dmpdONhj1RyIZdi6DKKpDXS5Lb8ftr3p7cyHJc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.20/go.mod h1:V1K+TeJVD5JOk3D9e5tsX2KUdL7BlB+FV6cBhdobN8c= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6 h1:XAq62tBTJP/85lFD5oqOOe7YYgWxY9LvWq8plyDvDVg= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.11 h1:BYf7XNsJMzl4mObARUBUib+j2tf0U//JAAtTnYqvqCw= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.11/go.mod h1:aEUS4WrNk/+FxkBZZa7tVgp4pGH+kFGW40Y8rCPqt5g= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19 h1:X1Tow7suZk9UCJHE1Iw9GMZJJl0dAnKXXP1NaSDHwmw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19/go.mod h1:/rARO8psX+4sfjUQXp5LLifjUt8DuATZ31WptNJTyQA= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.19 h1:JnQeStZvPHFHeyky/7LbMlyQjUa+jIBj36OlWm0pzIk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.19/go.mod h1:HGyasyHvYdFQeJhvDHfH7HXkHh57htcJGKDZ+7z+I24= +github.com/aws/aws-sdk-go-v2/service/s3 v1.96.4 h1:4ExZyubQ6LQQVuF2Qp9OsfEvsTdAWh5Gfwf6PgIdLdk= +github.com/aws/aws-sdk-go-v2/service/s3 v1.96.4/go.mod h1:NF3JcMGOiARAss1ld3WGORCw71+4ExDD2cbbdKS5PpA= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.7 h1:Y2cAXlClHsXkkOvWZFXATr34b0hxxloeQu/pAZz2row= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.7/go.mod h1:idzZ7gmDeqeNrSPkdbtMp9qWMgcBwykA7P7Rzh5DXVU= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.12 h1:iSsvB9EtQ09YrsmIc44Heqlx5ByGErqhPK1ZQLppias= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.12/go.mod h1:fEWYKTRGoZNl8tZ77i61/ccwOMJdGxwOhWCkp6TXAr0= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.16 h1:EnUdUqRP1CNzt2DkV67tJx6XDN4xlfBFm+bzeNOQVb0= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.16/go.mod h1:Jic/xv0Rq/pFNCh3WwpH4BEqdbSAl+IyHro8LbibHD8= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.8 h1:XQTQTF75vnug2TXS8m7CVJfC2nniYPZnO1D4Np761Oo= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.8/go.mod h1:Xgx+PR1NUOjNmQY+tRMnouRp83JRM8pRMw/vCaVhPkI= +github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= +github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= -github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/bmatcuk/doublestar/v4 v4.10.0 h1:zU9WiOla1YA122oLM6i4EXvGW62DvKZVxIe6TYWexEs= +github.com/bmatcuk/doublestar/v4 v4.10.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= -github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= -github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/boombuler/barcode v1.1.0 h1:ChaYjBR63fr4LFyGn8E8nt7dBSt3MiU3zMOZqFvVkHo= +github.com/boombuler/barcode v1.1.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw= +github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cockroachdb/cockroach-go/v2 v2.3.8 h1:53yoUo4+EtrC1NrAEgnnad4AS3ntNvGup1PAXZ7UmpE= -github.com/cockroachdb/cockroach-go/v2 v2.3.8/go.mod h1:9uH5jK4yQ3ZQUT9IXe4I2fHzMIF5+JC/oOdzTRgJYJk= -github.com/coreos/go-oidc/v3 v3.10.0 h1:tDnXHnLyiTVyT/2zLDGj09pFPkhND8Gl8lnTRhoEaJU= -github.com/coreos/go-oidc/v3 v3.10.0/go.mod h1:5j11xcw0D3+SGxn6Z/WFADsgcWVMyNAlSQupk0KK3ac= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= +github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= +github.com/cockroachdb/cockroach-go/v2 v2.4.3 h1:LJO3K3jC5WXvMePRQSJE1NsIGoFGcEx1LW83W6RAlhw= +github.com/cockroachdb/cockroach-go/v2 v2.4.3/go.mod h1:9U179XbCx4qFWtNhc7BiWLPfuyMVQ7qdAhfrwLz1vH0= +github.com/coreos/go-oidc/v3 v3.17.0 h1:hWBGaQfbi0iVviX4ibC7bk8OKT5qNr4klBaCHVNvehc= +github.com/coreos/go-oidc/v3 v3.17.0/go.mod h1:wqPbKFrVnE90vty060SB40FCJ8fTHTxSwyXJqZH+sI8= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/drakkan/cron/v3 v3.0.0-20230222140221-217a1e4d96c0 h1:EW9gIJRmt9lzk66Fhh4S8VEtURA6QHZqGeSRE9Nb2/U= github.com/drakkan/cron/v3 v3.0.0-20230222140221-217a1e4d96c0/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -github.com/drakkan/crypto v0.0.0-20240509175024-33071fb6437f h1:4+0I7deWH0/8dTS1xVgFrNSq7aaNvKrfaqLlfFBNV64= -github.com/drakkan/crypto v0.0.0-20240509175024-33071fb6437f/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= github.com/drakkan/ftp v0.0.0-20240430173938-7ba8270c8e7f h1:S9JUlrOzjK58UKoLqqb40YLyVlt0bcIFtYrvnanV3zc= github.com/drakkan/ftp v0.0.0-20240430173938-7ba8270c8e7f/go.mod h1:4p8lUl4vQ80L598CygL+3IFtm+3nggvvW/palOlViwE= -github.com/drakkan/ftpserverlib v0.0.0-20240510125431-4617586dfa1c h1:cO3eqB2Bjv8WM8HUDfajAt3bFFGj6FUQ2eIxsxVvyC8= -github.com/drakkan/ftpserverlib v0.0.0-20240510125431-4617586dfa1c/go.mod h1:+9afJRWESpCq4/O8Vr00Q2jfinRxP6PiCpXph6CgGuc= -github.com/drakkan/webdav v0.0.0-20240503091431-218ec83910bb h1:067/Uo8cfeY7QC0yzWCr/RImuNcM0rLWAsBUyMks59o= -github.com/drakkan/webdav v0.0.0-20240503091431-218ec83910bb/go.mod h1:zOVb1QDhwwqWn2L2qZ0U3swMSO4GTSNyIwXCGO/UGWE= -github.com/eikenb/pipeat v0.0.0-20210730190139-06b3e6902001 h1:/ZshrfQzayqRSBDodmp3rhNCHJCff+utvgBuWRbiqu4= -github.com/eikenb/pipeat v0.0.0-20210730190139-06b3e6902001/go.mod h1:kltMsfRMTHSFdMbK66XdS8mfMW77+FZA1fGY1xYMF84= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/drakkan/webdav v0.0.0-20241026165615-b8b8f74ae71b h1:Y1tLiQ8fnxM5f3wiBjAXsHzHNwiY9BR+mXZA75nZwrs= +github.com/drakkan/webdav v0.0.0-20241026165615-b8b8f74ae71b/go.mod h1:zOVb1QDhwwqWn2L2qZ0U3swMSO4GTSNyIwXCGO/UGWE= +github.com/eikenb/pipeat v0.0.0-20251030185646-385cd3c3e07b h1:G2Mm3YhlyjkFrNnvu5E6LtNcPJtggXL1i5ekDV4hDD4= +github.com/eikenb/pipeat v0.0.0-20251030185646-385cd3c3e07b/go.mod h1:XccPiThW83W5pzeOCsJAylEUtWeH+3zQVwiO402FXXc= +github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= +github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= +github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= +github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= +github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= +github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= -github.com/fclairamb/go-log v0.5.0 h1:Gz9wSamEaA6lta4IU2cjJc2xSq5sV5VYSB5w/SUHhVc= -github.com/fclairamb/go-log v0.5.0/go.mod h1:XoRO1dYezpsGmLLkZE9I+sHqpqY65p8JA+Vqblb7k40= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/fclairamb/ftpserverlib v0.30.0 h1:caB9sDn1Au//q0j2ev/icPn388qPuk4k1ajSvglDcMQ= +github.com/fclairamb/ftpserverlib v0.30.0/go.mod h1:QmogtltTOgkihyKza0GNo37Mu4AEzbJ+sH6W9Y0MBIQ= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/go-acme/lego/v4 v4.16.1 h1:JxZ93s4KG0jL27rZ30UsIgxap6VGzKuREsSkkyzeoCQ= -github.com/go-acme/lego/v4 v4.16.1/go.mod h1:AVvwdPned/IWpD/ihHhMsKnveF7HHYAz/CmtXi7OZoE= -github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= -github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-chi/jwtauth/v5 v5.3.1 h1:1ePWrjVctvp1tyBq5b/2ER8Th/+RbYc7x4qNsc5rh5A= -github.com/go-chi/jwtauth/v5 v5.3.1/go.mod h1:6Fl2RRmWXs3tJYE1IQGX81FsPoGqDwq9c15j52R5q80= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/go-acme/lego/v4 v4.32.0 h1:z7Ss7aa1noabhKj+DBzhNCO2SM96xhE3b0ucVW3x8Tc= +github.com/go-acme/lego/v4 v4.32.0/go.mod h1:lI2fZNdgeM/ymf9xQ9YKbgZm6MeDuf91UrohMQE4DhI= +github.com/go-chi/chi/v5 v5.2.5 h1:Eg4myHZBjyvJmAFjFvWgrqDTXFyOzjj7YIm3L3mu6Ug= +github.com/go-chi/chi/v5 v5.2.5/go.mod h1:X7Gx4mteadT3eDOMTsXzmI4/rwUpOwBHLpAfupzFJP0= github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4= github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0= -github.com/go-jose/go-jose/v4 v4.0.2 h1:R3l3kkBds16bO7ZFAEEcofK0MkrAJt3jlJznWZG0nvk= -github.com/go-jose/go-jose/v4 v4.0.2/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= +github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= -github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo= +github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= +github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= +github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw= +github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0= +github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= +github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI= -github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw4Z96qg= -github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= +github.com/google/wire v0.7.0 h1:JxUKI6+CVBgCO2WToKy/nQk0sS+amI9z9EjVmdaocj4= +github.com/google/wire v0.7.0/go.mod h1:n6YbUQD9cPKTnHXEBN2DXlOp/mVADhVErcMFb0v3J18= +github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= +github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= +github.com/googleapis/gax-go/v2 v2.18.0 h1:jxP5Uuo3bxm3M6gGtV94P4lliVetoCB4Wk2x8QA86LI= +github.com/googleapis/gax-go/v2 v2.18.0/go.mod h1:uSzZN4a356eRG985CzJ3WfbFSpqkLTjsnhWGJR6EwrE= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -226,33 +202,28 @@ github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB1 github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-plugin v1.6.1 h1:P7MR2UP6gNKGPp+y7EZw2kOiq4IR9WiqLvp0XOsVdwI= -github.com/hashicorp/go-plugin v1.6.1/go.mod h1:XPHFku2tFo3o3QKFgSYo+cghcUhw1NA1hZyMK0PWAw0= -github.com/hashicorp/go-retryablehttp v0.7.6 h1:TwRYfx2z2C4cLbXmT8I5PgP/xmuqASDyiVuGYfs9GZM= -github.com/hashicorp/go-retryablehttp v0.7.6/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hashicorp/go-plugin v1.7.0 h1:YghfQH/0QmPNc/AZMTFE3ac8fipZyZECHdDPshfk+mA= +github.com/hashicorp/go-plugin v1.7.0/go.mod h1:BExt6KEaIYx804z8k4gRzRLEvxKVb+kn0NMcihqOqb8= +github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= +github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= +github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= +github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA= -github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= -github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= -github.com/jackc/puddle v1.3.0 h1:eHK/5clGOatcjX3oWGBO/MpxpbHzSwud5EWTSCI+MX0= -github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= -github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= -github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.8.0 h1:TYPDoleBBme0xGSAX3/+NujXXtpZn9HBONkQC7IEZSo= +github.com/jackc/pgx/v5 v5.8.0/go.mod h1:QVeDInX2m9VyzvNeiCJVjCkNFqzsNb43204HshNSZKw= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94= +github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8= +github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU= +github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k= +github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= +github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -261,217 +232,185 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lestrrat-go/blackmagic v1.0.2 h1:Cg2gVSc9h7sz9NOByczrbUvLopQmXrfFx//N+AkAr5k= -github.com/lestrrat-go/blackmagic v1.0.2/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= -github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= -github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= -github.com/lestrrat-go/httprc v1.0.5 h1:bsTfiH8xaKOJPrg1R+E3iE/AWZr/x0Phj9PBTG/OLUk= -github.com/lestrrat-go/httprc v1.0.5/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo= -github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= -github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= -github.com/lestrrat-go/jwx/v2 v2.0.21 h1:jAPKupy4uHgrHFEdjVjNkUgoBKtVDgrQPB/h55FHrR0= -github.com/lestrrat-go/jwx/v2 v2.0.21/go.mod h1:09mLW8zto6bWL9GbwnqAli+ArLf+5M33QLQPDggkUWM= -github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= -github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lithammer/shortuuid/v3 v3.0.7 h1:trX0KTHy4Pbwo/6ia8fscyHoGA+mf1jWbPJVuvyJQQ8= -github.com/lithammer/shortuuid/v3 v3.0.7/go.mod h1:vMk8ke37EmiewwolSO1NLW8vP4ZaKlRuDIi8tWWmAts= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lufia/plan9stats v0.0.0-20240513124658-fba389f38bae h1:dIZY4ULFcto4tAFlj1FYZl8ztUZ13bdq+PLY+NOfbyI= -github.com/lufia/plan9stats v0.0.0-20240513124658-fba389f38bae/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/lithammer/shortuuid/v4 v4.2.0 h1:LMFOzVB3996a7b8aBuEXxqOBflbfPQAiVzkIcHO0h8c= +github.com/lithammer/shortuuid/v4 v4.2.0/go.mod h1:D5noHZ2oFw/YaKCfGy0YxyE7M0wMbezmMjPdhyEFe6Y= +github.com/lufia/plan9stats v0.0.0-20260216142805-b3301c5f2a88 h1:PTw+yKnXcOFCR6+8hHTyWBeQ/P4Nb7dd4/0ohEcWQuM= +github.com/lufia/plan9stats v0.0.0-20260216142805-b3301c5f2a88/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= -github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/mattn/go-sqlite3 v1.14.34 h1:3NtcvcUnFBPsuRcno8pUtupspG/GM+9nZ88zgJcp6Zk= +github.com/mattn/go-sqlite3 v1.14.34/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mhale/smtpd v0.8.3 h1:8j8YNXajksoSLZja3HdwvYVZPuJSqAxFsib3adzRRt8= github.com/mhale/smtpd v0.8.3/go.mod h1:MQl+y2hwIEQCXtNhe5+55n0GZOjSmeqORDIXbqUL3x4= -github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= -github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= -github.com/minio/sio v0.3.1 h1:d59r5RTHb1OsQaSl1EaTWurzMMDRLA5fgNmjzD4eVu4= -github.com/minio/sio v0.3.1/go.mod h1:S0ovgVgc+sTlQyhiXA1ppBLv7REM7TYi5yyq2qL/Y6o= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= -github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= -github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= -github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= -github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks= -github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= -github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= -github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= -github.com/pires/go-proxyproto v0.7.0 h1:IukmRewDQFWC7kfnb66CSomk2q/seBuilHBYFwyq0Hs= -github.com/pires/go-proxyproto v0.7.0/go.mod h1:Vz/1JPY/OACxWGQNIRY2BeyDmpoaWmEP40O9LbuiFR4= +github.com/miekg/dns v1.1.72 h1:vhmr+TF2A3tuoGNkLDFK9zi36F2LS+hKTRW0Uf8kbzI= +github.com/miekg/dns v1.1.72/go.mod h1:+EuEPhdHOsfk6Wk5TT2CzssZdqkmFhf8r+aVyDEToIs= +github.com/minio/sio v0.4.3 h1:JqyID1XM86KwBZox5RAdLD4MLPIDoCY2cke2CXCJCkg= +github.com/minio/sio v0.4.3/go.mod h1:4ANoe4CCXqnt1FCiLM0+vlBUhhWZzVOhYCz0069KtFc= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/oklog/run v1.2.0 h1:O8x3yXwah4A73hJdlrwo/2X6J62gE5qTMusH0dvz60E= +github.com/oklog/run v1.2.0/go.mod h1:mgDbKRSwPhJfesJ4PntqFUbKQRZ50NgmZTSPlFA0YFk= +github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8= +github.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I= +github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= +github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pires/go-proxyproto v0.11.0 h1:gUQpS85X/VJMdUsYyEgyn59uLJvGqPhJV5YvG68wXH4= +github.com/pires/go-proxyproto v0.11.0/go.mod h1:ZKAAyp3cgy5Y5Mo4n9AlScrkCZwUy0g3Jf+slqQVcuU= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.7-0.20240410063531-637088883317 h1:kupFhKi4R3XqKmUmqGSHWn/WZbC9CnwSoW421tL1gGw= -github.com/pkg/sftp v1.13.7-0.20240410063531-637088883317/go.mod h1:KMKI0t3T6hfA+lTR/ssZdunHo+uwq7ghoN09/FSu3DY= +github.com/pkg/sftp v1.13.10 h1:+5FbKNTe5Z9aspU88DPIKJ9z2KZoaGCu6Sr6kKR/5mU= +github.com/pkg/sftp v1.13.10/go.mod h1:bJ1a7uDhrX/4OII+agvy28lzRvQrmIQuaHrcI1HbeGA= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/pquerna/otp v1.4.0 h1:wZvl1TIVxKRThZIBiwOOHOGP/1+nZyWBil9Y2XNEDzg= -github.com/pquerna/otp v1.4.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= -github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= -github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= -github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= -github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/pquerna/otp v1.5.0 h1:NMMR+WrmaqXU4EzdGJEE1aUUI0AMRzsp96fFFWNPwxs= +github.com/pquerna/otp v1.5.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= +github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= +github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= +github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= -github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= -github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= -github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4= +github.com/sagikazarmark/locafero v0.12.0/go.mod h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI= github.com/secsy/goftp v0.0.0-20200609142545-aa2de14babf4 h1:PT+ElG/UUFMfqy5HrxJxNzj3QBOf7dZwupeVC+mG1Lo= github.com/secsy/goftp v0.0.0-20200609142545-aa2de14babf4/go.mod h1:MnkX001NG75g3p8bhFycnyIjeQoOjGL6CEIsdE/nKSY= -github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= -github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= -github.com/sftpgo/sdk v0.1.7 h1:lzOKBDnKb1PpSMlskqCPxBYKxVWz34uMBhT78r/13iA= -github.com/sftpgo/sdk v0.1.7/go.mod h1:ler/KG6kMLlsOs/8s6dVN3oom+z+NkbXBVWO//Cv/WA= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= -github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= -github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= +github.com/sftpgo/sdk v0.1.9 h1:onBWfibCt34xHeKC2KFYPZ1DBqXGl9um/cAw+AVdgzY= +github.com/sftpgo/sdk v0.1.9/go.mod h1:ehimvlTP+XTEiE3t1CPwWx9n7+6A6OGvMGlZ7ouvKFk= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= +github.com/shoenig/go-m1cpu v0.2.0 h1:t4GNqvPZ84Vjtpboo/kT3pIkbaK3vc+JIlD/Wz1zSFY= +github.com/shoenig/go-m1cpu v0.2.0/go.mod h1:KkDOw6m3ZJQAPHbrzkZki4hnx+pDRR1Lo+ldA56wD5w= +github.com/shoenig/test v1.7.0 h1:eWcHtTXa6QLnBvm0jgEabMRN/uJ4DMV3M8xUGgRkZmk= +github.com/shoenig/test v1.7.0/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= +github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= +github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= +github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/studio-b12/gowebdav v0.9.0 h1:1j1sc9gQnNxbXXM4M/CebPOX4aXYtr7MojAVcN4dHjU= -github.com/studio-b12/gowebdav v0.9.0/go.mod h1:bHA7t77X/QFExdeAnDzK6vKM34kEZAcE1OX4MfiwjkE= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/studio-b12/gowebdav v0.12.0 h1:kFRtQECt8jmVAvA6RHBz3geXUGJHUZA6/IKpOVUs5kM= +github.com/studio-b12/gowebdav v0.12.0/go.mod h1:bHA7t77X/QFExdeAnDzK6vKM34kEZAcE1OX4MfiwjkE= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= -github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= -github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= -github.com/unrolled/secure v1.14.0 h1:u9vJTU/pR4Bny0ntLUMxdfLtmIRGvQf2sEFuA0TG9AE= -github.com/unrolled/secure v1.14.0/go.mod h1:BmF5hyM6tXczk3MpQkFf1hpKSRqCyhqcbiQtiAF7+40= +github.com/tklauser/go-sysconf v0.3.16 h1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA= +github.com/tklauser/go-sysconf v0.3.16/go.mod h1:/qNL9xxDhc7tx3HSRsLWNnuzbVfh3e7gh/BmM179nYI= +github.com/tklauser/numcpus v0.11.0 h1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw= +github.com/tklauser/numcpus v0.11.0/go.mod h1:z+LwcLq54uWZTX0u/bGobaV34u6V7KNlTZejzM6/3MQ= +github.com/unrolled/secure v1.17.0 h1:Io7ifFgo99Bnh0J7+Q+qcMzWM6kaDPCA5FroFZEdbWU= +github.com/unrolled/secure v1.17.0/go.mod h1:BmF5hyM6tXczk3MpQkFf1hpKSRqCyhqcbiQtiAF7+40= github.com/wagslane/go-password-validator v0.3.0 h1:vfxOPzGHkz5S146HDpavl0cw1DSVP061Ry2PX0/ON6I= github.com/wagslane/go-password-validator v0.3.0/go.mod h1:TI1XJ6T5fRdRnHqHt14pvy1tNVnrwe7m3/f1f2fDphQ= -github.com/wneessen/go-mail v0.4.1 h1:m2rSg/sc8FZQCdtrV5M8ymHYOFrC6KJAQAIcgrXvqoo= -github.com/wneessen/go-mail v0.4.1/go.mod h1:zxOlafWCP/r6FEhAaRgH4IC1vg2YXxO0Nar9u0IScZ8= +github.com/wneessen/go-mail v0.7.2 h1:xxPnhZ6IZLSgxShebmZ6DPKh1b6OJcoHfzy7UjOkzS8= +github.com/wneessen/go-mail v0.7.2/go.mod h1:+TkW6QP3EVkgTEqHtVmnAE/1MRhmzb8Y9/W3pweuS+k= github.com/yl2chen/cidranger v1.0.3-0.20210928021809-d1cb2c52f37a h1:XfF01GyP+0eWCaVp0y6rNN+kFp7pt9Da4UUYrJ5XPWA= github.com/yl2chen/cidranger v1.0.3-0.20210928021809-d1cb2c52f37a/go.mod h1:aXb8yZQEWo1XHGMf1qQfnb83GR/EJ2EBlwtUgAaNBoE= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= -go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.51.0 h1:A3SayB3rNyt+1S6qpI9mHPkeHTZbD7XILEqWnYZb2l0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.51.0/go.mod h1:27iA5uvhuRNmalO+iEUdVn5ZMj2qy10Mm+XRIpRmyuU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0 h1:Xs2Ncz0gNihqu9iosIZ5SkBbWo5T8JhhLJFMQL1qmLI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0/go.mod h1:vy+2G/6NvVMpwGX/NyLqcC41fxepnuKHk16E6IZUcJc= -go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= -go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= -go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30= -go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA= -go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= -go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= -go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -gocloud.dev v0.37.0 h1:XF1rN6R0qZI/9DYjN16Uy0durAmSlf58DHOcb28GPro= -gocloud.dev v0.37.0/go.mod h1:7/O4kqdInCNsc6LqgmuFnS0GRew4XNNYWpA44yQnwco= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +go.etcd.io/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo= +go.etcd.io/bbolt v1.4.3/go.mod h1:tKQlpPaYCVFctUIgFKFnAlvbmB3tpy1vkTnDWohtc0E= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/detectors/gcp v1.42.0 h1:kpt2PEJuOuqYkPcktfJqWWDjTEd/FNgrxcniL7kQrXQ= +go.opentelemetry.io/contrib/detectors/gcp v1.42.0/go.mod h1:W9zQ439utxymRrXsUOzZbFX4JhLxXU4+ZnCt8GG7yA8= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 h1:yI1/OhfEPy7J9eoa6Sj051C7n5dvpj0QX8g4sRchg04= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= +go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= +go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.39.0 h1:5gn2urDL/FBnK8OkCfD1j3/ER79rUuTYmCvlXBKeYL8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.39.0/go.mod h1:0fBG6ZJxhqByfFZDwSwpZGzJU671HkwpWaNe2t4VUPI= +go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= +go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= +go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= +go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= +go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= +go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= +go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= +go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= +go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +gocloud.dev v0.45.0 h1:WknIK8IbRdmynDvara3Q7G6wQhmEiOGwpgJufbM39sY= +gocloud.dev v0.45.0/go.mod h1:0kXKmkCLG6d31N7NyLZWzt7jDSQura9zD/mWgiB6THI= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI= +golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210601080250-7ecdf8ef093b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -483,86 +422,56 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= +golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= +golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/api v0.180.0 h1:M2D87Yo0rGBPWpo1orwfCLehUUL6E7/TYe5gvMQWDh4= -google.golang.org/api v0.180.0/go.mod h1:51AiyoEg1MJPSZ9zvklA8VnRILPXxn1iVen9v25XHAE= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20240513163218-0867130af1f8 h1:XpH03M6PDRKTo1oGfZBXu2SzwcbfxUokgobVinuUZoU= -google.golang.org/genproto v0.0.0-20240513163218-0867130af1f8/go.mod h1:OLh2Ylz+WlYAJaSBRpJIJLP8iQP+8da+fpxbwNEAV/o= -google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 h1:W5Xj/70xIA4x60O/IFyXivR5MGqblAb8R3w26pnD6No= -google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8/go.mod h1:vPrPUTsDCYxXWjP7clS81mZ6/803D8K4iM9Ma27VKas= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 h1:mxSlqyb8ZAHsYDCfiXN1EDdNTdvjUJSLY+OnAUtYNYA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/api v0.271.0 h1:cIPN4qcUc61jlh7oXu6pwOQqbJW2GqYh5PS6rB2C/JY= +google.golang.org/api v0.271.0/go.mod h1:CGT29bhwkbF+i11qkRUJb2KMKqcJ1hdFceEIRd9u64Q= +google.golang.org/genproto v0.0.0-20260311181403-84a4fc48630c h1:ZhFDeBMmFc/4g8/GwxnJ4rzB3O4GwQVNr+8Mh7Y5z4g= +google.golang.org/genproto v0.0.0-20260311181403-84a4fc48630c/go.mod h1:hf4r/rBuzaTkLUWRO03771Xvcs6P5hwdQK3UUEJjqo0= +google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c h1:OyQPd6I3pN/9gDxz6L13kYGJgqkpdrAohJRBeXyxlgI= +google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c/go.mod h1:X2gu9Qwng7Nn009s/r3RUxqkzQNqOrAy79bluY7ojIg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c h1:xgCzyF2LFIO/0X2UAoVRiXKU5Xg6VjToG4i2/ecSswk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.79.2 h1:fRMD94s2tITpyJGtBBn7MkMseNpOZU8ZxgC3MMBaXRU= +google.golang.org/grpc v1.79.2/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/img/logo.png b/img/logo.png index 0c320ff7..81b1f94b 100644 Binary files a/img/logo.png and b/img/logo.png differ diff --git a/img/reui.png b/img/reui.png new file mode 100644 index 00000000..20973803 Binary files /dev/null and b/img/reui.png differ diff --git a/img/servinga.png b/img/servinga.png new file mode 100644 index 00000000..c5ccb638 Binary files /dev/null and b/img/servinga.png differ diff --git a/img/vps2day.png b/img/vps2day.png deleted file mode 100644 index faddcf15..00000000 Binary files a/img/vps2day.png and /dev/null differ diff --git a/init/sftpgo b/init/sftpgo new file mode 100755 index 00000000..6da97d15 --- /dev/null +++ b/init/sftpgo @@ -0,0 +1,102 @@ +#! /bin/sh + +### BEGIN INIT INFO +# Provides: SFTPGo +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: +# Short-Description: SFTPGo server +### END INIT INFO + +set -e + +# /etc/init.d/sftpgo: start and stop the SFTPGo "server" daemon + +SFTPGO_USER="sftpgo" +SFTPGO_GROUP="sftpgo" +SFTPGO_BIN_NAME="sftpgo" +SFTPGO_BIN="/usr/bin/sftpgo" +SFTPGO_PID="/run/sftpgo.pid" +SFTPGO_CONF_DIR="/etc/sftpgo" +SFTPGO_CONF_FILE="sftpgo.json" +SFTPGO_OPTS="serve -c $SFTPGO_CONF_DIR --config-file $SFTPGO_CONF_FILE" + +umask 022 + +test -x $SFTPGO_BIN || exit 0 + + +if test -f /etc/default/$SFTPGO_BIN_NAME; then + . /etc/default/$SFTPGO_BIN_NAME +fi + +. /lib/lsb/init-functions + +if [ -n "$2" ]; then + SFTPGO_OPTS="$SFTPGO_OPTS $2" +fi + +# Are we running from init? +run_by_init() { + ([ "$previous" ] && [ "$runlevel" ]) || [ "$runlevel" = S ] +} + +check_dev_null() { + if [ ! -c /dev/null ]; then + if [ "$1" = log_end_msg ]; then + log_end_msg 1 || true + fi + if ! run_by_init; then + log_action_msg "/dev/null is not a character device!" || true + fi + exit 1 + fi +} + +write_pid() { + sleep 0.25 + echo $(/bin/pidof $SFTPGO_BIN_NAME) > $SFTPGO_PID +} + +export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" + +case "$1" in + start) + check_dev_null + log_daemon_msg "Starting SFTPGo server" "$SFTPGO_BIN_NAME" || true + if start-stop-daemon --start --background --quiet --oknodo --chuid $SFTPGO_USER:$SFTPGO_GROUP --pidfile $SFTPGO_PID --exec $SFTPGO_BIN -- $SFTPGO_OPTS; then + log_end_msg 0 || true + write_pid + else + log_end_msg 1 || true + fi + ;; + stop) + log_daemon_msg "Stopping SFTPGo server" "$SFTPGO_BIN_NAME" || true + if start-stop-daemon --stop --quiet --oknodo --pidfile $SFTPGO_PID --exec $SFTPGO_BIN; then + log_end_msg 0 || true + else + log_end_msg 1 || true + fi + ;; + + reload) + log_daemon_msg "Reloading SFTPGo server" "$SFTPGO_BIN_NAME" || true + if start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $SFTPGO_PID --exec $SFTPGO_BIN; then + log_end_msg 0 || true + else + log_end_msg 1 || true + fi + ;; + + status) + status_of_proc -p $SFTPGO_PID $SFTPGO_BIN $SFTPGO_BIN_NAME && exit 0 || exit $? + ;; + + *) + log_action_msg "Usage: /etc/init.d/$SFTPGO_BIN_NAME {start|stop|reload|status}" || true + exit 1 +esac + +exit 0 diff --git a/internal/acme/acme.go b/internal/acme/acme.go index 409ef260..6c4612e5 100644 --- a/internal/acme/acme.go +++ b/internal/acme/acme.go @@ -30,6 +30,7 @@ import ( "net/url" "os" "path/filepath" + "slices" "strconv" "strings" "time" @@ -43,6 +44,7 @@ import ( "github.com/go-acme/lego/v4/log" "github.com/go-acme/lego/v4/providers/http/webroot" "github.com/go-acme/lego/v4/registration" + "github.com/hashicorp/go-retryablehttp" "github.com/robfig/cron/v3" "github.com/drakkan/sftpgo/v2/internal/common" @@ -249,7 +251,7 @@ func (c *Configuration) Initialize(configDir string) error { if c.RenewDays < 1 { return fmt.Errorf("invalid number of days remaining before renewal: %d", c.RenewDays) } - if !util.Contains(supportedKeyTypes, c.KeyType) { + if !slices.Contains(supportedKeyTypes, c.KeyType) { return fmt.Errorf("invalid key type %q", c.KeyType) } caURL, err := url.Parse(c.CAEndpoint) @@ -489,7 +491,16 @@ func (c *Configuration) setup() (*account, *lego.Client, error) { config := lego.NewConfig(&account) config.CADirURL = c.CAEndpoint config.Certificate.KeyType = certcrypto.KeyType(c.KeyType) + config.Certificate.OverallRequestLimit = 6 config.UserAgent = version.GetServerVersion("/", false) + + retryClient := retryablehttp.NewClient() + retryClient.Logger = &logger.LeveledLogger{Sender: "RetryableHTTPClient"} + retryClient.RetryMax = 5 + retryClient.HTTPClient = config.HTTPClient + + config.HTTPClient = retryClient.StandardClient() + client, err := lego.NewClient(config) if err != nil { acmeLog(logger.LevelError, "unable to get ACME client: %v", err) @@ -557,6 +568,13 @@ func (c *Configuration) tryRecoverRegistration(privateKey crypto.PrivateKey) (*r config.CADirURL = c.CAEndpoint config.UserAgent = version.GetServerVersion("/", false) + retryClient := retryablehttp.NewClient() + retryClient.Logger = &logger.LeveledLogger{Sender: "RetryableHTTPClient"} + retryClient.RetryMax = 5 + retryClient.HTTPClient = config.HTTPClient + + config.HTTPClient = retryClient.StandardClient() + client, err := lego.NewClient(config) if err != nil { acmeLog(logger.LevelError, "unable to get the ACME client: %v", err) @@ -671,7 +689,7 @@ func (c *Configuration) notifyCertificateRenewal(domain string, err error) { params := common.EventParams{ Name: domain, Event: "Certificate renewal", - Timestamp: time.Now().UnixNano(), + Timestamp: time.Now(), } if err != nil { params.Status = 2 @@ -749,7 +767,7 @@ func (c *Configuration) renewCertificates() error { func isDomainValid(domain string) (string, bool) { isValid := false - for _, d := range strings.Split(domain, ",") { + for d := range strings.SplitSeq(domain, ",") { d = strings.TrimSpace(d) if d != "" { isValid = true @@ -767,7 +785,7 @@ func getDomains(domain string) []string { delimiter = " " } - for _, d := range strings.Split(domain, delimiter) { + for d := range strings.SplitSeq(domain, delimiter) { d = strings.TrimSpace(d) if d != "" { domains = append(domains, d) diff --git a/internal/bundle/bundle.go b/internal/bundle/bundle.go index 70934ace..077fb360 100644 --- a/internal/bundle/bundle.go +++ b/internal/bundle/bundle.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build bundle -// +build bundle package bundle diff --git a/internal/cmd/acme.go b/internal/cmd/acme.go index bce51598..e98cf515 100644 --- a/internal/cmd/acme.go +++ b/internal/cmd/acme.go @@ -24,6 +24,7 @@ import ( "github.com/drakkan/sftpgo/v2/internal/config" "github.com/drakkan/sftpgo/v2/internal/dataprovider" "github.com/drakkan/sftpgo/v2/internal/logger" + "github.com/drakkan/sftpgo/v2/internal/plugin" "github.com/drakkan/sftpgo/v2/internal/util" ) @@ -56,6 +57,15 @@ renewed by the SFTPGo service logger.ErrorToConsole("unable to initialize KMS: %v", err) os.Exit(1) } + if config.HasKMSPlugin() { + if err := plugin.Initialize(config.GetPluginsConfig(), "debug"); err != nil { + logger.ErrorToConsole("unable to initialize plugin system: %v", err) + os.Exit(1) + } + registerSignals() + defer plugin.Handler.Cleanup() + } + mfaConfig := config.GetMFAConfig() err = mfaConfig.Initialize() if err != nil { diff --git a/internal/cmd/awscontainer.go b/internal/cmd/awscontainer.go deleted file mode 100644 index 72deee90..00000000 --- a/internal/cmd/awscontainer.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (C) 2019 Nicola Murino -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, version 3. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -//go:build awscontainer -// +build awscontainer - -package cmd - -import ( - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -func addAWSContainerFlags(cmd *cobra.Command) { - viper.SetDefault("disable_aws_installation_code", false) - viper.BindEnv("disable_aws_installation_code", "SFTPGO_DISABLE_AWS_INSTALLATION_CODE") //nolint:errcheck - cmd.Flags().BoolVar(&disableAWSInstallationCode, "disable-aws-installation-code", viper.GetBool("disable_aws_installation_code"), - `Disable installation code for the AWS container. -This flag can be set using -SFTPGO_DISABLE_AWS_INSTALLATION_CODE env var too. -`) - viper.BindPFlag("disable_aws_installation_code", cmd.Flags().Lookup("disable-aws-installation-code")) //nolint:errcheck -} diff --git a/internal/cmd/initprovider.go b/internal/cmd/initprovider.go index c61ad228..8862d261 100644 --- a/internal/cmd/initprovider.go +++ b/internal/cmd/initprovider.go @@ -21,9 +21,11 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" + "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/config" "github.com/drakkan/sftpgo/v2/internal/dataprovider" "github.com/drakkan/sftpgo/v2/internal/logger" + "github.com/drakkan/sftpgo/v2/internal/plugin" "github.com/drakkan/sftpgo/v2/internal/service" "github.com/drakkan/sftpgo/v2/internal/util" ) @@ -65,6 +67,15 @@ Please take a look at the usage below to customize the options.`, logger.ErrorToConsole("Unable to initialize KMS: %v", err) os.Exit(1) } + if config.HasKMSPlugin() { + if err := plugin.Initialize(config.GetPluginsConfig(), "debug"); err != nil { + logger.ErrorToConsole("unable to initialize plugin system: %v", err) + os.Exit(1) + } + registerSignals() + defer plugin.Handler.Cleanup() + } + mfaConfig := config.GetMFAConfig() err = mfaConfig.Initialize() if err != nil { @@ -78,15 +89,20 @@ Please take a look at the usage below to customize the options.`, providerConf.Actions.ExecuteOn = nil logger.InfoToConsole("Initializing provider: %q config file: %q", providerConf.Driver, viper.ConfigFileUsed()) err = dataprovider.InitializeDatabase(providerConf, configDir) - if err == nil { + switch err { + case nil: logger.InfoToConsole("Data provider successfully initialized/updated") - } else if err == dataprovider.ErrNoInitRequired { + case dataprovider.ErrNoInitRequired: logger.InfoToConsole("%v", err.Error()) - } else { + default: logger.ErrorToConsole("Unable to initialize/update the data provider: %v", err) os.Exit(1) } if providerConf.Driver != dataprovider.MemoryDataProviderName && loadDataFrom != "" { + if err := common.Initialize(config.GetCommonConfig(), providerConf.GetShared()); err != nil { + logger.ErrorToConsole("%v", err) + os.Exit(1) + } service := service.Service{ LoadDataFrom: loadDataFrom, LoadDataMode: loadDataMode, diff --git a/internal/cmd/portable.go b/internal/cmd/portable.go index 0a39fb20..356371a9 100644 --- a/internal/cmd/portable.go +++ b/internal/cmd/portable.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build !noportable -// +build !noportable package cmd @@ -497,7 +496,7 @@ func getPatternsFilterValues(value string) (string, []string) { if len(dirExts) > 1 { dir := strings.TrimSpace(dirExts[0]) exts := []string{} - for _, e := range strings.Split(dirExts[1], ",") { + for e := range strings.SplitSeq(dirExts[1], ",") { cleanedExt := strings.TrimSpace(e) if cleanedExt != "" { exts = append(exts, cleanedExt) diff --git a/internal/cmd/portable_disabled.go b/internal/cmd/portable_disabled.go index 5e2b7974..f043ee7e 100644 --- a/internal/cmd/portable_disabled.go +++ b/internal/cmd/portable_disabled.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build noportable -// +build noportable package cmd diff --git a/internal/cmd/resetpwd.go b/internal/cmd/resetpwd.go index b46740af..eb009e31 100644 --- a/internal/cmd/resetpwd.go +++ b/internal/cmd/resetpwd.go @@ -27,6 +27,7 @@ import ( "github.com/drakkan/sftpgo/v2/internal/config" "github.com/drakkan/sftpgo/v2/internal/dataprovider" "github.com/drakkan/sftpgo/v2/internal/logger" + "github.com/drakkan/sftpgo/v2/internal/plugin" "github.com/drakkan/sftpgo/v2/internal/util" ) @@ -37,6 +38,7 @@ var ( Short: "Reset the password for the specified administrator", Long: `This command reads the data provider connection details from the specified configuration file and resets the password for the specified administrator. +Two-factor authentication is also disabled. This command is not supported for the memory provider. For embedded providers like bolt and SQLite you should stop the running SFTPGo instance to avoid database corruption. @@ -57,6 +59,15 @@ Please take a look at the usage below to customize the options.`, logger.ErrorToConsole("unable to initialize KMS: %v", err) os.Exit(1) } + if config.HasKMSPlugin() { + if err := plugin.Initialize(config.GetPluginsConfig(), "debug"); err != nil { + logger.ErrorToConsole("unable to initialize plugin system: %v", err) + os.Exit(1) + } + registerSignals() + defer plugin.Handler.Cleanup() + } + mfaConfig := config.GetMFAConfig() err = mfaConfig.Initialize() if err != nil { @@ -98,6 +109,7 @@ Please take a look at the usage below to customize the options.`, os.Exit(1) } admin.Password = string(pwd) + admin.Filters.TOTPConfig.Enabled = false if err := dataprovider.UpdateAdmin(&admin, dataprovider.ActionExecutorSystem, "", ""); err != nil { logger.ErrorToConsole("Unable to update password: %v", err) os.Exit(1) diff --git a/internal/cmd/revertprovider.go b/internal/cmd/revertprovider.go index 64de3529..09b8d1a8 100644 --- a/internal/cmd/revertprovider.go +++ b/internal/cmd/revertprovider.go @@ -24,6 +24,7 @@ import ( "github.com/drakkan/sftpgo/v2/internal/config" "github.com/drakkan/sftpgo/v2/internal/dataprovider" "github.com/drakkan/sftpgo/v2/internal/logger" + "github.com/drakkan/sftpgo/v2/internal/plugin" "github.com/drakkan/sftpgo/v2/internal/util" ) @@ -40,8 +41,8 @@ Please take a look at the usage below to customize the options.`, Run: func(_ *cobra.Command, _ []string) { logger.DisableLogger() logger.EnableConsoleLogger(zerolog.DebugLevel) - if revertProviderTargetVersion != 28 { - logger.WarnToConsole("Unsupported target version, 28 is the only supported one") + if revertProviderTargetVersion != 33 { + logger.WarnToConsole("Unsupported target version, 33 is the only supported one") os.Exit(1) } configDir = util.CleanDirInput(configDir) @@ -56,6 +57,21 @@ Please take a look at the usage below to customize the options.`, logger.ErrorToConsole("unable to initialize KMS: %v", err) os.Exit(1) } + if config.HasKMSPlugin() { + if err := plugin.Initialize(config.GetPluginsConfig(), "debug"); err != nil { + logger.ErrorToConsole("unable to initialize plugin system: %v", err) + os.Exit(1) + } + registerSignals() + defer plugin.Handler.Cleanup() + } + + mfaConfig := config.GetMFAConfig() + err = mfaConfig.Initialize() + if err != nil { + logger.ErrorToConsole("Unable to initialize MFA: %v", err) + os.Exit(1) + } providerConf := config.GetProviderConf() logger.InfoToConsole("Reverting provider: %q config file: %q target version %d", providerConf.Driver, viper.ConfigFileUsed(), revertProviderTargetVersion) @@ -71,7 +87,7 @@ Please take a look at the usage below to customize the options.`, func init() { addConfigFlags(revertProviderCmd) - revertProviderCmd.Flags().IntVar(&revertProviderTargetVersion, "to-version", 28, `28 means the version supported in v2.5.x`) + revertProviderCmd.Flags().IntVar(&revertProviderTargetVersion, "to-version", 33, `33 means the version supported in v2.7.x`) rootCmd.AddCommand(revertProviderCmd) } diff --git a/internal/cmd/root.go b/internal/cmd/root.go index ba96be58..00759236 100644 --- a/internal/cmd/root.go +++ b/internal/cmd/root.go @@ -85,8 +85,6 @@ var ( loadDataQuotaScan int loadDataClean bool graceTime int - // used if awscontainer build tag is enabled - disableAWSInstallationCode bool rootCmd = &cobra.Command{ Use: "sftpgo", diff --git a/internal/cmd/serve.go b/internal/cmd/serve.go index 2bc9e004..348fb834 100644 --- a/internal/cmd/serve.go +++ b/internal/cmd/serve.go @@ -16,13 +16,21 @@ package cmd import ( "os" + "path/filepath" + "strconv" + "strings" "github.com/spf13/cobra" + "github.com/subosito/gotenv" "github.com/drakkan/sftpgo/v2/internal/service" "github.com/drakkan/sftpgo/v2/internal/util" ) +const ( + envFileMaxSize = 1048576 +) + var ( serveCmd = &cobra.Command{ Use: "serve", @@ -34,9 +42,11 @@ $ sftpgo serve Please take a look at the usage below to customize the startup options`, Run: func(_ *cobra.Command, _ []string) { + configDir := util.CleanDirInput(configDir) + checkServeParamsFromEnvFiles(configDir) service.SetGraceTime(graceTime) service := service.Service{ - ConfigDir: util.CleanDirInput(configDir), + ConfigDir: configDir, ConfigFile: configFile, LogFilePath: logFilePath, LogMaxSize: logMaxSize, @@ -51,7 +61,7 @@ Please take a look at the usage below to customize the startup options`, LoadDataClean: loadDataClean, Shutdown: make(chan bool), } - if err := service.Start(disableAWSInstallationCode); err == nil { + if err := service.Start(); err == nil { service.Wait() if service.Error == nil { os.Exit(0) @@ -62,8 +72,76 @@ Please take a look at the usage below to customize the startup options`, } ) +func setIntFromEnv(receiver *int, val string) { + converted, err := strconv.Atoi(val) + if err == nil { + *receiver = converted + } +} + +func setBoolFromEnv(receiver *bool, val string) { + converted, err := strconv.ParseBool(strings.TrimSpace(val)) + if err == nil { + *receiver = converted + } +} + +func checkServeParamsFromEnvFiles(configDir string) { //nolint:gocyclo + // The logger is not yet initialized here, we have no way to report errors. + envd := filepath.Join(configDir, "env.d") + entries, err := os.ReadDir(envd) + if err != nil { + return + } + for _, entry := range entries { + info, err := entry.Info() + if err == nil && info.Mode().IsRegular() { + envFile := filepath.Join(envd, entry.Name()) + if info.Size() > envFileMaxSize { + continue + } + envVars, err := gotenv.Read(envFile) + if err != nil { + return + } + for k, v := range envVars { + if _, isSet := os.LookupEnv(k); isSet { + continue + } + switch k { + case "SFTPGO_LOG_FILE_PATH": + logFilePath = v + case "SFTPGO_LOG_MAX_SIZE": + setIntFromEnv(&logMaxSize, v) + case "SFTPGO_LOG_MAX_BACKUPS": + setIntFromEnv(&logMaxBackups, v) + case "SFTPGO_LOG_MAX_AGE": + setIntFromEnv(&logMaxAge, v) + case "SFTPGO_LOG_COMPRESS": + setBoolFromEnv(&logCompress, v) + case "SFTPGO_LOG_LEVEL": + logLevel = v + case "SFTPGO_LOG_UTC_TIME": + setBoolFromEnv(&logUTCTime, v) + case "SFTPGO_CONFIG_FILE": + configFile = v + case "SFTPGO_LOADDATA_FROM": + loadDataFrom = v + case "SFTPGO_LOADDATA_MODE": + setIntFromEnv(&loadDataMode, v) + case "SFTPGO_LOADDATA_CLEAN": + setBoolFromEnv(&loadDataClean, v) + case "SFTPGO_LOADDATA_QUOTA_SCAN": + setIntFromEnv(&loadDataQuotaScan, v) + case "SFTPGO_GRACE_TIME": + setIntFromEnv(&graceTime, v) + } + } + } + } +} + func init() { rootCmd.AddCommand(serveCmd) addServeFlags(serveCmd) - addAWSContainerFlags(serveCmd) } diff --git a/internal/sftpd/cmd_unix.go b/internal/cmd/signals_unix.go similarity index 58% rename from internal/sftpd/cmd_unix.go rename to internal/cmd/signals_unix.go index 1d0eaca4..91849b9a 100644 --- a/internal/sftpd/cmd_unix.go +++ b/internal/cmd/signals_unix.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019 Nicola Murino +// Copyright (C) 2025 Nicola Murino // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published @@ -13,26 +13,29 @@ // along with this program. If not, see . //go:build !windows -// +build !windows -package sftpd +package cmd import ( "os" - "os/exec" + "os/signal" "syscall" + + "github.com/drakkan/sftpgo/v2/internal/logger" + "github.com/drakkan/sftpgo/v2/internal/plugin" ) -var ( - processUID = os.Geteuid() - processGID = os.Getegid() -) - -func wrapCmd(cmd *exec.Cmd, uid, gid int) *exec.Cmd { - isCurrentUser := processUID == uid && processGID == gid - if (uid > 0 || gid > 0) && !isCurrentUser { - cmd.SysProcAttr = &syscall.SysProcAttr{} - cmd.SysProcAttr.Credential = &syscall.Credential{Uid: uint32(uid), Gid: uint32(gid)} - } - return cmd +func registerSignals() { + c := make(chan os.Signal, 1) + signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) + go func() { + for sig := range c { + switch sig { + case syscall.SIGINT, syscall.SIGTERM: + logger.DebugToConsole("Received interrupt request") + plugin.Handler.Cleanup() + os.Exit(0) + } + } + }() } diff --git a/internal/cmd/awscontainer_disabled.go b/internal/cmd/signals_windows.go similarity index 62% rename from internal/cmd/awscontainer_disabled.go rename to internal/cmd/signals_windows.go index 3dbd8599..3ea1e6ff 100644 --- a/internal/cmd/awscontainer_disabled.go +++ b/internal/cmd/signals_windows.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019 Nicola Murino +// Copyright (C) 2025 Nicola Murino // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published @@ -12,13 +12,25 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -//go:build !awscontainer -// +build !awscontainer - package cmd import ( - "github.com/spf13/cobra" + "os" + "os/signal" + + "github.com/drakkan/sftpgo/v2/internal/logger" + "github.com/drakkan/sftpgo/v2/internal/plugin" ) -func addAWSContainerFlags(_ *cobra.Command) {} +func registerSignals() { + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt) + + go func() { + for range c { + logger.DebugToConsole("Received interrupt request") + plugin.Handler.Cleanup() + os.Exit(0) + } + }() +} diff --git a/internal/cmd/start_windows.go b/internal/cmd/start_windows.go index be34dec2..5e4dde64 100644 --- a/internal/cmd/start_windows.go +++ b/internal/cmd/start_windows.go @@ -17,7 +17,6 @@ package cmd import ( "fmt" "os" - "path/filepath" "github.com/spf13/cobra" @@ -31,21 +30,23 @@ var ( Short: "Start the SFTPGo Windows Service", Run: func(_ *cobra.Command, _ []string) { configDir = util.CleanDirInput(configDir) - if !filepath.IsAbs(logFilePath) && util.IsFileInputValid(logFilePath) { - logFilePath = filepath.Join(configDir, logFilePath) - } + checkServeParamsFromEnvFiles(configDir) service.SetGraceTime(graceTime) s := service.Service{ - ConfigDir: configDir, - ConfigFile: configFile, - LogFilePath: logFilePath, - LogMaxSize: logMaxSize, - LogMaxBackups: logMaxBackups, - LogMaxAge: logMaxAge, - LogCompress: logCompress, - LogLevel: logLevel, - LogUTCTime: logUTCTime, - Shutdown: make(chan bool), + ConfigDir: configDir, + ConfigFile: configFile, + LogFilePath: logFilePath, + LogMaxSize: logMaxSize, + LogMaxBackups: logMaxBackups, + LogMaxAge: logMaxAge, + LogCompress: logCompress, + LogLevel: logLevel, + LogUTCTime: logUTCTime, + LoadDataFrom: loadDataFrom, + LoadDataMode: loadDataMode, + LoadDataQuotaScan: loadDataQuotaScan, + LoadDataClean: loadDataClean, + Shutdown: make(chan bool), } winService := service.WindowsService{ Service: s, diff --git a/internal/cmd/startsubsys.go b/internal/cmd/startsubsys.go deleted file mode 100644 index 322a62e2..00000000 --- a/internal/cmd/startsubsys.go +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright (C) 2019 Nicola Murino -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, version 3. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -package cmd - -import ( - "io" - "os" - "os/user" - "path/filepath" - - "github.com/rs/xid" - "github.com/rs/zerolog" - "github.com/spf13/cobra" - "github.com/spf13/viper" - - "github.com/drakkan/sftpgo/v2/internal/common" - "github.com/drakkan/sftpgo/v2/internal/config" - "github.com/drakkan/sftpgo/v2/internal/dataprovider" - "github.com/drakkan/sftpgo/v2/internal/logger" - "github.com/drakkan/sftpgo/v2/internal/plugin" - "github.com/drakkan/sftpgo/v2/internal/sftpd" - "github.com/drakkan/sftpgo/v2/internal/version" -) - -var ( - logJournalD = false - preserveHomeDir = false - baseHomeDir = "" - subsystemCmd = &cobra.Command{ - Use: "startsubsys", - Short: "Use sftpgo as SFTP file transfer subsystem", - Long: `In this mode SFTPGo speaks the server side of SFTP protocol to stdout and -expects client requests from stdin. -This mode is not intended to be called directly, but from sshd using the -Subsystem option. -For example adding a line like this one in "/etc/ssh/sshd_config": - -Subsystem sftp sftpgo startsubsys - -Command-line flags should be specified in the Subsystem declaration. -`, - Run: func(_ *cobra.Command, _ []string) { - logSender := "startsubsys" - connectionID := xid.New().String() - var zeroLogLevel zerolog.Level - switch logLevel { - case "info": - zeroLogLevel = zerolog.InfoLevel - case "warn": - zeroLogLevel = zerolog.WarnLevel - case "error": - zeroLogLevel = zerolog.ErrorLevel - default: - zeroLogLevel = zerolog.DebugLevel - } - logger.SetLogTime(logUTCTime) - if logJournalD { - logger.InitJournalDLogger(zeroLogLevel) - } else { - logger.InitStdErrLogger(zeroLogLevel) - } - osUser, err := user.Current() - if err != nil { - logger.Error(logSender, connectionID, "unable to get the current user: %v", err) - os.Exit(1) - } - username := osUser.Username - homedir := osUser.HomeDir - logger.Info(logSender, connectionID, "starting SFTPGo %v as subsystem, user %q home dir %q config dir %q base home dir %q", - version.Get(), username, homedir, configDir, baseHomeDir) - err = config.LoadConfig(configDir, configFile) - if err != nil { - logger.Error(logSender, connectionID, "unable to load configuration: %v", err) - os.Exit(1) - } - kmsConfig := config.GetKMSConfig() - if err := kmsConfig.Initialize(); err != nil { - logger.Error(logSender, connectionID, "unable to initialize KMS: %v", err) - os.Exit(1) - } - mfaConfig := config.GetMFAConfig() - err = mfaConfig.Initialize() - if err != nil { - logger.Error(logSender, "", "unable to initialize MFA: %v", err) - os.Exit(1) - } - dataProviderConf := config.GetProviderConf() - if dataProviderConf.Driver == dataprovider.SQLiteDataProviderName || dataProviderConf.Driver == dataprovider.BoltDataProviderName { - logger.Debug(logSender, connectionID, "data provider %q not supported in subsystem mode, using %q provider", - dataProviderConf.Driver, dataprovider.MemoryDataProviderName) - dataProviderConf.Driver = dataprovider.MemoryDataProviderName - dataProviderConf.Name = "" - } - config.SetProviderConf(dataProviderConf) - err = dataprovider.Initialize(dataProviderConf, configDir, false) - if err != nil { - logger.Error(logSender, connectionID, "unable to initialize the data provider: %v", err) - os.Exit(1) - } - if err := plugin.Initialize(config.GetPluginsConfig(), logLevel); err != nil { - logger.Error(logSender, connectionID, "unable to initialize plugin system: %v", err) - os.Exit(1) - } - smtpConfig := config.GetSMTPConfig() - err = smtpConfig.Initialize(configDir, false) - if err != nil { - logger.Error(logSender, connectionID, "unable to initialize SMTP configuration: %v", err) - os.Exit(1) - } - commonConfig := config.GetCommonConfig() - // idle connection are managed externally - commonConfig.IdleTimeout = 0 - config.SetCommonConfig(commonConfig) - if err := common.Initialize(config.GetCommonConfig(), dataProviderConf.GetShared()); err != nil { - logger.Error(logSender, connectionID, "%v", err) - os.Exit(1) - } - httpConfig := config.GetHTTPConfig() - if err := httpConfig.Initialize(configDir); err != nil { - logger.Error(logSender, connectionID, "unable to initialize http client: %v", err) - os.Exit(1) - } - commandConfig := config.GetCommandConfig() - if err := commandConfig.Initialize(); err != nil { - logger.Error(logSender, connectionID, "unable to initialize commands configuration: %v", err) - os.Exit(1) - } - user, err := dataprovider.UserExists(username, "") - if err == nil { - if user.HomeDir != filepath.Clean(homedir) && !preserveHomeDir { - // update the user - user.HomeDir = filepath.Clean(homedir) - err = dataprovider.UpdateUser(&user, dataprovider.ActionExecutorSystem, "", "") - if err != nil { - logger.Error(logSender, connectionID, "unable to update user %q: %v", username, err) - os.Exit(1) - } - } - } else { - user.Username = username - if baseHomeDir != "" && filepath.IsAbs(baseHomeDir) { - user.HomeDir = filepath.Join(baseHomeDir, username) - } else { - user.HomeDir = filepath.Clean(homedir) - } - logger.Debug(logSender, connectionID, "home dir for new user %q", user.HomeDir) - user.Password = connectionID - user.Permissions = make(map[string][]string) - user.Permissions["/"] = []string{dataprovider.PermAny} - err = dataprovider.AddUser(&user, dataprovider.ActionExecutorSystem, "", "") - if err != nil { - logger.Error(logSender, connectionID, "unable to add user %q: %v", username, err) - os.Exit(1) - } - } - err = user.LoadAndApplyGroupSettings() - if err != nil { - logger.Error(logSender, connectionID, "unable to apply group settings for user %q: %v", username, err) - os.Exit(1) - } - err = sftpd.ServeSubSystemConnection(&user, connectionID, os.Stdin, os.Stdout) - if err != nil && err != io.EOF { - logger.Warn(logSender, connectionID, "serving subsystem finished with error: %v", err) - os.Exit(1) - } - logger.Info(logSender, connectionID, "serving subsystem finished") - plugin.Handler.Cleanup() - os.Exit(0) - }, - } -) - -func init() { - subsystemCmd.Flags().BoolVarP(&preserveHomeDir, "preserve-home", "p", false, `If the user already exists, the existing home -directory will not be changed`) - subsystemCmd.Flags().StringVarP(&baseHomeDir, "base-home-dir", "d", "", `If the user does not exist specify an alternate -starting directory. The home directory for a new -user will be: - -[base-home-dir]/[username] - -base-home-dir must be an absolute path.`) - subsystemCmd.Flags().BoolVarP(&logJournalD, "log-to-journald", "j", false, `Send logs to journald. Only available on Linux. -Use: - -$ journalctl -o verbose -f - -To see full logs. -If not set, the logs will be sent to the standard -error`) - - addConfigFlags(subsystemCmd) - - viper.SetDefault(logLevelKey, defaultLogLevel) - viper.BindEnv(logLevelKey, "SFTPGO_LOG_LEVEL") //nolint:errcheck - subsystemCmd.Flags().StringVar(&logLevel, logLevelFlag, viper.GetString(logLevelKey), - `Set the log level. Supported values: - -debug, info, warn, error. - -This flag can be set -using SFTPGO_LOG_LEVEL env var too. -`) - viper.BindPFlag(logLevelKey, subsystemCmd.Flags().Lookup(logLevelFlag)) //nolint:errcheck - - viper.SetDefault(logUTCTimeKey, defaultLogUTCTime) - viper.BindEnv(logUTCTimeKey, "SFTPGO_LOG_UTC_TIME") //nolint:errcheck - subsystemCmd.Flags().BoolVar(&logUTCTime, logUTCTimeFlag, viper.GetBool(logUTCTimeKey), - `Use UTC time for logging. This flag can be set -using SFTPGO_LOG_UTC_TIME env var too. -`) - viper.BindPFlag(logUTCTimeKey, subsystemCmd.Flags().Lookup(logUTCTimeFlag)) //nolint:errcheck - - rootCmd.AddCommand(subsystemCmd) -} diff --git a/internal/command/command.go b/internal/command/command.go index b3d56aa3..512c2d4e 100644 --- a/internal/command/command.go +++ b/internal/command/command.go @@ -17,10 +17,9 @@ package command import ( "fmt" + "slices" "strings" "time" - - "github.com/drakkan/sftpgo/v2/internal/util" ) const ( @@ -36,7 +35,6 @@ const ( HookStartup = "startup" HookPostConnect = "post_connect" HookPostDisconnect = "post_disconnect" - HookDataRetention = "data_retention" HookCheckPassword = "check_password" HookPreLogin = "pre_login" HookPostLogin = "post_login" @@ -47,7 +45,7 @@ const ( var ( config Config supportedHooks = []string{HookFsActions, HookProviderActions, HookStartup, HookPostConnect, HookPostDisconnect, - HookDataRetention, HookCheckPassword, HookPreLogin, HookPostLogin, HookExternalAuth, HookKeyboardInteractive} + HookCheckPassword, HookPreLogin, HookPostLogin, HookExternalAuth, HookKeyboardInteractive} ) // Command define the configuration for a specific commands @@ -117,7 +115,7 @@ func (c Config) Initialize() error { } // don't validate args, we allow to pass empty arguments if cmd.Hook != "" { - if !util.Contains(supportedHooks, cmd.Hook) { + if !slices.Contains(supportedHooks, cmd.Hook) { return fmt.Errorf("invalid hook name %q, supported values: %+v", cmd.Hook, supportedHooks) } } diff --git a/internal/common/actions.go b/internal/common/actions.go index 446068c1..d6fd04b0 100644 --- a/internal/common/actions.go +++ b/internal/common/actions.go @@ -25,6 +25,7 @@ import ( "os/exec" "path" "path/filepath" + "slices" "strings" "sync/atomic" "time" @@ -37,7 +38,6 @@ import ( "github.com/drakkan/sftpgo/v2/internal/httpclient" "github.com/drakkan/sftpgo/v2/internal/logger" "github.com/drakkan/sftpgo/v2/internal/plugin" - "github.com/drakkan/sftpgo/v2/internal/util" ) var ( @@ -86,13 +86,14 @@ func InitializeActionHandler(handler ActionHandler) { func ExecutePreAction(conn *BaseConnection, operation, filePath, virtualPath string, fileSize int64, openFlags int) (int, error) { var event *notifier.FsEvent hasNotifiersPlugin := plugin.Handler.HasNotifiers() - hasHook := util.Contains(Config.Actions.ExecuteOn, operation) + hasHook := slices.Contains(Config.Actions.ExecuteOn, operation) hasRules := eventManager.hasFsRules() if !hasHook && !hasNotifiersPlugin && !hasRules { return 0, nil } + dateTime := time.Now() event = newActionNotification(&conn.User, operation, filePath, virtualPath, "", "", "", - conn.protocol, conn.GetRemoteIP(), conn.ID, fileSize, openFlags, conn.getNotificationStatus(nil), 0, nil) + conn.protocol, conn.GetRemoteIP(), conn.ID, fileSize, openFlags, conn.getNotificationStatus(nil), 0, dateTime, nil) if hasNotifiersPlugin { plugin.Handler.NotifyFsEvent(event) } @@ -112,7 +113,7 @@ func ExecutePreAction(conn *BaseConnection, operation, filePath, virtualPath str Protocol: event.Protocol, IP: event.IP, Role: event.Role, - Timestamp: event.Timestamp, + Timestamp: dateTime, Email: conn.User.Email, Object: nil, } @@ -132,13 +133,14 @@ func ExecuteActionNotification(conn *BaseConnection, operation, filePath, virtua fileSize int64, err error, elapsed int64, metadata map[string]string, ) error { hasNotifiersPlugin := plugin.Handler.HasNotifiers() - hasHook := util.Contains(Config.Actions.ExecuteOn, operation) + hasHook := slices.Contains(Config.Actions.ExecuteOn, operation) hasRules := eventManager.hasFsRules() if !hasHook && !hasNotifiersPlugin && !hasRules { return nil } + dateTime := time.Now() notification := newActionNotification(&conn.User, operation, filePath, virtualPath, target, virtualTarget, sshCmd, - conn.protocol, conn.GetRemoteIP(), conn.ID, fileSize, 0, conn.getNotificationStatus(err), elapsed, metadata) + conn.protocol, conn.GetRemoteIP(), conn.ID, fileSize, 0, conn.getNotificationStatus(err), elapsed, dateTime, metadata) if hasNotifiersPlugin { plugin.Handler.NotifyFsEvent(notification) } @@ -159,7 +161,7 @@ func ExecuteActionNotification(conn *BaseConnection, operation, filePath, virtua Protocol: notification.Protocol, IP: notification.IP, Role: notification.Role, - Timestamp: notification.Timestamp, + Timestamp: dateTime, Email: conn.User.Email, Object: nil, Metadata: metadata, @@ -173,7 +175,7 @@ func ExecuteActionNotification(conn *BaseConnection, operation, filePath, virtua } } if hasHook { - if util.Contains(Config.Actions.ExecuteSync, operation) { + if slices.Contains(Config.Actions.ExecuteSync, operation) { _, err := actionHandler.Handle(notification) return err } @@ -197,6 +199,7 @@ func newActionNotification( operation, filePath, virtualPath, target, virtualTarget, sshCmd, protocol, ip, sessionID string, fileSize int64, openFlags, status int, elapsed int64, + datetime time.Time, metadata map[string]string, ) *notifier.FsEvent { var bucket, endpoint string @@ -238,7 +241,7 @@ func newActionNotification( SessionID: sessionID, OpenFlags: openFlags, Role: user.Role, - Timestamp: time.Now().UnixNano(), + Timestamp: datetime.UnixNano(), Elapsed: elapsed, Metadata: metadata, } @@ -247,7 +250,7 @@ func newActionNotification( type defaultActionHandler struct{} func (h *defaultActionHandler) Handle(event *notifier.FsEvent) (int, error) { - if !util.Contains(Config.Actions.ExecuteOn, event.Action) { + if !slices.Contains(Config.Actions.ExecuteOn, event.Action) { return 0, nil } @@ -345,7 +348,7 @@ func notificationAsEnvVars(event *notifier.FsEvent) []string { if len(event.Metadata) > 0 { data, err := json.Marshal(event.Metadata) if err == nil { - result = append(result, fmt.Sprintf("SFTPGO_ACTION_METADATA=%s", util.BytesToString(data))) + result = append(result, fmt.Sprintf("SFTPGO_ACTION_METADATA=%s", data)) } } return result diff --git a/internal/common/actions_test.go b/internal/common/actions_test.go index 28eea408..6ac0463c 100644 --- a/internal/common/actions_test.go +++ b/internal/common/actions_test.go @@ -22,8 +22,9 @@ import ( "path/filepath" "runtime" "testing" + "time" - "github.com/lithammer/shortuuid/v3" + "github.com/lithammer/shortuuid/v4" "github.com/rs/xid" "github.com/sftpgo/sdk" "github.com/sftpgo/sdk/plugin/notifier" @@ -71,7 +72,7 @@ func TestNewActionNotification(t *testing.T) { c := NewBaseConnection("id", ProtocolSSH, "", "", user) sessionID := xid.New().String() a := newActionNotification(&user, operationDownload, "path", "vpath", "target", "", "", ProtocolSFTP, "", sessionID, - 123, 0, c.getNotificationStatus(errors.New("fake error")), 0, nil) + 123, 0, c.getNotificationStatus(errors.New("fake error")), 0, time.Now(), nil) assert.Equal(t, user.Username, a.Username) assert.Equal(t, 0, len(a.Bucket)) assert.Equal(t, 0, len(a.Endpoint)) @@ -79,38 +80,38 @@ func TestNewActionNotification(t *testing.T) { user.FsConfig.Provider = sdk.S3FilesystemProvider a = newActionNotification(&user, operationDownload, "path", "vpath", "target", "", "", ProtocolSSH, "", sessionID, - 123, 0, c.getNotificationStatus(nil), 0, nil) + 123, 0, c.getNotificationStatus(nil), 0, time.Now(), nil) assert.Equal(t, "s3bucket", a.Bucket) assert.Equal(t, "endpoint", a.Endpoint) assert.Equal(t, 1, a.Status) user.FsConfig.Provider = sdk.GCSFilesystemProvider a = newActionNotification(&user, operationDownload, "path", "vpath", "target", "", "", ProtocolSCP, "", sessionID, - 123, 0, c.getNotificationStatus(ErrQuotaExceeded), 0, nil) + 123, 0, c.getNotificationStatus(ErrQuotaExceeded), 0, time.Now(), nil) assert.Equal(t, "gcsbucket", a.Bucket) assert.Equal(t, 0, len(a.Endpoint)) assert.Equal(t, 3, a.Status) a = newActionNotification(&user, operationDownload, "path", "vpath", "target", "", "", ProtocolSCP, "", sessionID, - 123, 0, c.getNotificationStatus(fmt.Errorf("wrapper quota error: %w", ErrQuotaExceeded)), 0, nil) + 123, 0, c.getNotificationStatus(fmt.Errorf("wrapper quota error: %w", ErrQuotaExceeded)), 0, time.Now(), nil) assert.Equal(t, "gcsbucket", a.Bucket) assert.Equal(t, 0, len(a.Endpoint)) assert.Equal(t, 3, a.Status) user.FsConfig.Provider = sdk.HTTPFilesystemProvider a = newActionNotification(&user, operationDownload, "path", "vpath", "target", "", "", ProtocolSSH, "", sessionID, - 123, 0, c.getNotificationStatus(nil), 0, nil) + 123, 0, c.getNotificationStatus(nil), 0, time.Now(), nil) assert.Equal(t, "httpendpoint", a.Endpoint) assert.Equal(t, 1, a.Status) user.FsConfig.Provider = sdk.AzureBlobFilesystemProvider a = newActionNotification(&user, operationDownload, "path", "vpath", "target", "", "", ProtocolSCP, "", sessionID, - 123, 0, c.getNotificationStatus(nil), 0, nil) + 123, 0, c.getNotificationStatus(nil), 0, time.Now(), nil) assert.Equal(t, "azcontainer", a.Bucket) assert.Equal(t, "azendpoint", a.Endpoint) assert.Equal(t, 1, a.Status) a = newActionNotification(&user, operationDownload, "path", "vpath", "target", "", "", ProtocolSCP, "", sessionID, - 123, os.O_APPEND, c.getNotificationStatus(nil), 0, nil) + 123, os.O_APPEND, c.getNotificationStatus(nil), 0, time.Now(), nil) assert.Equal(t, "azcontainer", a.Bucket) assert.Equal(t, "azendpoint", a.Endpoint) assert.Equal(t, 1, a.Status) @@ -118,7 +119,7 @@ func TestNewActionNotification(t *testing.T) { user.FsConfig.Provider = sdk.SFTPFilesystemProvider a = newActionNotification(&user, operationDownload, "path", "vpath", "target", "", "", ProtocolSFTP, "", sessionID, - 123, 0, c.getNotificationStatus(nil), 0, nil) + 123, 0, c.getNotificationStatus(nil), 0, time.Now(), nil) assert.Equal(t, "sftpendpoint", a.Endpoint) } @@ -135,7 +136,7 @@ func TestActionHTTP(t *testing.T) { }, } a := newActionNotification(user, operationDownload, "path", "vpath", "target", "", "", ProtocolSFTP, "", - xid.New().String(), 123, 0, 1, 0, nil) + xid.New().String(), 123, 0, 1, 0, time.Now(), nil) status, err := actionHandler.Handle(a) assert.NoError(t, err) assert.Equal(t, 1, status) @@ -175,7 +176,7 @@ func TestActionCMD(t *testing.T) { } sessionID := shortuuid.New() a := newActionNotification(user, operationDownload, "path", "vpath", "target", "", "", ProtocolSFTP, "", sessionID, - 123, 0, 1, 0, map[string]string{"key": "value"}) + 123, 0, 1, 0, time.Now(), map[string]string{"key": "value"}) status, err := actionHandler.Handle(a) assert.NoError(t, err) assert.Equal(t, 1, status) @@ -208,7 +209,7 @@ func TestWrongActions(t *testing.T) { } a := newActionNotification(user, operationUpload, "", "", "", "", "", ProtocolSFTP, "", xid.New().String(), - 123, 0, 1, 0, nil) + 123, 0, 1, 0, time.Now(), nil) status, err := actionHandler.Handle(a) assert.Error(t, err, "action with bad command must fail") assert.Equal(t, 1, status) diff --git a/internal/common/common.go b/internal/common/common.go index e35316bc..99b5e8d1 100644 --- a/internal/common/common.go +++ b/internal/common/common.go @@ -19,12 +19,14 @@ import ( "context" "errors" "fmt" + "io" "net" "net/http" "net/url" "os" "os/exec" "path/filepath" + "slices" "strconv" "strings" "sync" @@ -124,6 +126,9 @@ func init() { Connections.clients = clientsMap{ clients: make(map[string]int), } + Connections.transfers = clientsMap{ + clients: make(map[string]int), + } Connections.perUserConns = make(map[string]int) Connections.mapping = make(map[string]int) Connections.sshMapping = make(map[string]int) @@ -163,13 +168,20 @@ var ( rateLimiters map[string][]*rateLimiter isShuttingDown atomic.Bool ftpLoginCommands = []string{"PASS", "USER"} + fnUpdateBranding func(*dataprovider.BrandingConfigs) ) +// SetUpdateBrandingFn sets the function to call to update branding configs. +func SetUpdateBrandingFn(fn func(*dataprovider.BrandingConfigs)) { + fnUpdateBranding = fn +} + // Initialize sets the common configuration func Initialize(c Configuration, isShared int) error { isShuttingDown.Store(false) util.SetUmask(c.Umask) version.SetConfig(c.ServerVersion) + dataprovider.SetTZ(c.TZ) Config = c Config.Actions.ExecuteOn = util.RemoveDuplicates(Config.Actions.ExecuteOn, true) Config.Actions.ExecuteSync = util.RemoveDuplicates(Config.Actions.ExecuteSync, true) @@ -200,7 +212,7 @@ func Initialize(c Configuration, isShared int) error { Config.rateLimitersList = rateLimitersList } if c.DefenderConfig.Enabled { - if !util.Contains(supportedDefenderDrivers, c.DefenderConfig.Driver) { + if !slices.Contains(supportedDefenderDrivers, c.DefenderConfig.Driver) { return fmt.Errorf("unsupported defender driver %q", c.DefenderConfig.Driver) } var defender Defender @@ -228,6 +240,9 @@ func Initialize(c Configuration, isShared int) error { if err := c.initializeProxyProtocol(); err != nil { return err } + if err := c.EventManager.validate(); err != nil { + return err + } vfs.SetTempPath(c.TempPath) dataprovider.SetTempPath(c.TempPath) vfs.SetAllowSelfConnections(c.AllowSelfConnections) @@ -236,6 +251,7 @@ func Initialize(c Configuration, isShared int) error { vfs.SetResumeMaxSize(c.ResumeMaxSize) vfs.SetUploadMode(c.UploadMode) dataprovider.SetAllowSelfConnections(c.AllowSelfConnections) + dataprovider.EnabledActionCommands = c.EventManager.EnabledCommands transfersChecker = getTransfersChecker(isShared) return nil } @@ -327,6 +343,13 @@ func Reload() error { return nil } +// DelayLogin applies the configured login delay +func DelayLogin(err error) { + if Config.defender != nil { + Config.defender.DelayLogin(err) + } +} + // IsBanned returns true if the specified IP address is banned func IsBanned(ip, protocol string) bool { if plugin.Handler.IsIPBanned(ip, protocol) { @@ -395,6 +418,23 @@ func AddDefenderEvent(ip, protocol string, event HostEvent) bool { return Config.defender.AddEvent(ip, protocol, event) } +func reloadProviderConfigs() { + configs, err := dataprovider.GetConfigs() + if err != nil { + logger.Error(logSender, "", "unable to load config from provider: %v", err) + return + } + configs.SetNilsToEmpty() + if fnUpdateBranding != nil { + fnUpdateBranding(configs.Branding) + } + if err := configs.SMTP.TryDecrypt(); err != nil { + logger.Error(logSender, "", "unable to decrypt smtp config: %v", err) + return + } + smtp.Activate(configs.SMTP) +} + func startPeriodicChecks(duration time.Duration, isShared int) { startEventScheduler() spec := fmt.Sprintf("@every %s", duration) @@ -403,7 +443,7 @@ func startPeriodicChecks(duration time.Duration, isShared int) { logger.Info(logSender, "", "scheduled overquota transfers check, schedule %q", spec) if isShared == 1 { logger.Info(logSender, "", "add reload configs task") - _, err := eventScheduler.AddFunc("@every 10m", smtp.ReloadProviderConf) + _, err := eventScheduler.AddFunc("@every 10m", reloadProviderConfigs) util.PanicOnError(err) } if Config.IdleTimeout > 0 { @@ -423,6 +463,7 @@ type ActiveTransfer interface { GetDownloadedSize() int64 GetUploadedSize() int64 GetVirtualPath() string + GetFsPath() string GetStartTime() time.Time SignalClose(err error) Truncate(fsPath string, size int64) (int64, error) @@ -477,6 +518,23 @@ type ConnectionTransfer struct { DLSize int64 `json:"-"` } +// EventManagerConfig defines the configuration for the EventManager +type EventManagerConfig struct { + // EnabledCommands defines the system commands that can be executed via EventManager, + // an empty list means that any command is allowed to be executed. + // Commands must be set as an absolute path + EnabledCommands []string `json:"enabled_commands" mapstructure:"enabled_commands"` +} + +func (c *EventManagerConfig) validate() error { + for _, c := range c.EnabledCommands { + if !filepath.IsAbs(c) { + return fmt.Errorf("invalid command %q: it must be an absolute path", c) + } + } + return nil +} + // MetadataConfig defines how to handle metadata for cloud storage backends type MetadataConfig struct { // If not zero the metadata will be read before downloads and will be @@ -558,9 +616,6 @@ type Configuration struct { // Absolute path to an external program or an HTTP URL to invoke after an SSH/FTP connection ends. // Leave empty do disable. PostDisconnectHook string `json:"post_disconnect_hook" mapstructure:"post_disconnect_hook"` - // Absolute path to an external program or an HTTP URL to invoke after a data retention check completes. - // Leave empty do disable. - DataRetentionHook string `json:"data_retention_hook" mapstructure:"data_retention_hook"` // Maximum number of concurrent client connections. 0 means unlimited MaxTotalConnections int `json:"max_total_connections" mapstructure:"max_total_connections"` // Maximum number of concurrent client connections from the same host (IP). 0 means unlimited @@ -581,8 +636,14 @@ type Configuration struct { Umask string `json:"umask" mapstructure:"umask"` // Defines the server version ServerVersion string `json:"server_version" mapstructure:"server_version"` + // TZ defines the time zone to use for the EventManager scheduler and to + // control time-based access restrictions. Set to "local" to use the + // server's local time, otherwise UTC will be used. + TZ string `json:"tz" mapstructure:"tz"` // Metadata configuration - Metadata MetadataConfig `json:"metadata" mapstructure:"metadata"` + Metadata MetadataConfig `json:"metadata" mapstructure:"metadata"` + // EventManager configuration + EventManager EventManagerConfig `json:"event_manager" mapstructure:"event_manager"` idleTimeoutAsDuration time.Duration idleLoginTimeout time.Duration defender Defender @@ -615,7 +676,7 @@ func (c *Configuration) initializeProxyProtocol() error { // GetProxyListener returns a wrapper for the given listener that supports the // HAProxy Proxy Protocol -func (c *Configuration) GetProxyListener(listener net.Listener) (*proxyproto.Listener, error) { +func (c *Configuration) GetProxyListener(listener net.Listener) (net.Listener, error) { if c.ProxyProtocol > 0 { defaultPolicy := proxyproto.REQUIRE if c.ProxyProtocol == 1 { @@ -624,7 +685,7 @@ func (c *Configuration) GetProxyListener(listener net.Listener) (*proxyproto.Lis return &proxyproto.Listener{ Listener: listener, - Policy: getProxyPolicy(c.proxyAllowed, c.proxySkipped, defaultPolicy), + ConnPolicy: getProxyPolicy(c.proxyAllowed, c.proxySkipped, defaultPolicy), ReadHeaderTimeout: 10 * time.Second, }, nil } @@ -742,7 +803,7 @@ func (c *Configuration) checkPostDisconnectHook(remoteAddr, protocol, username, if c.PostDisconnectHook == "" { return } - if !util.Contains(disconnHookProtocols, protocol) { + if !slices.Contains(disconnHookProtocols, protocol) { return } go c.executePostDisconnectHook(remoteAddr, protocol, username, connID, connectionTime) @@ -799,12 +860,14 @@ func (c *Configuration) ExecutePostConnectHook(ipAddr, protocol string) error { return nil } -func getProxyPolicy(allowed, skipped []func(net.IP) bool, def proxyproto.Policy) proxyproto.PolicyFunc { - return func(upstream net.Addr) (proxyproto.Policy, error) { - upstreamIP, err := util.GetIPFromNetAddr(upstream) +func getProxyPolicy(allowed, skipped []func(net.IP) bool, def proxyproto.Policy) proxyproto.ConnPolicyFunc { + return func(connPolicyOptions proxyproto.ConnPolicyOptions) (proxyproto.Policy, error) { + upstreamIP, err := util.GetIPFromNetAddr(connPolicyOptions.Upstream) if err != nil { - // something is wrong with the source IP, better reject the connection - return proxyproto.REJECT, err + // Something is wrong with the source IP, better reject the + // connection. + logger.Error(logSender, "", "reject connection from ip %q, err: %v", connPolicyOptions.Upstream, err) + return proxyproto.REJECT, proxyproto.ErrInvalidUpstream } for _, skippedFrom := range skipped { @@ -822,6 +885,11 @@ func getProxyPolicy(allowed, skipped []func(net.IP) bool, def proxyproto.Policy) } } + if def == proxyproto.REQUIRE { + logger.Debug(logSender, "", "reject connection from ip %q: proxy protocol signature required and not set", + upstreamIP) + return proxyproto.REJECT, proxyproto.ErrInvalidUpstream + } return def, nil } } @@ -830,12 +898,12 @@ func getProxyPolicy(allowed, skipped []func(net.IP) bool, def proxyproto.Policy) // Each SSH connection can open several channels for SFTP or SSH commands type SSHConnection struct { id string - conn net.Conn + conn io.Closer lastActivity atomic.Int64 } // NewSSHConnection returns a new SSHConnection -func NewSSHConnection(id string, conn net.Conn) *SSHConnection { +func NewSSHConnection(id string, conn io.Closer) *SSHConnection { c := &SSHConnection{ id: id, conn: conn, @@ -868,7 +936,9 @@ func (c *SSHConnection) Close() error { type ActiveConnections struct { // clients contains both authenticated and estabilished connections and the ones waiting // for authentication - clients clientsMap + clients clientsMap + // transfers contains active transfers, total and per-user + transfers clientsMap transfersCheckStatus atomic.Bool sync.RWMutex connections []ActiveConnection @@ -919,6 +989,9 @@ func (conns *ActiveConnections) Add(c ActiveConnection) error { if val := conns.perUserConns[username]; val >= maxSessions { return fmt.Errorf("too many open sessions: %d/%d", val, maxSessions) } + if val := conns.transfers.getTotalFrom(username); val >= maxSessions { + return fmt.Errorf("too many open transfers: %d/%d", val, maxSessions) + } } conns.addUserConnection(username) } @@ -980,7 +1053,7 @@ func (conns *ActiveConnections) Remove(connectionID string) { metric.UpdateActiveConnectionsSize(lastIdx) logger.Debug(conn.GetProtocol(), conn.GetID(), "connection removed, local address %q, remote address %q close fs error: %v, num open connections: %d", conn.GetLocalAddress(), conn.GetRemoteAddress(), err, lastIdx) - if conn.GetProtocol() == ProtocolFTP && conn.GetUsername() == "" && !util.Contains(ftpLoginCommands, conn.GetCommand()) { + if conn.GetProtocol() == ProtocolFTP && conn.GetUsername() == "" && !slices.Contains(ftpLoginCommands, conn.GetCommand()) { ip := util.GetIPFromRemoteAddress(conn.GetRemoteAddress()) logger.ConnectionFailedLog("", ip, dataprovider.LoginMethodNoAuthTried, ProtocolFTP, dataprovider.ErrNoAuthTried.Error()) @@ -1089,7 +1162,7 @@ func (conns *ActiveConnections) checkIdles() { logger.Debug(conn.GetProtocol(), conn.GetID(), "close idle connection, idle time: %s, username: %q close err: %v", time.Since(conn.GetLastActivity()), conn.GetUsername(), err) }(c) - } else if !c.isAccessAllowed() { + } else if !isUnauthenticatedFTPUser && !c.isAccessAllowed() { defer func(conn ActiveConnection) { err := conn.Disconnect() logger.Info(conn.GetProtocol(), conn.GetID(), "access conditions not met for user: %q close connection err: %v", @@ -1179,6 +1252,35 @@ func (conns *ActiveConnections) GetClientConnections() int32 { return conns.clients.getTotal() } +// GetTotalTransfers returns the total number of active transfers +func (conns *ActiveConnections) GetTotalTransfers() int32 { + return conns.transfers.getTotal() +} + +// IsNewTransferAllowed returns an error if the maximum number of concurrent allowed +// transfers is exceeded +func (conns *ActiveConnections) IsNewTransferAllowed(username string) error { + if isShuttingDown.Load() { + return ErrShuttingDown + } + if Config.MaxTotalConnections == 0 && Config.MaxPerHostConnections == 0 { + return nil + } + if Config.MaxPerHostConnections > 0 { + if transfers := conns.transfers.getTotalFrom(username); transfers >= Config.MaxPerHostConnections { + logger.Info(logSender, "", "active transfers from user %q: %d/%d", username, transfers, Config.MaxPerHostConnections) + return ErrConnectionDenied + } + } + if Config.MaxTotalConnections > 0 { + if transfers := conns.transfers.getTotal(); transfers >= int32(Config.MaxTotalConnections) { + logger.Info(logSender, "", "active transfers %d/%d", transfers, Config.MaxTotalConnections) + return ErrConnectionDenied + } + } + return nil +} + // IsNewConnectionAllowed returns an error if the maximum number of concurrent allowed // connections is exceeded or a whitelist is defined and the specified ipAddr is not listed // or the service is shutting down @@ -1219,7 +1321,11 @@ func (conns *ActiveConnections) IsNewConnectionAllowed(ipAddr, protocol string) } // on a single SFTP connection we could have multiple SFTP channels or commands - // so we check the estabilished connections too + // so we check the estabilished connections and active uploads too + if transfers := conns.transfers.getTotal(); transfers >= int32(Config.MaxTotalConnections) { + logger.Info(logSender, "", "active transfers %d/%d", transfers, Config.MaxTotalConnections) + return ErrConnectionDenied + } conns.RLock() defer conns.RUnlock() diff --git a/internal/common/common_test.go b/internal/common/common_test.go index c7d4ba51..8566d773 100644 --- a/internal/common/common_test.go +++ b/internal/common/common_test.go @@ -23,6 +23,7 @@ import ( "os/exec" "path/filepath" "runtime" + "slices" "sync" "testing" "time" @@ -63,7 +64,7 @@ func (c *fakeConnection) AddUser(user dataprovider.User) error { if err != nil { return err } - c.BaseConnection.User = user + c.User = user return nil } @@ -216,6 +217,33 @@ func TestConnections(t *testing.T) { Connections.RUnlock() } +func TestEventManagerCommandsInitialization(t *testing.T) { + configCopy := Config + + c := Configuration{ + EventManager: EventManagerConfig{ + EnabledCommands: []string{"ls"}, // not an absolute path + }, + } + err := Initialize(c, 0) + assert.ErrorContains(t, err, "invalid command") + + var commands []string + if runtime.GOOS == osWindows { + commands = []string{"C:\\command"} + } else { + commands = []string{"/bin/ls"} + } + + c.EventManager.EnabledCommands = commands + err = Initialize(c, 0) + assert.NoError(t, err) + assert.Equal(t, commands, dataprovider.EnabledActionCommands) + + dataprovider.EnabledActionCommands = configCopy.EventManager.EnabledCommands + Config = configCopy +} + func TestInitializationProxyErrors(t *testing.T) { configCopy := Config @@ -419,6 +447,9 @@ func TestDefenderIntegration(t *testing.T) { ObservationTime: 15, EntriesSoftLimit: 100, EntriesHardLimit: 150, + LoginDelay: LoginDelay{ + PasswordFailed: 200, + }, } err = Initialize(Config, 0) // ScoreInvalid cannot be greater than threshold @@ -477,6 +508,16 @@ func TestDefenderIntegration(t *testing.T) { assert.Nil(t, banTime) assert.False(t, DeleteDefenderHost(ip)) + startTime := time.Now() + DelayLogin(nil) + elapsed := time.Since(startTime) + assert.Less(t, elapsed, time.Millisecond*50) + + startTime = time.Now() + DelayLogin(ErrInternalFailure) + elapsed = time.Since(startTime) + assert.Greater(t, elapsed, time.Millisecond*150) + Config = configCopy } @@ -612,11 +653,17 @@ func TestMaxConnections(t *testing.T) { ipAddr := "192.168.7.8" assert.NoError(t, Connections.IsNewConnectionAllowed(ipAddr, ProtocolFTP)) + assert.NoError(t, Connections.IsNewTransferAllowed(userTestUsername)) Config.MaxTotalConnections = 1 Config.MaxPerHostConnections = perHost assert.NoError(t, Connections.IsNewConnectionAllowed(ipAddr, ProtocolHTTP)) + assert.NoError(t, Connections.IsNewTransferAllowed(userTestUsername)) + isShuttingDown.Store(true) + assert.ErrorIs(t, Connections.IsNewTransferAllowed(userTestUsername), ErrShuttingDown) + isShuttingDown.Store(false) + c := NewBaseConnection("id", ProtocolSFTP, "", "", dataprovider.User{}) fakeConn := &fakeConnection{ BaseConnection: c, @@ -625,6 +672,10 @@ func TestMaxConnections(t *testing.T) { assert.NoError(t, err) assert.Len(t, Connections.GetStats(""), 1) assert.Error(t, Connections.IsNewConnectionAllowed(ipAddr, ProtocolSSH)) + Connections.transfers.add(userTestUsername) + assert.Error(t, Connections.IsNewTransferAllowed(userTestUsername)) + Connections.transfers.remove(userTestUsername) + assert.Equal(t, int32(0), Connections.GetTotalTransfers()) res := Connections.Close(fakeConn.GetID(), "") assert.True(t, res) @@ -636,6 +687,9 @@ func TestMaxConnections(t *testing.T) { assert.Error(t, Connections.IsNewConnectionAllowed(ipAddr, ProtocolSSH)) Connections.RemoveClientConnection(ipAddr) assert.NoError(t, Connections.IsNewConnectionAllowed(ipAddr, ProtocolWebDAV)) + Connections.transfers.add(userTestUsername) + assert.Error(t, Connections.IsNewConnectionAllowed(ipAddr, ProtocolSSH)) + Connections.transfers.remove(userTestUsername) Connections.RemoveClientConnection(ipAddr) Config.MaxTotalConnections = oldValue @@ -774,11 +828,7 @@ func TestIdleConnections(t *testing.T) { assert.NoError(t, err) assert.Equal(t, Connections.GetActiveSessions(username), 2) - cFTP := NewBaseConnection("id2", ProtocolFTP, "", "", dataprovider.User{ - BaseUser: sdk.BaseUser{ - Status: 1, - }, - }) + cFTP := NewBaseConnection("id2", ProtocolFTP, "", "", dataprovider.User{}) cFTP.lastActivity.Store(time.Now().UnixNano()) fakeConn = &fakeConnection{ BaseConnection: cFTP, @@ -945,9 +995,10 @@ func TestConnectionStatus(t *testing.T) { assert.Len(t, stats, 3) for _, stat := range stats { assert.Equal(t, stat.Username, username) - if stat.ConnectionID == "SFTP_id1" { + switch stat.ConnectionID { + case "SFTP_id1": assert.Len(t, stat.Transfers, 2) - } else if stat.ConnectionID == "DAV_id3" { + case "DAV_id3": assert.Len(t, stat.Transfers, 1) } } @@ -1028,9 +1079,13 @@ func TestQuotaScansRole(t *testing.T) { func TestProxyPolicy(t *testing.T) { addr := net.TCPAddr{} + downstream := net.TCPAddr{IP: net.ParseIP("1.1.1.1")} p := getProxyPolicy(nil, nil, proxyproto.IGNORE) - policy, err := p(&addr) - assert.Error(t, err) + policy, err := p(proxyproto.ConnPolicyOptions{ + Upstream: &addr, + Downstream: &downstream, + }) + assert.ErrorIs(t, err, proxyproto.ErrInvalidUpstream) assert.Equal(t, proxyproto.REJECT, policy) ip1 := net.ParseIP("10.8.1.1") ip2 := net.ParseIP("10.8.1.2") @@ -1040,31 +1095,55 @@ func TestProxyPolicy(t *testing.T) { skipped, err := util.ParseAllowedIPAndRanges([]string{ip2.String(), ip3.String()}) assert.NoError(t, err) p = getProxyPolicy(allowed, skipped, proxyproto.IGNORE) - policy, err = p(&net.TCPAddr{IP: ip1}) + policy, err = p(proxyproto.ConnPolicyOptions{ + Upstream: &net.TCPAddr{IP: ip1}, + Downstream: &downstream, + }) assert.NoError(t, err) assert.Equal(t, proxyproto.USE, policy) - policy, err = p(&net.TCPAddr{IP: ip2}) + policy, err = p(proxyproto.ConnPolicyOptions{ + Upstream: &net.TCPAddr{IP: ip2}, + Downstream: &downstream, + }) assert.NoError(t, err) assert.Equal(t, proxyproto.SKIP, policy) - policy, err = p(&net.TCPAddr{IP: ip3}) + policy, err = p(proxyproto.ConnPolicyOptions{ + Upstream: &net.TCPAddr{IP: ip3}, + Downstream: &downstream, + }) assert.NoError(t, err) assert.Equal(t, proxyproto.SKIP, policy) - policy, err = p(&net.TCPAddr{IP: net.ParseIP("10.8.1.4")}) + policy, err = p(proxyproto.ConnPolicyOptions{ + Upstream: &net.TCPAddr{IP: net.ParseIP("10.8.1.4")}, + Downstream: &downstream, + }) assert.NoError(t, err) assert.Equal(t, proxyproto.IGNORE, policy) p = getProxyPolicy(allowed, skipped, proxyproto.REQUIRE) - policy, err = p(&net.TCPAddr{IP: ip1}) + policy, err = p(proxyproto.ConnPolicyOptions{ + Upstream: &net.TCPAddr{IP: ip1}, + Downstream: &downstream, + }) assert.NoError(t, err) assert.Equal(t, proxyproto.REQUIRE, policy) - policy, err = p(&net.TCPAddr{IP: ip2}) + policy, err = p(proxyproto.ConnPolicyOptions{ + Upstream: &net.TCPAddr{IP: ip2}, + Downstream: &downstream, + }) assert.NoError(t, err) assert.Equal(t, proxyproto.SKIP, policy) - policy, err = p(&net.TCPAddr{IP: ip3}) + policy, err = p(proxyproto.ConnPolicyOptions{ + Upstream: &net.TCPAddr{IP: ip3}, + Downstream: &downstream, + }) assert.NoError(t, err) assert.Equal(t, proxyproto.SKIP, policy) - policy, err = p(&net.TCPAddr{IP: net.ParseIP("10.8.1.5")}) - assert.NoError(t, err) - assert.Equal(t, proxyproto.REQUIRE, policy) + policy, err = p(proxyproto.ConnPolicyOptions{ + Upstream: &net.TCPAddr{IP: net.ParseIP("10.8.1.5")}, + Downstream: &downstream, + }) + assert.ErrorIs(t, err, proxyproto.ErrInvalidUpstream) + assert.Equal(t, proxyproto.REJECT, policy) } func TestProxyProtocolVersion(t *testing.T) { @@ -1076,14 +1155,18 @@ func TestProxyProtocolVersion(t *testing.T) { assert.Contains(t, err.Error(), "proxy protocol not configured") } c.ProxyProtocol = 1 - proxyListener, err := c.GetProxyListener(nil) + listener, err := c.GetProxyListener(nil) assert.NoError(t, err) - assert.NotNil(t, proxyListener.Policy) + proxyListener, ok := listener.(*proxyproto.Listener) + require.True(t, ok) + assert.NotNil(t, proxyListener.ConnPolicy) c.ProxyProtocol = 2 - proxyListener, err = c.GetProxyListener(nil) + listener, err = c.GetProxyListener(nil) assert.NoError(t, err) - assert.NotNil(t, proxyListener.Policy) + proxyListener, ok = listener.(*proxyproto.Listener) + require.True(t, ok) + assert.NotNil(t, proxyListener.ConnPolicy) } func TestStartupHook(t *testing.T) { @@ -1213,8 +1296,8 @@ func TestFolderCopy(t *testing.T) { folder.ID = 2 folder.Users = []string{"user3"} require.Len(t, folderCopy.Users, 2) - require.True(t, util.Contains(folderCopy.Users, "user1")) - require.True(t, util.Contains(folderCopy.Users, "user2")) + require.True(t, slices.Contains(folderCopy.Users, "user1")) + require.True(t, slices.Contains(folderCopy.Users, "user2")) require.Equal(t, int64(1), folderCopy.ID) require.Equal(t, folder.Name, folderCopy.Name) require.Equal(t, folder.MappedPath, folderCopy.MappedPath) @@ -1230,7 +1313,7 @@ func TestFolderCopy(t *testing.T) { folderCopy = folder.GetACopy() folder.FsConfig.CryptConfig.Passphrase = kms.NewEmptySecret() require.Len(t, folderCopy.Users, 1) - require.True(t, util.Contains(folderCopy.Users, "user3")) + require.True(t, slices.Contains(folderCopy.Users, "user3")) require.Equal(t, int64(2), folderCopy.ID) require.Equal(t, folder.Name, folderCopy.Name) require.Equal(t, folder.MappedPath, folderCopy.MappedPath) diff --git a/internal/common/connection.go b/internal/common/connection.go index e7f9c9a8..4bbc89f0 100644 --- a/internal/common/connection.go +++ b/internal/common/connection.go @@ -21,6 +21,7 @@ import ( "io/fs" "os" "path" + "slices" "strings" "sync" "sync/atomic" @@ -62,7 +63,7 @@ type BaseConnection struct { // NewBaseConnection returns a new BaseConnection func NewBaseConnection(id, protocol, localAddr, remoteAddr string, user dataprovider.User) *BaseConnection { connID := id - if util.Contains(supportedProtocols, protocol) { + if slices.Contains(supportedProtocols, protocol) { connID = fmt.Sprintf("%s_%s", protocol, id) } user.UploadBandwidth, user.DownloadBandwidth = user.GetBandwidthForIP(util.GetIPFromRemoteAddress(remoteAddr), connID) @@ -131,7 +132,7 @@ func (c *BaseConnection) GetRemoteIP() string { // SetProtocol sets the protocol for this connection func (c *BaseConnection) SetProtocol(protocol string) { c.protocol = protocol - if util.Contains(supportedProtocols, c.protocol) { + if slices.Contains(supportedProtocols, c.protocol) { c.ID = fmt.Sprintf("%v_%v", c.protocol, c.ID) } } @@ -158,6 +159,8 @@ func (c *BaseConnection) CloseFS() error { // AddTransfer associates a new transfer to this connection func (c *BaseConnection) AddTransfer(t ActiveTransfer) { + Connections.transfers.add(c.User.Username) + c.Lock() defer c.Unlock() @@ -189,6 +192,8 @@ func (c *BaseConnection) AddTransfer(t ActiveTransfer) { // RemoveTransfer removes the specified transfer from the active ones func (c *BaseConnection) RemoveTransfer(t ActiveTransfer) { + Connections.transfers.remove(c.User.Username) + c.Lock() defer c.Unlock() @@ -291,6 +296,20 @@ func (c *BaseConnection) setTimes(fsPath string, atime time.Time, mtime time.Tim return false } +// getInfoForOngoingUpload returns upload statistics for an upload currently in +// progress on this connection. +func (c *BaseConnection) getInfoForOngoingUpload(fsPath string) (os.FileInfo, error) { + c.RLock() + defer c.RUnlock() + + for _, t := range c.activeTransfers { + if t.GetType() == TransferUpload && t.GetFsPath() == fsPath { + return vfs.NewFileInfo(t.GetVirtualPath(), false, t.GetSize(), t.GetStartTime(), false), nil + } + } + return nil, os.ErrNotExist +} + func (c *BaseConnection) truncateOpenHandle(fsPath string, size int64) (int64, error) { c.RLock() defer c.RUnlock() @@ -321,10 +340,9 @@ func (c *BaseConnection) ListDir(virtualPath string) (*DirListerAt, error) { } return &DirListerAt{ virtualPath: virtualPath, - user: &c.User, + conn: c, + fs: fs, info: c.User.GetVirtualFoldersInfo(virtualPath), - id: c.ID, - protocol: c.protocol, lister: lister, }, nil } @@ -449,10 +467,7 @@ func (c *BaseConnection) RemoveFile(fs vfs.Fs, fsPath, virtualPath string, info if updateQuota && info.Mode()&os.ModeSymlink == 0 { vfolder, err := c.User.GetVirtualFolderForPath(path.Dir(virtualPath)) if err == nil { - dataprovider.UpdateVirtualFolderQuota(&vfolder.BaseVirtualFolder, -1, -size, false) //nolint:errcheck - if vfolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&c.User, -1, -size, false) //nolint:errcheck - } + dataprovider.UpdateUserFolderQuota(&vfolder, &c.User, -1, -size, false) } else { dataprovider.UpdateUserQuota(&c.User, -1, -size, false) //nolint:errcheck } @@ -616,13 +631,15 @@ func (c *BaseConnection) checkCopy(srcInfo, dstInfo os.FileInfo, virtualSource, if dstInfo != nil && dstInfo.IsDir() { return fmt.Errorf("cannot overwrite file %q with dir %q: %w", virtualSource, virtualTarget, c.GetOpUnsupportedError()) } - if fsSourcePath == fsTargetPath { - return fmt.Errorf("the copy source and target cannot be the same: %w", c.GetOpUnsupportedError()) + if c.IsSameResource(virtualSource, virtualTarget) { + if fsSourcePath == fsTargetPath { + return fmt.Errorf("the copy source and target cannot be the same: %w", c.GetOpUnsupportedError()) + } } return nil } -func (c *BaseConnection) copyFile(virtualSourcePath, virtualTargetPath string, srcSize int64) error { +func (c *BaseConnection) copyFile(virtualSourcePath, virtualTargetPath string, srcInfo os.FileInfo) error { if !c.User.HasPerm(dataprovider.PermCopy, virtualSourcePath) || !c.User.HasPerm(dataprovider.PermCopy, virtualTargetPath) { return c.GetPermissionDeniedError() } @@ -640,12 +657,12 @@ func (c *BaseConnection) copyFile(virtualSourcePath, virtualTargetPath string, s return err } startTime := time.Now() - numFiles, sizeDiff, err := copier.CopyFile(fsSourcePath, fsTargetPath, srcSize) + numFiles, sizeDiff, err := copier.CopyFile(fsSourcePath, fsTargetPath, srcInfo) elapsed := time.Since(startTime).Nanoseconds() / 1000000 updateUserQuotaAfterFileWrite(c, virtualTargetPath, numFiles, sizeDiff) logger.CommandLog(copyLogSender, fsSourcePath, fsTargetPath, c.User.Username, "", c.ID, c.protocol, -1, -1, - "", "", "", srcSize, c.localAddr, c.remoteAddr, elapsed) - ExecuteActionNotification(c, operationCopy, fsSourcePath, virtualSourcePath, fsTargetPath, virtualTargetPath, "", srcSize, err, elapsed, nil) //nolint:errcheck + "", "", "", srcInfo.Size(), c.localAddr, c.remoteAddr, elapsed) + ExecuteActionNotification(c, operationCopy, fsSourcePath, virtualSourcePath, fsTargetPath, virtualTargetPath, "", srcInfo.Size(), err, elapsed, nil) //nolint:errcheck return err } } @@ -657,7 +674,7 @@ func (c *BaseConnection) copyFile(virtualSourcePath, virtualTargetPath string, s defer rCancelFn() defer reader.Close() - writer, numFiles, truncatedSize, wCancelFn, err := getFileWriter(c, virtualTargetPath, srcSize) + writer, numFiles, truncatedSize, wCancelFn, err := getFileWriter(c, virtualTargetPath, srcInfo.Size()) if err != nil { return fmt.Errorf("unable to get writer for path %q: %w", virtualTargetPath, err) } @@ -708,7 +725,7 @@ func (c *BaseConnection) doRecursiveCopy(virtualSourcePath, virtualTargetPath st return nil } - return c.copyFile(virtualSourcePath, virtualTargetPath, srcInfo.Size()) + return c.copyFile(virtualSourcePath, virtualTargetPath, srcInfo) } func (c *BaseConnection) recursiveCopyEntries(virtualSourcePath, virtualTargetPath string, entries []os.FileInfo, recursion int) error { @@ -770,29 +787,27 @@ func (c *BaseConnection) Copy(virtualSourcePath, virtualTargetPath string) error return err } } - createTargetDir := true - if dstInfo != nil && dstInfo.IsDir() { - createTargetDir = false - } + createTargetDir := dstInfo == nil || !dstInfo.IsDir() if err := c.checkCopy(srcInfo, dstInfo, virtualSourcePath, destPath); err != nil { return err } if err := c.CheckParentDirs(path.Dir(destPath)); err != nil { return err } - done := make(chan bool) - defer close(done) - go keepConnectionAlive(c, done, 2*time.Minute) + stopKeepAlive := keepConnectionAlive(c, 2*time.Minute) + defer stopKeepAlive() return c.doRecursiveCopy(virtualSourcePath, destPath, srcInfo, createTargetDir, 0) } // Rename renames (moves) virtualSourcePath to virtualTargetPath func (c *BaseConnection) Rename(virtualSourcePath, virtualTargetPath string) error { - return c.renameInternal(virtualSourcePath, virtualTargetPath, false) + return c.renameInternal(virtualSourcePath, virtualTargetPath, false, vfs.CheckParentDir) } -func (c *BaseConnection) renameInternal(virtualSourcePath, virtualTargetPath string, checkParentDestination bool) error { +func (c *BaseConnection) renameInternal(virtualSourcePath, virtualTargetPath string, //nolint:gocyclo + checkParentDestination bool, checks int, +) error { if virtualSourcePath == virtualTargetPath { return fmt.Errorf("the rename source and target cannot be the same: %w", c.GetOpUnsupportedError()) } @@ -813,7 +828,11 @@ func (c *BaseConnection) renameInternal(virtualSourcePath, virtualTargetPath str return c.GetPermissionDeniedError() } initialSize := int64(-1) - if dstInfo, err := fsDst.Lstat(fsTargetPath); err == nil { + dstInfo, err := fsDst.Lstat(fsTargetPath) + if err != nil && !fsDst.IsNotExist(err) { + return err + } + if err == nil { checkParentDestination = false if dstInfo.IsDir() { c.Log(logger.LevelWarn, "attempted to rename %q overwriting an existing directory %q", @@ -835,18 +854,17 @@ func (c *BaseConnection) renameInternal(virtualSourcePath, virtualTargetPath str return err } } - if !c.hasSpaceForRename(fsSrc, virtualSourcePath, virtualTargetPath, initialSize, fsSourcePath) { + if !c.hasSpaceForRename(fsSrc, virtualSourcePath, virtualTargetPath, initialSize, fsSourcePath, srcInfo) { c.Log(logger.LevelInfo, "denying cross rename due to space limit") return c.GetGenericError(ErrQuotaExceeded) } if checkParentDestination { c.CheckParentDirs(path.Dir(virtualTargetPath)) //nolint:errcheck } - done := make(chan bool) - defer close(done) - go keepConnectionAlive(c, done, 2*time.Minute) + stopKeepAlive := keepConnectionAlive(c, 2*time.Minute) + defer stopKeepAlive() - files, size, err := fsDst.Rename(fsSourcePath, fsTargetPath) + files, size, err := fsDst.Rename(fsSourcePath, fsTargetPath, checks) if err != nil { c.Log(logger.LevelError, "failed to rename %q -> %q: %+v", fsSourcePath, fsTargetPath, err) return c.GetFsError(fsSrc, err) @@ -918,16 +936,6 @@ func (c *BaseConnection) CreateSymlink(virtualSourcePath, virtualTargetPath stri return nil } -func (c *BaseConnection) getPathForSetStatPerms(fs vfs.Fs, fsPath, virtualPath string) string { - pathForPerms := virtualPath - if fi, err := fs.Lstat(fsPath); err == nil { - if fi.IsDir() { - pathForPerms = path.Dir(virtualPath) - } - } - return pathForPerms -} - func (c *BaseConnection) doStatInternal(virtualPath string, mode int, checkFilePatterns, convertResult bool, ) (os.FileInfo, error) { @@ -958,7 +966,19 @@ func (c *BaseConnection) doStatInternal(virtualPath string, mode int, checkFileP info, err = fs.Stat(c.getRealFsPath(fsPath)) } if err != nil { - if !fs.IsNotExist(err) { + isNotExist := fs.IsNotExist(err) + if isNotExist { + // This is primarily useful for atomic storage backends, where files + // become visible only after they are closed. However, since we may + // be proxying (for example) an SFTP server backed by atomic + // storage, and this search only inspects transfers active on the + // current connection (typically just one), the check is inexpensive + // and safe to perform unconditionally. + if info, err := c.getInfoForOngoingUpload(fsPath); err == nil { + return info, nil + } + } + if !isNotExist { c.Log(logger.LevelWarn, "stat error for path %q: %+v", virtualPath, err) } return nil, c.GetFsError(fs, err) @@ -1064,7 +1084,7 @@ func (c *BaseConnection) SetStat(virtualPath string, attributes *StatAttributes) if err != nil { return err } - pathForPerms := c.getPathForSetStatPerms(fs, fsPath, virtualPath) + pathForPerms := path.Dir(virtualPath) if attributes.Flags&StatAttrTimes != 0 { if err = c.handleChtimes(fs, fsPath, pathForPerms, attributes); err != nil { @@ -1121,10 +1141,7 @@ func (c *BaseConnection) truncateFile(fs vfs.Fs, fsPath, virtualPath string, siz sizeDiff := initialSize - size vfolder, err := c.User.GetVirtualFolderForPath(path.Dir(virtualPath)) if err == nil { - dataprovider.UpdateVirtualFolderQuota(&vfolder.BaseVirtualFolder, 0, -sizeDiff, false) //nolint:errcheck - if vfolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&c.User, 0, -sizeDiff, false) //nolint:errcheck - } + dataprovider.UpdateUserFolderQuota(&vfolder, &c.User, 0, -sizeDiff, false) } else { dataprovider.UpdateUserQuota(&c.User, 0, -sizeDiff, false) //nolint:errcheck } @@ -1133,11 +1150,11 @@ func (c *BaseConnection) truncateFile(fs vfs.Fs, fsPath, virtualPath string, siz } func (c *BaseConnection) checkRecursiveRenameDirPermissions(fsSrc, fsDst vfs.Fs, sourcePath, targetPath, - virtualSourcePath, virtualTargetPath string, fi os.FileInfo, + virtualSourcePath, virtualTargetPath string, srcInfo os.FileInfo, ) error { if !c.User.HasPermissionsInside(virtualSourcePath) && !c.User.HasPermissionsInside(virtualTargetPath) { - if !c.isRenamePermitted(fsSrc, fsDst, sourcePath, targetPath, virtualSourcePath, virtualTargetPath, fi) { + if !c.isRenamePermitted(fsSrc, fsDst, sourcePath, targetPath, virtualSourcePath, virtualTargetPath, srcInfo) { c.Log(logger.LevelInfo, "rename %q -> %q is not allowed, virtual destination path: %q", sourcePath, targetPath, virtualTargetPath) return c.GetPermissionDeniedError() @@ -1197,7 +1214,7 @@ func (c *BaseConnection) hasRenamePerms(virtualSourcePath, virtualTargetPath str } func (c *BaseConnection) checkFolderRename(fsSrc, fsDst vfs.Fs, fsSourcePath, fsTargetPath, virtualSourcePath, - virtualTargetPath string, fi os.FileInfo) error { + virtualTargetPath string, srcInfo os.FileInfo) error { if util.IsDirOverlapped(virtualSourcePath, virtualTargetPath, true, "/") { c.Log(logger.LevelDebug, "renaming the folder %q->%q is not supported: nested folders", virtualSourcePath, virtualTargetPath) @@ -1221,7 +1238,7 @@ func (c *BaseConnection) checkFolderRename(fsSrc, fsDst vfs.Fs, fsSourcePath, fs return fmt.Errorf("folder %q has virtual folders inside it: %w", virtualTargetPath, c.GetOpUnsupportedError()) } if err := c.checkRecursiveRenameDirPermissions(fsSrc, fsDst, fsSourcePath, fsTargetPath, - virtualSourcePath, virtualTargetPath, fi); err != nil { + virtualSourcePath, virtualTargetPath, srcInfo); err != nil { c.Log(logger.LevelDebug, "error checking recursive permissions before renaming %q: %+v", fsSourcePath, err) return err } @@ -1229,7 +1246,7 @@ func (c *BaseConnection) checkFolderRename(fsSrc, fsDst vfs.Fs, fsSourcePath, fs } func (c *BaseConnection) isRenamePermitted(fsSrc, fsDst vfs.Fs, fsSourcePath, fsTargetPath, virtualSourcePath, - virtualTargetPath string, fi os.FileInfo, + virtualTargetPath string, srcInfo os.FileInfo, ) bool { if !c.IsSameResource(virtualSourcePath, virtualTargetPath) { c.Log(logger.LevelInfo, "rename %q->%q is not allowed: the paths must be on the same resource", @@ -1259,11 +1276,11 @@ func (c *BaseConnection) isRenamePermitted(fsSrc, fsDst vfs.Fs, fsSourcePath, fs virtualTargetPath) return false } - return c.hasRenamePerms(virtualSourcePath, virtualTargetPath, fi) + return c.hasRenamePerms(virtualSourcePath, virtualTargetPath, srcInfo) } func (c *BaseConnection) hasSpaceForRename(fs vfs.Fs, virtualSourcePath, virtualTargetPath string, initialSize int64, - fsSourcePath string) bool { + sourcePath string, srcInfo os.FileInfo) bool { if dataprovider.GetQuotaTracking() == 0 { return true } @@ -1293,30 +1310,28 @@ func (c *BaseConnection) hasSpaceForRename(fs vfs.Fs, virtualSourcePath, virtual // no quota restrictions return true } - return c.hasSpaceForCrossRename(fs, quotaResult, initialSize, fsSourcePath) + return c.hasSpaceForCrossRename(fs, quotaResult, initialSize, sourcePath, srcInfo) } // hasSpaceForCrossRename checks the quota after a rename between different folders -func (c *BaseConnection) hasSpaceForCrossRename(fs vfs.Fs, quotaResult vfs.QuotaCheckResult, initialSize int64, sourcePath string) bool { +func (c *BaseConnection) hasSpaceForCrossRename(fs vfs.Fs, quotaResult vfs.QuotaCheckResult, initialSize int64, + sourcePath string, srcInfo os.FileInfo, +) bool { if !quotaResult.HasSpace && initialSize == -1 { // we are over quota and this is not a file replace return false } - fi, err := fs.Lstat(sourcePath) - if err != nil { - c.Log(logger.LevelError, "cross rename denied, stat error for path %q: %v", sourcePath, err) - return false - } var sizeDiff int64 var filesDiff int - if fi.Mode().IsRegular() { - sizeDiff = fi.Size() + var err error + if srcInfo.Mode().IsRegular() { + sizeDiff = srcInfo.Size() filesDiff = 1 if initialSize != -1 { sizeDiff -= initialSize filesDiff = 0 } - } else if fi.IsDir() { + } else if srcInfo.IsDir() { filesDiff, sizeDiff, err = fs.GetDirSize(sourcePath) if err != nil { c.Log(logger.LevelError, "cross rename denied, error getting size for directory %q: %v", sourcePath, err) @@ -1343,7 +1358,7 @@ func (c *BaseConnection) hasSpaceForCrossRename(fs vfs.Fs, quotaResult vfs.Quota } if quotaResult.QuotaSize > 0 { remainingSize := quotaResult.GetRemainingSize() - c.Log(logger.LevelDebug, "cross rename, source %q remaining size %d to add %d", sourcePath, + c.Log(logger.LevelDebug, "cross rename, source %q remaining size %d to add %d", srcInfo.Name(), remainingSize, sizeDiff) if remainingSize < sizeDiff { return false @@ -1518,61 +1533,40 @@ func (c *BaseConnection) updateQuotaMoveBetweenVFolders(sourceFolder, dstFolder if sourceFolder.Name == dstFolder.Name { // both files are inside the same virtual folder if initialSize != -1 { - dataprovider.UpdateVirtualFolderQuota(&dstFolder.BaseVirtualFolder, -numFiles, -initialSize, false) //nolint:errcheck - if dstFolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&c.User, -numFiles, -initialSize, false) //nolint:errcheck - } + dataprovider.UpdateUserFolderQuota(dstFolder, &c.User, -numFiles, -initialSize, false) } return } // files are inside different virtual folders - dataprovider.UpdateVirtualFolderQuota(&sourceFolder.BaseVirtualFolder, -numFiles, -filesSize, false) //nolint:errcheck - if sourceFolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&c.User, -numFiles, -filesSize, false) //nolint:errcheck - } + dataprovider.UpdateUserFolderQuota(sourceFolder, &c.User, -numFiles, -filesSize, false) if initialSize == -1 { - dataprovider.UpdateVirtualFolderQuota(&dstFolder.BaseVirtualFolder, numFiles, filesSize, false) //nolint:errcheck - if dstFolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&c.User, numFiles, filesSize, false) //nolint:errcheck - } - } else { - // we cannot have a directory here, initialSize != -1 only for files - dataprovider.UpdateVirtualFolderQuota(&dstFolder.BaseVirtualFolder, 0, filesSize-initialSize, false) //nolint:errcheck - if dstFolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&c.User, 0, filesSize-initialSize, false) //nolint:errcheck - } + dataprovider.UpdateUserFolderQuota(dstFolder, &c.User, numFiles, filesSize, false) + return } + // we cannot have a directory here, initialSize != -1 only for files + dataprovider.UpdateUserFolderQuota(dstFolder, &c.User, 0, filesSize-initialSize, false) } func (c *BaseConnection) updateQuotaMoveFromVFolder(sourceFolder *vfs.VirtualFolder, initialSize, filesSize int64, numFiles int) { // move between a virtual folder and the user home dir - dataprovider.UpdateVirtualFolderQuota(&sourceFolder.BaseVirtualFolder, -numFiles, -filesSize, false) //nolint:errcheck - if sourceFolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&c.User, -numFiles, -filesSize, false) //nolint:errcheck - } + dataprovider.UpdateUserFolderQuota(sourceFolder, &c.User, -numFiles, -filesSize, false) if initialSize == -1 { dataprovider.UpdateUserQuota(&c.User, numFiles, filesSize, false) //nolint:errcheck - } else { - // we cannot have a directory here, initialSize != -1 only for files - dataprovider.UpdateUserQuota(&c.User, 0, filesSize-initialSize, false) //nolint:errcheck + return } + // we cannot have a directory here, initialSize != -1 only for files + dataprovider.UpdateUserQuota(&c.User, 0, filesSize-initialSize, false) //nolint:errcheck } func (c *BaseConnection) updateQuotaMoveToVFolder(dstFolder *vfs.VirtualFolder, initialSize, filesSize int64, numFiles int) { // move between the user home dir and a virtual folder dataprovider.UpdateUserQuota(&c.User, -numFiles, -filesSize, false) //nolint:errcheck if initialSize == -1 { - dataprovider.UpdateVirtualFolderQuota(&dstFolder.BaseVirtualFolder, numFiles, filesSize, false) //nolint:errcheck - if dstFolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&c.User, numFiles, filesSize, false) //nolint:errcheck - } - } else { - // we cannot have a directory here, initialSize != -1 only for files - dataprovider.UpdateVirtualFolderQuota(&dstFolder.BaseVirtualFolder, 0, filesSize-initialSize, false) //nolint:errcheck - if dstFolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&c.User, 0, filesSize-initialSize, false) //nolint:errcheck - } + dataprovider.UpdateUserFolderQuota(dstFolder, &c.User, numFiles, filesSize, false) + return } + // we cannot have a directory here, initialSize != -1 only for files + dataprovider.UpdateUserFolderQuota(dstFolder, &c.User, 0, filesSize-initialSize, false) } func (c *BaseConnection) updateQuotaAfterRename(fs vfs.Fs, virtualSourcePath, virtualTargetPath, targetPath string, @@ -1814,20 +1808,19 @@ func (c *BaseConnection) GetFsAndResolvedPath(virtualPath string) (vfs.Fs, strin // DirListerAt defines a directory lister implementing the ListAt method. type DirListerAt struct { virtualPath string - user *dataprovider.User + conn *BaseConnection + fs vfs.Fs info []os.FileInfo - id string - protocol string mu sync.Mutex lister vfs.DirLister } -// Add adds the given os.FileInfo to the internal cache -func (l *DirListerAt) Add(fi os.FileInfo) { +// Prepend adds the given os.FileInfo as first element of the internal cache +func (l *DirListerAt) Prepend(fi os.FileInfo) { l.mu.Lock() defer l.mu.Unlock() - l.info = append(l.info, fi) + l.info = slices.Insert(l.info, 0, fi) } // ListAt implements sftp.ListerAt @@ -1840,10 +1833,10 @@ func (l *DirListerAt) ListAt(f []os.FileInfo, _ int64) (int, error) { } if len(f) <= len(l.info) { files := make([]os.FileInfo, 0, len(f)) - for idx := len(l.info) - 1; idx >= 0; idx-- { + for idx := range l.info { files = append(files, l.info[idx]) if len(files) == len(f) { - l.info = l.info[:idx] + l.info = l.info[idx+1:] n := copy(f, files) return n, nil } @@ -1860,14 +1853,12 @@ func (l *DirListerAt) Next(limit int) ([]os.FileInfo, error) { for { files, err := l.lister.Next(limit) if err != nil && !errors.Is(err, io.EOF) { - logger.Debug(l.protocol, l.id, "error retrieving directory entries: %+v", err) - return files, err + l.conn.Log(logger.LevelDebug, "error retrieving directory entries: %+v", err) + return files, l.conn.GetFsError(l.fs, err) } - files = l.user.FilterListDir(files, l.virtualPath) + files = l.conn.User.FilterListDir(files, l.virtualPath) if len(l.info) > 0 { - for _, fi := range l.info { - files = util.PrependFileInfo(files, fi) - } + files = slices.Concat(l.info, files) l.info = nil } if err != nil || len(files) > 0 { @@ -1902,18 +1893,22 @@ func getPermissionDeniedError(protocol string) error { } } -func keepConnectionAlive(c *BaseConnection, done chan bool, interval time.Duration) { - ticker := time.NewTicker(interval) - defer func() { - ticker.Stop() - }() +func keepConnectionAlive(c *BaseConnection, interval time.Duration) func() { + var timer *time.Timer + var closed atomic.Bool - for { - select { - case <-done: - return - case <-ticker.C: - c.UpdateLastActivity() + task := func() { + c.UpdateLastActivity() + + if !closed.Load() { + timer.Reset(interval) } } + + timer = time.AfterFunc(interval, task) + + return func() { + closed.Store(true) + timer.Stop() + } } diff --git a/internal/common/connection_test.go b/internal/common/connection_test.go index 8b9d44c2..0f426858 100644 --- a/internal/common/connection_test.go +++ b/internal/common/connection_test.go @@ -22,6 +22,7 @@ import ( "path" "path/filepath" "runtime" + "slices" "strconv" "testing" "time" @@ -197,25 +198,24 @@ func TestRecursiveRenameWalkError(t *testing.T) { } func TestCrossRenameFsErrors(t *testing.T) { + if runtime.GOOS == osWindows { + t.Skip("this test is not available on Windows") + } fs := vfs.NewOsFs("", os.TempDir(), "", nil) conn := NewBaseConnection("", ProtocolWebDAV, "", "", dataprovider.User{}) - res := conn.hasSpaceForCrossRename(fs, vfs.QuotaCheckResult{}, 1, "missingsource") + dirPath := filepath.Join(os.TempDir(), "d") + err := os.Mkdir(dirPath, os.ModePerm) + assert.NoError(t, err) + err = os.Chmod(dirPath, 0001) + assert.NoError(t, err) + srcInfo := vfs.NewFileInfo(filepath.Base(dirPath), true, 0, time.Now(), false) + res := conn.hasSpaceForCrossRename(fs, vfs.QuotaCheckResult{}, 1, dirPath, srcInfo) assert.False(t, res) - if runtime.GOOS != osWindows { - dirPath := filepath.Join(os.TempDir(), "d") - err := os.Mkdir(dirPath, os.ModePerm) - assert.NoError(t, err) - err = os.Chmod(dirPath, 0001) - assert.NoError(t, err) - res = conn.hasSpaceForCrossRename(fs, vfs.QuotaCheckResult{}, 1, dirPath) - assert.False(t, res) - - err = os.Chmod(dirPath, os.ModePerm) - assert.NoError(t, err) - err = os.Remove(dirPath) - assert.NoError(t, err) - } + err = os.Chmod(dirPath, os.ModePerm) + assert.NoError(t, err) + err = os.Remove(dirPath) + assert.NoError(t, err) } func TestRenameVirtualFolders(t *testing.T) { @@ -389,7 +389,7 @@ func TestErrorsMapping(t *testing.T) { err := conn.GetFsError(fs, os.ErrNotExist) if protocol == ProtocolSFTP { assert.ErrorIs(t, err, sftp.ErrSSHFxNoSuchFile) - } else if util.Contains(osErrorsProtocols, protocol) { + } else if slices.Contains(osErrorsProtocols, protocol) { assert.EqualError(t, err, os.ErrNotExist.Error()) } else { assert.EqualError(t, err, ErrNotExist.Error()) @@ -627,12 +627,11 @@ func TestErrorResolvePath(t *testing.T) { func TestConnectionKeepAlive(t *testing.T) { conn := NewBaseConnection("", ProtocolWebDAV, "", "", dataprovider.User{}) lastActivity := conn.GetLastActivity() - done := make(chan bool) - go func() { - time.Sleep(200 * time.Millisecond) - close(done) - }() - keepConnectionAlive(conn, done, 50*time.Millisecond) + + stop := keepConnectionAlive(conn, 50*time.Millisecond) + defer stop() + + time.Sleep(200 * time.Millisecond) assert.Greater(t, conn.GetLastActivity(), lastActivity) } @@ -1047,6 +1046,37 @@ func TestFilePatterns(t *testing.T) { require.Len(t, filtered, 1) } +func TestStatForOngoingTransfers(t *testing.T) { + user := dataprovider.User{ + BaseUser: sdk.BaseUser{ + Username: xid.New().String(), + Password: xid.New().String(), + HomeDir: filepath.Clean(os.TempDir()), + Status: 1, + Permissions: map[string][]string{ + "/": {"*"}, + }, + }, + } + fileName := "file.txt" + conn := NewBaseConnection(xid.New().String(), ProtocolSFTP, "", "", user) + fs := vfs.NewOsFs("", os.TempDir(), "", nil) + tr := NewBaseTransfer(nil, conn, nil, filepath.Join(os.TempDir(), fileName), filepath.Join(os.TempDir(), fileName), + fileName, TransferUpload, 0, 0, 0, 0, true, fs, dataprovider.TransferQuota{}) + _, err := conn.DoStat("/file.txt", 0, false) + assert.NoError(t, err) + err = tr.Close() + assert.NoError(t, err) + tr = NewBaseTransfer(nil, conn, nil, filepath.Join(os.TempDir(), fileName), filepath.Join(os.TempDir(), fileName), + fileName, TransferDownload, 0, 0, 0, 0, true, fs, dataprovider.TransferQuota{}) + _, err = conn.DoStat("/file.txt", 0, false) + assert.Error(t, err) + err = tr.Close() + assert.NoError(t, err) + err = conn.CloseFS() + assert.NoError(t, err) +} + func TestListerAt(t *testing.T) { dir := t.TempDir() user := dataprovider.User{ @@ -1090,7 +1120,7 @@ func TestListerAt(t *testing.T) { require.ErrorIs(t, err, io.EOF) require.Len(t, files, 0) _, err = lister.Next(-1) - require.ErrorContains(t, err, "invalid limit") + require.ErrorContains(t, err, conn.GetGenericError(err).Error()) err = lister.Close() require.NoError(t, err) @@ -1134,8 +1164,8 @@ func TestListerAt(t *testing.T) { require.Equal(t, 0, n) lister, err = conn.ListDir("/") require.NoError(t, err) - lister.Add(vfs.NewFileInfo("..", true, 0, time.Unix(0, 0), false)) - lister.Add(vfs.NewFileInfo(".", true, 0, time.Unix(0, 0), false)) + lister.Prepend(vfs.NewFileInfo("..", true, 0, time.Unix(0, 0), false)) + lister.Prepend(vfs.NewFileInfo(".", true, 0, time.Unix(0, 0), false)) files = make([]os.FileInfo, 1) n, err = lister.ListAt(files, 0) require.NoError(t, err) @@ -1159,3 +1189,348 @@ func TestListerAt(t *testing.T) { err = lister.Close() require.NoError(t, err) } + +func TestGetFsAndResolvedPath(t *testing.T) { + homeDir := filepath.Join(os.TempDir(), "home_test") + localVdir := filepath.Join(os.TempDir(), "local_mount_test") + + err := os.MkdirAll(homeDir, 0777) + require.NoError(t, err) + err = os.MkdirAll(localVdir, 0777) + require.NoError(t, err) + + t.Cleanup(func() { + os.RemoveAll(homeDir) + os.RemoveAll(localVdir) + }) + + user := dataprovider.User{ + BaseUser: sdk.BaseUser{ + Username: xid.New().String(), + Status: 1, + HomeDir: homeDir, + }, + VirtualFolders: []vfs.VirtualFolder{ + { + BaseVirtualFolder: vfs.BaseVirtualFolder{ + Name: "s3", + MappedPath: "", + FsConfig: vfs.Filesystem{ + Provider: sdk.S3FilesystemProvider, + S3Config: vfs.S3FsConfig{ + BaseS3FsConfig: sdk.BaseS3FsConfig{ + Bucket: "my-test-bucket", + Region: "us-east-1", + }, + }, + }, + }, + VirtualPath: "/s3", + }, + { + BaseVirtualFolder: vfs.BaseVirtualFolder{ + Name: "local", + MappedPath: localVdir, + FsConfig: vfs.Filesystem{ + Provider: sdk.LocalFilesystemProvider, + }, + }, + VirtualPath: "/local", + }, + }, + } + + conn := NewBaseConnection(xid.New().String(), ProtocolSFTP, "", "", user) + + tests := []struct { + name string + inputVirtualPath string + expectedFsType string + expectedPhyPath string // The resolved path on the target FS + expectedRelativePath string + }{ + { + name: "Root File", + inputVirtualPath: "/file.txt", + expectedFsType: "osfs", + expectedPhyPath: filepath.Join(homeDir, "file.txt"), + expectedRelativePath: "/file.txt", + }, + { + name: "Standard S3 File", + inputVirtualPath: "/s3/image.png", + expectedFsType: "S3Fs", + expectedPhyPath: "image.png", + expectedRelativePath: "/s3/image.png", + }, + { + name: "Standard Local Mount File", + inputVirtualPath: "/local/config.json", + expectedFsType: "osfs", + expectedPhyPath: filepath.Join(localVdir, "config.json"), + expectedRelativePath: "/local/config.json", + }, + + { + name: "Backslash Separator -> Should hit S3", + inputVirtualPath: "\\s3\\doc.txt", + expectedFsType: "S3Fs", + expectedPhyPath: "doc.txt", + expectedRelativePath: "/s3/doc.txt", + }, + { + name: "Mixed Separators -> Should hit Local Mount", + inputVirtualPath: "/local\\subdir/test.txt", + expectedFsType: "osfs", + expectedPhyPath: filepath.Join(localVdir, "subdir", "test.txt"), + expectedRelativePath: "/local/subdir/test.txt", + }, + { + name: "Double Slash -> Should normalize and hit S3", + inputVirtualPath: "//s3//dir @1/data.csv", + expectedFsType: "S3Fs", + expectedPhyPath: "dir @1/data.csv", + expectedRelativePath: "/s3/dir @1/data.csv", + }, + + { + name: "Local Mount Traversal (Attempt to escape)", + inputVirtualPath: "/local/../../etc/passwd", + expectedFsType: "osfs", + expectedPhyPath: filepath.Join(homeDir, "/etc/passwd"), + expectedRelativePath: "/etc/passwd", + }, + { + name: "Traversal Out of S3 (Valid)", + inputVirtualPath: "/s3/../../secret.txt", + expectedFsType: "osfs", + expectedPhyPath: filepath.Join(homeDir, "secret.txt"), + expectedRelativePath: "/secret.txt", + }, + { + name: "Traversal Inside S3", + inputVirtualPath: "/s3/subdir/../image.png", + expectedFsType: "S3Fs", + expectedPhyPath: "image.png", + expectedRelativePath: "/s3/image.png", + }, + { + name: "Mount Point Bypass -> Target Local Mount", + inputVirtualPath: "/s3\\..\\local\\secret.txt", + expectedFsType: "osfs", + expectedPhyPath: filepath.Join(localVdir, "secret.txt"), + expectedRelativePath: "/local/secret.txt", + }, + { + name: "Dirty Relative Path (Your Case)", + inputVirtualPath: "test\\..\\..\\oops/file.txt", + expectedFsType: "osfs", + expectedPhyPath: filepath.Join(homeDir, "oops", "file.txt"), + expectedRelativePath: "/oops/file.txt", + }, + { + name: "Relative Path targeting S3 (No leading slash)", + inputVirtualPath: "s3//sub/../image.png", + expectedFsType: "S3Fs", + expectedPhyPath: "image.png", + expectedRelativePath: "/s3/image.png", + }, + { + name: "Windows Path starting with Backslash", + inputVirtualPath: "\\s3\\doc/dir\\doc.txt", + expectedFsType: "S3Fs", + expectedPhyPath: "doc/dir/doc.txt", + expectedRelativePath: "/s3/doc/dir/doc.txt", + }, + { + name: "Filesystem Juggling (Relative)", + inputVirtualPath: "local/../s3/file.txt", + expectedFsType: "S3Fs", + expectedPhyPath: "file.txt", + expectedRelativePath: "/s3/file.txt", + }, + { + name: "Triple Dot Filename (Valid Name)", + inputVirtualPath: "/...hidden/secret", + expectedFsType: "osfs", + expectedPhyPath: filepath.Join(homeDir, "...hidden", "secret"), + expectedRelativePath: "/...hidden/secret", + }, + { + name: "Dot Slash Prefix", + inputVirtualPath: "./local/file.txt", + expectedFsType: "osfs", + expectedPhyPath: filepath.Join(localVdir, "file.txt"), + expectedRelativePath: "/local/file.txt", + }, + { + name: "Root of Local Mount Exactly", + inputVirtualPath: "/local/", + expectedFsType: "osfs", + expectedPhyPath: localVdir, + expectedRelativePath: "/local", + }, + { + name: "Root of S3 Mount Exactly", + inputVirtualPath: "/s3/", + expectedFsType: "S3Fs", + expectedPhyPath: "", + expectedRelativePath: "/s3", + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + // The input path is sanitized by the protocol handler + // implementations before reaching GetFsAndResolvedPath. + cleanInput := util.CleanPath(tc.inputVirtualPath) + fs, resolvedPath, err := conn.GetFsAndResolvedPath(cleanInput) + if assert.NoError(t, err, "did not expect error for path: %q, got: %v", tc.inputVirtualPath, err) { + assert.Contains(t, fs.Name(), tc.expectedFsType, + "routing error: input %q but expected fs %q, got %q", tc.inputVirtualPath, tc.expectedFsType, fs.Name()) + assert.Equal(t, tc.expectedPhyPath, resolvedPath, + "resolution error: input %q resolved to %q expected %q", tc.inputVirtualPath, resolvedPath, tc.expectedPhyPath) + relativePath := fs.GetRelativePath(resolvedPath) + assert.Equal(t, tc.expectedRelativePath, relativePath, + "relative path error, input %q, got %q, expected %q", tc.inputVirtualPath, tc.expectedRelativePath, relativePath) + } + }) + } +} + +func TestOsFsGetRelativePath(t *testing.T) { + homeDir := filepath.Join(os.TempDir(), "home_test") + localVdir := filepath.Join(os.TempDir(), "local_mount_test") + + err := os.MkdirAll(homeDir, 0777) + require.NoError(t, err) + err = os.MkdirAll(localVdir, 0777) + require.NoError(t, err) + + t.Cleanup(func() { + os.RemoveAll(homeDir) + os.RemoveAll(localVdir) + }) + + user := dataprovider.User{ + BaseUser: sdk.BaseUser{ + Username: xid.New().String(), + Status: 1, + HomeDir: homeDir, + }, + VirtualFolders: []vfs.VirtualFolder{ + { + BaseVirtualFolder: vfs.BaseVirtualFolder{ + Name: "local", + MappedPath: localVdir, + FsConfig: vfs.Filesystem{ + Provider: sdk.LocalFilesystemProvider, + }, + }, + VirtualPath: "/local", + }, + }, + } + + connID := xid.New().String() + rootFs, err := user.GetFilesystemForPath("/", connID) + require.NoError(t, err) + + localFs, err := user.GetFilesystemForPath("/local", connID) + require.NoError(t, err) + + tests := []struct { + name string + fs vfs.Fs + inputPath string // The physical path to reverse-map + expectedRel string // The expected virtual path + }{ + { + name: "Root FS - Inside root", + fs: rootFs, + inputPath: filepath.Join(homeDir, "docs", "file.txt"), + expectedRel: "/docs/file.txt", + }, + { + name: "Root FS - Exact root directory", + fs: rootFs, + inputPath: homeDir, + expectedRel: "/", + }, + { + name: "Root FS - External absolute path (Jail to /)", + fs: rootFs, + inputPath: "/etc/passwd", + expectedRel: "/", + }, + { + name: "Root FS - Traversal escape (Jail to /)", + fs: rootFs, + inputPath: filepath.Join(homeDir, "..", "escaped.txt"), + expectedRel: "/", + }, + { + name: "Root FS - Valid file named with triple dots", + fs: rootFs, + inputPath: filepath.Join(homeDir, "..."), + expectedRel: "/...", + }, + { + name: "Local FS - Up path in dir", + fs: rootFs, + inputPath: homeDir + "/../" + filepath.Base(homeDir) + "/dir/test.txt", + expectedRel: "/dir/test.txt", + }, + + { + name: "Local FS - Inside mount", + fs: localFs, + inputPath: filepath.Join(localVdir, "data", "config.json"), + expectedRel: "/local/data/config.json", + }, + { + name: "Local FS - Exact mount directory", + fs: localFs, + inputPath: localVdir, + expectedRel: "/local", + }, + { + name: "Local FS - External absolute path (Jail to /local)", + fs: localFs, + inputPath: "/var/log/syslog", + expectedRel: "/local", + }, + { + name: "Local FS - Traversal escape (Jail to /local)", + fs: localFs, + inputPath: filepath.Join(localVdir, "..", "..", "etc", "passwd"), + expectedRel: "/local", + }, + { + name: "Local FS - Partial prefix (Jail to /local)", + fs: localFs, + inputPath: localVdir + "_backup", + expectedRel: "/local", + }, + { + name: "Local FS - Relative traversal matching virual dir", + fs: localFs, + inputPath: localVdir + "/../" + filepath.Base(localVdir) + "/dir/test.txt", + expectedRel: "/local/dir/test.txt", + }, + { + name: "Local FS - Valid file starting with two dots", + fs: localFs, + inputPath: filepath.Join(localVdir, "..hidden_file.txt"), + expectedRel: "/local/..hidden_file.txt", + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + actualRel := tc.fs.GetRelativePath(tc.inputPath) + assert.Equal(t, tc.expectedRel, actualRel, + "Failed mapping physical path %q on FS %q", tc.inputPath, tc.fs.Name()) + }) + } +} diff --git a/internal/common/dataretention.go b/internal/common/dataretention.go index 4f0f9aca..cbde9521 100644 --- a/internal/common/dataretention.go +++ b/internal/common/dataretention.go @@ -15,44 +15,20 @@ package common import ( - "bytes" - "context" - "encoding/json" "errors" "fmt" "io" - "net/http" - "net/url" "os" - "os/exec" "path" - "path/filepath" - "strings" "sync" "time" - "github.com/wneessen/go-mail" - - "github.com/drakkan/sftpgo/v2/internal/command" "github.com/drakkan/sftpgo/v2/internal/dataprovider" - "github.com/drakkan/sftpgo/v2/internal/httpclient" "github.com/drakkan/sftpgo/v2/internal/logger" - "github.com/drakkan/sftpgo/v2/internal/smtp" "github.com/drakkan/sftpgo/v2/internal/util" "github.com/drakkan/sftpgo/v2/internal/vfs" ) -// RetentionCheckNotification defines the supported notification methods for a retention check result -type RetentionCheckNotification = string - -// Supported notification methods -const ( - // notify results using the defined "data_retention_hook" - RetentionCheckNotificationHook = "Hook" - // notify results by email - RetentionCheckNotificationEmail = "Email" -) - var ( // RetentionChecks is the list of active retention checks RetentionChecks ActiveRetentionChecks @@ -74,14 +50,10 @@ func (c *ActiveRetentionChecks) Get(role string) []RetentionCheck { if role == "" || role == check.Role { foldersCopy := make([]dataprovider.FolderRetention, len(check.Folders)) copy(foldersCopy, check.Folders) - notificationsCopy := make([]string, len(check.Notifications)) - copy(notificationsCopy, check.Notifications) checks = append(checks, RetentionCheck{ - Username: check.Username, - StartTime: check.StartTime, - Notifications: notificationsCopy, - Email: check.Email, - Folders: foldersCopy, + Username: check.Username, + StartTime: check.StartTime, + Folders: foldersCopy, }) } } @@ -150,54 +122,10 @@ type RetentionCheck struct { StartTime int64 `json:"start_time"` // affected folders Folders []dataprovider.FolderRetention `json:"folders"` - // how cleanup results will be notified - Notifications []RetentionCheckNotification `json:"notifications,omitempty"` - // email to use if the notification method is set to email - Email string `json:"email,omitempty"` - Role string `json:"-"` + Role string `json:"-"` // Cleanup results results []folderRetentionCheckResult `json:"-"` - conn *BaseConnection -} - -// Validate returns an error if the specified folders are not valid -func (c *RetentionCheck) Validate() error { - folderPaths := make(map[string]bool) - nothingToDo := true - for idx := range c.Folders { - f := &c.Folders[idx] - if err := f.Validate(); err != nil { - return err - } - if f.Retention > 0 { - nothingToDo = false - } - if _, ok := folderPaths[f.Path]; ok { - return util.NewValidationError(fmt.Sprintf("duplicated folder path %q", f.Path)) - } - folderPaths[f.Path] = true - } - if nothingToDo { - return util.NewValidationError("nothing to delete!") - } - for _, notification := range c.Notifications { - switch notification { - case RetentionCheckNotificationEmail: - if !smtp.IsEnabled() { - return util.NewValidationError("in order to notify results via email you must configure an SMTP server") - } - if c.Email == "" { - return util.NewValidationError("in order to notify results via email you must add a valid email address to your profile") - } - case RetentionCheckNotificationHook: - if Config.DataRetentionHook == "" { - return util.NewValidationError("in order to notify results via hook you must define a data_retention_hook") - } - default: - return util.NewValidationError(fmt.Sprintf("invalid notification %q", notification)) - } - } - return nil + conn *BaseConnection `json:"-"` } func (c *RetentionCheck) updateUserPermissions() { @@ -269,7 +197,7 @@ func (c *RetentionCheck) cleanupFolder(folderPath string, recursion int) error { return nil } result.Error = fmt.Sprintf("unable to get lister for directory %q", folderPath) - c.conn.Log(logger.LevelError, result.Error) + c.conn.Log(logger.LevelError, "%s", result.Error) return err } defer lister.Close() @@ -359,130 +287,13 @@ func (c *RetentionCheck) Start() error { for _, folder := range c.Folders { if folder.Retention > 0 { if err := c.cleanupFolder(folder.Path, 0); err != nil { - c.conn.Log(logger.LevelError, "retention check failed, unable to cleanup folder %q", folder.Path) - c.sendNotifications(time.Since(startTime), err) + c.conn.Log(logger.LevelError, "retention check failed, unable to cleanup folder %q, elapsed: %s", + folder.Path, time.Since(startTime)) return err } } } - c.conn.Log(logger.LevelInfo, "retention check completed") - c.sendNotifications(time.Since(startTime), nil) + c.conn.Log(logger.LevelInfo, "retention check completed, elapsed: %s", time.Since(startTime)) return nil } - -func (c *RetentionCheck) sendNotifications(elapsed time.Duration, err error) { - for _, notification := range c.Notifications { - switch notification { - case RetentionCheckNotificationEmail: - c.sendEmailNotification(err) //nolint:errcheck - case RetentionCheckNotificationHook: - c.sendHookNotification(elapsed, err) //nolint:errcheck - } - } -} - -func (c *RetentionCheck) sendEmailNotification(errCheck error) error { - params := EventParams{} - if len(c.results) > 0 || errCheck != nil { - params.retentionChecks = append(params.retentionChecks, executedRetentionCheck{ - Username: c.conn.User.Username, - ActionName: "Retention check", - Results: c.results, - }) - } - var files []*mail.File - f, err := params.getRetentionReportsAsMailAttachment() - if err != nil { - c.conn.Log(logger.LevelError, "unable to get retention report as mail attachment: %v", err) - return err - } - f.Name = "retention-report.zip" - files = append(files, f) - - startTime := time.Now() - var subject string - if errCheck == nil { - subject = fmt.Sprintf("Successful retention check for user %q", c.conn.User.Username) - } else { - subject = fmt.Sprintf("Retention check failed for user %q", c.conn.User.Username) - } - body := "Further details attached." - err = smtp.SendEmail([]string{c.Email}, nil, subject, body, smtp.EmailContentTypeTextPlain, files...) - if err != nil { - c.conn.Log(logger.LevelError, "unable to notify retention check result via email: %v, elapsed: %s", err, - time.Since(startTime)) - return err - } - c.conn.Log(logger.LevelInfo, "retention check result successfully notified via email, elapsed: %s", time.Since(startTime)) - return nil -} - -func (c *RetentionCheck) sendHookNotification(elapsed time.Duration, errCheck error) error { - startNewHook() - defer hookEnded() - - data := make(map[string]any) - totalDeletedFiles := 0 - totalDeletedSize := int64(0) - for _, result := range c.results { - totalDeletedFiles += result.DeletedFiles - totalDeletedSize += result.DeletedSize - } - data["username"] = c.conn.User.Username - data["start_time"] = c.StartTime - data["elapsed"] = elapsed.Milliseconds() - if errCheck == nil { - data["status"] = 1 - } else { - data["status"] = 0 - } - data["total_deleted_files"] = totalDeletedFiles - data["total_deleted_size"] = totalDeletedSize - data["details"] = c.results - jsonData, _ := json.Marshal(data) - - startTime := time.Now() - - if strings.HasPrefix(Config.DataRetentionHook, "http") { - var url *url.URL - url, err := url.Parse(Config.DataRetentionHook) - if err != nil { - c.conn.Log(logger.LevelError, "invalid data retention hook %q: %v", Config.DataRetentionHook, err) - return err - } - respCode := 0 - - resp, err := httpclient.RetryablePost(url.String(), "application/json", bytes.NewBuffer(jsonData)) - if err == nil { - respCode = resp.StatusCode - resp.Body.Close() - - if respCode != http.StatusOK { - err = errUnexpectedHTTResponse - } - } - - c.conn.Log(logger.LevelDebug, "notified result to URL: %q, status code: %v, elapsed: %v err: %v", - url.Redacted(), respCode, time.Since(startTime), err) - - return err - } - if !filepath.IsAbs(Config.DataRetentionHook) { - err := fmt.Errorf("invalid data retention hook %q", Config.DataRetentionHook) - c.conn.Log(logger.LevelError, "%v", err) - return err - } - timeout, env, args := command.GetConfig(Config.DataRetentionHook, command.HookDataRetention) - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - - cmd := exec.CommandContext(ctx, Config.DataRetentionHook, args...) - cmd.Env = append(env, - fmt.Sprintf("SFTPGO_DATA_RETENTION_RESULT=%s", util.BytesToString(jsonData))) - err := cmd.Run() - - c.conn.Log(logger.LevelDebug, "notified result using command: %q, elapsed: %s err: %v", - Config.DataRetentionHook, time.Since(startTime), err) - return err -} diff --git a/internal/common/dataretention_test.go b/internal/common/dataretention_test.go index b0c17e3b..b3ce46df 100644 --- a/internal/common/dataretention_test.go +++ b/internal/common/dataretention_test.go @@ -15,228 +15,17 @@ package common import ( - "errors" "fmt" - "os/exec" - "runtime" "testing" - "time" "github.com/sftpgo/sdk" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/drakkan/sftpgo/v2/internal/dataprovider" - "github.com/drakkan/sftpgo/v2/internal/smtp" "github.com/drakkan/sftpgo/v2/internal/util" ) -func TestRetentionValidation(t *testing.T) { - check := RetentionCheck{} - check.Folders = []dataprovider.FolderRetention{ - { - Path: "/", - Retention: -1, - }, - } - err := check.Validate() - require.Error(t, err) - assert.Contains(t, err.Error(), "invalid folder retention") - - check.Folders = []dataprovider.FolderRetention{ - { - Path: "/ab/..", - Retention: 0, - }, - } - err = check.Validate() - require.Error(t, err) - assert.Contains(t, err.Error(), "nothing to delete") - assert.Equal(t, "/", check.Folders[0].Path) - - check.Folders = append(check.Folders, dataprovider.FolderRetention{ - Path: "/../..", - Retention: 24, - }) - err = check.Validate() - require.Error(t, err) - assert.Contains(t, err.Error(), `duplicated folder path "/"`) - - check.Folders = []dataprovider.FolderRetention{ - { - Path: "/dir1", - Retention: 48, - }, - { - Path: "/dir2", - Retention: 96, - }, - } - err = check.Validate() - assert.NoError(t, err) - assert.Len(t, check.Notifications, 0) - assert.Empty(t, check.Email) - - check.Notifications = []RetentionCheckNotification{RetentionCheckNotificationEmail} - err = check.Validate() - require.Error(t, err) - assert.Contains(t, err.Error(), "you must configure an SMTP server") - - smtpCfg := smtp.Config{ - Host: "mail.example.com", - Port: 25, - From: "notification@example.com", - TemplatesPath: "templates", - } - err = smtpCfg.Initialize(configDir, true) - require.NoError(t, err) - - err = check.Validate() - require.Error(t, err) - assert.Contains(t, err.Error(), "you must add a valid email address") - - check.Email = "admin@example.com" - err = check.Validate() - assert.NoError(t, err) - - smtpCfg = smtp.Config{} - err = smtpCfg.Initialize(configDir, true) - require.NoError(t, err) - - check.Notifications = []RetentionCheckNotification{RetentionCheckNotificationHook} - err = check.Validate() - require.Error(t, err) - assert.Contains(t, err.Error(), "data_retention_hook") - - check.Notifications = []string{"not valid"} - err = check.Validate() - require.Error(t, err) - assert.Contains(t, err.Error(), "invalid notification") -} - -func TestRetentionEmailNotifications(t *testing.T) { - smtpCfg := smtp.Config{ - Host: "127.0.0.1", - Port: 2525, - From: "notification@example.com", - TemplatesPath: "templates", - } - err := smtpCfg.Initialize(configDir, true) - require.NoError(t, err) - - user := dataprovider.User{ - BaseUser: sdk.BaseUser{ - Username: "user1", - }, - } - user.Permissions = make(map[string][]string) - user.Permissions["/"] = []string{dataprovider.PermAny} - check := RetentionCheck{ - Notifications: []RetentionCheckNotification{RetentionCheckNotificationEmail}, - Email: "notification@example.com", - results: []folderRetentionCheckResult{ - { - Path: "/", - Retention: 24, - DeletedFiles: 10, - DeletedSize: 32657, - Elapsed: 10 * time.Second, - }, - }, - } - conn := NewBaseConnection("", "", "", "", user) - conn.SetProtocol(ProtocolDataRetention) - conn.ID = fmt.Sprintf("data_retention_%v", user.Username) - check.conn = conn - check.sendNotifications(1*time.Second, nil) - err = check.sendEmailNotification(nil) - assert.NoError(t, err) - err = check.sendEmailNotification(errors.New("test error")) - assert.NoError(t, err) - - check.results = nil - err = check.sendEmailNotification(nil) - if assert.Error(t, err) { - assert.Contains(t, err.Error(), "no data retention report available") - } - - smtpCfg.Port = 2626 - err = smtpCfg.Initialize(configDir, true) - require.NoError(t, err) - err = check.sendEmailNotification(nil) - assert.Error(t, err) - check.results = []folderRetentionCheckResult{ - { - Path: "/", - Retention: 24, - DeletedFiles: 20, - DeletedSize: 456789, - Elapsed: 12 * time.Second, - }, - } - - smtpCfg = smtp.Config{} - err = smtpCfg.Initialize(configDir, true) - require.NoError(t, err) - err = check.sendEmailNotification(nil) - assert.Error(t, err) -} - -func TestRetentionHookNotifications(t *testing.T) { - dataRetentionHook := Config.DataRetentionHook - - Config.DataRetentionHook = fmt.Sprintf("http://%v", httpAddr) - user := dataprovider.User{ - BaseUser: sdk.BaseUser{ - Username: "user2", - }, - } - user.Permissions = make(map[string][]string) - user.Permissions["/"] = []string{dataprovider.PermAny} - check := RetentionCheck{ - Notifications: []RetentionCheckNotification{RetentionCheckNotificationHook}, - results: []folderRetentionCheckResult{ - { - Path: "/", - Retention: 24, - DeletedFiles: 10, - DeletedSize: 32657, - Elapsed: 10 * time.Second, - }, - }, - } - conn := NewBaseConnection("", "", "", "", user) - conn.SetProtocol(ProtocolDataRetention) - conn.ID = fmt.Sprintf("data_retention_%v", user.Username) - check.conn = conn - check.sendNotifications(1*time.Second, nil) - err := check.sendHookNotification(1*time.Second, nil) - assert.NoError(t, err) - - Config.DataRetentionHook = fmt.Sprintf("http://%v/404", httpAddr) - err = check.sendHookNotification(1*time.Second, nil) - assert.ErrorIs(t, err, errUnexpectedHTTResponse) - - Config.DataRetentionHook = "http://foo\x7f.com/retention" - err = check.sendHookNotification(1*time.Second, err) - assert.Error(t, err) - - Config.DataRetentionHook = "relativepath" - err = check.sendHookNotification(1*time.Second, err) - assert.Error(t, err) - - if runtime.GOOS != osWindows { - hookCmd, err := exec.LookPath("true") - assert.NoError(t, err) - - Config.DataRetentionHook = hookCmd - err = check.sendHookNotification(1*time.Second, err) - assert.NoError(t, err) - } - - Config.DataRetentionHook = dataRetentionHook -} - func TestRetentionPermissionsAndGetFolder(t *testing.T) { user := dataprovider.User{ BaseUser: sdk.BaseUser{ @@ -311,7 +100,6 @@ func TestRetentionCheckAddRemove(t *testing.T) { Retention: 48, }, }, - Notifications: []RetentionCheckNotification{RetentionCheckNotificationHook}, } assert.NotNil(t, RetentionChecks.Add(check, &user)) checks := RetentionChecks.Get("") @@ -321,8 +109,6 @@ func TestRetentionCheckAddRemove(t *testing.T) { require.Len(t, checks[0].Folders, 1) assert.Equal(t, check.Folders[0].Path, checks[0].Folders[0].Path) assert.Equal(t, check.Folders[0].Retention, checks[0].Folders[0].Retention) - require.Len(t, checks[0].Notifications, 1) - assert.Equal(t, RetentionCheckNotificationHook, checks[0].Notifications[0]) assert.Nil(t, RetentionChecks.Add(check, &user)) assert.True(t, RetentionChecks.remove(username)) @@ -349,7 +135,6 @@ func TestRetentionCheckRole(t *testing.T) { Retention: 48, }, }, - Notifications: []RetentionCheckNotification{RetentionCheckNotificationHook}, } assert.NotNil(t, RetentionChecks.Add(check, &user)) checks := RetentionChecks.Get("") diff --git a/internal/common/defender.go b/internal/common/defender.go index d3f38221..18ea0ea7 100644 --- a/internal/common/defender.go +++ b/internal/common/defender.go @@ -53,6 +53,7 @@ type Defender interface { GetBanTime(ip string) (*time.Time, error) GetScore(ip string) (int, error) DeleteHost(ip string) bool + DelayLogin(err error) } // DefenderConfig defines the "defender" configuration @@ -90,6 +91,16 @@ type DefenderConfig struct { // to return when you request for the entire host list from the defender EntriesSoftLimit int `json:"entries_soft_limit" mapstructure:"entries_soft_limit"` EntriesHardLimit int `json:"entries_hard_limit" mapstructure:"entries_hard_limit"` + // Configuration to impose a delay between login attempts + LoginDelay LoginDelay `json:"login_delay" mapstructure:"login_delay"` +} + +// LoginDelay defines the delays to impose between login attempts. +type LoginDelay struct { + // The number of milliseconds to pause prior to allowing a successful login + Success int `json:"success" mapstructure:"success"` + // The number of milliseconds to pause prior to reporting a failed login + PasswordFailed int `json:"password_failed" mapstructure:"password_failed"` } type baseDefender struct { @@ -163,6 +174,19 @@ func (d *baseDefender) logBan(ip, protocol string) { Send() } +// DelayLogin applies the configured login delay. +func (d *baseDefender) DelayLogin(err error) { + if err == nil { + if d.config.LoginDelay.Success > 0 { + time.Sleep(time.Duration(d.config.LoginDelay.Success) * time.Millisecond) + } + return + } + if d.config.LoginDelay.PasswordFailed > 0 { + time.Sleep(time.Duration(d.config.LoginDelay.PasswordFailed) * time.Millisecond) + } +} + type hostEvent struct { dateTime time.Time score int diff --git a/internal/common/defender_test.go b/internal/common/defender_test.go index 9465a770..f7cb9ad4 100644 --- a/internal/common/defender_test.go +++ b/internal/common/defender_test.go @@ -435,6 +435,31 @@ func TestDefenderCleanup(t *testing.T) { assert.Equal(t, 0, score) } +func TestDefenderDelay(t *testing.T) { + d := memoryDefender{ + baseDefender: baseDefender{ + config: &DefenderConfig{ + ObservationTime: 1, + EntriesSoftLimit: 2, + EntriesHardLimit: 3, + LoginDelay: LoginDelay{ + Success: 50, + PasswordFailed: 200, + }, + }, + }, + } + startTime := time.Now() + d.DelayLogin(nil) + elapsed := time.Since(startTime) + assert.Less(t, elapsed, time.Millisecond*100) + + startTime = time.Now() + d.DelayLogin(ErrInternalFailure) + elapsed = time.Since(startTime) + assert.Greater(t, elapsed, time.Millisecond*150) +} + func TestDefenderConfig(t *testing.T) { c := DefenderConfig{} err := c.validate() diff --git a/internal/common/defenderdb.go b/internal/common/defenderdb.go index d60879b4..63995862 100644 --- a/internal/common/defenderdb.go +++ b/internal/common/defenderdb.go @@ -62,7 +62,7 @@ func (d *dbDefender) GetHost(ip string) (dataprovider.DefenderEntry, error) { // and increase ban time if the IP is found. // This method must be called as soon as the client connects func (d *dbDefender) IsBanned(ip, protocol string) bool { - if d.baseDefender.isBanned(ip, protocol) { + if d.isBanned(ip, protocol) { return true } @@ -95,22 +95,22 @@ func (d *dbDefender) AddEvent(ip, protocol string, event HostEvent) bool { return true } - score := d.baseDefender.getScore(event) + score := d.getScore(event) host, err := dataprovider.AddDefenderEvent(ip, score, d.getStartObservationTime()) if err != nil { return false } - d.baseDefender.logEvent(ip, protocol, event, host.Score) + d.logEvent(ip, protocol, event, host.Score) if host.Score > d.config.Threshold { - d.baseDefender.logBan(ip, protocol) + d.logBan(ip, protocol) banTime := time.Now().Add(time.Duration(d.config.BanTime) * time.Minute) err = dataprovider.SetDefenderBanTime(ip, util.GetTimeAsMsSinceEpoch(banTime)) if err == nil { eventManager.handleIPBlockedEvent(EventParams{ Event: ipBlockedEventName, IP: ip, - Timestamp: time.Now().UnixNano(), + Timestamp: time.Now(), Status: 1, }) } diff --git a/internal/common/defendermem.go b/internal/common/defendermem.go index 6a908d04..0f59b37a 100644 --- a/internal/common/defendermem.go +++ b/internal/common/defendermem.go @@ -148,7 +148,7 @@ func (d *memoryDefender) IsBanned(ip, protocol string) bool { defer d.RUnlock() - return d.baseDefender.isBanned(ip, protocol) + return d.isBanned(ip, protocol) } // DeleteHost removes the specified IP from the defender lists @@ -188,7 +188,7 @@ func (d *memoryDefender) AddEvent(ip, protocol string, event HostEvent) bool { delete(d.banned, ip) } - score := d.baseDefender.getScore(event) + score := d.getScore(event) ev := hostEvent{ dateTime: time.Now(), @@ -207,25 +207,25 @@ func (d *memoryDefender) AddEvent(ip, protocol string, event HostEvent) bool { idx++ } } - d.baseDefender.logEvent(ip, protocol, event, hs.TotalScore) + d.logEvent(ip, protocol, event, hs.TotalScore) hs.Events = hs.Events[:idx] if hs.TotalScore >= d.config.Threshold { - d.baseDefender.logBan(ip, protocol) + d.logBan(ip, protocol) d.banned[ip] = time.Now().Add(time.Duration(d.config.BanTime) * time.Minute) delete(d.hosts, ip) d.cleanupBanned() eventManager.handleIPBlockedEvent(EventParams{ Event: ipBlockedEventName, IP: ip, - Timestamp: time.Now().UnixNano(), + Timestamp: time.Now(), Status: 1, }) } else { d.hosts[ip] = hs } } else { - d.baseDefender.logEvent(ip, protocol, event, ev.score) + d.logEvent(ip, protocol, event, ev.score) d.hosts[ip] = hostScore{ TotalScore: ev.score, Events: []hostEvent{ev}, diff --git a/internal/common/eventmanager.go b/internal/common/eventmanager.go index de9cbf64..ca0f7494 100644 --- a/internal/common/eventmanager.go +++ b/internal/common/eventmanager.go @@ -21,6 +21,7 @@ import ( "encoding/json" "errors" "fmt" + "html" "io" "mime" "mime/multipart" @@ -31,6 +32,7 @@ import ( "os/exec" "path" "path/filepath" + "slices" "strconv" "strings" "sync" @@ -55,8 +57,9 @@ import ( const ( ipBlockedEventName = "IP Blocked" maxAttachmentsSize = int64(10 * 1024 * 1024) - objDataPlaceholder = "{{ObjectData}}" - objDataPlaceholderString = "{{ObjectDataString}}" + objDataPlaceholder = "{{.ObjectData}}" + objDataPlaceholderString = "{{.ObjectDataString}}" + dateTimeMillisFormat = "2006-01-02T15:04:05.000" ) // Supported IDP login events @@ -69,6 +72,9 @@ var ( // eventManager handle the supported event rules actions eventManager eventRulesContainer multipartQuoteEscaper = strings.NewReplacer("\\", "\\\\", `"`, "\\\"") + fsEventsWithSize = []string{operationPreDelete, OperationPreUpload, operationDelete, + operationCopy, operationDownload, operationFirstUpload, operationFirstDownload, + operationUpload} ) func init() { @@ -88,11 +94,12 @@ func init() { ObjectType: objectType, IP: ip, Role: role, - Timestamp: time.Now().UnixNano(), + Timestamp: time.Now(), Object: object, } if u, ok := object.(*dataprovider.User); ok { p.Email = u.Email + p.Groups = u.Groups } else if a, ok := object.(*dataprovider.Admin); ok { p.Email = a.Email } @@ -271,7 +278,8 @@ func (r *eventRulesContainer) addUpdateRuleInternal(rule dataprovider.EventRule) func (r *eventRulesContainer) loadRules() { eventManagerLog(logger.LevelDebug, "loading updated rules") modTime := util.GetTimeAsMsSinceEpoch(time.Now()) - rules, err := dataprovider.GetRecentlyUpdatedRules(r.getLastLoadTime()) + lastLoadTime := r.getLastLoadTime() + rules, err := dataprovider.GetRecentlyUpdatedRules(lastLoadTime) if err != nil { eventManagerLog(logger.LevelError, "unable to load event rules: %v", err) return @@ -307,23 +315,26 @@ func (*eventRulesContainer) checkIPDLoginEventMatch(conditions *dataprovider.Eve } func (*eventRulesContainer) checkProviderEventMatch(conditions *dataprovider.EventConditions, params *EventParams) bool { - if !util.Contains(conditions.ProviderEvents, params.Event) { + if !slices.Contains(conditions.ProviderEvents, params.Event) { return false } if !checkEventConditionPatterns(params.Name, conditions.Options.Names) { return false } + if !checkEventGroupConditionPatterns(params.Groups, conditions.Options.GroupNames) { + return false + } if !checkEventConditionPatterns(params.Role, conditions.Options.RoleNames) { return false } - if len(conditions.Options.ProviderObjects) > 0 && !util.Contains(conditions.Options.ProviderObjects, params.ObjectType) { + if len(conditions.Options.ProviderObjects) > 0 && !slices.Contains(conditions.Options.ProviderObjects, params.ObjectType) { return false } return true } func (*eventRulesContainer) checkFsEventMatch(conditions *dataprovider.EventConditions, params *EventParams) bool { - if !util.Contains(conditions.FsEvents, params.Event) { + if !slices.Contains(conditions.FsEvents, params.Event) { return false } if !checkEventConditionPatterns(params.Name, conditions.Options.Names) { @@ -338,10 +349,10 @@ func (*eventRulesContainer) checkFsEventMatch(conditions *dataprovider.EventCond if !checkEventConditionPatterns(params.VirtualPath, conditions.Options.FsPaths) { return false } - if len(conditions.Options.Protocols) > 0 && !util.Contains(conditions.Options.Protocols, params.Protocol) { + if len(conditions.Options.Protocols) > 0 && !slices.Contains(conditions.Options.Protocols, params.Protocol) { return false } - if params.Event == operationUpload || params.Event == operationDownload { + if slices.Contains(fsEventsWithSize, params.Event) { if conditions.Options.MinFileSize > 0 { if params.FileSize < conditions.Options.MinFileSize { return false @@ -555,7 +566,7 @@ type EventParams struct { IP string Role string Email string - Timestamp int64 + Timestamp time.Time UID string IDPCustomFields *map[string]string Object plugin.Renderer @@ -639,7 +650,7 @@ func (p *EventParams) setBackupParams(backupPath string) { p.FsPath = backupPath p.ObjectName = filepath.Base(backupPath) p.VirtualPath = "/" + p.ObjectName - p.Timestamp = time.Now().UnixNano() + p.Timestamp = time.Now() info, err := os.Stat(backupPath) if err == nil { p.FileSize = info.Size() @@ -765,46 +776,70 @@ func (p *EventParams) getRetentionReportsAsMailAttachment() (*mail.File, error) }, nil } -func (*EventParams) getStringReplacement(val string, jsonEscaped bool) string { - if jsonEscaped { +func (*EventParams) getStringReplacement(val string, escapeMode int) string { + switch escapeMode { + case 1: return util.JSONEscape(val) + case 2: + return html.EscapeString(val) + default: + return val } - return val } -func (p *EventParams) getStringReplacements(addObjectData, jsonEscaped bool) []string { +func (p *EventParams) getStringReplacements(addObjectData bool, escapeMode int) []string { + var dateTimeString string + if Config.TZ == "local" { + dateTimeString = p.Timestamp.Local().Format(dateTimeMillisFormat) + } else { + dateTimeString = p.Timestamp.UTC().Format(dateTimeMillisFormat) + } + year := dateTimeString[0:4] + month := dateTimeString[5:7] + day := dateTimeString[8:10] + hour := dateTimeString[11:13] + minute := dateTimeString[14:16] + replacements := []string{ - "{{Name}}", p.getStringReplacement(p.Name, jsonEscaped), - "{{Event}}", p.Event, - "{{Status}}", fmt.Sprintf("%d", p.Status), - "{{VirtualPath}}", p.getStringReplacement(p.VirtualPath, jsonEscaped), - "{{FsPath}}", p.getStringReplacement(p.FsPath, jsonEscaped), - "{{VirtualTargetPath}}", p.getStringReplacement(p.VirtualTargetPath, jsonEscaped), - "{{FsTargetPath}}", p.getStringReplacement(p.FsTargetPath, jsonEscaped), - "{{ObjectName}}", p.getStringReplacement(p.ObjectName, jsonEscaped), - "{{ObjectType}}", p.ObjectType, - "{{FileSize}}", strconv.FormatInt(p.FileSize, 10), - "{{Elapsed}}", strconv.FormatInt(p.Elapsed, 10), - "{{Protocol}}", p.Protocol, - "{{IP}}", p.IP, - "{{Role}}", p.getStringReplacement(p.Role, jsonEscaped), - "{{Email}}", p.getStringReplacement(p.Email, jsonEscaped), - "{{Timestamp}}", strconv.FormatInt(p.Timestamp, 10), - "{{StatusString}}", p.getStatusString(), - "{{UID}}", p.getStringReplacement(p.UID, jsonEscaped), - "{{Ext}}", p.getStringReplacement(p.Extension, jsonEscaped), + "{{.Name}}", p.getStringReplacement(p.Name, escapeMode), + "{{.Event}}", p.Event, + "{{.Status}}", fmt.Sprintf("%d", p.Status), + "{{.VirtualPath}}", p.getStringReplacement(p.VirtualPath, escapeMode), + "{{.EscapedVirtualPath}}", p.getStringReplacement(url.QueryEscape(p.VirtualPath), escapeMode), + "{{.FsPath}}", p.getStringReplacement(p.FsPath, escapeMode), + "{{.VirtualTargetPath}}", p.getStringReplacement(p.VirtualTargetPath, escapeMode), + "{{.FsTargetPath}}", p.getStringReplacement(p.FsTargetPath, escapeMode), + "{{.ObjectName}}", p.getStringReplacement(p.ObjectName, escapeMode), + "{{.ObjectBaseName}}", p.getStringReplacement(strings.TrimSuffix(p.ObjectName, p.Extension), escapeMode), + "{{.ObjectType}}", p.ObjectType, + "{{.FileSize}}", strconv.FormatInt(p.FileSize, 10), + "{{.Elapsed}}", strconv.FormatInt(p.Elapsed, 10), + "{{.Protocol}}", p.Protocol, + "{{.IP}}", p.IP, + "{{.Role}}", p.getStringReplacement(p.Role, escapeMode), + "{{.Email}}", p.getStringReplacement(p.Email, escapeMode), + "{{.Timestamp}}", strconv.FormatInt(p.Timestamp.UnixNano(), 10), + "{{.DateTime}}", dateTimeString, + "{{.Year}}", year, + "{{.Month}}", month, + "{{.Day}}", day, + "{{.Hour}}", hour, + "{{.Minute}}", minute, + "{{.StatusString}}", p.getStatusString(), + "{{.UID}}", p.getStringReplacement(p.UID, escapeMode), + "{{.Ext}}", p.getStringReplacement(p.Extension, escapeMode), } if p.VirtualPath != "" { - replacements = append(replacements, "{{VirtualDirPath}}", p.getStringReplacement(path.Dir(p.VirtualPath), jsonEscaped)) + replacements = append(replacements, "{{.VirtualDirPath}}", p.getStringReplacement(path.Dir(p.VirtualPath), escapeMode)) } if p.VirtualTargetPath != "" { - replacements = append(replacements, "{{VirtualTargetDirPath}}", p.getStringReplacement(path.Dir(p.VirtualTargetPath), jsonEscaped)) - replacements = append(replacements, "{{TargetName}}", p.getStringReplacement(path.Base(p.VirtualTargetPath), jsonEscaped)) + replacements = append(replacements, "{{.VirtualTargetDirPath}}", p.getStringReplacement(path.Dir(p.VirtualTargetPath), escapeMode)) + replacements = append(replacements, "{{.TargetName}}", p.getStringReplacement(path.Base(p.VirtualTargetPath), escapeMode)) } if len(p.errors) > 0 { - replacements = append(replacements, "{{ErrorString}}", p.getStringReplacement(strings.Join(p.errors, ", "), jsonEscaped)) + replacements = append(replacements, "{{.ErrorString}}", p.getStringReplacement(strings.Join(p.errors, ", "), escapeMode)) } else { - replacements = append(replacements, "{{ErrorString}}", "") + replacements = append(replacements, "{{.ErrorString}}", "") } replacements = append(replacements, objDataPlaceholder, "{}") replacements = append(replacements, objDataPlaceholderString, "") @@ -812,23 +847,23 @@ func (p *EventParams) getStringReplacements(addObjectData, jsonEscaped bool) []s data, err := p.Object.RenderAsJSON(p.Event != operationDelete) if err == nil { dataString := util.BytesToString(data) - replacements[len(replacements)-3] = p.getStringReplacement(dataString, false) - replacements[len(replacements)-1] = p.getStringReplacement(dataString, true) + replacements[len(replacements)-3] = p.getStringReplacement(dataString, 0) + replacements[len(replacements)-1] = p.getStringReplacement(dataString, 1) } } if p.IDPCustomFields != nil { for k, v := range *p.IDPCustomFields { - replacements = append(replacements, fmt.Sprintf("{{IDPField%s}}", k), p.getStringReplacement(v, jsonEscaped)) + replacements = append(replacements, fmt.Sprintf("{{.IDPField%s}}", k), p.getStringReplacement(v, escapeMode)) } } - replacements = append(replacements, "{{Metadata}}", "{}") - replacements = append(replacements, "{{MetadataString}}", "") + replacements = append(replacements, "{{.Metadata}}", "{}") + replacements = append(replacements, "{{.MetadataString}}", "") if len(p.Metadata) > 0 { data, err := json.Marshal(p.Metadata) if err == nil { dataString := util.BytesToString(data) - replacements[len(replacements)-3] = p.getStringReplacement(dataString, false) - replacements[len(replacements)-1] = p.getStringReplacement(dataString, true) + replacements[len(replacements)-3] = p.getStringReplacement(dataString, 0) + replacements[len(replacements)-1] = p.getStringReplacement(dataString, 1) } } return replacements @@ -908,10 +943,7 @@ func updateUserQuotaAfterFileWrite(conn *BaseConnection, virtualPath string, num dataprovider.UpdateUserQuota(&conn.User, numFiles, fileSize, false) //nolint:errcheck return } - dataprovider.UpdateVirtualFolderQuota(&vfolder.BaseVirtualFolder, numFiles, fileSize, false) //nolint:errcheck - if vfolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&conn.User, numFiles, fileSize, false) //nolint:errcheck - } + dataprovider.UpdateUserFolderQuota(&vfolder, &conn.User, numFiles, fileSize, false) } func checkWriterPermsAndQuota(conn *BaseConnection, virtualPath string, numFiles int, expectedSize, truncatedSize int64) error { @@ -988,7 +1020,7 @@ func getFileWriter(conn *BaseConnection, virtualPath string, expectedSize int64) return w, numFiles, truncatedSize, cancelFn, nil } -func addZipEntry(wr *zipWriterWrapper, conn *BaseConnection, entryPath, baseDir string, recursion int) error { +func addZipEntry(wr *zipWriterWrapper, conn *BaseConnection, entryPath, baseDir string, info os.FileInfo, recursion int) error { //nolint:gocyclo if entryPath == wr.Name { // skip the archive itself return nil @@ -998,10 +1030,13 @@ func addZipEntry(wr *zipWriterWrapper, conn *BaseConnection, entryPath, baseDir return util.ErrRecursionTooDeep } recursion++ - info, err := conn.DoStat(entryPath, 1, false) - if err != nil { - eventManagerLog(logger.LevelError, "unable to add zip entry %q, stat error: %v", entryPath, err) - return err + var err error + if info == nil { + info, err = conn.DoStat(entryPath, 1, false) + if err != nil { + eventManagerLog(logger.LevelError, "unable to add zip entry %q, stat error: %v", entryPath, err) + return err + } } entryName, err := getZipEntryName(entryPath, baseDir) if err != nil { @@ -1039,7 +1074,7 @@ func addZipEntry(wr *zipWriterWrapper, conn *BaseConnection, entryPath, baseDir } for _, info := range contents { fullPath := util.CleanPath(path.Join(entryPath, info.Name())) - if err := addZipEntry(wr, conn, fullPath, baseDir, recursion); err != nil { + if err := addZipEntry(wr, conn, fullPath, baseDir, info, recursion); err != nil { eventManagerLog(logger.LevelError, "unable to add zip entry: %v", err) return err } @@ -1163,7 +1198,7 @@ func getMailAttachments(conn *BaseConnection, attachments []string, replacer *st } func replaceWithReplacer(input string, replacer *strings.Replacer) string { - if !strings.Contains(input, "{{") { + if !strings.Contains(input, "{{.") { return input } return replacer.Replace(input) @@ -1250,7 +1285,7 @@ func getHTTPRuleActionEndpoint(c *dataprovider.EventActionHTTPConfig, replacer * if err != nil { return "", fmt.Errorf("invalid endpoint: %w", err) } - if strings.Contains(u.Path, "{{") { + if strings.Contains(u.Path, "{{.") { pathComponents := strings.Split(u.Path, "/") for idx := range pathComponents { part := replaceWithReplacer(pathComponents[idx], replacer) @@ -1284,7 +1319,7 @@ func writeHTTPPart(m *multipart.Writer, part dataprovider.HTTPPart, h textproto. if part.Body != "" { cType := h.Get("Content-Type") if strings.Contains(strings.ToLower(cType), "application/json") { - replacements := params.getStringReplacements(addObjectData, true) + replacements := params.getStringReplacements(addObjectData, 1) jsonReplacer := strings.NewReplacer(replacements...) _, err = partWriter.Write(util.StringToBytes(replaceWithReplacer(part.Body, jsonReplacer))) } else { @@ -1316,7 +1351,7 @@ func writeHTTPPart(m *multipart.Writer, part dataprovider.HTTPPart, h textproto. return nil } -func getHTTPRuleActionBody(c *dataprovider.EventActionHTTPConfig, replacer *strings.Replacer, +func getHTTPRuleActionBody(c *dataprovider.EventActionHTTPConfig, replacer *strings.Replacer, //nolint:gocyclo cancel context.CancelFunc, user dataprovider.User, params *EventParams, addObjectData bool, ) (io.Reader, string, error) { var body io.Reader @@ -1332,7 +1367,7 @@ func getHTTPRuleActionBody(c *dataprovider.EventActionHTTPConfig, replacer *stri return bytes.NewBuffer(data), "", nil } if c.HasJSONBody() { - replacements := params.getStringReplacements(addObjectData, true) + replacements := params.getStringReplacements(addObjectData, 1) jsonReplacer := strings.NewReplacer(replacements...) return bytes.NewBufferString(replaceWithReplacer(c.Body, jsonReplacer)), "", nil } @@ -1345,8 +1380,7 @@ func getHTTPRuleActionBody(c *dataprovider.EventActionHTTPConfig, replacer *stri var conn *BaseConnection if user.Username != "" { var err error - user, err = getUserForEventAction(user) - if err != nil { + if err := getUserForEventAction(&user); err != nil { return body, "", err } connectionID := fmt.Sprintf("%s_%s", protocolEventAction, xid.New().String()) @@ -1362,6 +1396,9 @@ func getHTTPRuleActionBody(c *dataprovider.EventActionHTTPConfig, replacer *stri go func() { defer w.Close() defer user.CloseFs() //nolint:errcheck + if conn != nil { + defer conn.CloseFS() //nolint:errcheck + } for _, part := range c.Parts { h := make(textproto.MIMEHeader) @@ -1417,7 +1454,7 @@ func executeHTTPRuleAction(c dataprovider.EventActionHTTPConfig, params *EventPa addObjectData = c.HasObjectData() } - replacements := params.getStringReplacements(addObjectData, false) + replacements := params.getStringReplacements(addObjectData, 0) replacer := strings.NewReplacer(replacements...) endpoint, err := getHTTPRuleActionEndpoint(&c, replacer) if err != nil { @@ -1467,7 +1504,7 @@ func executeHTTPRuleAction(c dataprovider.EventActionHTTPConfig, params *EventPa if resp.StatusCode < http.StatusOK || resp.StatusCode > http.StatusNoContent { if rb, err := io.ReadAll(io.LimitReader(resp.Body, 2048)); err == nil { eventManagerLog(logger.LevelDebug, "error notification response from endpoint %q: %s", - endpoint, util.BytesToString(rb)) + endpoint, rb) } return fmt.Errorf("unexpected status code: %d", resp.StatusCode) } @@ -1476,6 +1513,9 @@ func executeHTTPRuleAction(c dataprovider.EventActionHTTPConfig, params *EventPa } func executeCommandRuleAction(c dataprovider.EventActionCommandConfig, params *EventParams) error { + if !dataprovider.IsActionCommandAllowed(c.Cmd) { + return fmt.Errorf("command %q is not allowed", c.Cmd) + } addObjectData := false if params.Object != nil { for _, k := range c.EnvVars { @@ -1485,7 +1525,7 @@ func executeCommandRuleAction(c dataprovider.EventActionCommandConfig, params *E } } } - replacements := params.getStringReplacements(addObjectData, false) + replacements := params.getStringReplacements(addObjectData, 0) replacer := strings.NewReplacer(replacements...) args := make([]string, 0, len(c.Args)) @@ -1499,7 +1539,7 @@ func executeCommandRuleAction(c dataprovider.EventActionCommandConfig, params *E cmd := exec.CommandContext(ctx, c.Cmd, args...) cmd.Env = []string{} for _, keyVal := range c.EnvVars { - if keyVal.Value == "$" { + if keyVal.Value == "$" && !strings.HasPrefix(strings.ToUpper(keyVal.Key), "SFTPGO_") { val := os.Getenv(keyVal.Key) if val == "" { eventManagerLog(logger.LevelDebug, "empty value for environment variable %q", keyVal.Key) @@ -1540,9 +1580,16 @@ func executeEmailRuleAction(c dataprovider.EventActionEmailConfig, params *Event addObjectData = true } } - replacements := params.getStringReplacements(addObjectData, false) + replacements := params.getStringReplacements(addObjectData, 0) replacer := strings.NewReplacer(replacements...) - body := replaceWithReplacer(c.Body, replacer) + var body string + if c.ContentType == 1 { + replacements := params.getStringReplacements(addObjectData, 2) + bodyReplacer := strings.NewReplacer(replacements...) + body = replaceWithReplacer(c.Body, bodyReplacer) + } else { + body = replaceWithReplacer(c.Body, replacer) + } subject := replaceWithReplacer(c.Subject, replacer) recipients := getEmailAddressesWithReplacer(c.Recipients, replacer) bcc := getEmailAddressesWithReplacer(c.Bcc, replacer) @@ -1565,8 +1612,7 @@ func executeEmailRuleAction(c dataprovider.EventActionEmailConfig, params *Event if err != nil { return err } - user, err = getUserForEventAction(user) - if err != nil { + if err := getUserForEventAction(&user); err != nil { return err } connectionID := fmt.Sprintf("%s_%s", protocolEventAction, xid.New().String()) @@ -1576,6 +1622,8 @@ func executeEmailRuleAction(c dataprovider.EventActionEmailConfig, params *Event return fmt.Errorf("error getting email attachments, unable to check root fs for user %q: %w", user.Username, err) } conn := NewBaseConnection(connectionID, protocolEventAction, "", "", user) + defer conn.CloseFS() //nolint:errcheck + res, err := getMailAttachments(conn, fileAttachments, replacer) if err != nil { return err @@ -1591,11 +1639,11 @@ func executeEmailRuleAction(c dataprovider.EventActionEmailConfig, params *Event return nil } -func getUserForEventAction(user dataprovider.User) (dataprovider.User, error) { +func getUserForEventAction(user *dataprovider.User) error { err := user.LoadAndApplyGroupSettings() if err != nil { eventManagerLog(logger.LevelError, "unable to get group for user %q: %+v", user.Username, err) - return dataprovider.User{}, fmt.Errorf("unable to get groups for user %q", user.Username) + return fmt.Errorf("unable to get groups for user %q", user.Username) } user.UploadDataTransfer = 0 user.UploadBandwidth = 0 @@ -1606,7 +1654,7 @@ func getUserForEventAction(user dataprovider.User) (dataprovider.User, error) { for k := range user.Permissions { user.Permissions[k] = []string{dataprovider.PermAny} } - return user, nil + return nil } func replacePathsPlaceholders(paths []string, replacer *strings.Replacer) []string { @@ -1626,17 +1674,18 @@ func executeDeleteFileFsAction(conn *BaseConnection, item string, info os.FileIn } func executeDeleteFsActionForUser(deletes []string, replacer *strings.Replacer, user dataprovider.User) error { - user, err := getUserForEventAction(user) - if err != nil { + if err := getUserForEventAction(&user); err != nil { return err } connectionID := fmt.Sprintf("%s_%s", protocolEventAction, xid.New().String()) - err = user.CheckFsRoot(connectionID) + err := user.CheckFsRoot(connectionID) defer user.CloseFs() //nolint:errcheck if err != nil { return fmt.Errorf("delete error, unable to check root fs for user %q: %w", user.Username, err) } conn := NewBaseConnection(connectionID, protocolEventAction, "", "", user) + defer conn.CloseFS() //nolint:errcheck + for _, item := range replacePathsPlaceholders(deletes, replacer) { info, err := conn.DoStat(item, 0, false) if err != nil { @@ -1694,17 +1743,18 @@ func executeDeleteFsRuleAction(deletes []string, replacer *strings.Replacer, } func executeMkDirsFsActionForUser(dirs []string, replacer *strings.Replacer, user dataprovider.User) error { - user, err := getUserForEventAction(user) - if err != nil { + if err := getUserForEventAction(&user); err != nil { return err } connectionID := fmt.Sprintf("%s_%s", protocolEventAction, xid.New().String()) - err = user.CheckFsRoot(connectionID) + err := user.CheckFsRoot(connectionID) defer user.CloseFs() //nolint:errcheck if err != nil { return fmt.Errorf("mkdir error, unable to check root fs for user %q: %w", user.Username, err) } conn := NewBaseConnection(connectionID, protocolEventAction, "", "", user) + defer conn.CloseFS() //nolint:errcheck + for _, item := range replacePathsPlaceholders(dirs, replacer) { if err = conn.CheckParentDirs(path.Dir(item)); err != nil { return fmt.Errorf("unable to check parent dirs for %q, user %q: %w", item, user.Username, err) @@ -1750,24 +1800,29 @@ func executeMkdirFsRuleAction(dirs []string, replacer *strings.Replacer, return nil } -func executeRenameFsActionForUser(renames []dataprovider.KeyValue, replacer *strings.Replacer, +func executeRenameFsActionForUser(renames []dataprovider.RenameConfig, replacer *strings.Replacer, user dataprovider.User, ) error { - user, err := getUserForEventAction(user) - if err != nil { + if err := getUserForEventAction(&user); err != nil { return err } connectionID := fmt.Sprintf("%s_%s", protocolEventAction, xid.New().String()) - err = user.CheckFsRoot(connectionID) + err := user.CheckFsRoot(connectionID) defer user.CloseFs() //nolint:errcheck if err != nil { return fmt.Errorf("rename error, unable to check root fs for user %q: %w", user.Username, err) } conn := NewBaseConnection(connectionID, protocolEventAction, "", "", user) + defer conn.CloseFS() //nolint:errcheck + for _, item := range renames { source := util.CleanPath(replaceWithReplacer(item.Key, replacer)) target := util.CleanPath(replaceWithReplacer(item.Value, replacer)) - if err = conn.renameInternal(source, target, true); err != nil { + checks := 0 + if item.UpdateModTime { + checks += vfs.CheckUpdateModTime + } + if err = conn.renameInternal(source, target, true, checks); err != nil { return fmt.Errorf("unable to rename %q->%q, user %q: %w", source, target, user.Username, err) } eventManagerLog(logger.LevelDebug, "rename %q->%q ok, user %q", source, target, user.Username) @@ -1775,21 +1830,22 @@ func executeRenameFsActionForUser(renames []dataprovider.KeyValue, replacer *str return nil } -func executeCopyFsActionForUser(copy []dataprovider.KeyValue, replacer *strings.Replacer, +func executeCopyFsActionForUser(keyVals []dataprovider.KeyValue, replacer *strings.Replacer, user dataprovider.User, ) error { - user, err := getUserForEventAction(user) - if err != nil { + if err := getUserForEventAction(&user); err != nil { return err } connectionID := fmt.Sprintf("%s_%s", protocolEventAction, xid.New().String()) - err = user.CheckFsRoot(connectionID) + err := user.CheckFsRoot(connectionID) defer user.CloseFs() //nolint:errcheck if err != nil { return fmt.Errorf("copy error, unable to check root fs for user %q: %w", user.Username, err) } conn := NewBaseConnection(connectionID, protocolEventAction, "", "", user) - for _, item := range copy { + defer conn.CloseFS() //nolint:errcheck + + for _, item := range keyVals { source := util.CleanPath(replaceWithReplacer(item.Key, replacer)) target := util.CleanPath(replaceWithReplacer(item.Value, replacer)) if strings.HasSuffix(item.Key, "/") { @@ -1809,17 +1865,18 @@ func executeCopyFsActionForUser(copy []dataprovider.KeyValue, replacer *strings. func executeExistFsActionForUser(exist []string, replacer *strings.Replacer, user dataprovider.User, ) error { - user, err := getUserForEventAction(user) - if err != nil { + if err := getUserForEventAction(&user); err != nil { return err } connectionID := fmt.Sprintf("%s_%s", protocolEventAction, xid.New().String()) - err = user.CheckFsRoot(connectionID) + err := user.CheckFsRoot(connectionID) defer user.CloseFs() //nolint:errcheck if err != nil { return fmt.Errorf("existence check error, unable to check root fs for user %q: %w", user.Username, err) } conn := NewBaseConnection(connectionID, protocolEventAction, "", "", user) + defer conn.CloseFS() //nolint:errcheck + for _, item := range replacePathsPlaceholders(exist, replacer) { if _, err = conn.DoStat(item, 0, false); err != nil { return fmt.Errorf("error checking existence for path %q, user %q: %w", item, user.Username, err) @@ -1829,7 +1886,7 @@ func executeExistFsActionForUser(exist []string, replacer *strings.Replacer, return nil } -func executeRenameFsRuleAction(renames []dataprovider.KeyValue, replacer *strings.Replacer, +func executeRenameFsRuleAction(renames []dataprovider.RenameConfig, replacer *strings.Replacer, conditions dataprovider.ConditionOptions, params *EventParams, ) error { users, err := params.getUsers() @@ -1863,7 +1920,7 @@ func executeRenameFsRuleAction(renames []dataprovider.KeyValue, replacer *string return nil } -func executeCopyFsRuleAction(copy []dataprovider.KeyValue, replacer *strings.Replacer, +func executeCopyFsRuleAction(keyVals []dataprovider.KeyValue, replacer *strings.Replacer, conditions dataprovider.ConditionOptions, params *EventParams, ) error { users, err := params.getUsers() @@ -1882,7 +1939,7 @@ func executeCopyFsRuleAction(copy []dataprovider.KeyValue, replacer *strings.Rep } } executed++ - if err = executeCopyFsActionForUser(copy, replacer, user); err != nil { + if err = executeCopyFsActionForUser(keyVals, replacer, user); err != nil { failures = append(failures, user.Username) params.AddError(err) } @@ -1967,17 +2024,18 @@ func estimateZipSize(conn *BaseConnection, zipPath string, paths []string) (int6 func executeCompressFsActionForUser(c dataprovider.EventActionFsCompress, replacer *strings.Replacer, user dataprovider.User, ) error { - user, err := getUserForEventAction(user) - if err != nil { + if err := getUserForEventAction(&user); err != nil { return err } connectionID := fmt.Sprintf("%s_%s", protocolEventAction, xid.New().String()) - err = user.CheckFsRoot(connectionID) + err := user.CheckFsRoot(connectionID) defer user.CloseFs() //nolint:errcheck if err != nil { return fmt.Errorf("compress error, unable to check root fs for user %q: %w", user.Username, err) } conn := NewBaseConnection(connectionID, protocolEventAction, "", "", user) + defer conn.CloseFS() //nolint:errcheck + name := util.CleanPath(replaceWithReplacer(c.Name, replacer)) conn.CheckParentDirs(path.Dir(name)) //nolint:errcheck paths := make([]string, 0, len(c.Paths)) @@ -2011,7 +2069,7 @@ func executeCompressFsActionForUser(c dataprovider.EventActionFsCompress, replac } startTime := time.Now() for _, item := range paths { - if err := addZipEntry(zipWriter, conn, item, baseDir, 0); err != nil { + if err := addZipEntry(zipWriter, conn, item, baseDir, nil, 0); err != nil { closeWriterAndUpdateQuota(writer, conn, name, "", numFiles, truncatedSize, err, operationUpload, startTime) //nolint:errcheck return err } @@ -2096,7 +2154,7 @@ func executeFsRuleAction(c dataprovider.EventActionFilesystemConfig, conditions params *EventParams, ) error { addObjectData := false - replacements := params.getStringReplacements(addObjectData, false) + replacements := params.getStringReplacements(addObjectData, 0) replacer := strings.NewReplacer(replacements...) switch c.Type { case dataprovider.FilesystemActionRename: @@ -2448,7 +2506,7 @@ func executePwdExpirationCheckForUser(user *dataprovider.User, config dataprovid } subject := "SFTPGo password expiration notification" startTime := time.Now() - if err := smtp.SendEmail([]string{user.Email}, nil, subject, body.String(), smtp.EmailContentTypeTextHTML); err != nil { + if err := smtp.SendEmail(user.GetEmailAddresses(), nil, subject, body.String(), smtp.EmailContentTypeTextHTML); err != nil { eventManagerLog(logger.LevelError, "unable to notify password expiration for user %s: %v, elapsed: %s", user.Username, err, time.Since(startTime)) return err @@ -2496,7 +2554,7 @@ func executeAdminCheckAction(c *dataprovider.EventActionIDPAccountCheck, params return nil, err } - replacements := params.getStringReplacements(false, true) + replacements := params.getStringReplacements(false, 1) replacer := strings.NewReplacer(replacements...) data := replaceWithReplacer(c.TemplateAdmin, replacer) @@ -2505,19 +2563,57 @@ func executeAdminCheckAction(c *dataprovider.EventActionIDPAccountCheck, params if err != nil { return nil, err } - if newAdmin.Password == "" { - newAdmin.Password = util.GenerateUniqueID() - } if exists { eventManagerLog(logger.LevelDebug, "updating admin %q after IDP login", params.Name) + // Not sure if this makes sense, but it shouldn't hurt. + if newAdmin.Password == "" { + newAdmin.Password = admin.Password + } + newAdmin.Filters.TOTPConfig = admin.Filters.TOTPConfig + newAdmin.Filters.RecoveryCodes = admin.Filters.RecoveryCodes err = dataprovider.UpdateAdmin(&newAdmin, dataprovider.ActionExecutorSystem, "", "") } else { eventManagerLog(logger.LevelDebug, "creating admin %q after IDP login", params.Name) + if newAdmin.Password == "" { + newAdmin.Password = util.GenerateUniqueID() + } err = dataprovider.AddAdmin(&newAdmin, dataprovider.ActionExecutorSystem, "", "") } return &newAdmin, err } +func preserveUserProfile(user, newUser *dataprovider.User) { + if newUser.CanChangePassword() && user.Password != "" { + newUser.Password = user.Password + } + if newUser.CanManagePublicKeys() && len(user.PublicKeys) > 0 { + newUser.PublicKeys = user.PublicKeys + } + if newUser.CanManageTLSCerts() { + if len(user.Filters.TLSCerts) > 0 { + newUser.Filters.TLSCerts = user.Filters.TLSCerts + } + } + if newUser.CanChangeInfo() { + if user.Description != "" { + newUser.Description = user.Description + } + if user.Email != "" { + newUser.Email = user.Email + } + if len(user.Filters.AdditionalEmails) > 0 { + newUser.Filters.AdditionalEmails = user.Filters.AdditionalEmails + } + } + if newUser.CanChangeAPIKeyAuth() { + newUser.Filters.AllowAPIKeyAuth = user.Filters.AllowAPIKeyAuth + } + newUser.Filters.RecoveryCodes = user.Filters.RecoveryCodes + newUser.Filters.TOTPConfig = user.Filters.TOTPConfig + newUser.LastPasswordChange = user.LastPasswordChange + newUser.SetEmptySecretsIfNil() +} + func executeUserCheckAction(c *dataprovider.EventActionIDPAccountCheck, params *EventParams) (*dataprovider.User, error) { user, err := dataprovider.UserExists(params.Name, "") exists := err == nil @@ -2528,7 +2624,7 @@ func executeUserCheckAction(c *dataprovider.EventActionIDPAccountCheck, params * if err != nil && !errors.Is(err, util.ErrNotFound) { return nil, err } - replacements := params.getStringReplacements(false, true) + replacements := params.getStringReplacements(false, 1) replacer := strings.NewReplacer(replacements...) data := replaceWithReplacer(c.TemplateUser, replacer) @@ -2539,6 +2635,7 @@ func executeUserCheckAction(c *dataprovider.EventActionIDPAccountCheck, params * } if exists { eventManagerLog(logger.LevelDebug, "updating user %q after IDP login", params.Name) + preserveUserProfile(&user, &newUser) err = dataprovider.UpdateUser(&newUser, dataprovider.ActionExecutorSystem, "", "") } else { eventManagerLog(logger.LevelDebug, "creating user %q after IDP login", params.Name) @@ -2551,9 +2648,14 @@ func executeUserCheckAction(c *dataprovider.EventActionIDPAccountCheck, params * return &u, err } -func executeRuleAction(action dataprovider.BaseEventAction, params *EventParams, +func executeRuleAction(action dataprovider.BaseEventAction, params *EventParams, //nolint:gocyclo conditions dataprovider.ConditionOptions, ) error { + if len(conditions.EventStatuses) > 0 && !slices.Contains(conditions.EventStatuses, params.Status) { + eventManagerLog(logger.LevelDebug, "skipping action %s, event status %d does not match: %v", + action.Name, params.Status, conditions.EventStatuses) + return nil + } var err error switch action.Type { @@ -2585,6 +2687,8 @@ func executeRuleAction(action dataprovider.BaseEventAction, params *EventParams, err = executeUserExpirationCheckRuleAction(conditions, params) case dataprovider.ActionTypeUserInactivityCheck: err = executeUserInactivityCheckRuleAction(action.Options.UserInactivityConfig, conditions, params, time.Now()) + case dataprovider.ActionTypeRotateLogs: + err = logger.RotateLogFile() default: err = fmt.Errorf("unsupported action type: %d", action.Type) } @@ -2742,6 +2846,16 @@ func (j *eventCronJob) getTask(rule *dataprovider.EventRule) (dataprovider.Task, return dataprovider.Task{}, nil } +func (j *eventCronJob) getEventParams() EventParams { + return EventParams{ + Event: "Schedule", + Name: j.ruleName, + Status: 1, + Timestamp: time.Now(), + updateStatusFromError: true, + } +} + func (j *eventCronJob) Run() { eventManagerLog(logger.LevelDebug, "executing scheduled rule %q", j.ruleName) rule, err := dataprovider.EventRuleExists(j.ruleName) @@ -2792,9 +2906,9 @@ func (j *eventCronJob) Run() { } }(task.Name) - executeAsyncRulesActions([]dataprovider.EventRule{rule}, EventParams{Status: 1, updateStatusFromError: true}) + executeAsyncRulesActions([]dataprovider.EventRule{rule}, j.getEventParams()) } else { - executeAsyncRulesActions([]dataprovider.EventRule{rule}, EventParams{Status: 1, updateStatusFromError: true}) + executeAsyncRulesActions([]dataprovider.EventRule{rule}, j.getEventParams()) } eventManagerLog(logger.LevelDebug, "execution for scheduled rule %q finished", j.ruleName) } diff --git a/internal/common/eventmanager_test.go b/internal/common/eventmanager_test.go index 47ddd08c..d350421e 100644 --- a/internal/common/eventmanager_test.go +++ b/internal/common/eventmanager_test.go @@ -800,6 +800,32 @@ func TestEventManagerErrors(t *testing.T) { stopEventScheduler() } +func TestDateTimePlaceholder(t *testing.T) { + oldTZ := Config.TZ + + Config.TZ = "" + dateTime := time.Now() + params := EventParams{ + Timestamp: dateTime, + } + replacements := params.getStringReplacements(false, 0) + r := strings.NewReplacer(replacements...) + res := r.Replace("{{.DateTime}}") + assert.Equal(t, dateTime.UTC().Format(dateTimeMillisFormat), res) + res = r.Replace("{{.Year}}-{{.Month}}-{{.Day}}T{{.Hour}}:{{.Minute}}") + assert.Equal(t, dateTime.UTC().Format(dateTimeMillisFormat)[:16], res) + + Config.TZ = "local" + replacements = params.getStringReplacements(false, 0) + r = strings.NewReplacer(replacements...) + res = r.Replace("{{.DateTime}}") + assert.Equal(t, dateTime.Local().Format(dateTimeMillisFormat), res) + res = r.Replace("{{.Year}}-{{.Month}}-{{.Day}}T{{.Hour}}:{{.Minute}}") + assert.Equal(t, dateTime.Local().Format(dateTimeMillisFormat)[:16], res) + + Config.TZ = oldTZ +} + func TestEventRuleActions(t *testing.T) { actionName := "test rule action" action := dataprovider.BaseEventAction{ @@ -819,7 +845,7 @@ func TestEventRuleActions(t *testing.T) { HTTPConfig: dataprovider.EventActionHTTPConfig{ Endpoint: "http://foo\x7f.com/", // invalid URL SkipTLSVerify: true, - Body: `"data": "{{ObjectDataString}}"`, + Body: `"data": "{{.ObjectDataString}}"`, Method: http.MethodPost, QueryParameters: []dataprovider.KeyValue{ { @@ -887,7 +913,7 @@ func TestEventRuleActions(t *testing.T) { assert.Contains(t, getErrorString(err), "error getting user") action.Options.HTTPConfig.Parts = nil - action.Options.HTTPConfig.Body = "{{ObjectData}}" + action.Options.HTTPConfig.Body = "{{.ObjectData}}" // test disk and transfer quota reset username1 := "user1" username2 := "user2" @@ -1166,10 +1192,12 @@ func TestEventRuleActions(t *testing.T) { action.Options = dataprovider.BaseEventActionOptions{ FsConfig: dataprovider.EventActionFilesystemConfig{ Type: dataprovider.FilesystemActionRename, - Renames: []dataprovider.KeyValue{ + Renames: []dataprovider.RenameConfig{ { - Key: "/source", - Value: "/target", + KeyValue: dataprovider.KeyValue{ + Key: "/source", + Value: "/target", + }, }, }, }, @@ -1221,7 +1249,7 @@ func TestEventRuleActions(t *testing.T) { Type: dataprovider.FilesystemActionCompress, Compress: dataprovider.EventActionFsCompress{ Name: "test.zip", - Paths: []string{"/{{VirtualPath}}"}, + Paths: []string{"/{{.VirtualPath}}"}, }, }, } @@ -1386,6 +1414,31 @@ func TestIDPAccountCheckRule(t *testing.T) { assert.NoError(t, err) assert.Equal(t, username, user.Username) assert.Equal(t, 1, user.Status) + assert.Empty(t, user.Password) + assert.Len(t, user.PublicKeys, 0) + assert.Len(t, user.Filters.TLSCerts, 0) + assert.Empty(t, user.Email) + assert.Empty(t, user.Description) + // Update the profile attribute and make sure they are preserved + user.Password = "secret" + user.Email = "example@example.com" + user.Filters.AdditionalEmails = []string{"alias@example.com"} + user.Description = "some desc" + user.Filters.TLSCerts = []string{serverCert} + user.PublicKeys = []string{"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC03jj0D+djk7pxIf/0OhrxrchJTRZklofJ1NoIu4752Sq02mdXmarMVsqJ1cAjV5LBVy3D1F5U6XW4rppkXeVtd04Pxb09ehtH0pRRPaoHHlALiJt8CoMpbKYMA8b3KXPPriGxgGomvtU2T2RMURSwOZbMtpsugfjYSWenyYX+VORYhylWnSXL961LTyC21ehd6d6QnW9G7E5hYMITMY9TuQZz3bROYzXiTsgN0+g6Hn7exFQp50p45StUMfV/SftCMdCxlxuyGny2CrN/vfjO7xxOo2uv7q1qm10Q46KPWJQv+pgZ/OfL+EDjy07n5QVSKHlbx+2nT4Q0EgOSQaCTYwn3YjtABfIxWwgAFdyj6YlPulCL22qU4MYhDcA6PSBwDdf8hvxBfvsiHdM+JcSHvv8/VeJhk6CmnZxGY0fxBupov27z3yEO8nAg8k+6PaUiW1MSUfuGMF/ktB8LOstXsEPXSszuyXiOv4DaryOXUiSn7bmRqKcEFlJusO6aZP0= nicola@p1"} + err = dataprovider.UpdateUser(user, "", "", "") + assert.NoError(t, err) + + user, err = executeUserCheckAction(c, params) + assert.NoError(t, err) + assert.Equal(t, username, user.Username) + assert.Equal(t, 1, user.Status) + assert.NotEmpty(t, user.Password) + assert.Len(t, user.PublicKeys, 1) + assert.Len(t, user.Filters.TLSCerts, 1) + assert.NotEmpty(t, user.Email) + assert.Len(t, user.Filters.AdditionalEmails, 1) + assert.NotEmpty(t, user.Description) err = dataprovider.DeleteUser(username, "", "", "") assert.NoError(t, err) @@ -1686,10 +1739,12 @@ func TestFilesystemActionErrors(t *testing.T) { assert.NoError(t, err) err = dataprovider.AddUser(&user, "", "", "") assert.NoError(t, err) - err = executeRenameFsActionForUser([]dataprovider.KeyValue{ + err = executeRenameFsActionForUser([]dataprovider.RenameConfig{ { - Key: "/p1", - Value: "/p1", + KeyValue: dataprovider.KeyValue{ + Key: "/p1", + Value: "/p1", + }, }, }, testReplacer, user) if assert.Error(t, err) { @@ -1700,10 +1755,12 @@ func TestFilesystemActionErrors(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ FsConfig: dataprovider.EventActionFilesystemConfig{ Type: dataprovider.FilesystemActionRename, - Renames: []dataprovider.KeyValue{ + Renames: []dataprovider.RenameConfig{ { - Key: "/p2", - Value: "/p2", + KeyValue: dataprovider.KeyValue{ + Key: "/p2", + Value: "/p2", + }, }, }, }, @@ -1789,7 +1846,7 @@ func TestFilesystemActionErrors(t *testing.T) { Writer: zip.NewWriter(bytes.NewBuffer(nil)), Entries: map[string]bool{}, } - err = addZipEntry(wr, conn, "/adir/sub/f.dat", "/adir/sub/sub", 0) + err = addZipEntry(wr, conn, "/adir/sub/f.dat", "/adir/sub/sub", nil, 0) assert.Error(t, err) assert.Contains(t, getErrorString(err), "is outside base dir") } @@ -1799,7 +1856,7 @@ func TestFilesystemActionErrors(t *testing.T) { Writer: zip.NewWriter(bytes.NewBuffer(nil)), Entries: map[string]bool{}, } - err = addZipEntry(wr, conn, "/p1", "/", 2000) + err = addZipEntry(wr, conn, "/p1", "/", nil, 2000) assert.ErrorIs(t, err, util.ErrRecursionTooDeep) err = dataprovider.DeleteUser(username, "", "", "") @@ -1897,12 +1954,27 @@ func TestScheduledActions(t *testing.T) { backupsPath := filepath.Join(os.TempDir(), "backups") err := os.RemoveAll(backupsPath) assert.NoError(t, err) + now := time.Now().UTC().Format(dateTimeMillisFormat) + // The backup action sets the home directory to the backup path. + expectedDirPath := filepath.Join(backupsPath, fmt.Sprintf("%s_%s_%s", now[0:4], now[5:7], now[8:10])) - action := &dataprovider.BaseEventAction{ - Name: "action", + action1 := &dataprovider.BaseEventAction{ + Name: "action1", Type: dataprovider.ActionTypeBackup, } - err = dataprovider.AddEventAction(action, "", "", "") + err = dataprovider.AddEventAction(action1, "", "", "") + assert.NoError(t, err) + action2 := &dataprovider.BaseEventAction{ + Name: "action2", + Type: dataprovider.ActionTypeFilesystem, + Options: dataprovider.BaseEventActionOptions{ + FsConfig: dataprovider.EventActionFilesystemConfig{ + Type: dataprovider.FilesystemActionMkdirs, + MkDirs: []string{"{{.Year}}_{{.Month}}_{{.Day}}"}, + }, + }, + } + err = dataprovider.AddEventAction(action2, "", "", "") assert.NoError(t, err) rule := &dataprovider.EventRule{ Name: "rule", @@ -1921,10 +1993,16 @@ func TestScheduledActions(t *testing.T) { Actions: []dataprovider.EventAction{ { BaseEventAction: dataprovider.BaseEventAction{ - Name: action.Name, + Name: action1.Name, }, Order: 1, }, + { + BaseEventAction: dataprovider.BaseEventAction{ + Name: action2.Name, + }, + Order: 2, + }, }, } @@ -1939,9 +2017,10 @@ func TestScheduledActions(t *testing.T) { job.Run() assert.DirExists(t, backupsPath) + assert.DirExists(t, expectedDirPath) - action.Type = dataprovider.ActionTypeEmail - action.Options = dataprovider.BaseEventActionOptions{ + action1.Type = dataprovider.ActionTypeEmail + action1.Options = dataprovider.BaseEventActionOptions{ EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"example@example.com"}, Subject: "test with attachments", @@ -1949,16 +2028,19 @@ func TestScheduledActions(t *testing.T) { Attachments: []string{"/file1.txt"}, }, } - err = dataprovider.UpdateEventAction(action, "", "", "") + err = dataprovider.UpdateEventAction(action1, "", "", "") assert.NoError(t, err) job.Run() // action is not compatible with a scheduled rule err = dataprovider.DeleteEventRule(rule.Name, "", "", "") assert.NoError(t, err) - err = dataprovider.DeleteEventAction(action.Name, "", "", "") + err = dataprovider.DeleteEventAction(action1.Name, "", "", "") + assert.NoError(t, err) + err = dataprovider.DeleteEventAction(action2.Name, "", "", "") assert.NoError(t, err) err = os.RemoveAll(backupsPath) assert.NoError(t, err) + stopEventScheduler() } @@ -2077,11 +2159,11 @@ func TestWriteHTTPPartsError(t *testing.T) { } func TestReplacePathsPlaceholders(t *testing.T) { - replacer := strings.NewReplacer("{{VirtualPath}}", "/path1") - paths := []string{"{{VirtualPath}}", "/path1"} + replacer := strings.NewReplacer("{{.VirtualPath}}", "/path1") + paths := []string{"{{.VirtualPath}}", "/path1"} paths = replacePathsPlaceholders(paths, replacer) assert.Equal(t, []string{"/path1"}, paths) - paths = []string{"{{VirtualPath}}", "/path2"} + paths = []string{"{{.VirtualPath}}", "/path2"} paths = replacePathsPlaceholders(paths, replacer) assert.Equal(t, []string{"/path1", "/path2"}, paths) } @@ -2174,7 +2256,7 @@ func TestOnDemandRule(t *testing.T) { Recipients: []string{"example@example.org"}, Subject: "subject", Body: "body", - Attachments: []string{"/{{VirtualPath}}"}, + Attachments: []string{"/{{.VirtualPath}}"}, }, }, } @@ -2215,21 +2297,21 @@ func getErrorString(err error) string { func TestHTTPEndpointWithPlaceholders(t *testing.T) { c := dataprovider.EventActionHTTPConfig{ - Endpoint: "http://127.0.0.1:8080/base/url/{{Name}}/{{VirtualPath}}/upload", + Endpoint: "http://127.0.0.1:8080/base/url/{{.Name}}/{{.VirtualPath}}/upload", QueryParameters: []dataprovider.KeyValue{ { Key: "u", - Value: "{{Name}}", + Value: "{{.Name}}", }, { Key: "p", - Value: "{{VirtualPath}}", + Value: "{{.VirtualPath}}", }, }, } name := "uname" vPath := "/a dir/@ file.txt" - replacer := strings.NewReplacer("{{Name}}", name, "{{VirtualPath}}", vPath) + replacer := strings.NewReplacer("{{.Name}}", name, "{{.VirtualPath}}", vPath) u, err := getHTTPRuleActionEndpoint(&c, replacer) assert.NoError(t, err) expected := "http://127.0.0.1:8080/base/url/" + url.PathEscape(name) + "/" + url.PathEscape(vPath) + @@ -2249,9 +2331,9 @@ func TestMetadataReplacement(t *testing.T) { "key": "value", }, } - replacements := params.getStringReplacements(false, false) + replacements := params.getStringReplacements(false, 0) replacer := strings.NewReplacer(replacements...) - reader, _, err := getHTTPRuleActionBody(&dataprovider.EventActionHTTPConfig{Body: "{{Metadata}} {{MetadataString}}"}, replacer, nil, dataprovider.User{}, params, false) + reader, _, err := getHTTPRuleActionBody(&dataprovider.EventActionHTTPConfig{Body: "{{.Metadata}} {{.MetadataString}}"}, replacer, nil, dataprovider.User{}, params, false) require.NoError(t, err) data, err := io.ReadAll(reader) require.NoError(t, err) diff --git a/internal/common/eventscheduler.go b/internal/common/eventscheduler.go index 71315e81..762880f7 100644 --- a/internal/common/eventscheduler.go +++ b/internal/common/eventscheduler.go @@ -19,6 +19,8 @@ import ( "github.com/robfig/cron/v3" + "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/logger" "github.com/drakkan/sftpgo/v2/internal/util" ) @@ -36,7 +38,15 @@ func stopEventScheduler() { func startEventScheduler() { stopEventScheduler() - eventScheduler = cron.New(cron.WithLocation(time.UTC), cron.WithLogger(cron.DiscardLogger)) + options := []cron.Option{ + cron.WithLogger(cron.DiscardLogger), + } + if !dataprovider.UseLocalTime() { + eventManagerLog(logger.LevelDebug, "use UTC time for the scheduler") + options = append(options, cron.WithLocation(time.UTC)) + } + + eventScheduler = cron.New(options...) eventManager.loadRules() _, err := eventScheduler.AddFunc("@every 10m", eventManager.loadRules) util.PanicOnError(err) diff --git a/internal/common/protocol_test.go b/internal/common/protocol_test.go index e8f590b2..8147e246 100644 --- a/internal/common/protocol_test.go +++ b/internal/common/protocol_test.go @@ -26,10 +26,12 @@ import ( "math" "net" "net/http" + "net/url" "os" "path" "path/filepath" "runtime" + "slices" "strings" "sync" "testing" @@ -1457,15 +1459,15 @@ func TestTruncateQuotaLimits(t *testing.T) { expectedQuotaSize := int64(3) fold, _, err := httpdtest.GetFolderByName(folder2.Name, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, expectedQuotaSize, fold.UsedQuotaSize) - assert.Equal(t, expectedQuotaFiles, fold.UsedQuotaFiles) + assert.Equal(t, int64(0), fold.UsedQuotaSize) + assert.Equal(t, 0, fold.UsedQuotaFiles) err = f.Close() assert.NoError(t, err) expectedQuotaFiles = 1 fold, _, err = httpdtest.GetFolderByName(folder2.Name, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, expectedQuotaSize, fold.UsedQuotaSize) - assert.Equal(t, expectedQuotaFiles, fold.UsedQuotaFiles) + assert.Equal(t, int64(0), fold.UsedQuotaSize) + assert.Equal(t, 0, fold.UsedQuotaFiles) user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) assert.NoError(t, err) assert.Equal(t, expectedQuotaFiles, user.UsedQuotaFiles) @@ -1777,8 +1779,8 @@ func TestVirtualFoldersQuotaValues(t *testing.T) { assert.Equal(t, expectedQuotaSize, user.UsedQuotaSize) f, _, err := httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize, f.UsedQuotaSize) @@ -1885,8 +1887,8 @@ func TestQuotaRenameInsideSameVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize+testFileSize1, user.UsedQuotaSize) f, _, err := httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 2, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) @@ -1910,8 +1912,8 @@ func TestQuotaRenameInsideSameVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize+testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 2, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) // rename a file inside vdir2, it isn't included inside user quota, so we have: // - vdir1/dir1/testFileName.rename // - vdir1/dir2/testFileName1 @@ -1929,8 +1931,8 @@ func TestQuotaRenameInsideSameVirtualFolder(t *testing.T) { assert.Equal(t, 2, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 2, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) // rename a file inside vdir2 overwriting an existing, we now have: // - vdir1/dir1/testFileName.rename // - vdir1/dir2/testFileName1 @@ -1947,8 +1949,8 @@ func TestQuotaRenameInsideSameVirtualFolder(t *testing.T) { assert.Equal(t, 1, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 2, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) // rename a file inside vdir1 overwriting an existing, we now have: // - vdir1/dir1/testFileName.rename (initial testFileName1) // - vdir2/dir1/testFileName.rename (initial testFileName1) @@ -1960,8 +1962,8 @@ func TestQuotaRenameInsideSameVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize1, f.UsedQuotaSize) @@ -1981,8 +1983,8 @@ func TestQuotaRenameInsideSameVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize1, f.UsedQuotaSize) @@ -2087,8 +2089,8 @@ func TestQuotaRenameBetweenVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize, user.UsedQuotaSize) f, _, err := httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize+testFileSize1+testFileSize1, f.UsedQuotaSize) @@ -2106,8 +2108,8 @@ func TestQuotaRenameBetweenVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize*2, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize*2, f.UsedQuotaSize) - assert.Equal(t, 2, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize1*2, f.UsedQuotaSize) @@ -2124,8 +2126,8 @@ func TestQuotaRenameBetweenVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize1+testFileSize, f.UsedQuotaSize) @@ -2141,8 +2143,8 @@ func TestQuotaRenameBetweenVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize, f.UsedQuotaSize) @@ -2172,8 +2174,8 @@ func TestQuotaRenameBetweenVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize1*3+testFileSize*2, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize1*3+testFileSize*2, f.UsedQuotaSize) - assert.Equal(t, 5, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, int64(0), f.UsedQuotaSize) @@ -2187,8 +2189,8 @@ func TestQuotaRenameBetweenVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize1*2+testFileSize, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize1*2+testFileSize, f.UsedQuotaSize) - assert.Equal(t, 3, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) @@ -2293,8 +2295,8 @@ func TestQuotaRenameFromVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize+testFileSize1, user.UsedQuotaSize) f, _, err := httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) @@ -2312,8 +2314,8 @@ func TestQuotaRenameFromVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize+testFileSize1+testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize, f.UsedQuotaSize) @@ -2376,8 +2378,8 @@ func TestQuotaRenameFromVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize*3+testFileSize1*3, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 2, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, int64(0), f.UsedQuotaSize) @@ -2497,8 +2499,8 @@ func TestQuotaRenameToVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize+testFileSize1, user.UsedQuotaSize) f, _, err := httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) // rename a file from user home dir to vdir2, vdir2 is not included in user quota so we have: // - /vdir2/dir1/testFileName // - /vdir1/dir1/testFileName1 @@ -2537,8 +2539,8 @@ func TestQuotaRenameToVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize+testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize, f.UsedQuotaSize) @@ -2554,8 +2556,8 @@ func TestQuotaRenameToVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize1, f.UsedQuotaSize) @@ -2577,8 +2579,8 @@ func TestQuotaRenameToVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize*2+testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize1, f.UsedQuotaSize) @@ -2595,8 +2597,8 @@ func TestQuotaRenameToVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize*2+testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize*2+testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 3, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize1, f.UsedQuotaSize) @@ -2621,8 +2623,8 @@ func TestQuotaRenameToVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize*2+testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize*2+testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 3, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize1*2+testFileSize, f.UsedQuotaSize) @@ -3782,8 +3784,8 @@ func TestEventRule(t *testing.T) { EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"test1@example.com", "test2@example.com"}, Bcc: []string{"test3@example.com"}, - Subject: `New "{{Event}}" from "{{Name}}" status {{StatusString}}`, - Body: "Fs path {{FsPath}}, size: {{FileSize}}, protocol: {{Protocol}}, IP: {{IP}} Data: {{ObjectData}} {{ErrorString}}", + Subject: `New "{{.Event}}" from "{{.Name}}" status {{.StatusString}}`, + Body: "Fs path {{.FsPath}}, size: {{.FileSize}}, protocol: {{.Protocol}}, IP: {{.IP}} Data: {{.ObjectData}} {{.ErrorString}}", }, }, } @@ -3793,8 +3795,8 @@ func TestEventRule(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"failure@example.com"}, - Subject: `Failed "{{Event}}" from "{{Name}}"`, - Body: "Fs path {{FsPath}}, protocol: {{Protocol}}, IP: {{IP}} {{ErrorString}}", + Subject: `Failed "{{.Event}}" from "{{.Name}}"`, + Body: "Fs path {{.FsPath}}, protocol: {{.Protocol}}, IP: {{.IP}} {{.ErrorString}}", }, }, } @@ -3814,6 +3816,7 @@ func TestEventRule(t *testing.T) { Conditions: dataprovider.EventConditions{ FsEvents: []string{"upload"}, Options: dataprovider.ConditionOptions{ + EventStatuses: []int{1}, FsPaths: []dataprovider.ConditionPattern{ { Pattern: "/subdir/*.dat", @@ -3925,6 +3928,11 @@ func TestEventRule(t *testing.T) { err = os.WriteFile(uploadScriptPath, getUploadScriptContent(movedPath, "", 0), 0755) assert.NoError(t, err) + dataprovider.EnabledActionCommands = []string{uploadScriptPath} + defer func() { + dataprovider.EnabledActionCommands = nil + }() + action1.Type = dataprovider.ActionTypeCommand action1.Options = dataprovider.BaseEventActionOptions{ CmdConfig: dataprovider.EventActionCommandConfig{ @@ -3933,7 +3941,7 @@ func TestEventRule(t *testing.T) { EnvVars: []dataprovider.KeyValue{ { Key: "SFTPGO_ACTION_PATH", - Value: "{{FsPath}}", + Value: "{{.FsPath}}", }, { Key: "CUSTOM_ENV_VAR", @@ -3978,9 +3986,9 @@ func TestEventRule(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email := lastReceivedEmail.get() assert.Len(t, email.To, 3) - assert.True(t, util.Contains(email.To, "test1@example.com")) - assert.True(t, util.Contains(email.To, "test2@example.com")) - assert.True(t, util.Contains(email.To, "test3@example.com")) + assert.True(t, slices.Contains(email.To, "test1@example.com")) + assert.True(t, slices.Contains(email.To, "test2@example.com")) + assert.True(t, slices.Contains(email.To, "test3@example.com")) assert.Contains(t, email.Data, fmt.Sprintf(`Subject: New "upload" from "%s" status OK`, user.Username)) // test the failure action, we download a file that exceeds the transfer quota limit err = writeSFTPFileNoCheck(path.Join("subdir1", testFileName), 1*1024*1024+65535, client) @@ -3999,9 +4007,9 @@ func TestEventRule(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email = lastReceivedEmail.get() assert.Len(t, email.To, 3) - assert.True(t, util.Contains(email.To, "test1@example.com")) - assert.True(t, util.Contains(email.To, "test2@example.com")) - assert.True(t, util.Contains(email.To, "test3@example.com")) + assert.True(t, slices.Contains(email.To, "test1@example.com")) + assert.True(t, slices.Contains(email.To, "test2@example.com")) + assert.True(t, slices.Contains(email.To, "test3@example.com")) assert.Contains(t, email.Data, fmt.Sprintf(`Subject: New "download" from "%s" status KO`, user.Username)) assert.Contains(t, email.Data, `"download" failed`) assert.Contains(t, email.Data, common.ErrReadQuotaExceeded.Error()) @@ -4019,7 +4027,7 @@ func TestEventRule(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email = lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "failure@example.com")) + assert.True(t, slices.Contains(email.To, "failure@example.com")) assert.Contains(t, email.Data, fmt.Sprintf(`Subject: Failed "upload" from "%s"`, user.Username)) assert.Contains(t, email.Data, fmt.Sprintf(`action %q failed`, action1.Name)) // now test the download rule @@ -4036,13 +4044,13 @@ func TestEventRule(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email = lastReceivedEmail.get() assert.Len(t, email.To, 3) - assert.True(t, util.Contains(email.To, "test1@example.com")) - assert.True(t, util.Contains(email.To, "test2@example.com")) - assert.True(t, util.Contains(email.To, "test3@example.com")) + assert.True(t, slices.Contains(email.To, "test1@example.com")) + assert.True(t, slices.Contains(email.To, "test2@example.com")) + assert.True(t, slices.Contains(email.To, "test3@example.com")) assert.Contains(t, email.Data, fmt.Sprintf(`Subject: New "download" from "%s"`, user.Username)) } // test upload action command with arguments - action1.Options.CmdConfig.Args = []string{"{{Event}}", "{{VirtualPath}}", "custom_arg"} + action1.Options.CmdConfig.Args = []string{"{{.Event}}", "{{.VirtualPath}}", "custom_arg"} action1, _, err = httpdtest.UpdateEventAction(action1, http.StatusOK) assert.NoError(t, err) uploadLogFilePath := filepath.Join(os.TempDir(), "upload.log") @@ -4079,9 +4087,9 @@ func TestEventRule(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email := lastReceivedEmail.get() assert.Len(t, email.To, 3) - assert.True(t, util.Contains(email.To, "test1@example.com")) - assert.True(t, util.Contains(email.To, "test2@example.com")) - assert.True(t, util.Contains(email.To, "test3@example.com")) + assert.True(t, slices.Contains(email.To, "test1@example.com")) + assert.True(t, slices.Contains(email.To, "test2@example.com")) + assert.True(t, slices.Contains(email.To, "test3@example.com")) assert.Contains(t, email.Data, `Subject: New "delete" from "admin"`) _, err = httpdtest.RemoveEventRule(rule3, http.StatusOK) assert.NoError(t, err) @@ -4104,7 +4112,108 @@ func TestEventRule(t *testing.T) { require.NoError(t, err) } -func TestEventRuleProviderEvents(t *testing.T) { +func TestEventRuleStatues(t *testing.T) { + smtpCfg := smtp.Config{ + Host: "127.0.0.1", + Port: 2525, + From: "notification@example.com", + TemplatesPath: "templates", + } + err := smtpCfg.Initialize(configDir, true) + require.NoError(t, err) + + a1 := dataprovider.BaseEventAction{ + Name: "a1", + Type: dataprovider.ActionTypeEmail, + Options: dataprovider.BaseEventActionOptions{ + EmailConfig: dataprovider.EventActionEmailConfig{ + Recipients: []string{"test6@example.com"}, + Subject: `New "{{.Event}}" error`, + Body: "{{.ErrorString}}", + }, + }, + } + action1, _, err := httpdtest.AddEventAction(a1, http.StatusCreated) + assert.NoError(t, err) + + r := dataprovider.EventRule{ + Name: "rule", + Status: 1, + Trigger: dataprovider.EventTriggerFsEvent, + Conditions: dataprovider.EventConditions{ + FsEvents: []string{"upload"}, + Options: dataprovider.ConditionOptions{ + EventStatuses: []int{3}, + }, + }, + Actions: []dataprovider.EventAction{ + { + BaseEventAction: dataprovider.BaseEventAction{ + Name: action1.Name, + }, + Order: 1, + }, + }, + } + rule, resp, err := httpdtest.AddEventRule(r, http.StatusCreated) + assert.NoError(t, err, string(resp)) + + u := getTestUser() + u.UploadDataTransfer = 1 + u.DownloadDataTransfer = 1 + user, _, err := httpdtest.AddUser(u, http.StatusCreated) + assert.NoError(t, err) + conn, client, err := getSftpClient(user) + if assert.NoError(t, err) { + defer conn.Close() + defer client.Close() + + testFileSize := int64(999999) + err = writeSFTPFile(testFileName, testFileSize, client) + assert.NoError(t, err) + f, err := client.Open(testFileName) + assert.NoError(t, err) + contents := make([]byte, testFileSize) + n, err := io.ReadFull(f, contents) + assert.NoError(t, err) + assert.Equal(t, int(testFileSize), n) + assert.Len(t, contents, int(testFileSize)) + err = f.Close() + assert.NoError(t, err) + + lastReceivedEmail.reset() + assert.Eventually(t, func() bool { + return lastReceivedEmail.get().From == "" + }, 600*time.Millisecond, 500*time.Millisecond) + + err = writeSFTPFile(testFileName, testFileSize, client) + assert.Error(t, err) + lastReceivedEmail.reset() + assert.Eventually(t, func() bool { + return lastReceivedEmail.get().From != "" + }, 3000*time.Millisecond, 100*time.Millisecond) + email := lastReceivedEmail.get() + assert.Len(t, email.To, 1) + assert.True(t, slices.Contains(email.To, "test6@example.com")) + assert.Contains(t, email.Data, `Subject: New "upload" error`) + assert.Contains(t, email.Data, common.ErrQuotaExceeded.Error()) + } + + _, err = httpdtest.RemoveEventRule(rule, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveEventAction(action1, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveUser(user, http.StatusOK) + assert.NoError(t, err) + err = os.RemoveAll(user.GetHomeDir()) + assert.NoError(t, err) + + smtpCfg = smtp.Config{} + err = smtpCfg.Initialize(configDir, true) + require.NoError(t, err) +} + +func TestEventRuleDisabledCommand(t *testing.T) { if runtime.GOOS == osWindows { t.Skip("this test is not available on Windows") } @@ -4132,7 +4241,7 @@ func TestEventRuleProviderEvents(t *testing.T) { EnvVars: []dataprovider.KeyValue{ { Key: "SFTPGO_OBJECT_DATA", - Value: "{{ObjectData}}", + Value: "{{.ObjectData}}", }, }, }, @@ -4144,8 +4253,8 @@ func TestEventRuleProviderEvents(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"test3@example.com"}, - Subject: `New "{{Event}}" from "{{Name}}"`, - Body: "Object name: {{ObjectName}} object type: {{ObjectType}} Data: {{ObjectData}}", + Subject: `New "{{.Event}}" from "{{.Name}}"`, + Body: "Object name: {{.ObjectName}} object type: {{.ObjectType}} Data: {{.ObjectData}}", }, }, } @@ -4156,8 +4265,157 @@ func TestEventRuleProviderEvents(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"failure@example.com"}, - Subject: `Failed "{{Event}}" from "{{Name}}"`, - Body: "Object name: {{ObjectName}} object type: {{ObjectType}}, IP: {{IP}}", + Subject: `Failed "{{.Event}}" from "{{.Name}}"`, + Body: "Object name: {{.ObjectName}} object type: {{.ObjectType}}, IP: {{.IP}}", + }, + }, + } + _, _, err = httpdtest.AddEventAction(a1, http.StatusBadRequest) + assert.NoError(t, err) + // Enable the command to allow saving + dataprovider.EnabledActionCommands = []string{a1.Options.CmdConfig.Cmd} + action1, _, err := httpdtest.AddEventAction(a1, http.StatusCreated) + assert.NoError(t, err) + action2, _, err := httpdtest.AddEventAction(a2, http.StatusCreated) + assert.NoError(t, err) + action3, _, err := httpdtest.AddEventAction(a3, http.StatusCreated) + assert.NoError(t, err) + + r := dataprovider.EventRule{ + Name: "rule", + Status: 1, + Trigger: dataprovider.EventTriggerProviderEvent, + Conditions: dataprovider.EventConditions{ + ProviderEvents: []string{"add"}, + Options: dataprovider.ConditionOptions{ + ProviderObjects: []string{"folder"}, + }, + }, + Actions: []dataprovider.EventAction{ + { + BaseEventAction: dataprovider.BaseEventAction{ + Name: action1.Name, + }, + Order: 1, + Options: dataprovider.EventActionOptions{ + StopOnFailure: true, + }, + }, + { + BaseEventAction: dataprovider.BaseEventAction{ + Name: action2.Name, + }, + Order: 2, + }, + { + BaseEventAction: dataprovider.BaseEventAction{ + Name: action3.Name, + }, + Order: 3, + Options: dataprovider.EventActionOptions{ + IsFailureAction: true, + StopOnFailure: true, + }, + }, + }, + } + rule, _, err := httpdtest.AddEventRule(r, http.StatusCreated) + assert.NoError(t, err) + // restrict command execution + dataprovider.EnabledActionCommands = nil + + lastReceivedEmail.reset() + // create a folder to trigger the rule + folder := vfs.BaseVirtualFolder{ + Name: "ftest failed command", + MappedPath: filepath.Join(os.TempDir(), "p"), + } + folder, _, err = httpdtest.AddFolder(folder, http.StatusCreated) + assert.NoError(t, err) + + assert.NoFileExists(t, outPath) + assert.Eventually(t, func() bool { + return lastReceivedEmail.get().From != "" + }, 3000*time.Millisecond, 100*time.Millisecond) + email := lastReceivedEmail.get() + assert.Len(t, email.To, 1) + assert.True(t, slices.Contains(email.To, "failure@example.com")) + assert.Contains(t, email.Data, `Subject: Failed "add" from "admin"`) + assert.Contains(t, email.Data, fmt.Sprintf("Object name: %s object type: folder", folder.Name)) + lastReceivedEmail.reset() + + _, err = httpdtest.RemoveFolder(folder, http.StatusOK) + assert.NoError(t, err) + + _, err = httpdtest.RemoveEventRule(rule, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveEventAction(action1, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveEventAction(action2, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveEventAction(action3, http.StatusOK) + assert.NoError(t, err) +} + +func TestEventRuleProviderEvents(t *testing.T) { + if runtime.GOOS == osWindows { + t.Skip("this test is not available on Windows") + } + smtpCfg := smtp.Config{ + Host: "127.0.0.1", + Port: 2525, + From: "notification@example.com", + TemplatesPath: "templates", + } + err := smtpCfg.Initialize(configDir, true) + require.NoError(t, err) + + saveObjectScriptPath := filepath.Join(os.TempDir(), "provider.sh") + outPath := filepath.Join(os.TempDir(), "provider_out.json") + err = os.WriteFile(saveObjectScriptPath, getSaveProviderObjectScriptContent(outPath, 0), 0755) + assert.NoError(t, err) + + dataprovider.EnabledActionCommands = []string{saveObjectScriptPath} + defer func() { + dataprovider.EnabledActionCommands = nil + }() + + a1 := dataprovider.BaseEventAction{ + Name: "a1", + Type: dataprovider.ActionTypeCommand, + Options: dataprovider.BaseEventActionOptions{ + CmdConfig: dataprovider.EventActionCommandConfig{ + Cmd: saveObjectScriptPath, + Timeout: 10, + EnvVars: []dataprovider.KeyValue{ + { + Key: "SFTPGO_OBJECT_DATA", + Value: "{{.ObjectData}}", + }, + }, + }, + }, + } + a2 := dataprovider.BaseEventAction{ + Name: "a2", + Type: dataprovider.ActionTypeEmail, + Options: dataprovider.BaseEventActionOptions{ + EmailConfig: dataprovider.EventActionEmailConfig{ + Recipients: []string{"test3@example.com"}, + Subject: `New "{{.Event}}" from "{{.Name}}"`, + Body: "Object name: {{.ObjectName}} object type: {{.ObjectType}} Data: {{.ObjectData}}", + }, + }, + } + + a3 := dataprovider.BaseEventAction{ + Name: "a3", + Type: dataprovider.ActionTypeEmail, + Options: dataprovider.BaseEventActionOptions{ + EmailConfig: dataprovider.EventActionEmailConfig{ + Recipients: []string{"failure@example.com"}, + Subject: `Failed "{{.Event}}" from "{{.Name}}"`, + Body: "Object name: {{.ObjectName}} object type: {{.ObjectType}}, IP: {{.IP}}", }, }, } @@ -4236,7 +4494,7 @@ func TestEventRuleProviderEvents(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email := lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "test3@example.com")) + assert.True(t, slices.Contains(email.To, "test3@example.com")) assert.Contains(t, email.Data, `Subject: New "update" from "admin"`) } // now delete the script to generate an error @@ -4251,7 +4509,7 @@ func TestEventRuleProviderEvents(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email := lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "failure@example.com")) + assert.True(t, slices.Contains(email.To, "failure@example.com")) assert.Contains(t, email.Data, `Subject: Failed "update" from "admin"`) assert.Contains(t, email.Data, fmt.Sprintf("Object name: %s object type: folder", folder.Name)) lastReceivedEmail.reset() @@ -4300,10 +4558,12 @@ func TestEventRuleFsActions(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ FsConfig: dataprovider.EventActionFilesystemConfig{ Type: dataprovider.FilesystemActionRename, - Renames: []dataprovider.KeyValue{ + Renames: []dataprovider.RenameConfig{ { - Key: "/{{VirtualDirPath}}/{{ObjectName}}", - Value: "/{{ObjectName}}_renamed", + KeyValue: dataprovider.KeyValue{ + Key: "/{{.VirtualDirPath}}/{{.ObjectName}}", + Value: "/{{.ObjectName}}_renamed", + }, }, }, }, @@ -4315,7 +4575,7 @@ func TestEventRuleFsActions(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ FsConfig: dataprovider.EventActionFilesystemConfig{ Type: dataprovider.FilesystemActionDelete, - Deletes: []string{"/{{ObjectName}}_renamed"}, + Deletes: []string{"/{{.ObjectName}}_renamed"}, }, }, } @@ -4333,7 +4593,7 @@ func TestEventRuleFsActions(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ FsConfig: dataprovider.EventActionFilesystemConfig{ Type: dataprovider.FilesystemActionExist, - Exist: []string{"/{{VirtualPath}}"}, + Exist: []string{"/{{.VirtualPath}}"}, }, }, } @@ -4561,6 +4821,80 @@ func TestEventRuleFsActions(t *testing.T) { assert.NoError(t, err) } +func TestEventActionObjectBaseName(t *testing.T) { + a1 := dataprovider.BaseEventAction{ + Name: "a1", + Type: dataprovider.ActionTypeFilesystem, + Options: dataprovider.BaseEventActionOptions{ + FsConfig: dataprovider.EventActionFilesystemConfig{ + Type: dataprovider.FilesystemActionRename, + Renames: []dataprovider.RenameConfig{ + { + KeyValue: dataprovider.KeyValue{ + Key: "/{{.VirtualDirPath}}/{{.ObjectName}}", + Value: "/{{.ObjectBaseName}}", + }, + }, + }, + }, + }, + } + action1, resp, err := httpdtest.AddEventAction(a1, http.StatusCreated) + assert.NoError(t, err, string(resp)) + + r1 := dataprovider.EventRule{ + Name: "r2", + Status: 1, + Trigger: dataprovider.EventTriggerFsEvent, + Conditions: dataprovider.EventConditions{ + FsEvents: []string{"upload"}, + }, + Actions: []dataprovider.EventAction{ + { + BaseEventAction: dataprovider.BaseEventAction{ + Name: action1.Name, + }, + Order: 1, + Options: dataprovider.EventActionOptions{ + ExecuteSync: true, + }, + }, + }, + } + rule1, _, err := httpdtest.AddEventRule(r1, http.StatusCreated) + assert.NoError(t, err) + + user, _, err := httpdtest.AddUser(getTestUser(), http.StatusCreated) + assert.NoError(t, err) + conn, client, err := getSftpClient(user) + if assert.NoError(t, err) { + defer conn.Close() + defer client.Close() + + testDir := "test dir name" + err = client.Mkdir(testDir) + fileSize := int64(32768) + assert.NoError(t, err) + err = writeSFTPFileNoCheck(path.Join(testDir, testFileName), fileSize, client) + assert.NoError(t, err) + + _, err = client.Stat(path.Join(testDir, testFileName)) + assert.ErrorIs(t, err, os.ErrNotExist) + + _, err = client.Stat(strings.TrimSuffix(testFileName, path.Ext(testFileName))) + assert.NoError(t, err) + } + + _, err = httpdtest.RemoveUser(user, http.StatusOK) + assert.NoError(t, err) + err = os.RemoveAll(user.GetHomeDir()) + assert.NoError(t, err) + _, err = httpdtest.RemoveEventRule(rule1, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveEventAction(action1, http.StatusOK) + assert.NoError(t, err) +} + func TestUploadEventRule(t *testing.T) { smtpCfg := smtp.Config{ Host: "127.0.0.1", @@ -4577,8 +4911,8 @@ func TestUploadEventRule(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"test1@example.com"}, - Subject: `New "{{Event}}" from "{{Name}}" status {{StatusString}}`, - Body: "Fs path {{FsPath}}, size: {{FileSize}}, protocol: {{Protocol}}, IP: {{IP}} Data: {{ObjectData}} {{ErrorString}}", + Subject: `New "{{.Event}}" from "{{.Name}}" status {{.StatusString}}`, + Body: "Fs path {{.FsPath}}, size: {{.FileSize}}, protocol: {{.Protocol}}, IP: {{.IP}} Data: {{.ObjectData}} {{.ErrorString}}", }, }, } @@ -4710,10 +5044,13 @@ func TestEventRulePreDelete(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ FsConfig: dataprovider.EventActionFilesystemConfig{ Type: dataprovider.FilesystemActionRename, - Renames: []dataprovider.KeyValue{ + Renames: []dataprovider.RenameConfig{ { - Key: "/{{VirtualPath}}", - Value: fmt.Sprintf("/%s/{{VirtualPath}}", movePath), + KeyValue: dataprovider.KeyValue{ + Key: "/{{.VirtualPath}}", + Value: fmt.Sprintf("/%s/{{.VirtualPath}}", movePath), + }, + UpdateModTime: true, }, }, }, @@ -4767,59 +5104,83 @@ func TestEventRulePreDelete(t *testing.T) { QuotaFiles: 1000, }, } - user, _, err := httpdtest.AddUser(u, http.StatusCreated) + localUser, _, err := httpdtest.AddUser(u, http.StatusCreated) + assert.NoError(t, err) + u = getTestSFTPUser() + u.QuotaFiles = 1000 + sftpUser, _, err := httpdtest.AddUser(u, http.StatusCreated) assert.NoError(t, err) - conn, client, err := getSftpClient(user) - if assert.NoError(t, err) { - defer conn.Close() - defer client.Close() - testDir := "sub dir" - err = client.MkdirAll(testDir) - assert.NoError(t, err) - err = writeSFTPFile(testFileName, 100, client) - assert.NoError(t, err) - err = writeSFTPFile(path.Join(testDir, testFileName), 100, client) - assert.NoError(t, err) - err = client.Remove(testFileName) - assert.NoError(t, err) - err = client.Remove(path.Join(testDir, testFileName)) - assert.NoError(t, err) - // check files - _, err = client.Stat(testFileName) - assert.ErrorIs(t, err, os.ErrNotExist) - _, err = client.Stat(path.Join(testDir, testFileName)) - assert.ErrorIs(t, err, os.ErrNotExist) - _, err = client.Stat(path.Join("/", movePath, testFileName)) - assert.NoError(t, err) - _, err = client.Stat(path.Join("/", movePath, testDir, testFileName)) - assert.NoError(t, err) - // check quota - user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) - assert.NoError(t, err) - assert.Equal(t, 0, user.UsedQuotaFiles) - assert.Equal(t, int64(0), user.UsedQuotaSize) - folder, _, err := httpdtest.GetFolderByName(movePath, http.StatusOK) - assert.NoError(t, err) - assert.Equal(t, 2, folder.UsedQuotaFiles) - assert.Equal(t, int64(200), folder.UsedQuotaSize) - // pre-delete action is not executed in movePath - err = client.Remove(path.Join("/", movePath, testFileName)) - assert.NoError(t, err) - // check quota - folder, _, err = httpdtest.GetFolderByName(movePath, http.StatusOK) - assert.NoError(t, err) - assert.Equal(t, 1, folder.UsedQuotaFiles) - assert.Equal(t, int64(100), folder.UsedQuotaSize) + for _, user := range []dataprovider.User{localUser, sftpUser} { + conn, client, err := getSftpClient(user) + if assert.NoError(t, err) { + defer conn.Close() + defer client.Close() + + testDir := "sub dir" + err = client.MkdirAll(testDir) + assert.NoError(t, err) + err = writeSFTPFile(testFileName, 100, client) + assert.NoError(t, err) + err = writeSFTPFile(path.Join(testDir, testFileName), 100, client) + assert.NoError(t, err) + modTime := time.Now().Add(-36 * time.Hour) + err = client.Chtimes(testFileName, modTime, modTime) + assert.NoError(t, err) + err = client.Remove(testFileName) + assert.NoError(t, err) + err = client.Remove(path.Join(testDir, testFileName)) + assert.NoError(t, err) + // check files + _, err = client.Stat(testFileName) + assert.ErrorIs(t, err, os.ErrNotExist) + _, err = client.Stat(path.Join(testDir, testFileName)) + assert.ErrorIs(t, err, os.ErrNotExist) + info, err := client.Stat(path.Join("/", movePath, testFileName)) + assert.NoError(t, err) + diff := math.Abs(time.Until(info.ModTime()).Seconds()) + assert.LessOrEqual(t, diff, float64(2)) + + _, err = client.Stat(path.Join("/", movePath, testDir, testFileName)) + assert.NoError(t, err) + // check quota + user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) + assert.NoError(t, err) + if user.Username == localUser.Username { + assert.Equal(t, 0, user.UsedQuotaFiles) + assert.Equal(t, int64(0), user.UsedQuotaSize) + folder, _, err := httpdtest.GetFolderByName(movePath, http.StatusOK) + assert.NoError(t, err) + assert.Equal(t, 2, folder.UsedQuotaFiles) + assert.Equal(t, int64(200), folder.UsedQuotaSize) + } else { + assert.Equal(t, 1, user.UsedQuotaFiles) + assert.Equal(t, int64(100), user.UsedQuotaSize) + } + // pre-delete action is not executed in movePath + err = client.Remove(path.Join("/", movePath, testFileName)) + assert.NoError(t, err) + if user.Username == localUser.Username { + // check quota + folder, _, err := httpdtest.GetFolderByName(movePath, http.StatusOK) + assert.NoError(t, err) + assert.Equal(t, 1, folder.UsedQuotaFiles) + assert.Equal(t, int64(100), folder.UsedQuotaSize) + err = os.RemoveAll(user.GetHomeDir()) + assert.NoError(t, err) + } + } } _, err = httpdtest.RemoveEventRule(rule1, http.StatusOK) assert.NoError(t, err) _, err = httpdtest.RemoveEventAction(action1, http.StatusOK) assert.NoError(t, err) - _, err = httpdtest.RemoveUser(user, http.StatusOK) + _, err = httpdtest.RemoveUser(sftpUser, http.StatusOK) assert.NoError(t, err) - err = os.RemoveAll(user.GetHomeDir()) + _, err = httpdtest.RemoveUser(localUser, http.StatusOK) + assert.NoError(t, err) + err = os.RemoveAll(localUser.GetHomeDir()) assert.NoError(t, err) _, err = httpdtest.RemoveFolder(vfs.BaseVirtualFolder{Name: movePath}, http.StatusOK) assert.NoError(t, err) @@ -4847,10 +5208,12 @@ func TestEventRulePreDownloadUpload(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ FsConfig: dataprovider.EventActionFilesystemConfig{ Type: dataprovider.FilesystemActionRename, - Renames: []dataprovider.KeyValue{ + Renames: []dataprovider.RenameConfig{ { - Key: "/missing source", - Value: "/missing target", + KeyValue: dataprovider.KeyValue{ + Key: "/missing source", + Value: "/missing target", + }, }, }, }, @@ -4954,6 +5317,11 @@ func TestEventActionCommandEnvVars(t *testing.T) { envName := "MY_ENV" uploadScriptPath := filepath.Join(os.TempDir(), "upload.sh") + dataprovider.EnabledActionCommands = []string{uploadScriptPath} + defer func() { + dataprovider.EnabledActionCommands = nil + }() + err := os.WriteFile(uploadScriptPath, getUploadScriptEnvContent(envName), 0755) assert.NoError(t, err) a1 := dataprovider.BaseEventAction{ @@ -5034,6 +5402,7 @@ func TestEventActionCommandEnvVars(t *testing.T) { } func TestFsActionCopy(t *testing.T) { + dirCopy := "/dircopy" a1 := dataprovider.BaseEventAction{ Name: "a1", Type: dataprovider.ActionTypeFilesystem, @@ -5042,8 +5411,8 @@ func TestFsActionCopy(t *testing.T) { Type: dataprovider.FilesystemActionCopy, Copy: []dataprovider.KeyValue{ { - Key: "/{{VirtualPath}}/", - Value: "/dircopy/", + Key: "/{{.VirtualPath}}/", + Value: dirCopy + "/", }, }, }, @@ -5073,7 +5442,29 @@ func TestFsActionCopy(t *testing.T) { } rule1, _, err := httpdtest.AddEventRule(r1, http.StatusCreated) assert.NoError(t, err) + g1 := dataprovider.Group{ + BaseGroup: sdk.BaseGroup{ + Name: "group1", + }, + UserSettings: dataprovider.GroupUserSettings{ + BaseGroupUserSettings: sdk.BaseGroupUserSettings{ + Permissions: map[string][]string{ + // Restrict permissions in copyPath to check that action + // will have full permissions anyway. + dirCopy: {dataprovider.PermListItems, dataprovider.PermDelete}, + }, + }, + }, + } + group1, resp, err := httpdtest.AddGroup(g1, http.StatusCreated) + assert.NoError(t, err, string(resp)) u := getTestUser() + u.Groups = []sdk.GroupMapping{ + { + Name: group1.Name, + Type: sdk.GroupTypePrimary, + }, + } user, _, err := httpdtest.AddUser(u, http.StatusCreated) assert.NoError(t, err) conn, client, err := getSftpClient(user) @@ -5083,7 +5474,7 @@ func TestFsActionCopy(t *testing.T) { err = writeSFTPFile(testFileName, 100, client) assert.NoError(t, err) - _, err = client.Stat(path.Join("dircopy", testFileName)) + _, err = client.Stat(path.Join(dirCopy, testFileName)) assert.NoError(t, err) action1.Options.FsConfig.Copy = []dataprovider.KeyValue{ @@ -5106,6 +5497,8 @@ func TestFsActionCopy(t *testing.T) { assert.NoError(t, err) err = os.RemoveAll(user.GetHomeDir()) assert.NoError(t, err) + _, err = httpdtest.RemoveGroup(group1, http.StatusOK) + assert.NoError(t, err) } func TestEventFsActionsGroupFilters(t *testing.T) { @@ -5124,8 +5517,8 @@ func TestEventFsActionsGroupFilters(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"example@example.net"}, - Subject: `New "{{Event}}" from "{{Name}}" status {{StatusString}}`, - Body: "Fs path {{FsPath}}, size: {{FileSize}}, protocol: {{Protocol}}, IP: {{IP}} {{ErrorString}}", + Subject: `New "{{.Event}}" from "{{.Name}}" status {{.StatusString}}`, + Body: "Fs path {{.FsPath}}, size: {{.FileSize}}, protocol: {{.Protocol}}, IP: {{.IP}} {{.ErrorString}}", }, }, } @@ -5239,7 +5632,7 @@ func TestEventFsActionsGroupFilters(t *testing.T) { require.NoError(t, err) } -func TestBackupAsAttachment(t *testing.T) { +func TestEventProviderActionGroupFilters(t *testing.T) { smtpCfg := smtp.Config{ Host: "127.0.0.1", Port: 2525, @@ -5251,6 +5644,138 @@ func TestBackupAsAttachment(t *testing.T) { a1 := dataprovider.BaseEventAction{ Name: "a1", + Type: dataprovider.ActionTypeEmail, + Options: dataprovider.BaseEventActionOptions{ + EmailConfig: dataprovider.EventActionEmailConfig{ + Recipients: []string{"example@example.net"}, + Subject: `New "{{.Event}}" from "{{.Name}}"`, + Body: "IP: {{.IP}}", + }, + }, + } + action1, _, err := httpdtest.AddEventAction(a1, http.StatusCreated) + assert.NoError(t, err) + + r1 := dataprovider.EventRule{ + Name: "rule1", + Status: 1, + Trigger: dataprovider.EventTriggerProviderEvent, + Conditions: dataprovider.EventConditions{ + ProviderEvents: []string{"add", "update"}, + Options: dataprovider.ConditionOptions{ + GroupNames: []dataprovider.ConditionPattern{ + { + Pattern: "group_*", + }, + }, + ProviderObjects: []string{"user"}, + }, + }, + Actions: []dataprovider.EventAction{ + { + BaseEventAction: dataprovider.BaseEventAction{ + Name: action1.Name, + }, + Order: 1, + }, + }, + } + rule1, _, err := httpdtest.AddEventRule(r1, http.StatusCreated) + assert.NoError(t, err) + + g1 := dataprovider.Group{ + BaseGroup: sdk.BaseGroup{ + Name: "agroup_1", + }, + } + group1, _, err := httpdtest.AddGroup(g1, http.StatusCreated) + assert.NoError(t, err) + + g2 := dataprovider.Group{ + BaseGroup: sdk.BaseGroup{ + Name: "group_2", + }, + } + group2, _, err := httpdtest.AddGroup(g2, http.StatusCreated) + assert.NoError(t, err) + + u := getTestUser() + u.Groups = []sdk.GroupMapping{ + { + Name: group2.Name, + Type: sdk.GroupTypePrimary, + }, + } + + lastReceivedEmail.reset() + user, _, err := httpdtest.AddUser(u, http.StatusCreated) + assert.NoError(t, err) + assert.Eventually(t, func() bool { + return lastReceivedEmail.get().From != "" + }, 1500*time.Millisecond, 100*time.Millisecond) + email := lastReceivedEmail.get() + assert.Len(t, email.To, 1) + + user.Groups = []sdk.GroupMapping{ + { + Name: group1.Name, + Type: sdk.GroupTypePrimary, + }, + } + + lastReceivedEmail.reset() + user, _, err = httpdtest.UpdateUser(user, http.StatusOK, "") + assert.NoError(t, err) + time.Sleep(300 * time.Millisecond) + email = lastReceivedEmail.get() + assert.Len(t, email.To, 0) + + user.Groups = []sdk.GroupMapping{ + { + Name: group2.Name, + Type: sdk.GroupTypePrimary, + }, + } + + lastReceivedEmail.reset() + user, _, err = httpdtest.UpdateUser(user, http.StatusOK, "") + assert.NoError(t, err) + assert.Eventually(t, func() bool { + return lastReceivedEmail.get().From != "" + }, 1500*time.Millisecond, 100*time.Millisecond) + email = lastReceivedEmail.get() + assert.Len(t, email.To, 1) + + _, err = httpdtest.RemoveEventRule(rule1, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveEventAction(action1, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveUser(user, http.StatusOK) + assert.NoError(t, err) + err = os.RemoveAll(user.GetHomeDir()) + assert.NoError(t, err) + _, err = httpdtest.RemoveGroup(group1, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveGroup(group2, http.StatusOK) + assert.NoError(t, err) + + smtpCfg = smtp.Config{} + err = smtpCfg.Initialize(configDir, true) + require.NoError(t, err) +} + +func TestBackupAsAttachment(t *testing.T) { + smtpCfg := smtp.Config{ + Host: "127.0.0.1", + Port: 2525, + From: "notification@example.com", + TemplatesPath: "templates", + } + err := smtpCfg.Initialize(configDir, true) + require.NoError(t, err) + + a1 := dataprovider.BaseEventAction{ + Name: "a1 with space", Type: dataprovider.ActionTypeBackup, } a2 := dataprovider.BaseEventAction{ @@ -5259,9 +5784,9 @@ func TestBackupAsAttachment(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"test@example.com"}, - Subject: `"{{Event}} {{StatusString}}"`, - Body: "Domain: {{Name}}", - Attachments: []string{"/{{VirtualPath}}"}, + Subject: `"{{.Event}} {{.StatusString}}"`, + Body: "Domain: {{.Name}}", + Attachments: []string{"/{{.VirtualPath}}"}, }, }, } @@ -5297,7 +5822,7 @@ func TestBackupAsAttachment(t *testing.T) { common.HandleCertificateEvent(common.EventParams{ Name: "example.com", - Timestamp: time.Now().UnixNano(), + Timestamp: time.Now(), Status: 1, Event: renewalEvent, }) @@ -5306,7 +5831,7 @@ func TestBackupAsAttachment(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email := lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "test@example.com")) + assert.True(t, slices.Contains(email.To, "test@example.com")) assert.Contains(t, email.Data, fmt.Sprintf(`Subject: "%s OK"`, renewalEvent)) assert.Contains(t, email.Data, `Domain: example.com`) assert.Contains(t, email.Data, "Content-Type: application/json") @@ -5340,11 +5865,11 @@ func TestEventActionHTTPMultipart(t *testing.T) { Value: "application/json", }, }, - Body: `{"FilePath": "{{VirtualPath}}"}`, + Body: `{"FilePath": "{{.VirtualPath}}"}`, }, { Name: "file", - Filepath: "/{{VirtualPath}}", + Filepath: "/{{.VirtualPath}}", }, }, }, @@ -5420,8 +5945,8 @@ func TestEventActionCompress(t *testing.T) { FsConfig: dataprovider.EventActionFilesystemConfig{ Type: dataprovider.FilesystemActionCompress, Compress: dataprovider.EventActionFsCompress{ - Name: "/{{VirtualPath}}.zip", - Paths: []string{"/{{VirtualPath}}"}, + Name: "/{{.VirtualPath}}.zip", + Paths: []string{"/{{.VirtualPath}}"}, }, }, }, @@ -5591,7 +6116,7 @@ func TestEventActionCompressQuotaErrors(t *testing.T) { EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"test@example.com"}, Subject: `"Compress failed"`, - Body: "Error: {{ErrorString}}", + Body: "Error: {{.ErrorString}}", }, }, } @@ -5676,7 +6201,7 @@ func TestEventActionCompressQuotaErrors(t *testing.T) { }, 3*time.Second, 100*time.Millisecond) email := lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "test@example.com")) + assert.True(t, slices.Contains(email.To, "test@example.com")) assert.Contains(t, email.Data, `Subject: "Compress failed"`) assert.Contains(t, email.Data, common.ErrQuotaExceeded.Error()) // update quota size so the user is already overquota @@ -5691,7 +6216,7 @@ func TestEventActionCompressQuotaErrors(t *testing.T) { }, 3*time.Second, 100*time.Millisecond) email = lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "test@example.com")) + assert.True(t, slices.Contains(email.To, "test@example.com")) assert.Contains(t, email.Data, `Subject: "Compress failed"`) assert.Contains(t, email.Data, common.ErrQuotaExceeded.Error()) // remove the path to compress to trigger an error for size estimation @@ -5705,7 +6230,7 @@ func TestEventActionCompressQuotaErrors(t *testing.T) { }, 3*time.Second, 100*time.Millisecond) email = lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "test@example.com")) + assert.True(t, slices.Contains(email.To, "test@example.com")) assert.Contains(t, email.Data, `Subject: "Compress failed"`) assert.Contains(t, email.Data, "unable to estimate archive size") } @@ -5735,8 +6260,8 @@ func TestEventActionCompressQuotaFolder(t *testing.T) { FsConfig: dataprovider.EventActionFilesystemConfig{ Type: dataprovider.FilesystemActionCompress, Compress: dataprovider.EventActionFsCompress{ - Name: "/{{VirtualPath}}.zip", - Paths: []string{"/{{VirtualPath}}", testDir}, + Name: "/{{.VirtualPath}}.zip", + Paths: []string{"/{{.VirtualPath}}", testDir}, }, }, }, @@ -5834,8 +6359,8 @@ func TestEventActionCompressQuotaFolder(t *testing.T) { assert.Equal(t, expectedQuotaSize, user.UsedQuotaSize) vfolder, _, err := httpdtest.GetFolderByName(folderName, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, 2, vfolder.UsedQuotaFiles) - assert.Equal(t, info.Size()+int64(len(testFileContent)), vfolder.UsedQuotaSize) + assert.Equal(t, 0, vfolder.UsedQuotaFiles) + assert.Equal(t, int64(0), vfolder.UsedQuotaSize) } } @@ -5861,8 +6386,8 @@ func TestEventActionCompressErrors(t *testing.T) { FsConfig: dataprovider.EventActionFilesystemConfig{ Type: dataprovider.FilesystemActionCompress, Compress: dataprovider.EventActionFsCompress{ - Name: "/{{VirtualPath}}.zip", - Paths: []string{"/{{VirtualPath}}.zip"}, // cannot compress itself + Name: "/{{.VirtualPath}}.zip", + Paths: []string{"/{{.VirtualPath}}.zip"}, // cannot compress itself }, }, }, @@ -5924,7 +6449,7 @@ func TestEventActionCompressErrors(t *testing.T) { // try to overwrite a directory testDir := "/adir" action1.Options.FsConfig.Compress.Name = testDir - action1.Options.FsConfig.Compress.Paths = []string{"/{{VirtualPath}}"} + action1.Options.FsConfig.Compress.Paths = []string{"/{{.VirtualPath}}"} _, _, err = httpdtest.UpdateEventAction(action1, http.StatusOK) assert.NoError(t, err) conn, client, err = getSftpClient(user) @@ -5969,8 +6494,8 @@ func TestEventActionEmailAttachments(t *testing.T) { FsConfig: dataprovider.EventActionFilesystemConfig{ Type: dataprovider.FilesystemActionCompress, Compress: dataprovider.EventActionFsCompress{ - Name: "/archive/{{VirtualPath}}.zip", - Paths: []string{"/{{VirtualPath}}"}, + Name: "/archive/{{.VirtualPath}}.zip", + Paths: []string{"/{{.VirtualPath}}"}, }, }, }, @@ -5983,9 +6508,9 @@ func TestEventActionEmailAttachments(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"test@example.com"}, - Subject: `"{{Event}}" from "{{Name}}"`, - Body: "Fs path {{FsPath}}, size: {{FileSize}}, protocol: {{Protocol}}, IP: {{IP}}", - Attachments: []string{"/archive/{{VirtualPath}}.zip"}, + Subject: `"{{.Event}}" from "{{.Name}}"`, + Body: "Fs path {{.FsPath}}, size: {{.FileSize}}, protocol: {{.Protocol}}, IP: {{.IP}} {{.EscapedVirtualPath}}", + Attachments: []string{"/archive/{{.VirtualPath}}.zip"}, }, }, } @@ -6041,8 +6566,9 @@ func TestEventActionEmailAttachments(t *testing.T) { }, 1500*time.Millisecond, 100*time.Millisecond) email := lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "test@example.com")) + assert.True(t, slices.Contains(email.To, "test@example.com")) assert.Contains(t, email.Data, `Subject: "upload" from`) + assert.Contains(t, email.Data, url.QueryEscape("/"+testFileName)) assert.Contains(t, email.Data, "Content-Disposition: attachment") } } @@ -6103,8 +6629,8 @@ func TestEventActionsRetentionReports(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"test@example.com"}, - Subject: `"{{Event}}" from "{{Name}}"`, - Body: "Fs path {{FsPath}}, size: {{FileSize}}, protocol: {{Protocol}}, IP: {{IP}}", + Subject: `"{{.Event}}" from "{{.Name}}"`, + Body: "Fs path {{.FsPath}}, size: {{.FileSize}}, protocol: {{.Protocol}}, IP: {{.IP}}", Attachments: []string{dataprovider.RetentionReportPlaceHolder}, }, }, @@ -6218,7 +6744,7 @@ func TestEventActionsRetentionReports(t *testing.T) { email := lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "test@example.com")) + assert.True(t, slices.Contains(email.To, "test@example.com")) assert.Contains(t, email.Data, fmt.Sprintf(`Subject: "upload" from "%s"`, user.Username)) assert.Contains(t, email.Data, "Content-Disposition: attachment") _, err = client.Stat(testDir) @@ -6331,8 +6857,8 @@ func TestEventRuleFirstUploadDownloadActions(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"test@example.com"}, - Subject: `"{{Event}}" from "{{Name}}"`, - Body: "Fs path {{FsPath}}, size: {{FileSize}}, protocol: {{Protocol}}, IP: {{IP}}", + Subject: `"{{.Event}}" from "{{.Name}}"`, + Body: "Fs path {{.FsPath}}, size: {{.FileSize}}, protocol: {{.Protocol}}, IP: {{.IP}}", }, }, } @@ -6391,7 +6917,7 @@ func TestEventRuleFirstUploadDownloadActions(t *testing.T) { }, 1500*time.Millisecond, 100*time.Millisecond) email := lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "test@example.com")) + assert.True(t, slices.Contains(email.To, "test@example.com")) assert.Contains(t, email.Data, fmt.Sprintf(`Subject: "first-upload" from "%s"`, user.Username)) lastReceivedEmail.reset() // a new upload will not produce a new notification @@ -6414,7 +6940,7 @@ func TestEventRuleFirstUploadDownloadActions(t *testing.T) { }, 1500*time.Millisecond, 100*time.Millisecond) email = lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "test@example.com")) + assert.True(t, slices.Contains(email.To, "test@example.com")) assert.Contains(t, email.Data, fmt.Sprintf(`Subject: "first-download" from "%s"`, user.Username)) // download again lastReceivedEmail.reset() @@ -6463,9 +6989,9 @@ func TestEventRuleRenameEvent(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"test@example.com"}, - Subject: `"{{Event}}" from "{{Name}}"`, + Subject: `"{{.Event}}" from "{{.Name}}"`, ContentType: 1, - Body: `

Fs path {{FsPath}}, Target path "{{VirtualTargetDirPath}}/{{TargetName}}", size: {{FileSize}}

`, + Body: `

Fs path {{.FsPath}}, Name: {{.Name}}, Target path "{{.VirtualTargetDirPath}}/{{.TargetName}}", size: {{.FileSize}}

`, }, }, } @@ -6490,7 +7016,9 @@ func TestEventRuleRenameEvent(t *testing.T) { rule1, _, err := httpdtest.AddEventRule(r1, http.StatusCreated) assert.NoError(t, err) - user, _, err := httpdtest.AddUser(getTestUser(), http.StatusCreated) + u := getTestUser() + u.Username = "test & chars" + user, _, err := httpdtest.AddUser(u, http.StatusCreated) assert.NoError(t, err) conn, client, err := getSftpClient(user) if assert.NoError(t, err) { @@ -6510,10 +7038,11 @@ func TestEventRuleRenameEvent(t *testing.T) { }, 1500*time.Millisecond, 100*time.Millisecond) email := lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "test@example.com")) + assert.True(t, slices.Contains(email.To, "test@example.com")) assert.Contains(t, email.Data, fmt.Sprintf(`Subject: "rename" from "%s"`, user.Username)) assert.Contains(t, email.Data, "Content-Type: text/html") assert.Contains(t, email.Data, fmt.Sprintf("Target path %q", path.Join("/subdir", testFileName))) + assert.Contains(t, email.Data, "Name: test & chars,") } _, err = httpdtest.RemoveEventRule(rule1, http.StatusOK) @@ -6541,12 +7070,12 @@ func TestEventRuleIDPLogin(t *testing.T) { require.NoError(t, err) lastReceivedEmail.reset() - username := `test_"idp_"login` + username := `test_'idp_'login` custom1 := `cust"oa"1` u := map[string]any{ - "username": "{{Name}}", + "username": "{{.Name}}", "status": 1, - "home_dir": filepath.Join(os.TempDir(), "{{IDPFieldcustom1}}"), + "home_dir": filepath.Join(os.TempDir(), "{{.IDPFieldcustom1}}"), "permissions": map[string][]string{ "/": {dataprovider.PermAny}, }, @@ -6554,7 +7083,7 @@ func TestEventRuleIDPLogin(t *testing.T) { userTmpl, err := json.Marshal(u) require.NoError(t, err) a := map[string]any{ - "username": "{{Name}}", + "username": "{{.Name}}", "status": 1, "permissions": []string{dataprovider.PermAdminAny}, } @@ -6580,8 +7109,8 @@ func TestEventRuleIDPLogin(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"test@example.com"}, - Subject: `"{{Event}} {{StatusString}}"`, - Body: "{{Name}} Custom field: {{IDPFieldcustom1}}", + Subject: `"{{.Event}} {{.StatusString}}"`, + Body: "{{.Name}} Custom field: {{.IDPFieldcustom1}}", }, }, } @@ -6644,7 +7173,7 @@ func TestEventRuleIDPLogin(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email := lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "test@example.com")) + assert.True(t, slices.Contains(email.To, "test@example.com")) assert.Contains(t, email.Data, fmt.Sprintf(`Subject: "%s OK"`, common.IDPLoginUser)) assert.Contains(t, email.Data, username) assert.Contains(t, email.Data, custom1) @@ -6708,7 +7237,7 @@ func TestEventRuleIDPLogin(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email = lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "test@example.com")) + assert.True(t, slices.Contains(email.To, "test@example.com")) assert.Contains(t, email.Data, fmt.Sprintf(`Subject: "%s OK"`, common.IDPLoginAdmin)) assert.Contains(t, email.Data, username) assert.Contains(t, email.Data, custom1) @@ -6826,8 +7355,8 @@ func TestEventRuleEmailField(t *testing.T) { Type: dataprovider.ActionTypeEmail, Options: dataprovider.BaseEventActionOptions{ EmailConfig: dataprovider.EventActionEmailConfig{ - Recipients: []string{"{{Email}}"}, - Subject: `"{{Event}}" from "{{Name}}"`, + Recipients: []string{"{{.Email}}"}, + Subject: `"{{.Event}}" from "{{.Name}}"`, Body: "Sample email body", }, }, @@ -6841,7 +7370,7 @@ func TestEventRuleEmailField(t *testing.T) { EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"failure@example.com"}, Subject: `"Failure`, - Body: "{{ErrorString}}", + Body: "{{.ErrorString}}", }, }, } @@ -6868,6 +7397,9 @@ func TestEventRuleEmailField(t *testing.T) { Trigger: dataprovider.EventTriggerProviderEvent, Conditions: dataprovider.EventConditions{ ProviderEvents: []string{"add"}, + Options: dataprovider.ConditionOptions{ + ProviderObjects: []string{"user"}, + }, }, Actions: []dataprovider.EventAction{ { @@ -6900,7 +7432,7 @@ func TestEventRuleEmailField(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email := lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, user.Email)) + assert.True(t, slices.Contains(email.To, user.Email)) assert.Contains(t, email.Data, `Subject: "add" from "admin"`) // if we add a user without email the notification will fail @@ -6914,7 +7446,7 @@ func TestEventRuleEmailField(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email = lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "failure@example.com")) + assert.True(t, slices.Contains(email.To, "failure@example.com")) assert.Contains(t, email.Data, `no recipient addresses set`) conn, client, err := getSftpClient(user) @@ -6931,7 +7463,7 @@ func TestEventRuleEmailField(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email := lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, user.Email)) + assert.True(t, slices.Contains(email.To, user.Email)) assert.Contains(t, email.Data, fmt.Sprintf(`Subject: "mkdir" from "%s"`, user.Username)) } @@ -6972,9 +7504,9 @@ func TestEventRuleCertificate(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"test@example.com"}, - Subject: `"{{Event}} {{StatusString}}"`, + Subject: `"{{.Event}} {{.StatusString}}"`, ContentType: 0, - Body: "Domain: {{Name}} Timestamp: {{Timestamp}} {{ErrorString}}", + Body: "Domain: {{.Name}} Timestamp: {{.Timestamp}} {{.ErrorString}} Date time: {{.DateTime}}", }, }, } @@ -7029,7 +7561,7 @@ func TestEventRuleCertificate(t *testing.T) { common.HandleCertificateEvent(common.EventParams{ Name: "example.com", - Timestamp: time.Now().UnixNano(), + Timestamp: time.Now(), Status: 1, Event: renewalEvent, }) @@ -7038,15 +7570,16 @@ func TestEventRuleCertificate(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email := lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "test@example.com")) + assert.True(t, slices.Contains(email.To, "test@example.com")) assert.Contains(t, email.Data, fmt.Sprintf(`Subject: "%s OK"`, renewalEvent)) assert.Contains(t, email.Data, "Content-Type: text/plain") assert.Contains(t, email.Data, `Domain: example.com Timestamp`) lastReceivedEmail.reset() + dateTime := time.Now() params := common.EventParams{ Name: "example.com", - Timestamp: time.Now().UnixNano(), + Timestamp: dateTime, Status: 2, Event: renewalEvent, } @@ -7058,9 +7591,10 @@ func TestEventRuleCertificate(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email = lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "test@example.com")) + assert.True(t, slices.Contains(email.To, "test@example.com")) assert.Contains(t, email.Data, fmt.Sprintf(`Subject: "%s KO"`, renewalEvent)) assert.Contains(t, email.Data, `Domain: example.com Timestamp`) + assert.Contains(t, email.Data, dateTime.UTC().Format("2006-01-02T15:04:05.000")) assert.Contains(t, email.Data, errRenew.Error()) _, err = httpdtest.RemoveEventRule(rule1, http.StatusOK) @@ -7074,7 +7608,7 @@ func TestEventRuleCertificate(t *testing.T) { // ignored no more certificate rules common.HandleCertificateEvent(common.EventParams{ Name: "example.com", - Timestamp: time.Now().UnixNano(), + Timestamp: time.Now(), Status: 1, Event: renewalEvent, }) @@ -7110,8 +7644,8 @@ func TestEventRuleIPBlocked(t *testing.T) { Options: dataprovider.BaseEventActionOptions{ EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"test3@example.com", "test4@example.com"}, - Subject: `New "{{Event}}"`, - Body: "IP: {{IP}} Timestamp: {{Timestamp}}", + Subject: `New "{{.Event}}"`, + Body: "IP: {{.IP}} Timestamp: {{.Timestamp}}", }, }, } @@ -7184,8 +7718,8 @@ func TestEventRuleIPBlocked(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email := lastReceivedEmail.get() assert.Len(t, email.To, 2) - assert.True(t, util.Contains(email.To, "test3@example.com")) - assert.True(t, util.Contains(email.To, "test4@example.com")) + assert.True(t, slices.Contains(email.To, "test3@example.com")) + assert.True(t, slices.Contains(email.To, "test4@example.com")) assert.Contains(t, email.Data, `Subject: New "IP Blocked"`) err = dataprovider.DeleteEventRule(rule1.Name, "", "", "") @@ -7209,6 +7743,103 @@ func TestEventRuleIPBlocked(t *testing.T) { assert.NoError(t, err) } +func TestEventRuleRotateLog(t *testing.T) { + smtpCfg := smtp.Config{ + Host: "127.0.0.1", + Port: 2525, + From: "notification@example.com", + TemplatesPath: "templates", + } + err := smtpCfg.Initialize(configDir, true) + require.NoError(t, err) + + user, _, err := httpdtest.AddUser(getTestUser(), http.StatusCreated) + assert.NoError(t, err) + + a1 := dataprovider.BaseEventAction{ + Name: "a1", + Type: dataprovider.ActionTypeRotateLogs, + } + action1, _, err := httpdtest.AddEventAction(a1, http.StatusCreated) + assert.NoError(t, err) + a2 := dataprovider.BaseEventAction{ + Name: "a2", + Type: dataprovider.ActionTypeEmail, + Options: dataprovider.BaseEventActionOptions{ + EmailConfig: dataprovider.EventActionEmailConfig{ + Recipients: []string{"success@example.net"}, + Subject: `OK`, + Body: "OK action", + }, + }, + } + action2, _, err := httpdtest.AddEventAction(a2, http.StatusCreated) + assert.NoError(t, err) + + r1 := dataprovider.EventRule{ + Name: "rule1", + Status: 1, + Trigger: dataprovider.EventTriggerFsEvent, + Conditions: dataprovider.EventConditions{ + FsEvents: []string{"mkdir"}, + Options: dataprovider.ConditionOptions{ + Names: []dataprovider.ConditionPattern{ + { + Pattern: user.Username, + }, + }, + }, + }, + Actions: []dataprovider.EventAction{ + { + BaseEventAction: dataprovider.BaseEventAction{ + Name: action1.Name, + }, + Order: 1, + }, + { + BaseEventAction: dataprovider.BaseEventAction{ + Name: action2.Name, + }, + Order: 2, + }, + }, + } + rule1, resp, err := httpdtest.AddEventRule(r1, http.StatusCreated) + assert.NoError(t, err, string(resp)) + conn, client, err := getSftpClient(user) + if assert.NoError(t, err) { + defer conn.Close() + defer client.Close() + + lastReceivedEmail.reset() + err := client.Mkdir("just a test dir") + assert.NoError(t, err) + // just check that the action is executed + assert.Eventually(t, func() bool { + return lastReceivedEmail.get().From != "" + }, 1500*time.Millisecond, 100*time.Millisecond) + email := lastReceivedEmail.get() + assert.Len(t, email.To, 1) + assert.Contains(t, email.To, "success@example.net") + } + + _, err = httpdtest.RemoveEventRule(rule1, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveEventAction(action1, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveEventAction(action2, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveUser(user, http.StatusOK) + assert.NoError(t, err) + err = os.RemoveAll(user.GetHomeDir()) + assert.NoError(t, err) + + smtpCfg = smtp.Config{} + err = smtpCfg.Initialize(configDir, true) + require.NoError(t, err) +} + func TestEventRuleInactivityCheck(t *testing.T) { smtpCfg := smtp.Config{ Host: "127.0.0.1", @@ -7476,6 +8107,7 @@ func TestEventRulePasswordExpiration(t *testing.T) { _, _, err = httpdtest.UpdateEventRule(rule1, http.StatusOK) assert.NoError(t, err) user.Email = "user@example.net" + user.Filters.AdditionalEmails = []string{"additional@example.net"} _, _, err = httpdtest.UpdateUser(user, http.StatusOK, "") assert.NoError(t, err) conn, client, err = getSftpClient(user) @@ -7491,8 +8123,9 @@ func TestEventRulePasswordExpiration(t *testing.T) { return lastReceivedEmail.get().From != "" }, 1500*time.Millisecond, 100*time.Millisecond) email := lastReceivedEmail.get() - assert.Len(t, email.To, 1) + assert.Len(t, email.To, 2) assert.Contains(t, email.To, user.Email) + assert.Contains(t, email.To, user.Filters.AdditionalEmails[0]) assert.Contains(t, email.Data, "your SFTPGo password expires in 5 days") err = client.RemoveDirectory(dirName) assert.NoError(t, err) @@ -7713,7 +8346,12 @@ func TestRetentionAPI(t *testing.T) { DeleteEmptyDirs: true, }, } - _, err = httpdtest.StartRetentionCheck(user.Username, folderRetention, http.StatusAccepted) + check := common.RetentionCheck{ + Folders: folderRetention, + } + c := common.RetentionChecks.Add(check, &user) + assert.NotNil(t, c) + err = c.Start() assert.NoError(t, err) assert.Eventually(t, func() bool { @@ -7726,7 +8364,7 @@ func TestRetentionAPI(t *testing.T) { err = client.Chtimes(uploadPath, time.Now().Add(-48*time.Hour), time.Now().Add(-48*time.Hour)) assert.NoError(t, err) - _, err = httpdtest.StartRetentionCheck(user.Username, folderRetention, http.StatusAccepted) + err = c.Start() assert.NoError(t, err) assert.Eventually(t, func() bool { @@ -7744,11 +8382,13 @@ func TestRetentionAPI(t *testing.T) { err = writeSFTPFile(uploadPath, 32, client) assert.NoError(t, err) - folderRetention[0].DeleteEmptyDirs = false + check.Folders[0].DeleteEmptyDirs = false err = client.Chtimes(uploadPath, time.Now().Add(-48*time.Hour), time.Now().Add(-48*time.Hour)) assert.NoError(t, err) - _, err = httpdtest.StartRetentionCheck(user.Username, folderRetention, http.StatusAccepted) + c = common.RetentionChecks.Add(check, &user) + assert.NotNil(t, c) + err = c.Start() assert.NoError(t, err) assert.Eventually(t, func() bool { @@ -7765,6 +8405,8 @@ func TestRetentionAPI(t *testing.T) { assert.NoError(t, err) err = client.Chtimes(uploadPath, time.Now().Add(-48*time.Hour), time.Now().Add(-48*time.Hour)) assert.NoError(t, err) + conn.Close() + client.Close() } // remove delete permissions to the user, it will be automatically granted @@ -7775,9 +8417,6 @@ func TestRetentionAPI(t *testing.T) { conn, client, err = getSftpClient(user) if assert.NoError(t, err) { - defer conn.Close() - defer client.Close() - innerUploadFilePath := path.Join("/"+testDir, testDir, testFileName) err = client.Mkdir(path.Join(testDir, testDir)) assert.NoError(t, err) @@ -7802,7 +8441,12 @@ func TestRetentionAPI(t *testing.T) { Retention: 0, }, } - _, err = httpdtest.StartRetentionCheck(user.Username, folderRetention, http.StatusAccepted) + check := common.RetentionCheck{ + Folders: folderRetention, + } + c := common.RetentionChecks.Add(check, &user) + assert.NotNil(t, c) + err = c.Start() assert.NoError(t, err) assert.Eventually(t, func() bool { @@ -7823,7 +8467,12 @@ func TestRetentionAPI(t *testing.T) { }, } - _, err = httpdtest.StartRetentionCheck(user.Username, folderRetention, http.StatusAccepted) + check = common.RetentionCheck{ + Folders: folderRetention, + } + c = common.RetentionChecks.Add(check, &user) + assert.NotNil(t, c) + err = c.Start() assert.NoError(t, err) assert.Eventually(t, func() bool { @@ -7832,6 +8481,8 @@ func TestRetentionAPI(t *testing.T) { _, err = client.Stat(innerUploadFilePath) assert.ErrorIs(t, err, os.ErrNotExist) + conn.Close() + client.Close() } // finally test some errors removing files or folders if runtime.GOOS != osWindows { @@ -7857,8 +8508,13 @@ func TestRetentionAPI(t *testing.T) { }, } - _, err = httpdtest.StartRetentionCheck(user.Username, folderRetention, http.StatusAccepted) - assert.NoError(t, err) + check := common.RetentionCheck{ + Folders: folderRetention, + } + c := common.RetentionChecks.Add(check, &user) + assert.NotNil(t, c) + err = c.Start() + assert.ErrorIs(t, err, os.ErrPermission) assert.Eventually(t, func() bool { return len(common.RetentionChecks.Get("")) == 0 @@ -7867,8 +8523,10 @@ func TestRetentionAPI(t *testing.T) { err = os.Chmod(dirPath, 0555) assert.NoError(t, err) - _, err = httpdtest.StartRetentionCheck(user.Username, folderRetention, http.StatusAccepted) - assert.NoError(t, err) + c = common.RetentionChecks.Add(check, &user) + assert.NotNil(t, c) + err = c.Start() + assert.ErrorIs(t, err, os.ErrPermission) assert.Eventually(t, func() bool { return len(common.RetentionChecks.Get("")) == 0 @@ -7877,7 +8535,12 @@ func TestRetentionAPI(t *testing.T) { err = os.Chmod(dirPath, os.ModePerm) assert.NoError(t, err) - _, err = httpdtest.StartRetentionCheck(user.Username, folderRetention, http.StatusAccepted) + check = common.RetentionCheck{ + Folders: folderRetention, + } + c = common.RetentionChecks.Add(check, &user) + assert.NotNil(t, c) + err = c.Start() assert.NoError(t, err) assert.Eventually(t, func() bool { @@ -7891,6 +8554,93 @@ func TestRetentionAPI(t *testing.T) { assert.NoError(t, err) err = os.RemoveAll(user.GetHomeDir()) assert.NoError(t, err) + + assert.Eventually(t, func() bool { + return common.Connections.GetClientConnections() == 0 + }, 1*time.Second, 50*time.Millisecond) +} + +func TestPerUserTransferLimits(t *testing.T) { + oldMaxPerHostConns := common.Config.MaxPerHostConnections + + common.Config.MaxPerHostConnections = 2 + + u := getTestUser() + u.UploadBandwidth = 32 + user, _, err := httpdtest.AddUser(u, http.StatusCreated) + if !assert.NoError(t, err) { + printLatestLogs(20) + } + conn, client, err := getSftpClient(user) + if assert.NoError(t, err) { + defer conn.Close() + defer client.Close() + + var wg sync.WaitGroup + numErrors := 0 + for i := 0; i <= 2; i++ { + wg.Add(1) + go func(counter int) { + defer wg.Done() + + time.Sleep(20 * time.Millisecond) + err := writeSFTPFile(fmt.Sprintf("%s_%d", testFileName, counter), 64*1024, client) + if err != nil { + numErrors++ + } + }(i) + } + wg.Wait() + + assert.Equal(t, 1, numErrors) + } + _, err = httpdtest.RemoveUser(user, http.StatusOK) + assert.NoError(t, err) + err = os.RemoveAll(user.GetHomeDir()) + assert.NoError(t, err) + + common.Config.MaxPerHostConnections = oldMaxPerHostConns +} + +func TestMaxSessionsSameConnection(t *testing.T) { + u := getTestUser() + u.UploadBandwidth = 32 + u.MaxSessions = 2 + user, _, err := httpdtest.AddUser(u, http.StatusCreated) + assert.NoError(t, err) + conn, client, err := getSftpClient(user) + if assert.NoError(t, err) { + defer conn.Close() + defer client.Close() + + var wg sync.WaitGroup + numErrors := 0 + for i := 0; i <= 2; i++ { + wg.Add(1) + go func(counter int) { + defer wg.Done() + + var err error + if counter < 2 { + err = writeSFTPFile(fmt.Sprintf("%s_%d", testFileName, counter), 64*1024, client) + } else { + // wait for the transfers to start + time.Sleep(50 * time.Millisecond) + _, _, err = getSftpClient(user) + } + if err != nil { + numErrors++ + } + }(i) + } + + wg.Wait() + assert.Equal(t, 1, numErrors) + } + _, err = httpdtest.RemoveUser(user, http.StatusOK) + assert.NoError(t, err) + err = os.RemoveAll(user.GetHomeDir()) + assert.NoError(t, err) } func TestRenameDir(t *testing.T) { @@ -8260,7 +9010,7 @@ func TestSFTPLoopError(t *testing.T) { }, 3000*time.Millisecond, 100*time.Millisecond) email := lastReceivedEmail.get() assert.Len(t, email.To, 1) - assert.True(t, util.Contains(email.To, "failure@example.com")) + assert.True(t, slices.Contains(email.To, "failure@example.com")) assert.Contains(t, email.Data, `Subject: Failed action`) user1.VirtualFolders[0].FsConfig.SFTPConfig.Password = kms.NewPlainSecret(defaultPassword) @@ -8934,9 +9684,8 @@ func TestHTTPFs(t *testing.T) { func TestProxyProtocol(t *testing.T) { resp, err := httpclient.Get(fmt.Sprintf("http://%v", httpProxyAddr)) - if assert.NoError(t, err) { - defer resp.Body.Close() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + if !assert.Error(t, err) { + resp.Body.Close() } } @@ -9218,7 +9967,7 @@ func printLatestLogs(maxNumberOfLines int) { return } for _, line := range lines { - logger.DebugToConsole(line) + logger.DebugToConsole("%s", line) } } diff --git a/internal/common/ratelimiter.go b/internal/common/ratelimiter.go index 1caa2ebf..85d88092 100644 --- a/internal/common/ratelimiter.go +++ b/internal/common/ratelimiter.go @@ -17,6 +17,7 @@ package common import ( "errors" "fmt" + "slices" "sort" "sync" "sync/atomic" @@ -94,7 +95,7 @@ func (r *RateLimiterConfig) validate() error { } r.Protocols = util.RemoveDuplicates(r.Protocols, true) for _, protocol := range r.Protocols { - if !util.Contains(rateLimiterProtocolValues, protocol) { + if !slices.Contains(rateLimiterProtocolValues, protocol) { return fmt.Errorf("invalid protocol %q", protocol) } } diff --git a/internal/common/tlsutils.go b/internal/common/tlsutils.go index c604728d..a7dfb0c6 100644 --- a/internal/common/tlsutils.go +++ b/internal/common/tlsutils.go @@ -25,6 +25,7 @@ import ( "math/rand" "os" "path/filepath" + "slices" "sync" "github.com/drakkan/sftpgo/v2/internal/logger" @@ -96,7 +97,7 @@ func (m *CertManager) loadCertificates() error { } logger.Debug(m.logSender, "", "TLS certificate %q successfully loaded, id %v", keyPair.Cert, keyPair.ID) certs[keyPair.ID] = &newCert - if !util.Contains(m.monitorList, keyPair.Cert) { + if !slices.Contains(m.monitorList, keyPair.Cert) { m.monitorList = append(m.monitorList, keyPair.Cert) } } @@ -190,7 +191,7 @@ func (m *CertManager) LoadCRLs() error { logger.Debug(m.logSender, "", "CRL %q successfully loaded", revocationList) crls = append(crls, crl) - if !util.Contains(m.monitorList, revocationList) { + if !slices.Contains(m.monitorList, revocationList) { m.monitorList = append(m.monitorList, revocationList) } } diff --git a/internal/common/transfer.go b/internal/common/transfer.go index 9bf354fb..df9638b1 100644 --- a/internal/common/transfer.go +++ b/internal/common/transfer.go @@ -35,7 +35,7 @@ var ( ) // BaseTransfer contains protocols common transfer details for an upload or a download. -type BaseTransfer struct { //nolint:maligned +type BaseTransfer struct { ID int64 BytesSent atomic.Int64 BytesReceived atomic.Int64 @@ -329,6 +329,21 @@ func (t *BaseTransfer) getUploadFileSize() (int64, int, error) { var fileSize int64 var deletedFiles int + switch dataprovider.GetQuotaTracking() { + case 0: + return fileSize, deletedFiles, errors.New("quota tracking disabled") + case 2: + if !t.Connection.User.HasQuotaRestrictions() { + vfolder, err := t.Connection.User.GetVirtualFolderForPath(path.Dir(t.requestPath)) + if err != nil { + return fileSize, deletedFiles, errors.New("quota tracking disabled for this user") + } + if vfolder.IsIncludedInUserQuota() { + return fileSize, deletedFiles, errors.New("quota tracking disabled for this user and folder included in user quota") + } + } + } + info, err := t.Fs.Stat(t.fsPath) if err == nil { fileSize = info.Size() @@ -352,6 +367,9 @@ func (t *BaseTransfer) checkUploadOutsideHomeDir(err error) int { if err == nil { return 0 } + if t.ErrTransfer == nil { + t.ErrTransfer = err + } if Config.TempPath == "" { return 0 } @@ -391,7 +409,7 @@ func (t *BaseTransfer) Close() error { t.effectiveFsPath, err) } else if t.isAtomicUpload() { if t.ErrTransfer == nil || Config.UploadMode&UploadModeAtomicWithResume != 0 { - _, _, err = t.Fs.Rename(t.effectiveFsPath, t.fsPath) + _, _, err = t.Fs.Rename(t.effectiveFsPath, t.fsPath, 0) t.Connection.Log(logger.LevelDebug, "atomic upload completed, rename: %q -> %q, error: %v", t.effectiveFsPath, t.fsPath, err) // the file must be removed if it is uploaded to a path outside the home dir and cannot be renamed @@ -410,7 +428,8 @@ func (t *BaseTransfer) Close() error { var uploadFileSize int64 if t.transferType == TransferDownload { logger.TransferLog(downloadLogSender, t.fsPath, elapsed, t.BytesSent.Load(), t.Connection.User.Username, - t.Connection.ID, t.Connection.protocol, t.Connection.localAddr, t.Connection.remoteAddr, t.ftpMode) + t.Connection.ID, t.Connection.protocol, t.Connection.localAddr, t.Connection.remoteAddr, t.ftpMode, + t.ErrTransfer) ExecuteActionNotification(t.Connection, operationDownload, t.fsPath, t.requestPath, "", "", "", //nolint:errcheck t.BytesSent.Load(), t.ErrTransfer, elapsed, t.metadata) } else { @@ -431,7 +450,8 @@ func (t *BaseTransfer) Close() error { t.updateQuota(numFiles, uploadFileSize) t.updateTimes() logger.TransferLog(uploadLogSender, t.fsPath, elapsed, t.BytesReceived.Load(), t.Connection.User.Username, - t.Connection.ID, t.Connection.protocol, t.Connection.localAddr, t.Connection.remoteAddr, t.ftpMode) + t.Connection.ID, t.Connection.protocol, t.Connection.localAddr, t.Connection.remoteAddr, t.ftpMode, + t.ErrTransfer) } if t.ErrTransfer != nil { t.Connection.Log(logger.LevelError, "transfer error: %v, path: %q", t.ErrTransfer, t.fsPath) @@ -516,11 +536,8 @@ func (t *BaseTransfer) updateQuota(numFiles int, fileSize int64) bool { if t.transferType == TransferUpload && (numFiles != 0 || sizeDiff != 0) { vfolder, err := t.Connection.User.GetVirtualFolderForPath(path.Dir(t.requestPath)) if err == nil { - dataprovider.UpdateVirtualFolderQuota(&vfolder.BaseVirtualFolder, numFiles, //nolint:errcheck + dataprovider.UpdateUserFolderQuota(&vfolder, &t.Connection.User, numFiles, sizeDiff, false) - if vfolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&t.Connection.User, numFiles, sizeDiff, false) //nolint:errcheck - } } else { dataprovider.UpdateUserQuota(&t.Connection.User, numFiles, sizeDiff, false) //nolint:errcheck } diff --git a/internal/common/transfer_test.go b/internal/common/transfer_test.go index 5324484b..1bf0dbe1 100644 --- a/internal/common/transfer_test.go +++ b/internal/common/transfer_test.go @@ -306,8 +306,9 @@ func TestRemovePartialCryptoFile(t *testing.T) { require.NoError(t, err) u := dataprovider.User{ BaseUser: sdk.BaseUser{ - Username: "test", - HomeDir: os.TempDir(), + Username: "test", + HomeDir: os.TempDir(), + QuotaFiles: 1000000, }, } conn := NewBaseConnection(fs.ConnectionID(), ProtocolSFTP, "", "", u) @@ -323,6 +324,9 @@ func TestRemovePartialCryptoFile(t *testing.T) { assert.Equal(t, int64(0), size) assert.Equal(t, 1, deletedFiles) assert.NoFileExists(t, testFile) + err = transfer.Close() + assert.Error(t, err) + assert.Len(t, conn.GetTransfers(), 0) } func TestFTPMode(t *testing.T) { @@ -434,6 +438,11 @@ func TestTransferQuota(t *testing.T) { } err = transfer.CheckWrite() assert.True(t, conn.IsQuotaExceededError(err)) + + err = transfer.Close() + assert.NoError(t, err) + assert.Len(t, conn.GetTransfers(), 0) + assert.Equal(t, int32(0), Connections.GetTotalTransfers()) } func TestUploadOutsideHomeRenameError(t *testing.T) { diff --git a/internal/common/transferschecker_test.go b/internal/common/transferschecker_test.go index 443e438e..0528de61 100644 --- a/internal/common/transferschecker_test.go +++ b/internal/common/transferschecker_test.go @@ -250,6 +250,7 @@ func TestTransfersCheckerDiskQuota(t *testing.T) { Connections.Remove(fakeConn5.GetID()) stats := Connections.GetStats("") assert.Len(t, stats, 0) + assert.Equal(t, int32(0), Connections.GetTotalTransfers()) err = dataprovider.DeleteUser(user.Username, "", "", "") assert.NoError(t, err) @@ -368,11 +369,16 @@ func TestTransferCheckerTransferQuota(t *testing.T) { if assert.Error(t, transfer4.errAbort) { assert.Contains(t, transfer4.errAbort.Error(), ErrReadQuotaExceeded.Error()) } + err = transfer3.Close() + assert.NoError(t, err) + err = transfer4.Close() + assert.NoError(t, err) Connections.Remove(fakeConn3.GetID()) Connections.Remove(fakeConn4.GetID()) stats := Connections.GetStats("") assert.Len(t, stats, 0) + assert.Equal(t, int32(0), Connections.GetTotalTransfers()) err = dataprovider.DeleteUser(user.Username, "", "", "") assert.NoError(t, err) diff --git a/internal/config/config.go b/internal/config/config.go index 97a0da7b..58863c6d 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -20,9 +20,11 @@ import ( "fmt" "os" "path/filepath" + "slices" "strconv" "strings" + kmsplugin "github.com/sftpgo/sdk/plugin/kms" "github.com/spf13/viper" "github.com/subosito/gotenv" @@ -91,30 +93,35 @@ var ( TLSCipherSuites: nil, Protocols: nil, Prefix: "", + ProxyMode: 0, ProxyAllowed: nil, ClientIPProxyHeader: "", ClientIPHeaderDepth: 0, DisableWWWAuthHeader: false, } defaultHTTPDBinding = httpd.Binding{ - Address: "", - Port: 8080, - EnableWebAdmin: true, - EnableWebClient: true, - EnableRESTAPI: true, - EnabledLoginMethods: 0, - EnableHTTPS: false, - CertificateFile: "", - CertificateKeyFile: "", - MinTLSVersion: 12, - ClientAuthType: 0, - TLSCipherSuites: nil, - Protocols: nil, - ProxyAllowed: nil, - ClientIPProxyHeader: "", - ClientIPHeaderDepth: 0, - HideLoginURL: 0, - RenderOpenAPI: true, + Address: "", + Port: 8080, + EnableWebAdmin: true, + EnableWebClient: true, + EnableRESTAPI: true, + EnabledLoginMethods: 0, + DisabledLoginMethods: 0, + EnableHTTPS: false, + CertificateFile: "", + CertificateKeyFile: "", + MinTLSVersion: 12, + ClientAuthType: 0, + TLSCipherSuites: nil, + Protocols: nil, + ProxyMode: 0, + ProxyAllowed: nil, + ClientIPProxyHeader: "", + ClientIPHeaderDepth: 0, + HideLoginURL: 0, + RenderOpenAPI: true, + BaseURL: "", + Languages: []string{"en"}, OIDC: httpd.OIDC{ ClientID: "", ClientSecret: "", @@ -130,20 +137,23 @@ var ( Debug: false, }, Security: httpd.SecurityConf{ - Enabled: false, - AllowedHosts: nil, - AllowedHostsAreRegex: false, - HostsProxyHeaders: nil, - HTTPSRedirect: false, - HTTPSHost: "", - HTTPSProxyHeaders: nil, - STSSeconds: 0, - STSIncludeSubdomains: false, - STSPreload: false, - ContentTypeNosniff: false, - ContentSecurityPolicy: "", - PermissionsPolicy: "", - CrossOriginOpenerPolicy: "", + Enabled: false, + AllowedHosts: nil, + AllowedHostsAreRegex: false, + HostsProxyHeaders: nil, + HTTPSRedirect: false, + HTTPSHost: "", + HTTPSProxyHeaders: nil, + STSSeconds: 0, + STSIncludeSubdomains: false, + STSPreload: false, + ContentTypeNosniff: false, + ContentSecurityPolicy: "", + PermissionsPolicy: "", + CrossOriginOpenerPolicy: "", + CrossOriginResourcePolicy: "", + CrossOriginEmbedderPolicy: "", + CacheControl: "", }, Branding: httpd.Branding{}, } @@ -208,7 +218,6 @@ func Init() { ProxySkipped: []string{}, PostConnectHook: "", PostDisconnectHook: "", - DataRetentionHook: "", MaxTotalConnections: 0, MaxPerHostConnections: 20, AllowListStatus: 0, @@ -226,13 +235,21 @@ func Init() { ObservationTime: 30, EntriesSoftLimit: 100, EntriesHardLimit: 150, + LoginDelay: common.LoginDelay{ + Success: 0, + PasswordFailed: 1000, + }, }, RateLimitersConfig: []common.RateLimiterConfig{defaultRateLimiter}, Umask: "", ServerVersion: "", + TZ: "", Metadata: common.MetadataConfig{ Read: 0, }, + EventManager: common.EventManagerConfig{ + EnabledCommands: []string{}, + }, }, ACME: acme.Configuration{ Email: "", @@ -262,6 +279,8 @@ func Init() { PublicKeyAlgorithms: []string{}, TrustedUserCAKeys: []string{}, RevokedUserCertsFile: "", + OPKSSHPath: "", + OPKSSHChecksum: "", LoginBannerFile: "", EnabledSSHCommands: []string{}, KeyboardInteractiveAuthentication: true, @@ -390,6 +409,9 @@ func Init() { SigningPassphrase: "", SigningPassphraseFile: "", TokenValidation: 0, + CookieLifetime: 20, + ShareCookieLifetime: 120, + JWTLifetime: 20, MaxUploadFileSize: 0, Cors: httpd.CorsConfig{ Enabled: false, @@ -568,6 +590,16 @@ func SetPluginsConfig(config []plugin.Config) { globalConf.PluginsConfig = config } +// HasKMSPlugin returns true if at least one KMS plugin is configured. +func HasKMSPlugin() bool { + for _, c := range globalConf.PluginsConfig { + if c.Type == kmsplugin.PluginName { + return true + } + } + return false +} + // GetMFAConfig returns multi-factor authentication config func GetMFAConfig() mfa.Config { return globalConf.MFAConfig @@ -614,7 +646,6 @@ func getRedactedGlobalConf() globalConfig { conf.Common.StartupHook = util.GetRedactedURL(conf.Common.StartupHook) conf.Common.PostConnectHook = util.GetRedactedURL(conf.Common.PostConnectHook) conf.Common.PostDisconnectHook = util.GetRedactedURL(conf.Common.PostDisconnectHook) - conf.Common.DataRetentionHook = util.GetRedactedURL(conf.Common.DataRetentionHook) conf.SFTPD.KeyboardInteractiveHook = util.GetRedactedURL(conf.SFTPD.KeyboardInteractiveHook) conf.HTTPDConfig.SigningPassphrase = getRedactedPassword(conf.HTTPDConfig.SigningPassphrase) conf.HTTPDConfig.Setup.InstallationCode = getRedactedPassword(conf.HTTPDConfig.Setup.InstallationCode) @@ -631,6 +662,16 @@ func getRedactedGlobalConf() globalConfig { binding.OIDC.ClientSecret = getRedactedPassword(binding.OIDC.ClientSecret) conf.HTTPDConfig.Bindings = append(conf.HTTPDConfig.Bindings, binding) } + conf.KMSConfig.Secrets.MasterKeyString = getRedactedPassword(conf.KMSConfig.Secrets.MasterKeyString) + conf.PluginsConfig = nil + for _, plugin := range globalConf.PluginsConfig { + var args []string + for _, arg := range plugin.Args { + args = append(args, getRedactedPassword(arg)) + } + plugin.Args = args + conf.PluginsConfig = append(conf.PluginsConfig, plugin) + } return conf } @@ -701,7 +742,7 @@ func checkOverrideDefaultSettings() { } } - if util.Contains(viper.AllKeys(), "mfa.totp") { + if slices.Contains(viper.AllKeys(), "mfa.totp") { globalConf.MFAConfig.TOTP = nil } } @@ -787,6 +828,12 @@ func resetInvalidConfigs() { logger.WarnToConsole("Non-fatal configuration error: %v", warn) } } + if globalConf.Common.RenameMode < 0 || globalConf.Common.RenameMode > 1 { + warn := fmt.Sprintf("invalid rename mode %d, reset to 0", globalConf.Common.RenameMode) + globalConf.Common.RenameMode = 0 + logger.Warn(logSender, "", "Non-fatal configuration error: %v", warn) + logger.WarnToConsole("Non-fatal configuration error: %v", warn) + } } func loadBindingsFromEnv() { @@ -859,13 +906,13 @@ func getRateLimitersFromEnv(idx int) { isSet = true } - burst, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_COMMON__RATE_LIMITERS__%v__BURST", idx), 0) + burst, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_COMMON__RATE_LIMITERS__%v__BURST", idx), 32) if ok { rtlConfig.Burst = int(burst) isSet = true } - rtlType, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_COMMON__RATE_LIMITERS__%v__TYPE", idx), 0) + rtlType, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_COMMON__RATE_LIMITERS__%v__TYPE", idx), 32) if ok { rtlConfig.Type = int(rtlType) isSet = true @@ -883,13 +930,13 @@ func getRateLimitersFromEnv(idx int) { isSet = true } - softLimit, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_COMMON__RATE_LIMITERS__%v__ENTRIES_SOFT_LIMIT", idx), 0) + softLimit, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_COMMON__RATE_LIMITERS__%v__ENTRIES_SOFT_LIMIT", idx), 32) if ok { rtlConfig.EntriesSoftLimit = int(softLimit) isSet = true } - hardLimit, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_COMMON__RATE_LIMITERS__%v__ENTRIES_HARD_LIMIT", idx), 0) + hardLimit, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_COMMON__RATE_LIMITERS__%v__ENTRIES_HARD_LIMIT", idx), 32) if ok { rtlConfig.EntriesHardLimit = int(hardLimit) isSet = true @@ -925,7 +972,7 @@ func getKMSPluginFromEnv(idx int, pluginConfig *plugin.Config) bool { func getAuthPluginFromEnv(idx int, pluginConfig *plugin.Config) bool { isSet := false - authScope, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_PLUGINS__%v__AUTH_OPTIONS__SCOPE", idx), 0) + authScope, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_PLUGINS__%v__AUTH_OPTIONS__SCOPE", idx), 32) if ok { pluginConfig.AuthOptions.Scope = int(authScope) isSet = true @@ -970,13 +1017,13 @@ func getNotifierPluginFromEnv(idx int, pluginConfig *plugin.Config) bool { } } - notifierRetryMaxTime, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_PLUGINS__%v__NOTIFIER_OPTIONS__RETRY_MAX_TIME", idx), 0) + notifierRetryMaxTime, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_PLUGINS__%v__NOTIFIER_OPTIONS__RETRY_MAX_TIME", idx), 32) if ok { pluginConfig.NotifierOptions.RetryMaxTime = int(notifierRetryMaxTime) isSet = true } - notifierRetryQueueMaxSize, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_PLUGINS__%v__NOTIFIER_OPTIONS__RETRY_QUEUE_MAX_SIZE", idx), 0) + notifierRetryQueueMaxSize, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_PLUGINS__%v__NOTIFIER_OPTIONS__RETRY_QUEUE_MAX_SIZE", idx), 32) if ok { pluginConfig.NotifierOptions.RetryQueueMaxSize = int(notifierRetryQueueMaxSize) isSet = true @@ -1064,7 +1111,7 @@ func getSFTPDBindindFromEnv(idx int) { isSet := false - port, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_SFTPD__BINDINGS__%v__PORT", idx), 0) + port, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_SFTPD__BINDINGS__%v__PORT", idx), 32) if ok { binding.Port = int(port) isSet = true @@ -1151,19 +1198,13 @@ func getFTPDBindingSecurityFromEnv(idx int, binding *ftpd.Binding) bool { isSet = true } - tlsMode, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_FTPD__BINDINGS__%v__TLS_MODE", idx), 0) + tlsMode, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_FTPD__BINDINGS__%v__TLS_MODE", idx), 32) if ok { binding.TLSMode = int(tlsMode) isSet = true } - tlsSessionReuse, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_FTPD__BINDINGS__%v__TLS_SESSION_REUSE", idx), 0) - if ok { - binding.TLSSessionReuse = int(tlsSessionReuse) - isSet = true - } - - tlsVer, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_FTPD__BINDINGS__%v__MIN_TLS_VERSION", idx), 0) + tlsVer, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_FTPD__BINDINGS__%v__MIN_TLS_VERSION", idx), 32) if ok { binding.MinTLSVersion = int(tlsVer) isSet = true @@ -1175,30 +1216,24 @@ func getFTPDBindingSecurityFromEnv(idx int, binding *ftpd.Binding) bool { isSet = true } - clientAuthType, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_FTPD__BINDINGS__%v__CLIENT_AUTH_TYPE", idx), 0) + clientAuthType, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_FTPD__BINDINGS__%v__CLIENT_AUTH_TYPE", idx), 32) if ok { binding.ClientAuthType = int(clientAuthType) isSet = true } - pasvSecurity, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_FTPD__BINDINGS__%v__PASSIVE_CONNECTIONS_SECURITY", idx), 0) + pasvSecurity, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_FTPD__BINDINGS__%v__PASSIVE_CONNECTIONS_SECURITY", idx), 32) if ok { binding.PassiveConnectionsSecurity = int(pasvSecurity) isSet = true } - activeSecurity, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_FTPD__BINDINGS__%v__ACTIVE_CONNECTIONS_SECURITY", idx), 0) + activeSecurity, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_FTPD__BINDINGS__%v__ACTIVE_CONNECTIONS_SECURITY", idx), 32) if ok { binding.ActiveConnectionsSecurity = int(activeSecurity) isSet = true } - ignoreASCIITransferType, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_FTPD__BINDINGS__%d__IGNORE_ASCII_TRANSFER_TYPE", idx), 0) - if ok { - binding.IgnoreASCIITransferType = int(ignoreASCIITransferType) - isSet = true - } - return isSet } @@ -1206,7 +1241,7 @@ func getFTPDBindingFromEnv(idx int) { binding := getDefaultFTPDBinding(idx) isSet := false - port, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_FTPD__BINDINGS__%v__PORT", idx), 0) + port, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_FTPD__BINDINGS__%v__PORT", idx), 32) if ok { binding.Port = int(port) isSet = true @@ -1286,13 +1321,13 @@ func getWebDAVBindingHTTPSConfigsFromEnv(idx int, binding *webdavd.Binding) bool isSet = true } - tlsVer, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_WEBDAVD__BINDINGS__%v__MIN_TLS_VERSION", idx), 0) + tlsVer, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_WEBDAVD__BINDINGS__%v__MIN_TLS_VERSION", idx), 32) if ok { binding.MinTLSVersion = int(tlsVer) isSet = true } - clientAuthType, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_WEBDAVD__BINDINGS__%v__CLIENT_AUTH_TYPE", idx), 0) + clientAuthType, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_WEBDAVD__BINDINGS__%v__CLIENT_AUTH_TYPE", idx), 32) if ok { binding.ClientAuthType = int(clientAuthType) isSet = true @@ -1316,6 +1351,12 @@ func getWebDAVBindingHTTPSConfigsFromEnv(idx int, binding *webdavd.Binding) bool func getWebDAVDBindingProxyConfigsFromEnv(idx int, binding *webdavd.Binding) bool { isSet := false + proxyMode, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_WEBDAVD__BINDINGS__%v__PROXY_MODE", idx), 32) + if ok { + binding.ProxyMode = int(proxyMode) + isSet = true + } + proxyAllowed, ok := lookupStringListFromEnv(fmt.Sprintf("SFTPGO_WEBDAVD__BINDINGS__%v__PROXY_ALLOWED", idx)) if ok { binding.ProxyAllowed = proxyAllowed @@ -1328,7 +1369,7 @@ func getWebDAVDBindingProxyConfigsFromEnv(idx int, binding *webdavd.Binding) boo isSet = true } - clientIPHeaderDepth, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_WEBDAVD__BINDINGS__%v__CLIENT_IP_HEADER_DEPTH", idx), 0) + clientIPHeaderDepth, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_WEBDAVD__BINDINGS__%v__CLIENT_IP_HEADER_DEPTH", idx), 32) if ok { binding.ClientIPHeaderDepth = int(clientIPHeaderDepth) isSet = true @@ -1366,7 +1407,7 @@ func getWebDAVDBindingFromEnv(idx int) { isSet := false - port, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_WEBDAVD__BINDINGS__%v__PORT", idx), 0) + port, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_WEBDAVD__BINDINGS__%v__PORT", idx), 32) if ok { binding.Port = int(port) isSet = true @@ -1527,9 +1568,33 @@ func getHTTPDSecurityConfFromEnv(idx int) (httpd.SecurityConf, bool) { //nolint: isSet = true } - crossOriginOpenedPolicy, ok := os.LookupEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__SECURITY__CROSS_ORIGIN_OPENER_POLICY", idx)) + crossOriginOpenerPolicy, ok := os.LookupEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__SECURITY__CROSS_ORIGIN_OPENER_POLICY", idx)) if ok { - result.CrossOriginOpenerPolicy = crossOriginOpenedPolicy + result.CrossOriginOpenerPolicy = crossOriginOpenerPolicy + isSet = true + } + + crossOriginResourcePolicy, ok := os.LookupEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__SECURITY__CROSS_ORIGIN_RESOURCE_POLICY", idx)) + if ok { + result.CrossOriginResourcePolicy = crossOriginResourcePolicy + isSet = true + } + + crossOriginEmbedderPolicy, ok := os.LookupEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__SECURITY__CROSS_ORIGIN_EMBEDDER_POLICY", idx)) + if ok { + result.CrossOriginEmbedderPolicy = crossOriginEmbedderPolicy + isSet = true + } + + referredPolicy, ok := os.LookupEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__SECURITY__REFERRER_POLICY", idx)) + if ok { + result.ReferrerPolicy = referredPolicy + isSet = true + } + + cacheControl, ok := os.LookupEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__SECURITY__CACHE_CONTROL", idx)) + if ok { + result.CacheControl = cacheControl isSet = true } @@ -1645,12 +1710,6 @@ func getHTTPDUIBrandingFromEnv(prefix string, branding httpd.UIBranding) (httpd. isSet = true } - loginImagePath, ok := os.LookupEnv(fmt.Sprintf("%s__LOGIN_IMAGE_PATH", prefix)) - if ok { - branding.LoginImagePath = loginImagePath - isSet = true - } - disclaimerName, ok := os.LookupEnv(fmt.Sprintf("%s__DISCLAIMER_NAME", prefix)) if ok { branding.DisclaimerName = disclaimerName @@ -1737,6 +1796,12 @@ func getHTTPDNestedObjectsFromEnv(idx int, binding *httpd.Binding) bool { func getHTTPDBindingProxyConfigsFromEnv(idx int, binding *httpd.Binding) bool { isSet := false + proxyMode, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__PROXY_MODE", idx), 32) + if ok { + binding.ProxyMode = int(proxyMode) + isSet = true + } + proxyAllowed, ok := lookupStringListFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__PROXY_ALLOWED", idx)) if ok { binding.ProxyAllowed = proxyAllowed @@ -1749,7 +1814,7 @@ func getHTTPDBindingProxyConfigsFromEnv(idx int, binding *httpd.Binding) bool { isSet = true } - clientIPHeaderDepth, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__CLIENT_IP_HEADER_DEPTH", idx), 0) + clientIPHeaderDepth, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__CLIENT_IP_HEADER_DEPTH", idx), 32) if ok { binding.ClientIPHeaderDepth = int(clientIPHeaderDepth) isSet = true @@ -1762,7 +1827,7 @@ func getHTTPDBindingFromEnv(idx int) { //nolint:gocyclo binding := getDefaultHTTPBinding(idx) isSet := false - port, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__PORT", idx), 0) + port, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__PORT", idx), 32) if ok { binding.Port = int(port) isSet = true @@ -1804,31 +1869,49 @@ func getHTTPDBindingFromEnv(idx int) { //nolint:gocyclo isSet = true } - enabledLoginMethods, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__ENABLED_LOGIN_METHODS", idx), 0) + enabledLoginMethods, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__ENABLED_LOGIN_METHODS", idx), 32) if ok { binding.EnabledLoginMethods = int(enabledLoginMethods) isSet = true } + disabledLoginMethods, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__DISABLED_LOGIN_METHODS", idx), 32) + if ok { + binding.DisabledLoginMethods = int(disabledLoginMethods) + isSet = true + } + renderOpenAPI, ok := lookupBoolFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__RENDER_OPENAPI", idx)) if ok { binding.RenderOpenAPI = renderOpenAPI isSet = true } + baseURL, ok := os.LookupEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%d__BASE_URL", idx)) + if ok { + binding.BaseURL = baseURL + isSet = true + } + + languages, ok := lookupStringListFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%d__LANGUAGES", idx)) + if ok { + binding.Languages = languages + isSet = true + } + enableHTTPS, ok := lookupBoolFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__ENABLE_HTTPS", idx)) if ok { binding.EnableHTTPS = enableHTTPS isSet = true } - tlsVer, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__MIN_TLS_VERSION", idx), 0) + tlsVer, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__MIN_TLS_VERSION", idx), 32) if ok { binding.MinTLSVersion = int(tlsVer) isSet = true } - clientAuthType, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__CLIENT_AUTH_TYPE", idx), 0) + clientAuthType, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__CLIENT_AUTH_TYPE", idx), 32) if ok { binding.ClientAuthType = int(clientAuthType) isSet = true @@ -1850,7 +1933,7 @@ func getHTTPDBindingFromEnv(idx int) { //nolint:gocyclo isSet = true } - hideLoginURL, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__HIDE_LOGIN_URL", idx), 0) + hideLoginURL, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_HTTPD__BINDINGS__%v__HIDE_LOGIN_URL", idx), 32) if ok { binding.HideLoginURL = int(hideLoginURL) isSet = true @@ -1939,7 +2022,7 @@ func getCommandConfigsFromEnv(idx int) { cfg.Path = path } - timeout, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_COMMAND__COMMANDS__%v__TIMEOUT", idx), 0) + timeout, ok := lookupIntFromEnv(fmt.Sprintf("SFTPGO_COMMAND__COMMANDS__%v__TIMEOUT", idx), 32) if ok { cfg.Timeout = int(timeout) } @@ -1978,7 +2061,6 @@ func setViperDefaults() { viper.SetDefault("common.proxy_skipped", globalConf.Common.ProxySkipped) viper.SetDefault("common.post_connect_hook", globalConf.Common.PostConnectHook) viper.SetDefault("common.post_disconnect_hook", globalConf.Common.PostDisconnectHook) - viper.SetDefault("common.data_retention_hook", globalConf.Common.DataRetentionHook) viper.SetDefault("common.max_total_connections", globalConf.Common.MaxTotalConnections) viper.SetDefault("common.max_per_host_connections", globalConf.Common.MaxPerHostConnections) viper.SetDefault("common.allowlist_status", globalConf.Common.AllowListStatus) @@ -1995,9 +2077,13 @@ func setViperDefaults() { viper.SetDefault("common.defender.observation_time", globalConf.Common.DefenderConfig.ObservationTime) viper.SetDefault("common.defender.entries_soft_limit", globalConf.Common.DefenderConfig.EntriesSoftLimit) viper.SetDefault("common.defender.entries_hard_limit", globalConf.Common.DefenderConfig.EntriesHardLimit) + viper.SetDefault("common.defender.login_delay.success", globalConf.Common.DefenderConfig.LoginDelay.Success) + viper.SetDefault("common.defender.login_delay.password_failed", globalConf.Common.DefenderConfig.LoginDelay.PasswordFailed) viper.SetDefault("common.umask", globalConf.Common.Umask) viper.SetDefault("common.server_version", globalConf.Common.ServerVersion) + viper.SetDefault("common.tz", globalConf.Common.TZ) viper.SetDefault("common.metadata.read", globalConf.Common.Metadata.Read) + viper.SetDefault("common.event_manager.enabled_commands", globalConf.Common.EventManager.EnabledCommands) viper.SetDefault("acme.email", globalConf.ACME.Email) viper.SetDefault("acme.key_type", globalConf.ACME.KeyType) viper.SetDefault("acme.certs_path", globalConf.ACME.CertsPath) @@ -2018,6 +2104,8 @@ func setViperDefaults() { viper.SetDefault("sftpd.public_key_algorithms", globalConf.SFTPD.PublicKeyAlgorithms) viper.SetDefault("sftpd.trusted_user_ca_keys", globalConf.SFTPD.TrustedUserCAKeys) viper.SetDefault("sftpd.revoked_user_certs_file", globalConf.SFTPD.RevokedUserCertsFile) + viper.SetDefault("sftpd.opkssh_path", globalConf.SFTPD.OPKSSHPath) + viper.SetDefault("sftpd.opkssh_checksum", globalConf.SFTPD.OPKSSHChecksum) viper.SetDefault("sftpd.login_banner_file", globalConf.SFTPD.LoginBannerFile) viper.SetDefault("sftpd.enabled_ssh_commands", sftpd.GetDefaultSSHCommands()) viper.SetDefault("sftpd.keyboard_interactive_authentication", globalConf.SFTPD.KeyboardInteractiveAuthentication) @@ -2109,6 +2197,9 @@ func setViperDefaults() { viper.SetDefault("httpd.signing_passphrase", globalConf.HTTPDConfig.SigningPassphrase) viper.SetDefault("httpd.signing_passphrase_file", globalConf.HTTPDConfig.SigningPassphraseFile) viper.SetDefault("httpd.token_validation", globalConf.HTTPDConfig.TokenValidation) + viper.SetDefault("httpd.cookie_lifetime", globalConf.HTTPDConfig.CookieLifetime) + viper.SetDefault("httpd.share_cookie_lifetime", globalConf.HTTPDConfig.ShareCookieLifetime) + viper.SetDefault("httpd.jwt_lifetime", globalConf.HTTPDConfig.JWTLifetime) viper.SetDefault("httpd.max_upload_file_size", globalConf.HTTPDConfig.MaxUploadFileSize) viper.SetDefault("httpd.cors.enabled", globalConf.HTTPDConfig.Cors.Enabled) viper.SetDefault("httpd.cors.allowed_origins", globalConf.HTTPDConfig.Cors.AllowedOrigins) @@ -2182,7 +2273,7 @@ func lookupStringListFromEnv(envName string) ([]string, bool) { value, ok := os.LookupEnv(envName) if ok { var result []string - for _, v := range strings.Split(value, ",") { + for v := range strings.SplitSeq(value, ",") { val := strings.TrimSpace(v) if val != "" { result = append(result, val) diff --git a/internal/config/config_darwin.go b/internal/config/config_darwin.go index 04a31d48..808c1cd3 100644 --- a/internal/config/config_darwin.go +++ b/internal/config/config_darwin.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build darwin -// +build darwin package config diff --git a/internal/config/config_fallback.go b/internal/config/config_fallback.go index 5bf27b46..f841410a 100644 --- a/internal/config/config_fallback.go +++ b/internal/config/config_fallback.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build !linux && !darwin -// +build !linux,!darwin package config diff --git a/internal/config/config_linux.go b/internal/config/config_linux.go index ef19d34c..21e6eed5 100644 --- a/internal/config/config_linux.go +++ b/internal/config/config_linux.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build linux -// +build linux package config diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 17fc4702..668d6769 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -19,6 +19,7 @@ import ( "encoding/json" "os" "path/filepath" + "slices" "testing" "github.com/sftpgo/sdk/kms" @@ -36,7 +37,6 @@ import ( "github.com/drakkan/sftpgo/v2/internal/plugin" "github.com/drakkan/sftpgo/v2/internal/sftpd" "github.com/drakkan/sftpgo/v2/internal/smtp" - "github.com/drakkan/sftpgo/v2/internal/util" "github.com/drakkan/sftpgo/v2/internal/webdavd" ) @@ -243,6 +243,26 @@ func TestInvalidInstallationHint(t *testing.T) { assert.NoError(t, err) } +func TestInvalidRenameMode(t *testing.T) { + reset() + + confName := tempConfigName + ".json" + configFilePath := filepath.Join(configDir, confName) + commonConfig := config.GetCommonConfig() + commonConfig.RenameMode = 10 + c := make(map[string]any) + c["common"] = commonConfig + jsonConf, err := json.Marshal(c) + assert.NoError(t, err) + err = os.WriteFile(configFilePath, jsonConf, os.ModePerm) + assert.NoError(t, err) + err = config.LoadConfig(configDir, confName) + assert.NoError(t, err) + assert.Equal(t, 0, config.GetCommonConfig().RenameMode) + err = os.Remove(configFilePath) + assert.NoError(t, err) +} + func TestDefenderProviderDriver(t *testing.T) { if config.GetProviderConf().Driver != dataprovider.SQLiteDataProviderName { t.Skip("this test is not supported with the current database provider") @@ -323,6 +343,18 @@ func TestSetGetConfig(t *testing.T) { if assert.Len(t, config.GetPluginsConfig(), 1) { assert.Equal(t, pluginConf[0].Type, config.GetPluginsConfig()[0].Type) } + assert.False(t, config.HasKMSPlugin()) + pluginConf = []plugin.Config{ + { + Type: "notifier", + }, + { + Type: "kms", + }, + } + config.SetPluginsConfig(pluginConf) + assert.Len(t, config.GetPluginsConfig(), 2) + assert.True(t, config.HasKMSPlugin()) } func TestServiceToStart(t *testing.T) { @@ -508,7 +540,7 @@ func TestOverrideSliceValues(t *testing.T) { c = make(map[string]any) c["httpd"] = httpd.Conf{ - Bindings: []httpd.Binding{}, + Bindings: nil, } jsonConf, err = json.Marshal(c) assert.NoError(t, err) @@ -679,8 +711,8 @@ func TestPluginsFromEnv(t *testing.T) { pluginConf := pluginsConf[0] require.Equal(t, "notifier", pluginConf.Type) require.Len(t, pluginConf.NotifierOptions.FsEvents, 2) - require.True(t, util.Contains(pluginConf.NotifierOptions.FsEvents, "upload")) - require.True(t, util.Contains(pluginConf.NotifierOptions.FsEvents, "download")) + require.True(t, slices.Contains(pluginConf.NotifierOptions.FsEvents, "upload")) + require.True(t, slices.Contains(pluginConf.NotifierOptions.FsEvents, "download")) require.Len(t, pluginConf.NotifierOptions.ProviderEvents, 2) require.Equal(t, "add", pluginConf.NotifierOptions.ProviderEvents[0]) require.Equal(t, "update", pluginConf.NotifierOptions.ProviderEvents[1]) @@ -729,8 +761,8 @@ func TestPluginsFromEnv(t *testing.T) { pluginConf = pluginsConf[0] require.Equal(t, "notifier", pluginConf.Type) require.Len(t, pluginConf.NotifierOptions.FsEvents, 2) - require.True(t, util.Contains(pluginConf.NotifierOptions.FsEvents, "upload")) - require.True(t, util.Contains(pluginConf.NotifierOptions.FsEvents, "download")) + require.True(t, slices.Contains(pluginConf.NotifierOptions.FsEvents, "upload")) + require.True(t, slices.Contains(pluginConf.NotifierOptions.FsEvents, "download")) require.Len(t, pluginConf.NotifierOptions.ProviderEvents, 2) require.Equal(t, "add", pluginConf.NotifierOptions.ProviderEvents[0]) require.Equal(t, "update", pluginConf.NotifierOptions.ProviderEvents[1]) @@ -787,8 +819,8 @@ func TestRateLimitersFromEnv(t *testing.T) { require.Equal(t, 2, limiters[0].Type) protocols := limiters[0].Protocols require.Len(t, protocols, 2) - require.True(t, util.Contains(protocols, common.ProtocolFTP)) - require.True(t, util.Contains(protocols, common.ProtocolSSH)) + require.True(t, slices.Contains(protocols, common.ProtocolFTP)) + require.True(t, slices.Contains(protocols, common.ProtocolSSH)) require.True(t, limiters[0].GenerateDefenderEvents) require.Equal(t, 50, limiters[0].EntriesSoftLimit) require.Equal(t, 100, limiters[0].EntriesHardLimit) @@ -799,10 +831,10 @@ func TestRateLimitersFromEnv(t *testing.T) { require.Equal(t, 2, limiters[1].Type) protocols = limiters[1].Protocols require.Len(t, protocols, 4) - require.True(t, util.Contains(protocols, common.ProtocolFTP)) - require.True(t, util.Contains(protocols, common.ProtocolSSH)) - require.True(t, util.Contains(protocols, common.ProtocolWebDAV)) - require.True(t, util.Contains(protocols, common.ProtocolHTTP)) + require.True(t, slices.Contains(protocols, common.ProtocolFTP)) + require.True(t, slices.Contains(protocols, common.ProtocolSSH)) + require.True(t, slices.Contains(protocols, common.ProtocolWebDAV)) + require.True(t, slices.Contains(protocols, common.ProtocolHTTP)) require.False(t, limiters[1].GenerateDefenderEvents) require.Equal(t, 100, limiters[1].EntriesSoftLimit) require.Equal(t, 150, limiters[1].EntriesHardLimit) @@ -910,7 +942,6 @@ func TestFTPDBindingsFromEnv(t *testing.T) { os.Setenv("SFTPGO_FTPD__BINDINGS__0__PORT", "2200") os.Setenv("SFTPGO_FTPD__BINDINGS__0__APPLY_PROXY_CONFIG", "f") os.Setenv("SFTPGO_FTPD__BINDINGS__0__TLS_MODE", "2") - os.Setenv("SFTPGO_FTPD__BINDINGS__0__TLS_SESSION_REUSE", "1") os.Setenv("SFTPGO_FTPD__BINDINGS__0__FORCE_PASSIVE_IP", "127.0.1.2") os.Setenv("SFTPGO_FTPD__BINDINGS__0__PASSIVE_IP_OVERRIDES__0__IP", "172.16.1.1") os.Setenv("SFTPGO_FTPD__BINDINGS__0__PASSIVE_HOST", "127.0.1.3") @@ -935,7 +966,6 @@ func TestFTPDBindingsFromEnv(t *testing.T) { os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__PORT") os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__APPLY_PROXY_CONFIG") os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__TLS_MODE") - os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__TLS_SESSION_REUSE") os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__FORCE_PASSIVE_IP") os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__PASSIVE_IP_OVERRIDES__0__IP") os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__PASSIVE_HOST") @@ -964,7 +994,6 @@ func TestFTPDBindingsFromEnv(t *testing.T) { require.Equal(t, "127.0.0.1", bindings[0].Address) require.False(t, bindings[0].ApplyProxyConfig) require.Equal(t, 2, bindings[0].TLSMode) - require.Equal(t, 1, bindings[0].TLSSessionReuse) require.Equal(t, 12, bindings[0].MinTLSVersion) require.Equal(t, "127.0.1.2", bindings[0].ForcePassiveIP) require.Len(t, bindings[0].PassiveIPOverrides, 0) @@ -976,12 +1005,10 @@ func TestFTPDBindingsFromEnv(t *testing.T) { require.False(t, bindings[0].Debug) require.Equal(t, 1, bindings[0].PassiveConnectionsSecurity) require.Equal(t, 0, bindings[0].ActiveConnectionsSecurity) - require.Equal(t, 0, bindings[0].IgnoreASCIITransferType) require.Equal(t, 2203, bindings[1].Port) require.Equal(t, "127.0.1.1", bindings[1].Address) require.True(t, bindings[1].ApplyProxyConfig) // default value require.Equal(t, 1, bindings[1].TLSMode) - require.Equal(t, 0, bindings[1].TLSSessionReuse) require.Equal(t, 13, bindings[1].MinTLSVersion) require.Equal(t, "127.0.1.1", bindings[1].ForcePassiveIP) require.Empty(t, bindings[1].PassiveHost) @@ -994,7 +1021,6 @@ func TestFTPDBindingsFromEnv(t *testing.T) { require.Nil(t, bindings[1].TLSCipherSuites) require.Equal(t, 0, bindings[1].PassiveConnectionsSecurity) require.Equal(t, 1, bindings[1].ActiveConnectionsSecurity) - require.Equal(t, 1, bindings[1].IgnoreASCIITransferType) require.True(t, bindings[1].Debug) require.Equal(t, "cert.crt", bindings[1].CertificateFile) require.Equal(t, "cert.key", bindings[1].CertificateKeyFile) @@ -1074,6 +1100,7 @@ func TestWebDAVBindingsFromEnv(t *testing.T) { os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__ENABLE_HTTPS", "0") os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__TLS_CIPHER_SUITES", "TLS_RSA_WITH_AES_128_CBC_SHA ") os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__TLS_PROTOCOLS", "http/1.1 ") + os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__PROXY_MODE", "1") os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__PROXY_ALLOWED", "192.168.10.1") os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__CLIENT_IP_PROXY_HEADER", "X-Forwarded-For") os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__CLIENT_IP_HEADER_DEPTH", "2") @@ -1093,6 +1120,7 @@ func TestWebDAVBindingsFromEnv(t *testing.T) { os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__ENABLE_HTTPS") os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__TLS_CIPHER_SUITES") os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__TLS_PROTOCOLS") + os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__PROXY_MODE") os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__PROXY_ALLOWED") os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__CLIENT_IP_PROXY_HEADER") os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__CLIENT_IP_HEADER_DEPTH") @@ -1117,6 +1145,7 @@ func TestWebDAVBindingsFromEnv(t *testing.T) { require.Equal(t, 12, bindings[0].MinTLSVersion) require.Len(t, bindings[0].TLSCipherSuites, 0) require.Len(t, bindings[0].Protocols, 0) + require.Equal(t, 0, bindings[0].ProxyMode) require.Empty(t, bindings[0].Prefix) require.Equal(t, 0, bindings[0].ClientIPHeaderDepth) require.False(t, bindings[0].DisableWWWAuthHeader) @@ -1129,6 +1158,7 @@ func TestWebDAVBindingsFromEnv(t *testing.T) { require.Equal(t, "TLS_RSA_WITH_AES_128_CBC_SHA", bindings[1].TLSCipherSuites[0]) require.Len(t, bindings[1].Protocols, 1) assert.Equal(t, "http/1.1", bindings[1].Protocols[0]) + require.Equal(t, 1, bindings[1].ProxyMode) require.Equal(t, "192.168.10.1", bindings[1].ProxyAllowed[0]) require.Equal(t, "X-Forwarded-For", bindings[1].ClientIPProxyHeader) require.Equal(t, 2, bindings[1].ClientIPHeaderDepth) @@ -1139,6 +1169,7 @@ func TestWebDAVBindingsFromEnv(t *testing.T) { require.True(t, bindings[2].EnableHTTPS) require.Equal(t, 13, bindings[2].MinTLSVersion) require.Equal(t, 1, bindings[2].ClientAuthType) + require.Equal(t, 0, bindings[2].ProxyMode) require.Nil(t, bindings[2].TLSCipherSuites) require.Equal(t, "/dav2", bindings[2].Prefix) require.Equal(t, "webdav.crt", bindings[2].CertificateFile) @@ -1167,12 +1198,16 @@ func TestHTTPDBindingsFromEnv(t *testing.T) { os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_WEB_CLIENT", "0") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_REST_API", "0") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ENABLED_LOGIN_METHODS", "3") + os.Setenv("SFTPGO_HTTPD__BINDINGS__2__DISABLED_LOGIN_METHODS", "12") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__RENDER_OPENAPI", "0") + os.Setenv("SFTPGO_HTTPD__BINDINGS__2__BASE_URL", "https://example.com") + os.Setenv("SFTPGO_HTTPD__BINDINGS__2__LANGUAGES", "en,es") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_HTTPS", "1 ") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__MIN_TLS_VERSION", "13") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__CLIENT_AUTH_TYPE", "1") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__TLS_CIPHER_SUITES", " TLS_AES_256_GCM_SHA384 , TLS_CHACHA20_POLY1305_SHA256") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__TLS_PROTOCOLS", "h2, http/1.1") + os.Setenv("SFTPGO_HTTPD__BINDINGS__2__PROXY_MODE", "1") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__PROXY_ALLOWED", " 192.168.9.1 , 172.16.25.0/24") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__CLIENT_IP_PROXY_HEADER", "X-Real-IP") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__CLIENT_IP_HEADER_DEPTH", "2") @@ -1203,11 +1238,14 @@ func TestHTTPDBindingsFromEnv(t *testing.T) { os.Setenv("SFTPGO_HTTPD__BINDINGS__2__SECURITY__CONTENT_SECURITY_POLICY", "script-src $NONCE") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__SECURITY__PERMISSIONS_POLICY", "fullscreen=(), geolocation=()") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__SECURITY__CROSS_ORIGIN_OPENER_POLICY", "same-origin") + os.Setenv("SFTPGO_HTTPD__BINDINGS__2__SECURITY__CROSS_ORIGIN_RESOURCE_POLICY", "same-site") + os.Setenv("SFTPGO_HTTPD__BINDINGS__2__SECURITY__CROSS_ORIGIN_EMBEDDER_POLICY", "require-corp") + os.Setenv("SFTPGO_HTTPD__BINDINGS__2__SECURITY__CACHE_CONTROL", "private") + os.Setenv("SFTPGO_HTTPD__BINDINGS__2__SECURITY__REFERRER_POLICY", "no-referrer") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__EXTRA_CSS__0__PATH", "path1") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__EXTRA_CSS__1__PATH", "path2") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__BRANDING__WEB_ADMIN__FAVICON_PATH", "favicon.ico") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__BRANDING__WEB_CLIENT__LOGO_PATH", "logo.png") - os.Setenv("SFTPGO_HTTPD__BINDINGS__2__BRANDING__WEB_ADMIN__LOGIN_IMAGE_PATH", "login_image.png") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__BRANDING__WEB_CLIENT__DISCLAIMER_NAME", "disclaimer") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__BRANDING__WEB_ADMIN__DISCLAIMER_PATH", "disclaimer.html") os.Setenv("SFTPGO_HTTPD__BINDINGS__2__BRANDING__WEB_CLIENT__DEFAULT_CSS", "default.css") @@ -1234,10 +1272,14 @@ func TestHTTPDBindingsFromEnv(t *testing.T) { os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_WEB_CLIENT") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_REST_API") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ENABLED_LOGIN_METHODS") + os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__DISABLED_LOGIN_METHODS") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__RENDER_OPENAPI") + os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__BASE_URL") + os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__LANGUAGES") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__CLIENT_AUTH_TYPE") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__TLS_CIPHER_SUITES") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__TLS_PROTOCOLS") + os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__PROXY_MODE") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__PROXY_ALLOWED") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__CLIENT_IP_PROXY_HEADER") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__CLIENT_IP_HEADER_DEPTH") @@ -1268,11 +1310,14 @@ func TestHTTPDBindingsFromEnv(t *testing.T) { os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__SECURITY__CONTENT_SECURITY_POLICY") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__SECURITY__PERMISSIONS_POLICY") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__SECURITY__CROSS_ORIGIN_OPENER_POLICY") + os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__SECURITY__CROSS_ORIGIN_RESOURCE_POLICY") + os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__SECURITY__CROSS_ORIGIN_EMBEDDER_POLICY") + os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__SECURITY__CACHE_CONTROL") + os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__SECURITY__REFERRER_POLICY") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__EXTRA_CSS__0__PATH") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__EXTRA_CSS__1__PATH") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__BRANDING__WEB_ADMIN__FAVICON_PATH") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__BRANDING__WEB_CLIENT__LOGO_PATH") - os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__BRANDING__WEB_ADMIN__LOGIN_IMAGE_PATH") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__BRANDING__WEB_CLIENT__DISCLAIMER_NAME") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__BRANDING__WEB_ADMIN__DISCLAIMER_PATH") os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__BRANDING__WEB_CLIENT__DEFAULT_CSS") @@ -1294,8 +1339,13 @@ func TestHTTPDBindingsFromEnv(t *testing.T) { require.True(t, bindings[0].EnableWebClient) require.True(t, bindings[0].EnableRESTAPI) require.Equal(t, 0, bindings[0].EnabledLoginMethods) + require.Equal(t, 0, bindings[0].DisabledLoginMethods) require.True(t, bindings[0].RenderOpenAPI) + require.Empty(t, bindings[0].BaseURL) + require.Len(t, bindings[0].Languages, 1) + assert.Contains(t, bindings[0].Languages, "en") require.Len(t, bindings[0].TLSCipherSuites, 1) + require.Equal(t, 0, bindings[0].ProxyMode) require.Empty(t, bindings[0].OIDC.ConfigURL) require.Equal(t, "TLS_AES_128_GCM_SHA256", bindings[0].TLSCipherSuites[0]) require.Equal(t, 0, bindings[0].HideLoginURL) @@ -1304,6 +1354,7 @@ func TestHTTPDBindingsFromEnv(t *testing.T) { require.Len(t, bindings[0].OIDC.Scopes, 3) require.False(t, bindings[0].OIDC.InsecureSkipSignatureCheck) require.False(t, bindings[0].OIDC.Debug) + require.Empty(t, bindings[0].Security.ReferrerPolicy) require.Equal(t, 8000, bindings[1].Port) require.Equal(t, "127.0.0.1", bindings[1].Address) require.False(t, bindings[1].EnableHTTPS) @@ -1312,7 +1363,11 @@ func TestHTTPDBindingsFromEnv(t *testing.T) { require.True(t, bindings[1].EnableWebClient) require.True(t, bindings[1].EnableRESTAPI) require.Equal(t, 0, bindings[1].EnabledLoginMethods) + require.Equal(t, 0, bindings[1].DisabledLoginMethods) require.True(t, bindings[1].RenderOpenAPI) + require.Empty(t, bindings[1].BaseURL) + require.Len(t, bindings[1].Languages, 1) + assert.Contains(t, bindings[1].Languages, "en") require.Nil(t, bindings[1].TLSCipherSuites) require.Equal(t, 1, bindings[1].HideLoginURL) require.Empty(t, bindings[1].OIDC.ClientID) @@ -1322,6 +1377,7 @@ func TestHTTPDBindingsFromEnv(t *testing.T) { require.False(t, bindings[1].Security.Enabled) require.Equal(t, "Web Admin", bindings[1].Branding.WebAdmin.Name) require.Equal(t, "WebClient", bindings[1].Branding.WebClient.ShortName) + require.Equal(t, 0, bindings[1].ProxyMode) require.Equal(t, 0, bindings[1].ClientIPHeaderDepth) require.Equal(t, 9000, bindings[2].Port) require.Equal(t, "127.0.1.1", bindings[2].Address) @@ -1331,7 +1387,12 @@ func TestHTTPDBindingsFromEnv(t *testing.T) { require.False(t, bindings[2].EnableWebClient) require.False(t, bindings[2].EnableRESTAPI) require.Equal(t, 3, bindings[2].EnabledLoginMethods) + require.Equal(t, 12, bindings[2].DisabledLoginMethods) require.False(t, bindings[2].RenderOpenAPI) + require.Equal(t, "https://example.com", bindings[2].BaseURL) + require.Len(t, bindings[2].Languages, 2) + assert.Contains(t, bindings[2].Languages, "en") + assert.Contains(t, bindings[2].Languages, "es") require.Equal(t, 1, bindings[2].ClientAuthType) require.Len(t, bindings[2].TLSCipherSuites, 2) require.Equal(t, "TLS_AES_256_GCM_SHA384", bindings[2].TLSCipherSuites[0]) @@ -1339,6 +1400,7 @@ func TestHTTPDBindingsFromEnv(t *testing.T) { require.Len(t, bindings[2].Protocols, 2) require.Equal(t, "h2", bindings[2].Protocols[0]) require.Equal(t, "http/1.1", bindings[2].Protocols[1]) + require.Equal(t, 1, bindings[2].ProxyMode) require.Len(t, bindings[2].ProxyAllowed, 2) require.Equal(t, "192.168.9.1", bindings[2].ProxyAllowed[0]) require.Equal(t, "172.16.25.0/24", bindings[2].ProxyAllowed[1]) @@ -1378,9 +1440,12 @@ func TestHTTPDBindingsFromEnv(t *testing.T) { require.Equal(t, "script-src $NONCE", bindings[2].Security.ContentSecurityPolicy) require.Equal(t, "fullscreen=(), geolocation=()", bindings[2].Security.PermissionsPolicy) require.Equal(t, "same-origin", bindings[2].Security.CrossOriginOpenerPolicy) + require.Equal(t, "same-site", bindings[2].Security.CrossOriginResourcePolicy) + require.Equal(t, "require-corp", bindings[2].Security.CrossOriginEmbedderPolicy) + require.Equal(t, "private", bindings[2].Security.CacheControl) + require.Equal(t, "no-referrer", bindings[2].Security.ReferrerPolicy) require.Equal(t, "favicon.ico", bindings[2].Branding.WebAdmin.FaviconPath) require.Equal(t, "logo.png", bindings[2].Branding.WebClient.LogoPath) - require.Equal(t, "login_image.png", bindings[2].Branding.WebAdmin.LoginImagePath) require.Equal(t, "disclaimer", bindings[2].Branding.WebClient.DisclaimerName) require.Equal(t, "disclaimer.html", bindings[2].Branding.WebAdmin.DisclaimerPath) require.Equal(t, []string{"default.css"}, bindings[2].Branding.WebClient.DefaultCSS) diff --git a/internal/dataprovider/actions.go b/internal/dataprovider/actions.go index 066b7bf7..b61e5b0a 100644 --- a/internal/dataprovider/actions.go +++ b/internal/dataprovider/actions.go @@ -21,6 +21,7 @@ import ( "net/url" "os/exec" "path/filepath" + "slices" "strings" "time" @@ -78,8 +79,8 @@ func executeAction(operation, executor, ip, objectType, objectName, role string, if config.Actions.Hook == "" { return } - if !util.Contains(config.Actions.ExecuteOn, operation) || - !util.Contains(config.Actions.ExecuteFor, objectType) { + if !slices.Contains(config.Actions.ExecuteOn, operation) || + !slices.Contains(config.Actions.ExecuteFor, objectType) { return } @@ -141,14 +142,14 @@ func executeNotificationCommand(operation, executor, ip, objectType, objectName, cmd := exec.CommandContext(ctx, config.Actions.Hook, args...) cmd.Env = append(env, - fmt.Sprintf("SFTPGO_PROVIDER_ACTION=%vs", operation), + fmt.Sprintf("SFTPGO_PROVIDER_ACTION=%s", operation), fmt.Sprintf("SFTPGO_PROVIDER_OBJECT_TYPE=%s", objectType), fmt.Sprintf("SFTPGO_PROVIDER_OBJECT_NAME=%s", objectName), fmt.Sprintf("SFTPGO_PROVIDER_USERNAME=%s", executor), fmt.Sprintf("SFTPGO_PROVIDER_IP=%s", ip), fmt.Sprintf("SFTPGO_PROVIDER_ROLE=%s", role), fmt.Sprintf("SFTPGO_PROVIDER_TIMESTAMP=%d", util.GetTimeAsMsSinceEpoch(time.Now())), - fmt.Sprintf("SFTPGO_PROVIDER_OBJECT=%s", util.BytesToString(objectAsJSON))) + fmt.Sprintf("SFTPGO_PROVIDER_OBJECT=%s", objectAsJSON)) startTime := time.Now() err := cmd.Run() diff --git a/internal/dataprovider/admin.go b/internal/dataprovider/admin.go index b88cbe00..dea4a20b 100644 --- a/internal/dataprovider/admin.go +++ b/internal/dataprovider/admin.go @@ -20,6 +20,7 @@ import ( "fmt" "net" "os" + "slices" "strconv" "strings" @@ -44,19 +45,12 @@ const ( PermAdminViewConnections = "view_conns" PermAdminCloseConnections = "close_conns" PermAdminViewServerStatus = "view_status" - PermAdminManageAdmins = "manage_admins" PermAdminManageGroups = "manage_groups" PermAdminManageFolders = "manage_folders" - PermAdminManageAPIKeys = "manage_apikeys" PermAdminQuotaScans = "quota_scans" - PermAdminManageSystem = "manage_system" PermAdminManageDefender = "manage_defender" PermAdminViewDefender = "view_defender" - PermAdminRetentionChecks = "retention_checks" PermAdminViewEvents = "view_events" - PermAdminManageEventRules = "manage_event_rules" - PermAdminManageRoles = "manage_roles" - PermAdminManageIPLists = "manage_ip_lists" PermAdminDisableMFA = "disable_mfa" ) @@ -72,12 +66,9 @@ const ( var ( validAdminPerms = []string{PermAdminAny, PermAdminAddUsers, PermAdminChangeUsers, PermAdminDeleteUsers, PermAdminViewUsers, PermAdminManageFolders, PermAdminManageGroups, PermAdminViewConnections, - PermAdminCloseConnections, PermAdminViewServerStatus, PermAdminManageAdmins, PermAdminManageRoles, - PermAdminManageEventRules, PermAdminManageAPIKeys, PermAdminQuotaScans, PermAdminManageSystem, - PermAdminManageDefender, PermAdminViewDefender, PermAdminManageIPLists, PermAdminRetentionChecks, - PermAdminViewEvents, PermAdminDisableMFA} - forbiddenPermsForRoleAdmins = []string{PermAdminAny, PermAdminManageAdmins, PermAdminManageSystem, - PermAdminManageEventRules, PermAdminManageIPLists, PermAdminManageRoles} + PermAdminCloseConnections, PermAdminViewServerStatus, PermAdminQuotaScans, + PermAdminManageDefender, PermAdminViewDefender, PermAdminViewEvents, PermAdminDisableMFA} + forbiddenPermsForRoleAdmins = []string{PermAdminAny} ) // AdminTOTPConfig defines the time-based one time password configuration @@ -96,7 +87,7 @@ func (c *AdminTOTPConfig) validate(username string) error { if c.ConfigName == "" { return util.NewValidationError("totp: config name is mandatory") } - if !util.Contains(mfa.GetAvailableTOTPConfigNames(), c.ConfigName) { + if !slices.Contains(mfa.GetAvailableTOTPConfigNames(), c.ConfigName) { return util.NewValidationError(fmt.Sprintf("totp: config name %q not found", c.ConfigName)) } if c.Secret.IsEmpty() { @@ -265,12 +256,7 @@ type Admin struct { // Last login as unix timestamp in milliseconds LastLogin int64 `json:"last_login"` // Role name. If set the admin can only administer users with the same role. - // Role admins cannot have the following permissions: - // - manage_admins - // - manage_apikeys - // - manage_system - // - manage_event_rules - // - manage_roles + // Role admins cannot be super administrators Role string `json:"role,omitempty"` } @@ -337,22 +323,18 @@ func (a *Admin) validatePermissions() error { util.I18nErrorPermissionsRequired, ) } - if util.Contains(a.Permissions, PermAdminAny) { + if slices.Contains(a.Permissions, PermAdminAny) { a.Permissions = []string{PermAdminAny} } for _, perm := range a.Permissions { - if !util.Contains(validAdminPerms, perm) { + if !slices.Contains(validAdminPerms, perm) { return util.NewValidationError(fmt.Sprintf("invalid permission: %q", perm)) } if a.Role != "" { - if util.Contains(forbiddenPermsForRoleAdmins, perm) { - deniedPerms := strings.Join(forbiddenPermsForRoleAdmins, ",") + if slices.Contains(forbiddenPermsForRoleAdmins, perm) { return util.NewI18nError( - util.NewValidationError(fmt.Sprintf("a role admin cannot have the following permissions: %q", deniedPerms)), + util.NewValidationError("a role admin cannot be a super admin"), util.I18nErrorRoleAdminPerms, - util.I18nErrorArgs(map[string]any{ - "val": deniedPerms, - }), ) } } @@ -382,11 +364,24 @@ func (a *Admin) validateGroups() error { return nil } -func (a *Admin) validate() error { +func (a *Admin) applyNamingRules() { + a.Username = config.convertName(a.Username) + a.Role = config.convertName(a.Role) + for idx := range a.Groups { + a.Groups[idx].Name = config.convertName(a.Groups[idx].Name) + } +} + +func (a *Admin) validate() error { //nolint:gocyclo a.SetEmptySecretsIfNil() + a.applyNamingRules() + a.Password = strings.TrimSpace(a.Password) if a.Username == "" { return util.NewI18nError(util.NewValidationError("username is mandatory"), util.I18nErrorUsernameRequired) } + if !util.IsNameValid(a.Username) { + return util.NewI18nError(errInvalidInput, util.I18nErrorInvalidInput) + } if err := checkReservedUsernames(a.Username); err != nil { return util.NewI18nError(err, util.I18nErrorReservedUsername) } @@ -499,7 +494,7 @@ func (a *Admin) checkUserAndPass(password, ip string) error { if err := a.CanLogin(ip); err != nil { return err } - if a.Password == "" || password == "" { + if a.Password == "" || strings.TrimSpace(password) == "" { return errors.New("credentials cannot be null or empty") } match, err := a.CheckPassword(password) @@ -559,10 +554,20 @@ func (a *Admin) SetNilSecretsIfEmpty() { // HasPermission returns true if the admin has the specified permission func (a *Admin) HasPermission(perm string) bool { - if util.Contains(a.Permissions, PermAdminAny) { + if slices.Contains(a.Permissions, PermAdminAny) { return true } - return util.Contains(a.Permissions, perm) + return slices.Contains(a.Permissions, perm) +} + +// HasPermissions returns true if the admin has all the specified permissions +func (a *Admin) HasPermissions(perms ...string) bool { + for _, perm := range perms { + if !a.HasPermission(perm) { + return false + } + } + return len(perms) > 0 } // GetAllowedIPAsString returns the allowed IP as comma separated string diff --git a/internal/dataprovider/apikey.go b/internal/dataprovider/apikey.go index b6c8499d..b7424dd6 100644 --- a/internal/dataprovider/apikey.go +++ b/internal/dataprovider/apikey.go @@ -148,6 +148,9 @@ func (k *APIKey) validate() error { if k.Name == "" { return util.NewValidationError("name is mandatory") } + if !util.IsNameValid(k.Name) { + return util.NewI18nError(errInvalidInput, util.I18nErrorInvalidInput) + } if k.Scope != APIKeyScopeAdmin && k.Scope != APIKeyScopeUser { return util.NewValidationError(fmt.Sprintf("invalid scope: %v", k.Scope)) } diff --git a/internal/dataprovider/bolt.go b/internal/dataprovider/bolt.go index 01ad0b3e..28adb25f 100644 --- a/internal/dataprovider/bolt.go +++ b/internal/dataprovider/bolt.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build !nobolt -// +build !nobolt package dataprovider @@ -25,10 +24,13 @@ import ( "fmt" "net/netip" "path/filepath" + "slices" "sort" + "strconv" "time" bolt "go.etcd.io/bbolt" + bolterrors "go.etcd.io/bbolt/errors" "github.com/drakkan/sftpgo/v2/internal/logger" "github.com/drakkan/sftpgo/v2/internal/util" @@ -37,7 +39,7 @@ import ( ) const ( - boltDatabaseVersion = 29 + boltDatabaseVersion = 34 ) var ( @@ -181,6 +183,50 @@ func (p *BoltProvider) updateAPIKeyLastUse(keyID string) error { }) } +func (p *BoltProvider) getAdminSignature(username string) (string, error) { + var updatedAt int64 + err := p.dbHandle.View(func(tx *bolt.Tx) error { + bucket, err := p.getAdminsBucket(tx) + if err != nil { + return err + } + u := bucket.Get([]byte(username)) + var admin Admin + err = json.Unmarshal(u, &admin) + if err != nil { + return err + } + updatedAt = admin.UpdatedAt + return nil + }) + if err != nil { + return "", err + } + return strconv.FormatInt(updatedAt, 10), nil +} + +func (p *BoltProvider) getUserSignature(username string) (string, error) { + var updatedAt int64 + err := p.dbHandle.View(func(tx *bolt.Tx) error { + bucket, err := p.getUsersBucket(tx) + if err != nil { + return err + } + u := bucket.Get([]byte(username)) + var user User + err = json.Unmarshal(u, &user) + if err != nil { + return err + } + updatedAt = user.UpdatedAt + return nil + }) + if err != nil { + return "", err + } + return strconv.FormatInt(updatedAt, 10), nil +} + func (p *BoltProvider) setUpdatedAt(username string) { p.dbHandle.Update(func(tx *bolt.Tx) error { //nolint:errcheck bucket, err := p.getUsersBucket(tx) @@ -400,9 +446,6 @@ func (p *BoltProvider) addAdmin(admin *Admin) error { admin.LastLogin = 0 admin.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now()) admin.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now()) - sort.Slice(admin.Groups, func(i, j int) bool { - return admin.Groups[i].Name < admin.Groups[j].Name - }) for idx := range admin.Groups { err = p.addAdminToGroupMapping(admin.Username, admin.Groups[idx].Name, groupBucket) if err != nil { @@ -461,9 +504,6 @@ func (p *BoltProvider) updateAdmin(admin *Admin) error { if err = p.addAdminToRole(admin.Username, admin.Role, rolesBucket); err != nil { return err } - sort.Slice(admin.Groups, func(i, j int) bool { - return admin.Groups[i].Name < admin.Groups[j].Name - }) for idx := range admin.Groups { err = p.addAdminToGroupMapping(admin.Username, admin.Groups[idx].Name, groupBucket) if err != nil { @@ -675,18 +715,12 @@ func (p *BoltProvider) addUser(user *User) error { if err := p.addUserToRole(user.Username, user.Role, rolesBucket); err != nil { return err } - sort.Slice(user.VirtualFolders, func(i, j int) bool { - return user.VirtualFolders[i].Name < user.VirtualFolders[j].Name - }) for idx := range user.VirtualFolders { err = p.addRelationToFolderMapping(user.VirtualFolders[idx].Name, user, nil, foldersBucket) if err != nil { return err } } - sort.Slice(user.Groups, func(i, j int) bool { - return user.Groups[i].Name < user.Groups[j].Name - }) for idx := range user.Groups { err = p.addUserToGroupMapping(user.Username, user.Groups[idx].Name, groupBucket) if err != nil { @@ -1458,9 +1492,6 @@ func (p *BoltProvider) addGroup(group *Group) error { group.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now()) group.Users = nil group.Admins = nil - sort.Slice(group.VirtualFolders, func(i, j int) bool { - return group.VirtualFolders[i].Name < group.VirtualFolders[j].Name - }) for idx := range group.VirtualFolders { err = p.addRelationToFolderMapping(group.VirtualFolders[idx].Name, nil, group, foldersBucket) if err != nil { @@ -1503,9 +1534,6 @@ func (p *BoltProvider) updateGroup(group *Group) error { return err } } - sort.Slice(group.VirtualFolders, func(i, j int) bool { - return group.VirtualFolders[i].Name < group.VirtualFolders[j].Name - }) for idx := range group.VirtualFolders { err = p.addRelationToFolderMapping(group.VirtualFolders[idx].Name, nil, group, foldersBucket) if err != nil { @@ -2088,11 +2116,11 @@ func (p *BoltProvider) addSharedSession(_ Session) error { return ErrNotImplemented } -func (p *BoltProvider) deleteSharedSession(_ string) error { +func (p *BoltProvider) deleteSharedSession(_ string, _ SessionType) error { return ErrNotImplemented } -func (p *BoltProvider) getSharedSession(_ string) (Session, error) { +func (p *BoltProvider) getSharedSession(_ string, _ SessionType) (Session, error) { return Session{}, ErrNotImplemented } @@ -3134,15 +3162,16 @@ func (p *BoltProvider) migrateDatabase() error { case version == boltDatabaseVersion: providerLog(logger.LevelDebug, "bolt database is up to date, current version: %d", version) return ErrNoInitRequired - case version < 28: - err = fmt.Errorf("database schema version %d is too old, please see the upgrading docs", version) + case version < 33: + err = errSchemaVersionTooOld(version) providerLog(logger.LevelError, "%v", err) logger.ErrorToConsole("%v", err) return err - case version == 28: - logger.InfoToConsole("updating database schema version: %d -> 29", version) - providerLog(logger.LevelInfo, "updating database schema version: %d -> 29", version) - return updateBoltDatabaseVersion(p.dbHandle, 29) + case version == 33: + logger.InfoToConsole("updating database schema version: %d -> 34", version) + providerLog(logger.LevelInfo, "updating database schema version: %d -> 34", version) + return updateBoltDatabaseVersion(p.dbHandle, 34) + default: if version > boltDatabaseVersion { providerLog(logger.LevelError, "database schema version %d is newer than the supported one: %d", version, @@ -3155,7 +3184,7 @@ func (p *BoltProvider) migrateDatabase() error { } } -func (p *BoltProvider) revertDatabase(targetVersion int) error { //nolint:gocyclo +func (p *BoltProvider) revertDatabase(targetVersion int) error { dbVersion, err := getBoltDatabaseVersion(p.dbHandle) if err != nil { return err @@ -3164,10 +3193,11 @@ func (p *BoltProvider) revertDatabase(targetVersion int) error { //nolint:gocycl return errors.New("current version match target version, nothing to do") } switch dbVersion.Version { - case 29: - logger.InfoToConsole("downgrading database schema version: %d -> 28", dbVersion.Version) - providerLog(logger.LevelInfo, "downgrading database schema version: %d -> 28", dbVersion.Version) - return updateBoltDatabaseVersion(p.dbHandle, 28) + case 34: + logger.InfoToConsole("downgrading database schema version: %d -> 33", dbVersion.Version) + providerLog(logger.LevelInfo, "downgrading database schema version: %d -> 33", dbVersion.Version) + return updateBoltDatabaseVersion(p.dbHandle, 33) + default: return fmt.Errorf("database schema version not handled: %v", dbVersion.Version) } @@ -3177,7 +3207,7 @@ func (p *BoltProvider) resetDatabase() error { return p.dbHandle.Update(func(tx *bolt.Tx) error { for _, bucketName := range boltBuckets { err := tx.DeleteBucket(bucketName) - if err != nil && !errors.Is(err, bolt.ErrBucketNotFound) { + if err != nil && !errors.Is(err, bolterrors.ErrBucketNotFound) { return fmt.Errorf("unable to remove bucket %v: %w", bucketName, err) } } @@ -3328,7 +3358,7 @@ func (p *BoltProvider) addAdminToRole(username, roleName string, bucket *bolt.Bu if err != nil { return err } - if !util.Contains(role.Admins, username) { + if !slices.Contains(role.Admins, username) { role.Admins = append(role.Admins, username) buf, err := json.Marshal(role) if err != nil { @@ -3353,7 +3383,7 @@ func (p *BoltProvider) removeAdminFromRole(username, roleName string, bucket *bo if err != nil { return err } - if util.Contains(role.Admins, username) { + if slices.Contains(role.Admins, username) { var admins []string for _, admin := range role.Admins { if admin != username { @@ -3383,7 +3413,7 @@ func (p *BoltProvider) addUserToRole(username, roleName string, bucket *bolt.Buc if err != nil { return err } - if !util.Contains(role.Users, username) { + if !slices.Contains(role.Users, username) { role.Users = append(role.Users, username) buf, err := json.Marshal(role) if err != nil { @@ -3408,7 +3438,7 @@ func (p *BoltProvider) removeUserFromRole(username, roleName string, bucket *bol if err != nil { return err } - if util.Contains(role.Users, username) { + if slices.Contains(role.Users, username) { var users []string for _, user := range role.Users { if user != username { @@ -3436,7 +3466,7 @@ func (p *BoltProvider) addRuleToActionMapping(ruleName, actionName string, bucke if err != nil { return err } - if !util.Contains(action.Rules, ruleName) { + if !slices.Contains(action.Rules, ruleName) { action.Rules = append(action.Rules, ruleName) buf, err := json.Marshal(action) if err != nil { @@ -3458,7 +3488,7 @@ func (p *BoltProvider) removeRuleFromActionMapping(ruleName, actionName string, if err != nil { return err } - if util.Contains(action.Rules, ruleName) { + if slices.Contains(action.Rules, ruleName) { var rules []string for _, r := range action.Rules { if r != ruleName { @@ -3485,7 +3515,7 @@ func (p *BoltProvider) addUserToGroupMapping(username, groupname string, bucket if err != nil { return err } - if !util.Contains(group.Users, username) { + if !slices.Contains(group.Users, username) { group.Users = append(group.Users, username) buf, err := json.Marshal(group) if err != nil { @@ -3530,7 +3560,7 @@ func (p *BoltProvider) addAdminToGroupMapping(username, groupname string, bucket if err != nil { return err } - if !util.Contains(group.Admins, username) { + if !slices.Contains(group.Admins, username) { group.Admins = append(group.Admins, username) buf, err := json.Marshal(group) if err != nil { @@ -3601,11 +3631,11 @@ func (p *BoltProvider) addRelationToFolderMapping(folderName string, user *User, return err } updated := false - if user != nil && !util.Contains(folder.Users, user.Username) { + if user != nil && !slices.Contains(folder.Users, user.Username) { folder.Users = append(folder.Users, user.Username) updated = true } - if group != nil && !util.Contains(folder.Groups, group.Name) { + if group != nil && !slices.Contains(folder.Groups, group.Name) { folder.Groups = append(folder.Groups, group.Name) updated = true } @@ -3691,18 +3721,12 @@ func (p *BoltProvider) updateUserRelations(tx *bolt.Tx, user *User, oldUser User if err = p.removeUserFromRole(oldUser.Username, oldUser.Role, rolesBucket); err != nil { return err } - sort.Slice(user.VirtualFolders, func(i, j int) bool { - return user.VirtualFolders[i].Name < user.VirtualFolders[j].Name - }) for idx := range user.VirtualFolders { err = p.addRelationToFolderMapping(user.VirtualFolders[idx].Name, user, nil, foldersBucket) if err != nil { return err } } - sort.Slice(user.Groups, func(i, j int) bool { - return user.Groups[i].Name < user.Groups[j].Name - }) for idx := range user.Groups { err = p.addUserToGroupMapping(user.Username, user.Groups[idx].Name, groupsBucket) if err != nil { @@ -3899,7 +3923,7 @@ func getBoltDatabaseVersion(dbHandle *bolt.DB) (schemaVersion, error) { v := bucket.Get(dbVersionKey) if v == nil { dbVersion = schemaVersion{ - Version: 28, + Version: 33, } return nil } diff --git a/internal/dataprovider/bolt_disabled.go b/internal/dataprovider/bolt_disabled.go index 0116314d..0ec5030a 100644 --- a/internal/dataprovider/bolt_disabled.go +++ b/internal/dataprovider/bolt_disabled.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build nobolt -// +build nobolt package dataprovider diff --git a/internal/dataprovider/configs.go b/internal/dataprovider/configs.go index a68abf72..22a9c5a4 100644 --- a/internal/dataprovider/configs.go +++ b/internal/dataprovider/configs.go @@ -15,8 +15,12 @@ package dataprovider import ( + "bytes" "encoding/json" "fmt" + "image/png" + "net/url" + "slices" "golang.org/x/crypto/ssh" @@ -28,18 +32,18 @@ import ( // Supported values for host keys, KEXs, ciphers, MACs var ( supportedHostKeyAlgos = []string{ssh.KeyAlgoRSA} - supportedPublicKeyAlgos = []string{ssh.KeyAlgoRSA, ssh.InsecureKeyAlgoDSA} + supportedPublicKeyAlgos = []string{ssh.KeyAlgoRSA, ssh.InsecureKeyAlgoDSA} //nolint:staticcheck supportedKexAlgos = []string{ ssh.KeyExchangeDH16SHA512, ssh.InsecureKeyExchangeDH14SHA1, ssh.InsecureKeyExchangeDH1SHA1, ssh.InsecureKeyExchangeDHGEXSHA1, } supportedCiphers = []string{ - ssh.InsecureCipherAES128CBC, ssh.InsecureCipherAES192CBC, ssh.InsecureCipherAES256CBC, + ssh.InsecureCipherAES128CBC, ssh.InsecureCipherTripleDESCBC, } supportedMACs = []string{ ssh.HMACSHA512ETM, ssh.HMACSHA512, - ssh.InsecureHMACSHA1, ssh.InsecureHMACSHA196, + ssh.HMACSHA1, ssh.InsecureHMACSHA196, } ) @@ -102,7 +106,7 @@ func (c *SFTPDConfigs) validate() error { if algo == ssh.CertAlgoRSAv01 { continue } - if !util.Contains(supportedHostKeyAlgos, algo) { + if !slices.Contains(supportedHostKeyAlgos, algo) { return util.NewValidationError(fmt.Sprintf("unsupported host key algorithm %q", algo)) } hostKeyAlgos = append(hostKeyAlgos, algo) @@ -113,24 +117,27 @@ func (c *SFTPDConfigs) validate() error { if algo == "diffie-hellman-group18-sha512" || algo == ssh.KeyExchangeDHGEXSHA256 { continue } - if !util.Contains(supportedKexAlgos, algo) { + if !slices.Contains(supportedKexAlgos, algo) { return util.NewValidationError(fmt.Sprintf("unsupported KEX algorithm %q", algo)) } kexAlgos = append(kexAlgos, algo) } c.KexAlgorithms = kexAlgos for _, cipher := range c.Ciphers { - if !util.Contains(supportedCiphers, cipher) { + if slices.Contains([]string{"aes192-cbc", "aes256-cbc"}, cipher) { + continue + } + if !slices.Contains(supportedCiphers, cipher) { return util.NewValidationError(fmt.Sprintf("unsupported cipher %q", cipher)) } } for _, mac := range c.MACs { - if !util.Contains(supportedMACs, mac) { + if !slices.Contains(supportedMACs, mac) { return util.NewValidationError(fmt.Sprintf("unsupported MAC algorithm %q", mac)) } } for _, algo := range c.PublicKeyAlgos { - if !util.Contains(supportedPublicKeyAlgos, algo) { + if !slices.Contains(supportedPublicKeyAlgos, algo) { return util.NewValidationError(fmt.Sprintf("unsupported public key algorithm %q", algo)) } } @@ -193,19 +200,19 @@ func (c *SMTPOAuth2) validate() error { if c.ClientID == "" { return util.NewI18nError( util.NewValidationError("smtp oauth2: client id is required"), - util.I18nErrorSMTPClientIDRequired, + util.I18nErrorClientIDRequired, ) } - if c.ClientSecret == nil { + if c.ClientSecret == nil || c.ClientSecret.IsEmpty() { return util.NewI18nError( util.NewValidationError("smtp oauth2: client secret is required"), - util.I18nErrorSMTPClientSecretRequired, + util.I18nErrorClientSecretRequired, ) } - if c.RefreshToken == nil { + if c.RefreshToken == nil || c.RefreshToken.IsEmpty() { return util.NewI18nError( util.NewValidationError("smtp oauth2: refresh token is required"), - util.I18nErrorSMTPRefreshTokenRequired, + util.I18nErrorRefreshTokenRequired, ) } if err := validateSMTPSecret(c.ClientSecret, "oauth2 client secret"); err != nil { @@ -305,6 +312,27 @@ func (c *SMTPConfigs) TryDecrypt() error { return nil } +func (c *SMTPConfigs) prepareForRendering() { + if c.Password != nil { + c.Password.Hide() + if c.Password.IsEmpty() { + c.Password = nil + } + } + if c.OAuth2.ClientSecret != nil { + c.OAuth2.ClientSecret.Hide() + if c.OAuth2.ClientSecret.IsEmpty() { + c.OAuth2.ClientSecret = nil + } + } + if c.OAuth2.RefreshToken != nil { + c.OAuth2.RefreshToken.Hide() + if c.OAuth2.RefreshToken.IsEmpty() { + c.OAuth2.RefreshToken = nil + } + } +} + func (c *SMTPConfigs) getACopy() *SMTPConfigs { var password *kms.Secret if c.Password != nil { @@ -387,13 +415,137 @@ func (c *ACMEConfigs) getACopy() *ACMEConfigs { } } +// BrandingConfig defines the branding configuration +type BrandingConfig struct { + Name string `json:"name"` + ShortName string `json:"short_name"` + Logo []byte `json:"logo"` + Favicon []byte `json:"favicon"` + DisclaimerName string `json:"disclaimer_name"` + DisclaimerURL string `json:"disclaimer_url"` +} + +func (c *BrandingConfig) isEmpty() bool { + if c.Name != "" { + return false + } + if c.ShortName != "" { + return false + } + if len(c.Logo) > 0 { + return false + } + if len(c.Favicon) > 0 { + return false + } + if c.DisclaimerName != "" && c.DisclaimerURL != "" { + return false + } + return true +} + +func (*BrandingConfig) validatePNG(b []byte, maxWidth, maxHeight int) error { + if len(b) == 0 { + return nil + } + // DecodeConfig is more efficient, but I'm not sure if this would lead to + // accepting invalid images in some edge cases and performance does not + // matter here. + img, err := png.Decode(bytes.NewBuffer(b)) + if err != nil { + return util.NewI18nError( + util.NewValidationError("invalid PNG image"), + util.I18nErrorInvalidPNG, + ) + } + bounds := img.Bounds() + if bounds.Dx() > maxWidth || bounds.Dy() > maxHeight { + return util.NewI18nError( + util.NewValidationError("invalid PNG image size"), + util.I18nErrorInvalidPNGSize, + ) + } + return nil +} + +func (c *BrandingConfig) validateDisclaimerURL() error { + if c.DisclaimerURL == "" { + return nil + } + u, err := url.Parse(c.DisclaimerURL) + if err != nil { + return util.NewI18nError( + util.NewValidationError("invalid disclaimer URL"), + util.I18nErrorInvalidDisclaimerURL, + ) + } + if u.Scheme != "http" && u.Scheme != "https" { + return util.NewI18nError( + util.NewValidationError("invalid disclaimer URL scheme"), + util.I18nErrorInvalidDisclaimerURL, + ) + } + return nil +} + +func (c *BrandingConfig) validate() error { + if err := c.validateDisclaimerURL(); err != nil { + return err + } + if err := c.validatePNG(c.Logo, 512, 512); err != nil { + return err + } + return c.validatePNG(c.Favicon, 256, 256) +} + +func (c *BrandingConfig) getACopy() BrandingConfig { + logo := make([]byte, len(c.Logo)) + copy(logo, c.Logo) + favicon := make([]byte, len(c.Favicon)) + copy(favicon, c.Favicon) + + return BrandingConfig{ + Name: c.Name, + ShortName: c.ShortName, + Logo: logo, + Favicon: favicon, + DisclaimerName: c.DisclaimerName, + DisclaimerURL: c.DisclaimerURL, + } +} + +// BrandingConfigs defines the branding configuration for WebAdmin and WebClient UI +type BrandingConfigs struct { + WebAdmin BrandingConfig + WebClient BrandingConfig +} + +func (c *BrandingConfigs) isEmpty() bool { + return c.WebAdmin.isEmpty() && c.WebClient.isEmpty() +} + +func (c *BrandingConfigs) validate() error { + if err := c.WebAdmin.validate(); err != nil { + return err + } + return c.WebClient.validate() +} + +func (c *BrandingConfigs) getACopy() *BrandingConfigs { + return &BrandingConfigs{ + WebAdmin: c.WebAdmin.getACopy(), + WebClient: c.WebClient.getACopy(), + } +} + // Configs allows to set configuration keys disabled by default without // modifying the config file or setting env vars type Configs struct { - SFTPD *SFTPDConfigs `json:"sftpd,omitempty"` - SMTP *SMTPConfigs `json:"smtp,omitempty"` - ACME *ACMEConfigs `json:"acme,omitempty"` - UpdatedAt int64 `json:"updated_at,omitempty"` + SFTPD *SFTPDConfigs `json:"sftpd,omitempty"` + SMTP *SMTPConfigs `json:"smtp,omitempty"` + ACME *ACMEConfigs `json:"acme,omitempty"` + Branding *BrandingConfigs `json:"branding,omitempty"` + UpdatedAt int64 `json:"updated_at,omitempty"` } func (c *Configs) validate() error { @@ -412,6 +564,11 @@ func (c *Configs) validate() error { return err } } + if c.Branding != nil { + if err := c.Branding.validate(); err != nil { + return err + } + } return nil } @@ -428,25 +585,11 @@ func (c *Configs) PrepareForRendering() { if c.ACME != nil && c.ACME.isEmpty() { c.ACME = nil } + if c.Branding != nil && c.Branding.isEmpty() { + c.Branding = nil + } if c.SMTP != nil { - if c.SMTP.Password != nil { - c.SMTP.Password.Hide() - if c.SMTP.Password.IsEmpty() { - c.SMTP.Password = nil - } - } - if c.SMTP.OAuth2.ClientSecret != nil { - c.SMTP.OAuth2.ClientSecret.Hide() - if c.SMTP.OAuth2.ClientSecret.IsEmpty() { - c.SMTP.OAuth2.ClientSecret = nil - } - } - if c.SMTP.OAuth2.RefreshToken != nil { - c.SMTP.OAuth2.RefreshToken.Hide() - if c.SMTP.OAuth2.RefreshToken.IsEmpty() { - c.SMTP.OAuth2.RefreshToken = nil - } - } + c.SMTP.prepareForRendering() } } @@ -470,6 +613,9 @@ func (c *Configs) SetNilsToEmpty() { if c.ACME == nil { c.ACME = &ACMEConfigs{} } + if c.Branding == nil { + c.Branding = &BrandingConfigs{} + } } // RenderAsJSON implements the renderer interface used within plugins @@ -498,6 +644,9 @@ func (c *Configs) getACopy() Configs { if c.ACME != nil { result.ACME = c.ACME.getACopy() } + if c.Branding != nil { + result.Branding = c.Branding.getACopy() + } result.UpdatedAt = c.UpdatedAt return result } diff --git a/internal/dataprovider/dataprovider.go b/internal/dataprovider/dataprovider.go index 16d1dada..7ecbbe2d 100644 --- a/internal/dataprovider/dataprovider.go +++ b/internal/dataprovider/dataprovider.go @@ -44,6 +44,7 @@ import ( "path/filepath" "regexp" "runtime" + "slices" "strconv" "strings" "sync" @@ -89,7 +90,7 @@ const ( CockroachDataProviderName = "cockroachdb" // DumpVersion defines the version for the dump. // For restore/load we support the current version and the previous one - DumpVersion = 16 + DumpVersion = 17 argonPwdPrefix = "$argon2id$" bcryptPwdPrefix = "$2a$" @@ -111,7 +112,6 @@ const ( operationDelete = "delete" sqlPrefixValidChars = "abcdefghijklmnopqrstuvwxyz_0123456789" maxHookResponseSize = 1048576 // 1MB - iso8601UTCFormat = "2006-01-02T15:04:05Z" ) // Supported algorithms for hashing passwords. @@ -187,6 +187,8 @@ var ( ErrDuplicatedKey = errors.New("duplicated key not allowed") // ErrForeignKeyViolated occurs when there is a foreign key constraint violation ErrForeignKeyViolated = errors.New("violates foreign key constraint") + errInvalidInput = util.NewValidationError("Invalid input. Slashes (/ ), colons (:), control characters, and reserved system names are not allowed") + tz = "" isAdminCreated atomic.Bool validTLSUsernames = []string{string(sdk.TLSUsernameNone), string(sdk.TLSUsernameCN)} config Config @@ -209,6 +211,7 @@ var ( sqlTableAdmins string sqlTableAPIKeys string sqlTableShares string + sqlTableSharesGroupsMapping string sqlTableDefenderHosts string sqlTableDefenderEvents string sqlTableActiveTransfers string @@ -243,6 +246,7 @@ func initSQLTables() { sqlTableAdmins = "admins" sqlTableAPIKeys = "api_keys" sqlTableShares = "shares" + sqlTableSharesGroupsMapping = "shares_groups_mapping" sqlTableDefenderHosts = "defender_hosts" sqlTableDefenderEvents = "defender_events" sqlTableActiveTransfers = "active_transfers" @@ -518,7 +522,7 @@ type Config struct { // GetShared returns the provider share mode. // This method is called before the provider is initialized func (c *Config) GetShared() int { - if !util.Contains(sharedProviders, c.Driver) { + if !slices.Contains(sharedProviders, c.Driver) { return 0 } return c.IsShared @@ -590,6 +594,16 @@ func (c *Config) doBackup() (string, error) { return outputFile, nil } +// SetTZ sets the configured timezone. +func SetTZ(val string) { + tz = val +} + +// UseLocalTime returns true if local time should be used instead of UTC. +func UseLocalTime() bool { + return tz == "local" +} + // ExecuteBackup executes a backup func ExecuteBackup() (string, error) { return config.doBackup() @@ -759,6 +773,8 @@ type Provider interface { updateLastLogin(username string) error updateAdminLastLogin(username string) error setUpdatedAt(username string) + getAdminSignature(username string) (string, error) + getUserSignature(username string) (string, error) getFolders(limit, offset int, order string, minimal bool) ([]vfs.BaseVirtualFolder, error) getFolderByName(name string) (vfs.BaseVirtualFolder, error) addFolder(folder *vfs.BaseVirtualFolder) error @@ -810,8 +826,8 @@ type Provider interface { cleanupActiveTransfers(before time.Time) error getActiveTransfers(from time.Time) ([]ActiveTransfer, error) addSharedSession(session Session) error - deleteSharedSession(key string) error - getSharedSession(key string) (Session, error) + deleteSharedSession(key string, sessionType SessionType) error + getSharedSession(key string, sessionType SessionType) (Session, error) cleanupSharedSessions(sessionType SessionType, before int64) error getEventActions(limit, offset int, order string, minimal bool) ([]BaseEventAction, error) dumpEventActions() ([]BaseEventAction, error) @@ -874,7 +890,7 @@ func SetTempPath(fsPath string) { } func checkSharedMode() { - if !util.Contains(sharedProviders, config.Driver) { + if !slices.Contains(sharedProviders, config.Driver) { config.IsShared = 0 } } @@ -929,12 +945,13 @@ func checkDatabase(checkAdmins bool) error { if config.UpdateMode == 0 { err := provider.initializeDatabase() if err != nil && err != ErrNoInitRequired { - logger.WarnToConsole("Unable to initialize data provider: %v", err) - providerLog(logger.LevelError, "Unable to initialize data provider: %v", err) + logger.WarnToConsole("unable to initialize data provider: %v", err) + providerLog(logger.LevelError, "unable to initialize data provider: %v", err) return err } if err == nil { - logger.DebugToConsole("Data provider successfully initialized") + logger.DebugToConsole("data provider successfully initialized") + providerLog(logger.LevelInfo, "data provider successfully initialized") } err = provider.migrateDatabase() if err != nil && err != ErrNoInitRequired { @@ -1040,6 +1057,7 @@ func validateSQLTablesPrefix() error { sqlTableAdmins = config.SQLTablesPrefix + sqlTableAdmins sqlTableAPIKeys = config.SQLTablesPrefix + sqlTableAPIKeys sqlTableShares = config.SQLTablesPrefix + sqlTableShares + sqlTableSharesGroupsMapping = config.SQLTablesPrefix + sqlTableSharesGroupsMapping sqlTableDefenderEvents = config.SQLTablesPrefix + sqlTableDefenderEvents sqlTableDefenderHosts = config.SQLTablesPrefix + sqlTableDefenderHosts sqlTableActiveTransfers = config.SQLTablesPrefix + sqlTableActiveTransfers @@ -1061,12 +1079,12 @@ func validateSQLTablesPrefix() error { "api keys %q shares %q defender hosts %q defender events %q transfers %q groups %q "+ "users groups mapping %q admins groups mapping %q groups folders mapping %q shared sessions %q "+ "schema version %q events actions %q events rules %q rules actions mapping %q tasks %q nodes %q roles %q"+ - "ip lists %q configs %q", + "ip lists %q share groups mapping %q configs %q", sqlTableUsers, sqlTableFolders, sqlTableUsersFoldersMapping, sqlTableAdmins, sqlTableAPIKeys, sqlTableShares, sqlTableDefenderHosts, sqlTableDefenderEvents, sqlTableActiveTransfers, sqlTableGroups, sqlTableUsersGroupsMapping, sqlTableAdminsGroupsMapping, sqlTableGroupsFoldersMapping, sqlTableSharedSessions, sqlTableSchemaVersion, sqlTableEventsActions, sqlTableEventsRules, sqlTableRulesActionsMapping, - sqlTableTasks, sqlTableNodes, sqlTableRoles, sqlTableIPLists, sqlTableConfigs) + sqlTableTasks, sqlTableNodes, sqlTableRoles, sqlTableIPLists, sqlTableSharesGroupsMapping, sqlTableConfigs) } return nil } @@ -1503,6 +1521,15 @@ func UpdateUserQuota(user *User, filesAdd int, sizeAdd int64, reset bool) error return nil } +// UpdateUserFolderQuota updates the quota for the given user and virtual folder. +func UpdateUserFolderQuota(folder *vfs.VirtualFolder, user *User, filesAdd int, sizeAdd int64, reset bool) { + if folder.IsIncludedInUserQuota() { + UpdateUserQuota(user, filesAdd, sizeAdd, reset) //nolint:errcheck + return + } + UpdateVirtualFolderQuota(&folder.BaseVirtualFolder, filesAdd, sizeAdd, reset) //nolint:errcheck +} + // UpdateVirtualFolderQuota updates the quota for the given virtual folder adding filesAdd and sizeAdd. // If reset is true filesAdd and sizeAdd indicates the total files and the total size instead of the difference. func UpdateVirtualFolderQuota(vfolder *vfs.BaseVirtualFolder, filesAdd int, sizeAdd int64, reset bool) error { @@ -1693,7 +1720,7 @@ func IPListEntryExists(ipOrNet string, listType IPListType) (IPListEntry, error) // GetIPListEntries returns the IP list entries applying the specified criteria and search limit func GetIPListEntries(listType IPListType, filter, from, order string, limit int) ([]IPListEntry, error) { - if !util.Contains(supportedIPListType, listType) { + if !slices.Contains(supportedIPListType, listType) { return nil, util.NewValidationError(fmt.Sprintf("invalid list type %d", listType)) } return provider.getIPListEntries(listType, filter, from, order, limit) @@ -2064,6 +2091,20 @@ func UserExists(username, role string) (User, error) { return provider.userExists(username, role) } +// GetAdminSignature returns the signature for the admin with the specified +// username. +func GetAdminSignature(username string) (string, error) { + username = config.convertName(username) + return provider.getAdminSignature(username) +} + +// GetUserSignature returns the signature for the user with the specified +// username. +func GetUserSignature(username string) (string, error) { + username = config.convertName(username) + return provider.getUserSignature(username) +} + // GetUserWithGroupSettings tries to return the user with the specified username // loading also the group settings func GetUserWithGroupSettings(username, role string) (User, error) { @@ -2106,9 +2147,6 @@ func UpdateUserPassword(username, plainPwd, executor, ipAddress, role string) er return err } userCopy := user.getACopy() - if err := userCopy.LoadAndApplyGroupSettings(); err != nil { - return err - } userCopy.Password = plainPwd if err := createUserPasswordHash(&userCopy); err != nil { return err @@ -2206,8 +2244,8 @@ func AddSharedSession(session Session) error { } // DeleteSharedSession deletes the session with the specified key -func DeleteSharedSession(key string) error { - err := provider.deleteSharedSession(key) +func DeleteSharedSession(key string, sessionType SessionType) error { + err := provider.deleteSharedSession(key, sessionType) if err != nil { providerLog(logger.LevelError, "unable to add shared session, key %q, err: %v", key, err) } @@ -2215,8 +2253,8 @@ func DeleteSharedSession(key string) error { } // GetSharedSession retrieves the session with the specified key -func GetSharedSession(key string) (Session, error) { - return provider.getSharedSession(key) +func GetSharedSession(key string, sessionType SessionType) (Session, error) { + return provider.getSharedSession(key, sessionType) } // CleanupSharedSessions removes the shared session with the specified type and @@ -2352,7 +2390,7 @@ func GetFolders(limit, offset int, order string, minimal bool) ([]vfs.BaseVirtua } func dumpUsers(data *BackupData, scopes []string) error { - if len(scopes) == 0 || util.Contains(scopes, DumpScopeUsers) { + if len(scopes) == 0 || slices.Contains(scopes, DumpScopeUsers) { users, err := provider.dumpUsers() if err != nil { return err @@ -2363,7 +2401,7 @@ func dumpUsers(data *BackupData, scopes []string) error { } func dumpFolders(data *BackupData, scopes []string) error { - if len(scopes) == 0 || util.Contains(scopes, DumpScopeFolders) { + if len(scopes) == 0 || slices.Contains(scopes, DumpScopeFolders) { folders, err := provider.dumpFolders() if err != nil { return err @@ -2374,7 +2412,7 @@ func dumpFolders(data *BackupData, scopes []string) error { } func dumpGroups(data *BackupData, scopes []string) error { - if len(scopes) == 0 || util.Contains(scopes, DumpScopeGroups) { + if len(scopes) == 0 || slices.Contains(scopes, DumpScopeGroups) { groups, err := provider.dumpGroups() if err != nil { return err @@ -2385,7 +2423,7 @@ func dumpGroups(data *BackupData, scopes []string) error { } func dumpAdmins(data *BackupData, scopes []string) error { - if len(scopes) == 0 || util.Contains(scopes, DumpScopeAdmins) { + if len(scopes) == 0 || slices.Contains(scopes, DumpScopeAdmins) { admins, err := provider.dumpAdmins() if err != nil { return err @@ -2396,7 +2434,7 @@ func dumpAdmins(data *BackupData, scopes []string) error { } func dumpAPIKeys(data *BackupData, scopes []string) error { - if len(scopes) == 0 || util.Contains(scopes, DumpScopeAPIKeys) { + if len(scopes) == 0 || slices.Contains(scopes, DumpScopeAPIKeys) { apiKeys, err := provider.dumpAPIKeys() if err != nil { return err @@ -2407,7 +2445,7 @@ func dumpAPIKeys(data *BackupData, scopes []string) error { } func dumpShares(data *BackupData, scopes []string) error { - if len(scopes) == 0 || util.Contains(scopes, DumpScopeShares) { + if len(scopes) == 0 || slices.Contains(scopes, DumpScopeShares) { shares, err := provider.dumpShares() if err != nil { return err @@ -2418,7 +2456,7 @@ func dumpShares(data *BackupData, scopes []string) error { } func dumpActions(data *BackupData, scopes []string) error { - if len(scopes) == 0 || util.Contains(scopes, DumpScopeActions) { + if len(scopes) == 0 || slices.Contains(scopes, DumpScopeActions) { actions, err := provider.dumpEventActions() if err != nil { return err @@ -2429,7 +2467,7 @@ func dumpActions(data *BackupData, scopes []string) error { } func dumpRules(data *BackupData, scopes []string) error { - if len(scopes) == 0 || util.Contains(scopes, DumpScopeRules) { + if len(scopes) == 0 || slices.Contains(scopes, DumpScopeRules) { rules, err := provider.dumpEventRules() if err != nil { return err @@ -2440,7 +2478,7 @@ func dumpRules(data *BackupData, scopes []string) error { } func dumpRoles(data *BackupData, scopes []string) error { - if len(scopes) == 0 || util.Contains(scopes, DumpScopeRoles) { + if len(scopes) == 0 || slices.Contains(scopes, DumpScopeRoles) { roles, err := provider.dumpRoles() if err != nil { return err @@ -2451,7 +2489,7 @@ func dumpRoles(data *BackupData, scopes []string) error { } func dumpIPLists(data *BackupData, scopes []string) error { - if len(scopes) == 0 || util.Contains(scopes, DumpScopeIPLists) { + if len(scopes) == 0 || slices.Contains(scopes, DumpScopeIPLists) { ipLists, err := provider.dumpIPListEntries() if err != nil { return err @@ -2462,7 +2500,7 @@ func dumpIPLists(data *BackupData, scopes []string) error { } func dumpConfigs(data *BackupData, scopes []string) error { - if len(scopes) == 0 || util.Contains(scopes, DumpScopeConfigs) { + if len(scopes) == 0 || slices.Contains(scopes, DumpScopeConfigs) { configs, err := provider.getConfigs() if err != nil { return err @@ -2519,6 +2557,17 @@ func DumpData(scopes []string) (BackupData, error) { func ParseDumpData(data []byte) (BackupData, error) { var dump BackupData err := json.Unmarshal(data, &dump) + if err != nil { + return dump, err + } + if dump.Version < 17 { + providerLog(logger.LevelInfo, "updating placeholders for actions restored from dump version %d", dump.Version) + eventActions, err := updateEventActionPlaceholders(dump.EventActions) + if err != nil { + return dump, fmt.Errorf("unable to update event action placeholders for dump version %d: %w", dump.Version, err) + } + dump.EventActions = eventActions + } return dump, err } @@ -2568,9 +2617,8 @@ func createProvider(basePath string) error { return initializeBoltProvider(basePath) case MemoryDataProviderName: if err := initializeMemoryProvider(basePath); err != nil { - msg := fmt.Sprintf("provider initialized but data loading failed: %v", err) - logger.Warn(logSender, "", msg) - logger.WarnToConsole(msg) + logger.Warn(logSender, "", "provider initialized but data loading failed: %v", err) + logger.WarnToConsole("provider initialized but data loading failed: %v", err) } return nil default: @@ -2684,7 +2732,7 @@ func validateUserGroups(user *User) error { groupNames := make(map[string]bool) for _, g := range user.Groups { - if g.Type < sdk.GroupTypePrimary && g.Type > sdk.GroupTypeMembership { + if g.Type < sdk.GroupTypePrimary || g.Type > sdk.GroupTypeMembership { return util.NewValidationError(fmt.Sprintf("invalid group type: %v", g.Type)) } if g.Type == sdk.GroupTypePrimary { @@ -2715,6 +2763,7 @@ func validateAssociatedVirtualFolders(vfolders []vfs.VirtualFolder) ([]vfs.Virtu folderNames := make(map[string]bool) for _, v := range vfolders { + v.Name = config.convertName(v.Name) if v.VirtualPath == "" { return nil, util.NewI18nError( util.NewValidationError("mount/virtual path is mandatory"), @@ -2766,7 +2815,7 @@ func validateUserTOTPConfig(c *UserTOTPConfig, username string) error { if c.ConfigName == "" { return util.NewValidationError("totp: config name is mandatory") } - if !util.Contains(mfa.GetAvailableTOTPConfigNames(), c.ConfigName) { + if !slices.Contains(mfa.GetAvailableTOTPConfigNames(), c.ConfigName) { return util.NewValidationError(fmt.Sprintf("totp: config name %q not found", c.ConfigName)) } if c.Secret.IsEmpty() { @@ -2782,7 +2831,7 @@ func validateUserTOTPConfig(c *UserTOTPConfig, username string) error { return util.NewValidationError("totp: specify at least one protocol") } for _, protocol := range c.Protocols { - if !util.Contains(MFAProtocols, protocol) { + if !slices.Contains(MFAProtocols, protocol) { return util.NewValidationError(fmt.Sprintf("totp: invalid protocol %q", protocol)) } } @@ -2815,7 +2864,7 @@ func validateUserPermissions(permsToCheck map[string][]string) (map[string][]str return permissions, util.NewValidationError("invalid permissions") } for _, p := range perms { - if !util.Contains(ValidPerms, p) { + if !slices.Contains(ValidPerms, p) { return permissions, util.NewValidationError(fmt.Sprintf("invalid permission: %q", p)) } } @@ -2829,7 +2878,7 @@ func validateUserPermissions(permsToCheck map[string][]string) (map[string][]str if dir != cleanedDir && cleanedDir == "/" { return permissions, util.NewValidationError(fmt.Sprintf("cannot set permissions for invalid subdirectory: %q is an alias for \"/\"", dir)) } - if util.Contains(perms, PermAny) { + if slices.Contains(perms, PermAny) { permissions[cleanedDir] = []string{PermAny} } else { permissions[cleanedDir] = util.RemoveDuplicates(perms, false) @@ -2870,11 +2919,18 @@ func validatePublicKeys(user *User) error { util.I18nErrorPubKeyInvalid, ) } + if out.Type() == ssh.InsecureKeyAlgoDSA { //nolint:staticcheck + providerLog(logger.LevelError, "dsa public key not accepted, position: %d", idx) + return util.NewI18nError( + util.NewValidationError(fmt.Sprintf("DSA key format is insecure and it is not allowed for key at position %d", idx)), + util.I18nErrorKeyInsecure, + ) + } if k, ok := out.(ssh.CryptoPublicKey); ok { cryptoKey := k.CryptoPublicKey() if rsaKey, ok := cryptoKey.(*rsa.PublicKey); ok { if size := rsaKey.N.BitLen(); size < 2048 { - providerLog(logger.LevelError, "rsa key with size %d not accepted, minimum 2048", size) + providerLog(logger.LevelError, "rsa key with size %d at position %d not accepted, minimum 2048", size, idx) return util.NewI18nError( util.NewValidationError(fmt.Sprintf("invalid size %d for rsa key at position %d, minimum 2048", size, idx)), @@ -2905,7 +2961,7 @@ func validateFiltersPatternExtensions(baseFilters *sdk.BaseUserFilters) error { util.I18nErrorFilePatternPathInvalid, ) } - if util.Contains(filteredPaths, cleanedPath) { + if slices.Contains(filteredPaths, cleanedPath) { return util.NewI18nError( util.NewValidationError(fmt.Sprintf("duplicate file patterns filter for path %q", f.Path)), util.I18nErrorFilePatternDuplicated, @@ -3024,13 +3080,13 @@ func validateFilterProtocols(filters *sdk.BaseUserFilters) error { return util.NewValidationError("invalid denied_protocols") } for _, p := range filters.DeniedProtocols { - if !util.Contains(ValidProtocols, p) { + if !slices.Contains(ValidProtocols, p) { return util.NewValidationError(fmt.Sprintf("invalid denied protocol %q", p)) } } for _, p := range filters.TwoFactorAuthProtocols { - if !util.Contains(MFAProtocols, p) { + if !slices.Contains(MFAProtocols, p) { return util.NewValidationError(fmt.Sprintf("invalid two factor protocol %q", p)) } } @@ -3086,7 +3142,7 @@ func validateBaseFilters(filters *sdk.BaseUserFilters) error { return util.NewValidationError("invalid denied_login_methods") } for _, loginMethod := range filters.DeniedLoginMethods { - if !util.Contains(ValidLoginMethods, loginMethod) { + if !slices.Contains(ValidLoginMethods, loginMethod) { return util.NewValidationError(fmt.Sprintf("invalid login method: %q", loginMethod)) } } @@ -3094,7 +3150,7 @@ func validateBaseFilters(filters *sdk.BaseUserFilters) error { return err } if filters.TLSUsername != "" { - if !util.Contains(validTLSUsernames, string(filters.TLSUsername)) { + if !slices.Contains(validTLSUsernames, string(filters.TLSUsername)) { return util.NewValidationError(fmt.Sprintf("invalid TLS username: %q", filters.TLSUsername)) } } @@ -3104,7 +3160,7 @@ func validateBaseFilters(filters *sdk.BaseUserFilters) error { } filters.TLSCerts = certs for _, opts := range filters.WebClient { - if !util.Contains(sdk.WebClientOptions, opts) { + if !slices.Contains(sdk.WebClientOptions, opts) { return util.NewValidationError(fmt.Sprintf("invalid web client options %q", opts)) } } @@ -3172,19 +3228,19 @@ func validateAccessTimeFilters(filters *sdk.BaseUserFilters) error { } func validateCombinedUserFilters(user *User) error { - if user.Filters.TOTPConfig.Enabled && util.Contains(user.Filters.WebClient, sdk.WebClientMFADisabled) { + if user.Filters.TOTPConfig.Enabled && slices.Contains(user.Filters.WebClient, sdk.WebClientMFADisabled) { return util.NewI18nError( util.NewValidationError("two-factor authentication cannot be disabled for a user with an active configuration"), util.I18nErrorDisableActive2FA, ) } - if user.Filters.RequirePasswordChange && util.Contains(user.Filters.WebClient, sdk.WebClientPasswordChangeDisabled) { + if user.Filters.RequirePasswordChange && slices.Contains(user.Filters.WebClient, sdk.WebClientPasswordChangeDisabled) { return util.NewI18nError( util.NewValidationError("you cannot require password change and at the same time disallow it"), util.I18nErrorPwdChangeConflict, ) } - if len(user.Filters.TwoFactorAuthProtocols) > 0 && util.Contains(user.Filters.WebClient, sdk.WebClientMFADisabled) { + if len(user.Filters.TwoFactorAuthProtocols) > 0 && slices.Contains(user.Filters.WebClient, sdk.WebClientMFADisabled) { return util.NewI18nError( util.NewValidationError("you cannot require two-factor authentication and at the same time disallow it"), util.I18nError2FAConflict, @@ -3193,19 +3249,37 @@ func validateCombinedUserFilters(user *User) error { return nil } -func validateBaseParams(user *User) error { - if user.Username == "" { - return util.NewI18nError(util.NewValidationError("username is mandatory"), util.I18nErrorUsernameRequired) - } - if err := checkReservedUsernames(user.Username); err != nil { - return util.NewI18nError(err, util.I18nErrorReservedUsername) - } +func validateEmails(user *User) error { if user.Email != "" && !util.IsEmailValid(user.Email) { return util.NewI18nError( util.NewValidationError(fmt.Sprintf("email %q is not valid", user.Email)), util.I18nErrorInvalidEmail, ) } + for _, email := range user.Filters.AdditionalEmails { + if !util.IsEmailValid(email) { + return util.NewI18nError( + util.NewValidationError(fmt.Sprintf("email %q is not valid", email)), + util.I18nErrorInvalidEmail, + ) + } + } + return nil +} + +func validateBaseParams(user *User) error { + if user.Username == "" { + return util.NewI18nError(util.NewValidationError("username is mandatory"), util.I18nErrorUsernameRequired) + } + if !util.IsNameValid(user.Username) { + return util.NewI18nError(errInvalidInput, util.I18nErrorInvalidInput) + } + if err := checkReservedUsernames(user.Username); err != nil { + return util.NewI18nError(err, util.I18nErrorReservedUsername) + } + if err := validateEmails(user); err != nil { + return err + } if config.NamingRules&1 == 0 && !usernameRegex.MatchString(user.Username) { return util.NewI18nError( util.NewValidationError(fmt.Sprintf("username %q is not valid, the following characters are allowed: a-zA-Z0-9-_.~", user.Username)), @@ -3266,6 +3340,19 @@ func hashPlainPassword(plainPwd string) (string, error) { func createUserPasswordHash(user *User) error { if user.Password != "" && !user.IsPasswordHashed() { + for _, g := range user.Groups { + if g.Type == sdk.GroupTypePrimary { + group, err := GroupExists(g.Name) + if err != nil { + return errors.New("unable to load group password policies") + } + if minEntropy := group.UserSettings.Filters.PasswordStrength; minEntropy > 0 { + if err := passwordvalidator.Validate(user.Password, float64(minEntropy)); err != nil { + return util.NewI18nError(util.NewValidationError(err.Error()), util.I18nErrorPasswordComplexity) + } + } + } + } if minEntropy := user.getMinPasswordEntropy(); minEntropy > 0 { if err := passwordvalidator.Validate(user.Password, minEntropy); err != nil { return util.NewI18nError(util.NewValidationError(err.Error()), util.I18nErrorPasswordComplexity) @@ -3288,6 +3375,9 @@ func ValidateFolder(folder *vfs.BaseVirtualFolder) error { if folder.Name == "" { return util.NewI18nError(util.NewValidationError("folder name is mandatory"), util.I18nErrorNameRequired) } + if !util.IsNameValid(folder.Name) { + return util.NewI18nError(errInvalidInput, util.I18nErrorInvalidInput) + } if config.NamingRules&1 == 0 && !usernameRegex.MatchString(folder.Name) { return util.NewI18nError( util.NewValidationError(fmt.Sprintf("folder name %q is not valid, the following characters are allowed: a-zA-Z0-9-_.~", folder.Name)), @@ -3317,6 +3407,7 @@ func ValidateUser(user *User) error { user.OIDCCustomFields = nil user.HasPassword = false user.SetEmptySecretsIfNil() + user.applyNamingRules() buildUserHomeDir(user) if err := validateBaseParams(user); err != nil { return err @@ -3466,7 +3557,7 @@ func checkUserAndPass(user *User, password, ip, protocol string) (User, error) { if err != nil { return *user, ErrInvalidCredentials } - if user.Password == "" || password == "" { + if user.Password == "" || strings.TrimSpace(password) == "" { return *user, errors.New("credentials cannot be null or empty") } if !user.Filters.Hooks.CheckPasswordDisabled { @@ -3505,7 +3596,7 @@ func checkUserPasscode(user *User, password, protocol string) (string, error) { if user.Filters.TOTPConfig.Enabled { switch protocol { case protocolFTP: - if util.Contains(user.Filters.TOTPConfig.Protocols, protocol) { + if slices.Contains(user.Filters.TOTPConfig.Protocols, protocol) { // the TOTP passcode has six digits pwdLen := len(password) if pwdLen < 7 { @@ -3641,7 +3732,8 @@ func comparePbkdf2PasswordAndHash(password, hashedPassword string) (bool, error) } func getSSLMode() string { - if config.Driver == PGSQLDataProviderName || config.Driver == CockroachDataProviderName { + switch config.Driver { + case PGSQLDataProviderName, CockroachDataProviderName: switch config.SSLMode { case 0: return "disable" @@ -3656,7 +3748,7 @@ func getSSLMode() string { case 5: return "allow" } - } else if config.Driver == MySQLDataProviderName { + case MySQLDataProviderName: if config.requireCustomTLSForMySQL() { return "custom" } @@ -3711,7 +3803,7 @@ func doBuiltinKeyboardInteractiveAuth(user *User, client ssh.KeyboardInteractive if err := user.LoadAndApplyGroupSettings(); err != nil { return 0, err } - hasSecondFactor := user.Filters.TOTPConfig.Enabled && util.Contains(user.Filters.TOTPConfig.Protocols, protocolSSH) + hasSecondFactor := user.Filters.TOTPConfig.Enabled && slices.Contains(user.Filters.TOTPConfig.Protocols, protocolSSH) if !isPartialAuth || !hasSecondFactor { answers, err := client("", "", []string{"Password: "}, []bool{false}) if err != nil { @@ -3729,7 +3821,7 @@ func doBuiltinKeyboardInteractiveAuth(user *User, client ssh.KeyboardInteractive } func checkKeyboardInteractiveSecondFactor(user *User, client ssh.KeyboardInteractiveChallenge, protocol string) (int, error) { - if !user.Filters.TOTPConfig.Enabled || !util.Contains(user.Filters.TOTPConfig.Protocols, protocolSSH) { + if !user.Filters.TOTPConfig.Enabled || !slices.Contains(user.Filters.TOTPConfig.Protocols, protocolSSH) { return 1, nil } err := user.Filters.TOTPConfig.Secret.TryDecrypt() @@ -3853,7 +3945,7 @@ func getKeyboardInteractiveAnswers(client ssh.KeyboardInteractiveChallenge, resp } if len(answers) == 1 && response.CheckPwd > 0 { if response.CheckPwd == 2 { - if !user.Filters.TOTPConfig.Enabled || !util.Contains(user.Filters.TOTPConfig.Protocols, protocolSSH) { + if !user.Filters.TOTPConfig.Enabled || !slices.Contains(user.Filters.TOTPConfig.Protocols, protocolSSH) { providerLog(logger.LevelInfo, "keyboard interactive auth error: unable to check TOTP passcode, TOTP is not enabled for user %q", user.Username) return answers, errors.New("TOTP not enabled for SSH protocol") @@ -4059,7 +4151,7 @@ func getPasswordHookResponse(username, password, ip, protocol string) ([]byte, e fmt.Sprintf("SFTPGO_AUTHD_IP=%s", ip), fmt.Sprintf("SFTPGO_AUTHD_PROTOCOL=%s", protocol), ) - return cmd.Output() + return getCmdOutput(cmd, "check_password_hook") } func executeCheckPasswordHook(username, password, ip, protocol string) (checkPasswordResponse, error) { @@ -4115,15 +4207,17 @@ func getPreLoginHookResponse(loginMethod, ip, protocol string, userAsJSON []byte cmd := exec.CommandContext(ctx, config.PreLoginHook, args...) cmd.Env = append(env, - fmt.Sprintf("SFTPGO_LOGIND_USER=%s", util.BytesToString(userAsJSON)), + fmt.Sprintf("SFTPGO_LOGIND_USER=%s", userAsJSON), fmt.Sprintf("SFTPGO_LOGIND_METHOD=%s", loginMethod), fmt.Sprintf("SFTPGO_LOGIND_IP=%s", ip), fmt.Sprintf("SFTPGO_LOGIND_PROTOCOL=%s", protocol), ) - return cmd.Output() + return getCmdOutput(cmd, "pre_login_hook") } func executePreLoginHook(username, loginMethod, ip, protocol string, oidcTokenFields *map[string]any) (User, error) { + var user User + u, mergedUser, userAsJSON, err := getUserAndJSONForHook(username, oidcTokenFields) if err != nil { return u, err @@ -4146,55 +4240,41 @@ func executePreLoginHook(username, loginMethod, ip, protocol string, oidcTokenFi } return u, nil } - - userID := u.ID - userUsedQuotaSize := u.UsedQuotaSize - userUsedQuotaFiles := u.UsedQuotaFiles - userUsedDownloadTransfer := u.UsedDownloadDataTransfer - userUsedUploadTransfer := u.UsedUploadDataTransfer - userLastQuotaUpdate := u.LastQuotaUpdate - userLastLogin := u.LastLogin - userFirstDownload := u.FirstDownload - userFirstUpload := u.FirstUpload - userLastPwdChange := u.LastPasswordChange - userCreatedAt := u.CreatedAt - totpConfig := u.Filters.TOTPConfig - recoveryCodes := u.Filters.RecoveryCodes - err = json.Unmarshal(out, &u) + err = json.Unmarshal(out, &user) if err != nil { - return u, fmt.Errorf("invalid pre-login hook response %q, error: %v", util.BytesToString(out), err) + return u, fmt.Errorf("invalid pre-login hook response %q, error: %v", out, err) } - u.ID = userID - u.UsedQuotaSize = userUsedQuotaSize - u.UsedQuotaFiles = userUsedQuotaFiles - u.UsedUploadDataTransfer = userUsedUploadTransfer - u.UsedDownloadDataTransfer = userUsedDownloadTransfer - u.LastQuotaUpdate = userLastQuotaUpdate - u.LastLogin = userLastLogin - u.LastPasswordChange = userLastPwdChange - u.FirstDownload = userFirstDownload - u.FirstUpload = userFirstUpload - u.CreatedAt = userCreatedAt - if userID == 0 { - err = provider.addUser(&u) - } else { - u.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now()) + if u.ID > 0 { + user.ID = u.ID + user.UsedQuotaSize = u.UsedQuotaSize + user.UsedQuotaFiles = u.UsedQuotaFiles + user.UsedUploadDataTransfer = u.UsedUploadDataTransfer + user.UsedDownloadDataTransfer = u.UsedDownloadDataTransfer + user.LastQuotaUpdate = u.LastQuotaUpdate + user.LastLogin = u.LastLogin + user.LastPasswordChange = u.LastPasswordChange + user.FirstDownload = u.FirstDownload + user.FirstUpload = u.FirstUpload // preserve TOTP config and recovery codes - u.Filters.TOTPConfig = totpConfig - u.Filters.RecoveryCodes = recoveryCodes - err = provider.updateUser(&u) - if err == nil { - webDAVUsersCache.swap(&u, "") + user.Filters.TOTPConfig = u.Filters.TOTPConfig + user.Filters.RecoveryCodes = u.Filters.RecoveryCodes + if err := provider.updateUser(&user); err != nil { + return u, err + } + } else { + if err := provider.addUser(&user); err != nil { + return u, err } } + user, err = provider.userExists(user.Username, "") if err != nil { return u, err } - providerLog(logger.LevelDebug, "user %q added/updated from pre-login hook response, id: %d", username, userID) - if userID == 0 { - return provider.userExists(username, "") + providerLog(logger.LevelDebug, "user %q added/updated from pre-login hook response, id: %d", username, u.ID) + if u.ID > 0 { + webDAVUsersCache.swap(&user, "") } - return u, nil + return user, nil } // ExecutePostLoginHook executes the post login hook if defined @@ -4257,7 +4337,7 @@ func ExecutePostLoginHook(user *User, loginMethod, ip, protocol string, err erro cmd := exec.CommandContext(ctx, config.PostLoginHook, args...) cmd.Env = append(env, - fmt.Sprintf("SFTPGO_LOGIND_USER=%s", util.BytesToString(userAsJSON)), + fmt.Sprintf("SFTPGO_LOGIND_USER=%s", userAsJSON), fmt.Sprintf("SFTPGO_LOGIND_IP=%s", ip), fmt.Sprintf("SFTPGO_LOGIND_METHOD=%s", loginMethod), fmt.Sprintf("SFTPGO_LOGIND_STATUS=%s", status), @@ -4326,7 +4406,7 @@ func getExternalAuthResponse(username, password, pkey, keyboardInteractive, ip, cmd := exec.CommandContext(ctx, config.ExternalAuthHook, args...) cmd.Env = append(env, fmt.Sprintf("SFTPGO_AUTHD_USERNAME=%s", username), - fmt.Sprintf("SFTPGO_AUTHD_USER=%s", util.BytesToString(userAsJSON)), + fmt.Sprintf("SFTPGO_AUTHD_USER=%s", userAsJSON), fmt.Sprintf("SFTPGO_AUTHD_IP=%s", ip), fmt.Sprintf("SFTPGO_AUTHD_PASSWORD=%s", password), fmt.Sprintf("SFTPGO_AUTHD_PUBLIC_KEY=%s", pkey), @@ -4334,7 +4414,7 @@ func getExternalAuthResponse(username, password, pkey, keyboardInteractive, ip, fmt.Sprintf("SFTPGO_AUTHD_TLS_CERT=%s", strings.ReplaceAll(tlsCert, "\n", "\\n")), fmt.Sprintf("SFTPGO_AUTHD_KEYBOARD_INTERACTIVE=%v", keyboardInteractive)) - return cmd.Output() + return getCmdOutput(cmd, "external_auth_hook") } func updateUserFromExtAuthResponse(user *User, password, pkey string) { @@ -4442,7 +4522,7 @@ func doExternalAuth(username, password string, pubKey []byte, keyboardInteractiv // preserve TOTP config and recovery codes user.Filters.TOTPConfig = u.Filters.TOTPConfig user.Filters.RecoveryCodes = u.Filters.RecoveryCodes - err = provider.updateUser(&user) + user, err = updateUserAfterExternalAuth(&user) if err == nil { if protocol != protocolWebDAV { webDAVUsersCache.swap(&user, password) @@ -4514,7 +4594,7 @@ func doPluginAuth(username, password string, pubKey []byte, ip, protocol string, // preserve TOTP config and recovery codes user.Filters.TOTPConfig = u.Filters.TOTPConfig user.Filters.RecoveryCodes = u.Filters.RecoveryCodes - err = provider.updateUser(&user) + user, err = updateUserAfterExternalAuth(&user) if err == nil { if protocol != protocolWebDAV { webDAVUsersCache.swap(&user, password) @@ -4530,6 +4610,13 @@ func doPluginAuth(username, password string, pubKey []byte, ip, protocol string, return provider.userExists(user.Username, "") } +func updateUserAfterExternalAuth(user *User) (User, error) { + if err := provider.updateUser(user); err != nil { + return *user, err + } + return provider.userExists(user.Username, "") +} + func getUserForHook(username string, oidcTokenFields *map[string]any) (User, User, error) { u, err := provider.userExists(username, "") if err != nil { @@ -4601,6 +4688,59 @@ func isExternalAuthConfigured(loginMethod string) bool { } } +func replaceTemplateVars(input string) string { + var result strings.Builder + i := 0 + for i < len(input) { + if i+2 <= len(input) && input[i:i+2] == "{{" { + if i+2 < len(input) { + nextChar := input[i+2] + if nextChar == ' ' || nextChar == '.' || nextChar == '-' { + // Don't replace if followed by space, dot or minus. + result.WriteString("{{") + i += 2 + continue + } + } + + // Find the closing "}}" + closing := strings.Index(input[i:], "}}") + if closing != -1 { + // Replace with {{. only if it's a proper template variable. + result.WriteString("{{.") + result.WriteString(input[i+2 : i+closing]) + result.WriteString("}}") + i += closing + 2 + continue + } + } + result.WriteByte(input[i]) + i++ + } + return result.String() +} + +func updateEventActionPlaceholders(actions []BaseEventAction) ([]BaseEventAction, error) { + var result []BaseEventAction + + for _, action := range actions { + options, err := json.Marshal(action.Options) + if err != nil { + return nil, err + } + convertedOptions := replaceTemplateVars(string(options)) + var opts BaseEventActionOptions + err = json.Unmarshal([]byte(convertedOptions), &opts) + if err != nil { + return nil, err + } + action.Options = opts + result = append(result, action) + } + + return result, nil +} + func getConfigPath(name, configDir string) string { if !util.IsFileInputValid(name) { return "" @@ -4612,12 +4752,47 @@ func getConfigPath(name, configDir string) string { } func checkReservedUsernames(username string) error { - if util.Contains(reservedUsers, username) { + if slices.Contains(reservedUsers, username) { return util.NewValidationError("this username is reserved") } return nil } +func errSchemaVersionTooOld(version int) error { + return fmt.Errorf("database schema version %d is too old, please see the upgrading docs: https://docs.sftpgo.com/latest/data-provider/#upgrading", version) +} + +func getCmdOutput(cmd *exec.Cmd, sender string) ([]byte, error) { + var stdout bytes.Buffer + cmd.Stdout = &stdout + + stderr, err := cmd.StderrPipe() + if err != nil { + return nil, err + } + + err = cmd.Start() + if err != nil { + return nil, err + } + + scanner := bufio.NewScanner(stderr) + + go func() { + for scanner.Scan() { + if out := scanner.Text(); out != "" { + logger.Log(logger.LevelWarn, sender, "", "%s", out) + } + } + if err := scanner.Err(); err != nil { + logger.Log(logger.LevelError, sender, "", "error reading stderr: %v", err) + } + }() + + err = cmd.Wait() + return stdout.Bytes(), err +} + func providerLog(level logger.LogLevel, format string, v ...any) { logger.Log(level, logSender, "", format, v...) } diff --git a/internal/dataprovider/eventrule.go b/internal/dataprovider/eventrule.go index 2780860c..959f874c 100644 --- a/internal/dataprovider/eventrule.go +++ b/internal/dataprovider/eventrule.go @@ -23,6 +23,7 @@ import ( "net/http" "path" "path/filepath" + "slices" "strings" "time" @@ -49,17 +50,21 @@ const ( ActionTypeUserExpirationCheck ActionTypeIDPAccountCheck ActionTypeUserInactivityCheck + ActionTypeRotateLogs ) var ( supportedEventActions = []int{ActionTypeHTTP, ActionTypeCommand, ActionTypeEmail, ActionTypeFilesystem, ActionTypeBackup, ActionTypeUserQuotaReset, ActionTypeFolderQuotaReset, ActionTypeTransferQuotaReset, - ActionTypeDataRetentionCheck, ActionTypePasswordExpirationCheck, - ActionTypeUserExpirationCheck, ActionTypeUserInactivityCheck, ActionTypeIDPAccountCheck} + ActionTypeDataRetentionCheck, ActionTypePasswordExpirationCheck, ActionTypeUserExpirationCheck, + ActionTypeUserInactivityCheck, ActionTypeIDPAccountCheck, ActionTypeRotateLogs} + // EnabledActionCommands defines the system commands that can be executed via EventManager, + // an empty list means that no command is allowed to be executed. + EnabledActionCommands []string ) func isActionTypeValid(action int) bool { - return util.Contains(supportedEventActions, action) + return slices.Contains(supportedEventActions, action) } func getActionTypeAsString(action int) string { @@ -88,6 +93,8 @@ func getActionTypeAsString(action int) string { return util.I18nActionTypeUserInactivityCheck case ActionTypeIDPAccountCheck: return util.I18nActionTypeIDPCheck + case ActionTypeRotateLogs: + return util.I18nActionTypeRotateLogs default: return util.I18nActionTypeCommand } @@ -112,7 +119,7 @@ var ( ) func isEventTriggerValid(trigger int) bool { - return util.Contains(supportedEventTriggers, trigger) + return slices.Contains(supportedEventTriggers, trigger) } func getTriggerTypeAsString(trigger int) string { @@ -166,7 +173,7 @@ var ( ) func isFilesystemActionValid(value int) bool { - return util.Contains(supportedFsActions, value) + return slices.Contains(supportedFsActions, value) } func getFsActionTypeAsString(value int) string { @@ -335,7 +342,7 @@ func (c *EventActionHTTPConfig) validateMultiparts() error { ) } for _, k := range c.Headers { - if strings.ToLower(k.Key) == "content-type" { + if strings.EqualFold(k.Key, "content-type") { return util.NewI18nError( util.NewValidationError("content type is automatically set for multipart requests"), util.I18nErrorMultipartCType, @@ -377,7 +384,7 @@ func (c *EventActionHTTPConfig) validate(additionalData string) error { return util.NewValidationError(fmt.Sprintf("could not encrypt HTTP password: %v", err)) } } - if !util.Contains(SupportedHTTPActionMethods, c.Method) { + if !slices.Contains(SupportedHTTPActionMethods, c.Method) { return util.NewValidationError(fmt.Sprintf("unsupported HTTP method: %s", c.Method)) } for _, kv := range c.QueryParameters { @@ -398,11 +405,11 @@ func (c *EventActionHTTPConfig) GetContext() (context.Context, context.CancelFun // HasObjectData returns true if the {{ObjectData}} placeholder is defined func (c *EventActionHTTPConfig) HasObjectData() bool { - if strings.Contains(c.Body, "{{ObjectData}}") { + if strings.Contains(c.Body, "{{ObjectData}}") || strings.Contains(c.Body, "{{ObjectDataString}}") { return true } for _, part := range c.Parts { - if strings.Contains(part.Body, "{{ObjectData}}") { + if strings.Contains(part.Body, "{{ObjectData}}") || strings.Contains(part.Body, "{{ObjectDataString}}") { return true } } @@ -446,6 +453,11 @@ func (c *EventActionHTTPConfig) GetHTTPClient() *http.Client { return client } +// IsActionCommandAllowed returns true if the specified command is allowed +func IsActionCommandAllowed(cmd string) bool { + return slices.Contains(EnabledActionCommands, cmd) +} + // EventActionCommandConfig defines the configuration for a command event target type EventActionCommandConfig struct { Cmd string `json:"cmd,omitempty"` @@ -458,6 +470,9 @@ func (c *EventActionCommandConfig) validate() error { if c.Cmd == "" { return util.NewI18nError(util.NewValidationError("command is required"), util.I18nErrorCommandRequired) } + if !IsActionCommandAllowed(c.Cmd) { + return util.NewValidationError(fmt.Sprintf("command %q is not allowed", c.Cmd)) + } if !filepath.IsAbs(c.Cmd) { return util.NewI18nError( util.NewValidationError("invalid command, it must be an absolute path"), @@ -656,12 +671,21 @@ func (c *EventActionFsCompress) validate() error { return nil } +// RenameConfig defines the configuration for a filesystem rename +type RenameConfig struct { + // key is the source and target the value + KeyValue + // This setting only applies to storage providers that support + // changing modification times. + UpdateModTime bool `json:"update_modtime,omitempty"` +} + // EventActionFilesystemConfig defines the configuration for filesystem actions type EventActionFilesystemConfig struct { // Filesystem actions, see the above enum Type int `json:"type,omitempty"` - // files/dirs to rename, key is the source and target the value - Renames []KeyValue `json:"renames,omitempty"` + // files/dirs to rename + Renames []RenameConfig `json:"renames,omitempty"` // directories to create MkDirs []string `json:"mkdirs,omitempty"` // files/dirs to delete @@ -702,9 +726,9 @@ func (c *EventActionFilesystemConfig) validateRenames() error { if len(c.Renames) == 0 { return util.NewI18nError(util.NewValidationError("no path to rename specified"), util.I18nErrorPathRequired) } - for idx, kv := range c.Renames { - key := strings.TrimSpace(kv.Key) - value := strings.TrimSpace(kv.Value) + for idx, cfg := range c.Renames { + key := strings.TrimSpace(cfg.Key) + value := strings.TrimSpace(cfg.Value) if key == "" || value == "" { return util.NewValidationError("invalid paths to rename") } @@ -722,9 +746,12 @@ func (c *EventActionFilesystemConfig) validateRenames() error { util.I18nErrorRootNotAllowed, ) } - c.Renames[idx] = KeyValue{ - Key: key, - Value: value, + c.Renames[idx] = RenameConfig{ + KeyValue: KeyValue{ + Key: key, + Value: value, + }, + UpdateModTime: cfg.UpdateModTime, } } return nil @@ -888,7 +915,7 @@ func (c *EventActionFilesystemConfig) getACopy() EventActionFilesystemConfig { return EventActionFilesystemConfig{ Type: c.Type, - Renames: cloneKeyValues(c.Renames), + Renames: cloneRenameConfigs(c.Renames), MkDirs: mkdirs, Deletes: deletes, Exist: exist, @@ -1226,6 +1253,15 @@ func (a *BaseEventAction) validate() error { if a.Name == "" { return util.NewI18nError(util.NewValidationError("name is mandatory"), util.I18nErrorNameRequired) } + if !util.IsNameValid(a.Name) { + return util.NewI18nError(errInvalidInput, util.I18nErrorInvalidInput) + } + if config.NamingRules&1 == 0 && !usernameRegex.MatchString(a.Name) { + return util.NewI18nError( + util.NewValidationError(fmt.Sprintf("name %q is not valid, the following characters are allowed: a-zA-Z0-9-_.~", a.Name)), + util.I18nErrorInvalidUser, + ) + } if !isActionTypeValid(a.Type) { return util.NewValidationError(fmt.Sprintf("invalid action type: %d", a.Type)) } @@ -1277,7 +1313,7 @@ func (a *EventAction) validateAssociation(trigger int, fsEvents []string) error } if trigger == EventTriggerFsEvent { for _, ev := range fsEvents { - if !util.Contains(allowedSyncFsEvents, ev) { + if !slices.Contains(allowedSyncFsEvents, ev) { return util.NewI18nError( util.NewValidationError("sync execution is only supported for upload and pre-* events"), util.I18nErrorEvSyncUnsupportedFs, @@ -1320,6 +1356,7 @@ type ConditionOptions struct { ProviderObjects []string `json:"provider_objects,omitempty"` MinFileSize int64 `json:"min_size,omitempty"` MaxFileSize int64 `json:"max_size,omitempty"` + EventStatuses []int `json:"event_statuses,omitempty"` // allow to execute scheduled tasks concurrently from multiple instances ConcurrentExecution bool `json:"concurrent_execution,omitempty"` } @@ -1329,6 +1366,8 @@ func (f *ConditionOptions) getACopy() ConditionOptions { copy(protocols, f.Protocols) providerObjects := make([]string, len(f.ProviderObjects)) copy(providerObjects, f.ProviderObjects) + statuses := make([]int, len(f.EventStatuses)) + copy(statuses, f.EventStatuses) return ConditionOptions{ Names: cloneConditionPatterns(f.Names), @@ -1339,10 +1378,20 @@ func (f *ConditionOptions) getACopy() ConditionOptions { ProviderObjects: providerObjects, MinFileSize: f.MinFileSize, MaxFileSize: f.MaxFileSize, + EventStatuses: statuses, ConcurrentExecution: f.ConcurrentExecution, } } +func (f *ConditionOptions) validateStatuses() error { + for _, status := range f.EventStatuses { + if status < 0 || status > 3 { + return util.NewValidationError(fmt.Sprintf("invalid event_status %d", status)) + } + } + return nil +} + func (f *ConditionOptions) validate() error { if err := validateConditionPatterns(f.Names); err != nil { return err @@ -1358,12 +1407,12 @@ func (f *ConditionOptions) validate() error { } for _, p := range f.Protocols { - if !util.Contains(SupportedRuleConditionProtocols, p) { + if !slices.Contains(SupportedRuleConditionProtocols, p) { return util.NewValidationError(fmt.Sprintf("unsupported rule condition protocol: %q", p)) } } for _, p := range f.ProviderObjects { - if !util.Contains(SupporteRuleConditionProviderObjects, p) { + if !slices.Contains(SupporteRuleConditionProviderObjects, p) { return util.NewValidationError(fmt.Sprintf("unsupported provider object: %q", p)) } } @@ -1373,6 +1422,9 @@ func (f *ConditionOptions) validate() error { util.ByteCountSI(f.MaxFileSize), util.ByteCountSI(f.MinFileSize))) } } + if err := f.validateStatuses(); err != nil { + return err + } if config.IsShared == 0 { f.ConcurrentExecution = false } @@ -1465,16 +1517,16 @@ func (c *EventConditions) validate(trigger int) error { ) } for _, ev := range c.FsEvents { - if !util.Contains(SupportedFsEvents, ev) { + if !slices.Contains(SupportedFsEvents, ev) { return util.NewValidationError(fmt.Sprintf("unsupported fs event: %q", ev)) } } case EventTriggerProviderEvent: c.FsEvents = nil c.Schedules = nil - c.Options.GroupNames = nil c.Options.FsPaths = nil c.Options.Protocols = nil + c.Options.EventStatuses = nil c.Options.MinFileSize = 0 c.Options.MaxFileSize = 0 c.IDPLoginEvent = 0 @@ -1485,7 +1537,7 @@ func (c *EventConditions) validate(trigger int) error { ) } for _, ev := range c.ProviderEvents { - if !util.Contains(SupportedProviderEvents, ev) { + if !slices.Contains(SupportedProviderEvents, ev) { return util.NewValidationError(fmt.Sprintf("unsupported provider event: %q", ev)) } } @@ -1494,6 +1546,7 @@ func (c *EventConditions) validate(trigger int) error { c.ProviderEvents = nil c.Options.FsPaths = nil c.Options.Protocols = nil + c.Options.EventStatuses = nil c.Options.MinFileSize = 0 c.Options.MaxFileSize = 0 c.Options.ProviderObjects = nil @@ -1509,6 +1562,7 @@ func (c *EventConditions) validate(trigger int) error { c.Options.RoleNames = nil c.Options.FsPaths = nil c.Options.Protocols = nil + c.Options.EventStatuses = nil c.Options.MinFileSize = 0 c.Options.MaxFileSize = 0 c.Schedules = nil @@ -1518,6 +1572,7 @@ func (c *EventConditions) validate(trigger int) error { c.ProviderEvents = nil c.Options.FsPaths = nil c.Options.Protocols = nil + c.Options.EventStatuses = nil c.Options.MinFileSize = 0 c.Options.MaxFileSize = 0 c.Options.ProviderObjects = nil @@ -1531,10 +1586,11 @@ func (c *EventConditions) validate(trigger int) error { c.Options.RoleNames = nil c.Options.FsPaths = nil c.Options.Protocols = nil + c.Options.EventStatuses = nil c.Options.MinFileSize = 0 c.Options.MaxFileSize = 0 c.Schedules = nil - if !util.Contains(supportedIDPLoginEvents, c.IDPLoginEvent) { + if !slices.Contains(supportedIDPLoginEvents, c.IDPLoginEvent) { return util.NewValidationError(fmt.Sprintf("invalid Identity Provider login event %d", c.IDPLoginEvent)) } default: @@ -1544,6 +1600,7 @@ func (c *EventConditions) validate(trigger int) error { c.Options.RoleNames = nil c.Options.FsPaths = nil c.Options.Protocols = nil + c.Options.EventStatuses = nil c.Options.MinFileSize = 0 c.Options.MaxFileSize = 0 c.Schedules = nil @@ -1624,10 +1681,19 @@ func (r *EventRule) isStatusValid() bool { return r.Status >= 0 && r.Status <= 1 } -func (r *EventRule) validate() error { +func (r *EventRule) validate() error { //nolint:gocyclo if r.Name == "" { return util.NewI18nError(util.NewValidationError("name is mandatory"), util.I18nErrorNameRequired) } + if !util.IsNameValid(r.Name) { + return util.NewI18nError(errInvalidInput, util.I18nErrorInvalidInput) + } + if config.NamingRules&1 == 0 && !usernameRegex.MatchString(r.Name) { + return util.NewI18nError( + util.NewValidationError(fmt.Sprintf("name %q is not valid, the following characters are allowed: a-zA-Z0-9-_.~", r.Name)), + util.I18nErrorInvalidUser, + ) + } if !r.isStatusValid() { return util.NewValidationError(fmt.Sprintf("invalid event rule status: %d", r.Status)) } @@ -1687,7 +1753,7 @@ func (r *EventRule) validateMandatorySyncActions() error { return nil } for _, ev := range r.Conditions.FsEvents { - if util.Contains(mandatorySyncFsEvents, ev) { + if slices.Contains(mandatorySyncFsEvents, ev) { return util.NewI18nError( util.NewValidationError(fmt.Sprintf("event %q requires at least a sync action", ev)), util.I18nErrorRuleSyncActionRequired, @@ -1705,7 +1771,7 @@ func (r *EventRule) checkIPBlockedAndCertificateActions() error { ActionTypeDataRetentionCheck, ActionTypeFilesystem, ActionTypePasswordExpirationCheck, ActionTypeUserExpirationCheck} for _, action := range r.Actions { - if util.Contains(unavailableActions, action.Type) { + if slices.Contains(unavailableActions, action.Type) { return fmt.Errorf("action %q, type %q is not supported for event trigger %q", action.Name, getActionTypeAsString(action.Type), getTriggerTypeAsString(r.Trigger)) } @@ -1721,7 +1787,7 @@ func (r *EventRule) checkProviderEventActions(providerObjectType string) error { ActionTypeDataRetentionCheck, ActionTypeFilesystem, ActionTypePasswordExpirationCheck, ActionTypeUserExpirationCheck} for _, action := range r.Actions { - if util.Contains(userSpecificActions, action.Type) && providerObjectType != actionObjectUser { + if slices.Contains(userSpecificActions, action.Type) && providerObjectType != actionObjectUser { return fmt.Errorf("action %q, type %q is only supported for provider user events", action.Name, getActionTypeAsString(action.Type)) } @@ -1829,6 +1895,20 @@ func (r *EventRule) RenderAsJSON(reload bool) ([]byte, error) { return json.Marshal(r) } +func cloneRenameConfigs(renames []RenameConfig) []RenameConfig { + res := make([]RenameConfig, 0, len(renames)) + for _, c := range renames { + res = append(res, RenameConfig{ + KeyValue: KeyValue{ + Key: c.Key, + Value: c.Value, + }, + UpdateModTime: c.UpdateModTime, + }) + } + return res +} + func cloneKeyValues(keyVals []KeyValue) []KeyValue { res := make([]KeyValue, 0, len(keyVals)) for _, kv := range keyVals { diff --git a/internal/dataprovider/group.go b/internal/dataprovider/group.go index 8577efda..fa09fda4 100644 --- a/internal/dataprovider/group.go +++ b/internal/dataprovider/group.go @@ -132,11 +132,22 @@ func (g *Group) hasRedactedSecret() bool { return g.UserSettings.FsConfig.HasRedactedSecret() } +func (g *Group) applyNamingRules() { + g.Name = config.convertName(g.Name) + for idx := range g.VirtualFolders { + g.VirtualFolders[idx].Name = config.convertName(g.VirtualFolders[idx].Name) + } +} + func (g *Group) validate() error { g.SetEmptySecretsIfNil() + g.applyNamingRules() if g.Name == "" { return util.NewI18nError(util.NewValidationError("name is mandatory"), util.I18nErrorNameRequired) } + if !util.IsNameValid(g.Name) { + return util.NewI18nError(errInvalidInput, util.I18nErrorInvalidInput) + } if config.NamingRules&1 == 0 && !usernameRegex.MatchString(g.Name) { return util.NewI18nError( util.NewValidationError(fmt.Sprintf("name %q is not valid, the following characters are allowed: a-zA-Z0-9-_.~", g.Name)), diff --git a/internal/dataprovider/iplist.go b/internal/dataprovider/iplist.go index 739ef472..bc3b5b99 100644 --- a/internal/dataprovider/iplist.go +++ b/internal/dataprovider/iplist.go @@ -19,6 +19,7 @@ import ( "fmt" "net" "net/netip" + "slices" "strings" "sync" "sync/atomic" @@ -85,7 +86,7 @@ var ( // CheckIPListType returns an error if the provided IP list type is not valid func CheckIPListType(t IPListType) error { - if !util.Contains(supportedIPListType, t) { + if !slices.Contains(supportedIPListType, t) { return util.NewValidationError(fmt.Sprintf("invalid list type %d", t)) } return nil @@ -417,6 +418,10 @@ func (l *IPList) IsListed(ip, protocol string) (bool, int, error) { l.mu.RLock() defer l.mu.RUnlock() + if l.Ranges.Len() == 0 { + return false, 0, nil + } + parsedIP := net.ParseIP(ip) if parsedIP == nil { return false, 0, fmt.Errorf("invalid IP %s", ip) diff --git a/internal/dataprovider/memory.go b/internal/dataprovider/memory.go index 05d72352..e8595291 100644 --- a/internal/dataprovider/memory.go +++ b/internal/dataprovider/memory.go @@ -22,7 +22,9 @@ import ( "net/netip" "os" "path/filepath" + "slices" "sort" + "strconv" "sync" "time" @@ -206,6 +208,32 @@ func (p *MemoryProvider) updateAPIKeyLastUse(keyID string) error { return nil } +func (p *MemoryProvider) getAdminSignature(username string) (string, error) { + p.dbHandle.Lock() + defer p.dbHandle.Unlock() + if p.dbHandle.isClosed { + return "", errMemoryProviderClosed + } + admin, err := p.adminExistsInternal(username) + if err != nil { + return "", err + } + return strconv.FormatInt(admin.UpdatedAt, 10), nil +} + +func (p *MemoryProvider) getUserSignature(username string) (string, error) { + p.dbHandle.Lock() + defer p.dbHandle.Unlock() + if p.dbHandle.isClosed { + return "", errMemoryProviderClosed + } + user, err := p.userExistsInternal(username) + if err != nil { + return "", err + } + return strconv.FormatInt(user.UpdatedAt, 10), nil +} + func (p *MemoryProvider) setUpdatedAt(username string) { p.dbHandle.Lock() defer p.dbHandle.Unlock() @@ -348,9 +376,6 @@ func (p *MemoryProvider) addUser(user *User) error { if err := p.addUserToRole(user.Username, user.Role); err != nil { return err } - sort.Slice(user.Groups, func(i, j int) bool { - return user.Groups[i].Name < user.Groups[j].Name - }) var mappedGroups []string for idx := range user.Groups { if err = p.addUserToGroupMapping(user.Username, user.Groups[idx].Name); err != nil { @@ -362,9 +387,6 @@ func (p *MemoryProvider) addUser(user *User) error { } mappedGroups = append(mappedGroups, user.Groups[idx].Name) } - sort.Slice(user.VirtualFolders, func(i, j int) bool { - return user.VirtualFolders[i].Name < user.VirtualFolders[j].Name - }) var mappedFolders []string for idx := range user.VirtualFolders { if err = p.addUserToFolderMapping(user.Username, user.VirtualFolders[idx].Name); err != nil { @@ -410,9 +432,6 @@ func (p *MemoryProvider) updateUser(user *User) error { //nolint:gocyclo for idx := range u.Groups { p.removeUserFromGroupMapping(u.Username, u.Groups[idx].Name) } - sort.Slice(user.Groups, func(i, j int) bool { - return user.Groups[i].Name < user.Groups[j].Name - }) for idx := range user.Groups { if err = p.addUserToGroupMapping(user.Username, user.Groups[idx].Name); err != nil { // try to add old mapping @@ -428,9 +447,6 @@ func (p *MemoryProvider) updateUser(user *User) error { //nolint:gocyclo for _, oldFolder := range u.VirtualFolders { p.removeRelationFromFolderMapping(oldFolder.Name, u.Username, "") } - sort.Slice(user.VirtualFolders, func(i, j int) bool { - return user.VirtualFolders[i].Name < user.VirtualFolders[j].Name - }) for idx := range user.VirtualFolders { if err = p.addUserToFolderMapping(user.Username, user.VirtualFolders[idx].Name); err != nil { // try to add old mapping @@ -743,9 +759,6 @@ func (p *MemoryProvider) addAdmin(admin *Admin) error { return err } var mappedAdmins []string - sort.Slice(admin.Groups, func(i, j int) bool { - return admin.Groups[i].Name < admin.Groups[j].Name - }) for idx := range admin.Groups { if err = p.addAdminToGroupMapping(admin.Username, admin.Groups[idx].Name); err != nil { // try to remove group mapping @@ -788,9 +801,6 @@ func (p *MemoryProvider) updateAdmin(admin *Admin) error { for idx := range a.Groups { p.removeAdminFromGroupMapping(a.Username, a.Groups[idx].Name) } - sort.Slice(admin.Groups, func(i, j int) bool { - return admin.Groups[i].Name < admin.Groups[j].Name - }) for idx := range admin.Groups { if err = p.addAdminToGroupMapping(admin.Username, admin.Groups[idx].Name); err != nil { // try to add old mapping @@ -1054,9 +1064,6 @@ func (p *MemoryProvider) addGroup(group *Group) error { group.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now()) group.Users = nil group.Admins = nil - sort.Slice(group.VirtualFolders, func(i, j int) bool { - return group.VirtualFolders[i].Name < group.VirtualFolders[j].Name - }) var mappedFolders []string for idx := range group.VirtualFolders { if err = p.addGroupToFolderMapping(group.Name, group.VirtualFolders[idx].Name); err != nil { @@ -1090,9 +1097,6 @@ func (p *MemoryProvider) updateGroup(group *Group) error { for _, oldFolder := range g.VirtualFolders { p.removeRelationFromFolderMapping(oldFolder.Name, "", g.Name) } - sort.Slice(group.VirtualFolders, func(i, j int) bool { - return group.VirtualFolders[i].Name < group.VirtualFolders[j].Name - }) for idx := range group.VirtualFolders { if err = p.addGroupToFolderMapping(group.Name, group.VirtualFolders[idx].Name); err != nil { // try to add old mapping @@ -1210,7 +1214,7 @@ func (p *MemoryProvider) addRuleToActionMapping(ruleName, actionName string) err if err != nil { return util.NewGenericError(fmt.Sprintf("action %q does not exist", actionName)) } - if !util.Contains(a.Rules, ruleName) { + if !slices.Contains(a.Rules, ruleName) { a.Rules = append(a.Rules, ruleName) p.dbHandle.actions[actionName] = a } @@ -1223,7 +1227,7 @@ func (p *MemoryProvider) removeRuleFromActionMapping(ruleName, actionName string providerLog(logger.LevelWarn, "action %q does not exist, cannot remove from mapping", actionName) return } - if util.Contains(a.Rules, ruleName) { + if slices.Contains(a.Rules, ruleName) { var rules []string for _, r := range a.Rules { if r != ruleName { @@ -1240,7 +1244,7 @@ func (p *MemoryProvider) addAdminToGroupMapping(username, groupname string) erro if err != nil { return err } - if !util.Contains(g.Admins, username) { + if !slices.Contains(g.Admins, username) { g.Admins = append(g.Admins, username) p.dbHandle.groups[groupname] = g } @@ -1283,7 +1287,7 @@ func (p *MemoryProvider) addUserToGroupMapping(username, groupname string) error if err != nil { return err } - if !util.Contains(g.Users, username) { + if !slices.Contains(g.Users, username) { g.Users = append(g.Users, username) p.dbHandle.groups[groupname] = g } @@ -1313,7 +1317,7 @@ func (p *MemoryProvider) addAdminToRole(username, role string) error { if err != nil { return fmt.Errorf("%w: role %q does not exist", ErrForeignKeyViolated, role) } - if !util.Contains(r.Admins, username) { + if !slices.Contains(r.Admins, username) { r.Admins = append(r.Admins, username) p.dbHandle.roles[role] = r } @@ -1347,7 +1351,7 @@ func (p *MemoryProvider) addUserToRole(username, role string) error { if err != nil { return fmt.Errorf("%w: role %q does not exist", ErrForeignKeyViolated, role) } - if !util.Contains(r.Users, username) { + if !slices.Contains(r.Users, username) { r.Users = append(r.Users, username) p.dbHandle.roles[role] = r } @@ -1378,7 +1382,7 @@ func (p *MemoryProvider) addUserToFolderMapping(username, foldername string) err if err != nil { return util.NewGenericError(fmt.Sprintf("unable to get folder %q: %v", foldername, err)) } - if !util.Contains(f.Users, username) { + if !slices.Contains(f.Users, username) { f.Users = append(f.Users, username) p.dbHandle.vfolders[foldername] = f } @@ -1390,7 +1394,7 @@ func (p *MemoryProvider) addGroupToFolderMapping(name, foldername string) error if err != nil { return util.NewGenericError(fmt.Sprintf("unable to get folder %q: %v", foldername, err)) } - if !util.Contains(f.Groups, name) { + if !slices.Contains(f.Groups, name) { f.Groups = append(f.Groups, name) p.dbHandle.vfolders[foldername] = f } @@ -2089,11 +2093,11 @@ func (p *MemoryProvider) addSharedSession(_ Session) error { return ErrNotImplemented } -func (p *MemoryProvider) deleteSharedSession(_ string) error { +func (p *MemoryProvider) deleteSharedSession(_ string, _ SessionType) error { return ErrNotImplemented } -func (p *MemoryProvider) getSharedSession(_ string) (Session, error) { +func (p *MemoryProvider) getSharedSession(_ string, _ SessionType) (Session, error) { return Session{}, ErrNotImplemented } diff --git a/internal/dataprovider/mysql.go b/internal/dataprovider/mysql.go index 659637d9..f6be87b0 100644 --- a/internal/dataprovider/mysql.go +++ b/internal/dataprovider/mysql.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build !nomysql -// +build !nomysql package dataprovider @@ -39,11 +38,11 @@ import ( const ( mysqlResetSQL = "DROP TABLE IF EXISTS `{{api_keys}}` CASCADE;" + - "DROP TABLE IF EXISTS `{{folders_mapping}}` CASCADE;" + "DROP TABLE IF EXISTS `{{users_folders_mapping}}` CASCADE;" + "DROP TABLE IF EXISTS `{{users_groups_mapping}}` CASCADE;" + "DROP TABLE IF EXISTS `{{admins_groups_mapping}}` CASCADE;" + "DROP TABLE IF EXISTS `{{groups_folders_mapping}}` CASCADE;" + + "DROP TABLE IF EXISTS `{{shares_groups_mapping}}` CASCADE;" + "DROP TABLE IF EXISTS `{{admins}}` CASCADE;" + "DROP TABLE IF EXISTS `{{folders}}` CASCADE;" + "DROP TABLE IF EXISTS `{{shares}}` CASCADE;" + @@ -84,8 +83,8 @@ const ( "CREATE TABLE `{{groups}}` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, " + "`name` varchar(255) NOT NULL UNIQUE, `description` varchar(512) NULL, `created_at` bigint NOT NULL, " + "`updated_at` bigint NOT NULL, `user_settings` longtext NULL);" + - "CREATE TABLE `{{shared_sessions}}` (`key` varchar(128) NOT NULL PRIMARY KEY, " + - "`data` longtext NOT NULL, `type` integer NOT NULL, `timestamp` bigint NOT NULL);" + + "CREATE TABLE `{{shared_sessions}}` (`key` varchar(128) NOT NULL, `type` integer NOT NULL, `data` longtext NOT NULL, " + + "`timestamp` bigint NOT NULL, PRIMARY KEY (`key`, `type`));" + "CREATE TABLE `{{users}}` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `username` varchar(255) NOT NULL UNIQUE, " + "`status` integer NOT NULL, `expiration_date` bigint NOT NULL, `description` varchar(512) NULL, `password` longtext NULL, " + "`public_keys` longtext NULL, `home_dir` longtext NOT NULL, `uid` bigint NOT NULL, `gid` bigint NOT NULL, " + @@ -95,38 +94,41 @@ const ( "`last_login` bigint NOT NULL, `filters` longtext NULL, `filesystem` longtext NULL, `additional_info` longtext NULL, " + "`created_at` bigint NOT NULL, `updated_at` bigint NOT NULL, `email` varchar(255) NULL, " + "`upload_data_transfer` integer NOT NULL, `download_data_transfer` integer NOT NULL, " + - "`total_data_transfer` integer NOT NULL, `used_upload_data_transfer` integer NOT NULL, " + - "`used_download_data_transfer` integer NOT NULL, `deleted_at` bigint NOT NULL, `first_download` bigint NOT NULL, " + + "`total_data_transfer` integer NOT NULL, `used_upload_data_transfer` bigint NOT NULL, " + + "`used_download_data_transfer` bigint NOT NULL, `deleted_at` bigint NOT NULL, `first_download` bigint NOT NULL, " + "`first_upload` bigint NOT NULL, `last_password_change` bigint NOT NULL, `role_id` integer NULL);" + "CREATE TABLE `{{groups_folders_mapping}}` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, " + "`group_id` integer NOT NULL, `folder_id` integer NOT NULL, " + - "`virtual_path` longtext NOT NULL, `quota_size` bigint NOT NULL, `quota_files` integer NOT NULL);" + + "`virtual_path` longtext NOT NULL, `quota_size` bigint NOT NULL, `quota_files` integer NOT NULL, `sort_order` integer NOT NULL);" + "CREATE TABLE `{{users_groups_mapping}}` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, " + - "`user_id` integer NOT NULL, `group_id` integer NOT NULL, `group_type` integer NOT NULL);" + + "`user_id` integer NOT NULL, `group_id` integer NOT NULL, `group_type` integer NOT NULL, `sort_order` integer NOT NULL);" + "CREATE TABLE `{{users_folders_mapping}}` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `virtual_path` longtext NOT NULL, " + - "`quota_size` bigint NOT NULL, `quota_files` integer NOT NULL, `folder_id` integer NOT NULL, `user_id` integer NOT NULL);" + + "`quota_size` bigint NOT NULL, `quota_files` integer NOT NULL, `folder_id` integer NOT NULL, `user_id` integer NOT NULL, `sort_order` integer NOT NULL);" + "ALTER TABLE `{{users_folders_mapping}}` ADD CONSTRAINT `{{prefix}}unique_user_folder_mapping` " + "UNIQUE (`user_id`, `folder_id`);" + "ALTER TABLE `{{users_folders_mapping}}` ADD CONSTRAINT `{{prefix}}users_folders_mapping_user_id_fk_users_id` " + "FOREIGN KEY (`user_id`) REFERENCES `{{users}}` (`id`) ON DELETE CASCADE;" + "ALTER TABLE `{{users_folders_mapping}}` ADD CONSTRAINT `{{prefix}}users_folders_mapping_folder_id_fk_folders_id` " + "FOREIGN KEY (`folder_id`) REFERENCES `{{folders}}` (`id`) ON DELETE CASCADE;" + + "CREATE INDEX `{{prefix}}users_folders_mapping_sort_order_idx` ON `{{users_folders_mapping}}` (`sort_order`);" + "ALTER TABLE `{{users_groups_mapping}}` ADD CONSTRAINT `{{prefix}}unique_user_group_mapping` UNIQUE (`user_id`, `group_id`);" + "ALTER TABLE `{{groups_folders_mapping}}` ADD CONSTRAINT `{{prefix}}unique_group_folder_mapping` UNIQUE (`group_id`, `folder_id`);" + "ALTER TABLE `{{users_groups_mapping}}` ADD CONSTRAINT `{{prefix}}users_groups_mapping_group_id_fk_groups_id` " + "FOREIGN KEY (`group_id`) REFERENCES `{{groups}}` (`id`) ON DELETE NO ACTION;" + "ALTER TABLE `{{users_groups_mapping}}` ADD CONSTRAINT `{{prefix}}users_groups_mapping_user_id_fk_users_id` " + "FOREIGN KEY (`user_id`) REFERENCES `{{users}}` (`id`) ON DELETE CASCADE; " + + "CREATE INDEX `{{prefix}}users_groups_mapping_sort_order_idx` ON `{{users_groups_mapping}}` (`sort_order`);" + "ALTER TABLE `{{groups_folders_mapping}}` ADD CONSTRAINT `{{prefix}}groups_folders_mapping_folder_id_fk_folders_id` " + "FOREIGN KEY (`folder_id`) REFERENCES `{{folders}}` (`id`) ON DELETE CASCADE;" + "ALTER TABLE `{{groups_folders_mapping}}` ADD CONSTRAINT `{{prefix}}groups_folders_mapping_group_id_fk_groups_id` " + "FOREIGN KEY (`group_id`) REFERENCES `{{groups}}` (`id`) ON DELETE CASCADE;" + + "CREATE INDEX `{{prefix}}groups_folders_mapping_sort_order_idx` ON `{{groups_folders_mapping}}` (`sort_order`); " + "CREATE TABLE `{{shares}}` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, " + "`share_id` varchar(60) NOT NULL UNIQUE, `name` varchar(255) NOT NULL, `description` varchar(512) NULL, " + "`scope` integer NOT NULL, `paths` longtext NOT NULL, `created_at` bigint NOT NULL, " + "`updated_at` bigint NOT NULL, `last_use_at` bigint NOT NULL, `expires_at` bigint NOT NULL, " + "`password` longtext NULL, `max_tokens` integer NOT NULL, `used_tokens` integer NOT NULL, " + - "`allow_from` longtext NULL, `user_id` integer NOT NULL);" + + "`allow_from` longtext NULL, `options` longtext NULL, `user_id` integer NOT NULL);" + "ALTER TABLE `{{shares}}` ADD CONSTRAINT `{{prefix}}shares_user_id_fk_users_id` " + "FOREIGN KEY (`user_id`) REFERENCES `{{users}}` (`id`) ON DELETE CASCADE;" + "CREATE TABLE `{{api_keys}}` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(255) NOT NULL, `key_id` varchar(50) NOT NULL UNIQUE," + @@ -150,13 +152,14 @@ const ( "ALTER TABLE `{{rules_actions_mapping}}` ADD CONSTRAINT `{{prefix}}rules_actions_mapping_action_id_fk_events_targets_id` " + "FOREIGN KEY (`action_id`) REFERENCES `{{events_actions}}` (`id`) ON DELETE NO ACTION;" + "CREATE TABLE `{{admins_groups_mapping}}` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, " + - " `admin_id` integer NOT NULL, `group_id` integer NOT NULL, `options` longtext NOT NULL);" + + " `admin_id` integer NOT NULL, `group_id` integer NOT NULL, `options` longtext NOT NULL, `sort_order` integer NOT NULL);" + "ALTER TABLE `{{admins_groups_mapping}}` ADD CONSTRAINT `{{prefix}}unique_admin_group_mapping` " + "UNIQUE (`admin_id`, `group_id`);" + "ALTER TABLE `{{admins_groups_mapping}}` ADD CONSTRAINT `{{prefix}}admins_groups_mapping_admin_id_fk_admins_id` " + "FOREIGN KEY (`admin_id`) REFERENCES `{{admins}}` (`id`) ON DELETE CASCADE;" + "ALTER TABLE `{{admins_groups_mapping}}` ADD CONSTRAINT `{{prefix}}admins_groups_mapping_group_id_fk_groups_id` " + "FOREIGN KEY (`group_id`) REFERENCES `{{groups}}` (`id`) ON DELETE CASCADE;" + + "CREATE INDEX `{{prefix}}admins_groups_mapping_sort_order_idx` ON `{{admins_groups_mapping}}` (`sort_order`); " + "CREATE TABLE `{{nodes}}` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, " + "`name` varchar(255) NOT NULL UNIQUE, `data` longtext NOT NULL, `created_at` bigint NOT NULL, " + "`updated_at` bigint NOT NULL);" + @@ -193,11 +196,17 @@ const ( "CREATE INDEX `{{prefix}}ip_lists_updated_at_idx` ON `{{ip_lists}}` (`updated_at`);" + "CREATE INDEX `{{prefix}}ip_lists_deleted_at_idx` ON `{{ip_lists}}` (`deleted_at`);" + "CREATE INDEX `{{prefix}}ip_lists_first_last_idx` ON `{{ip_lists}}` (`first`, `last`);" + - "INSERT INTO {{schema_version}} (version) VALUES (28);" - mysqlV29SQL = "ALTER TABLE `{{users}}` MODIFY `used_download_data_transfer` bigint NOT NULL;" + - "ALTER TABLE `{{users}}` MODIFY `used_upload_data_transfer` bigint NOT NULL;" - mysqlV29DownSQL = "ALTER TABLE `{{users}}` MODIFY `used_upload_data_transfer` integer NOT NULL;" + - "ALTER TABLE `{{users}}` MODIFY `used_download_data_transfer` integer NOT NULL;" + "INSERT INTO {{schema_version}} (version) VALUES (33);" + mysqlV34SQL = "CREATE TABLE `{{shares_groups_mapping}}` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY," + + "`share_id` integer NOT NULL, `group_id` integer NOT NULL, `permissions` integer NOT NULL," + + "`sort_order` integer NOT NULL," + + "CONSTRAINT `{{prefix}}unique_share_group_mapping` UNIQUE (`share_id`, `group_id`)," + + "CONSTRAINT `{{prefix}}shares_groups_mapping_share_id_fk` FOREIGN KEY (`share_id`) REFERENCES `{{shares}}` (`id`) ON DELETE CASCADE," + + "CONSTRAINT `{{prefix}}shares_groups_mapping_group_id_fk` FOREIGN KEY (`group_id`) REFERENCES `{{groups}}` (`id`) ON DELETE CASCADE); " + + "CREATE INDEX `{{prefix}}shares_groups_mapping_sort_order_idx` ON `{{shares_groups_mapping}}` (`sort_order`); " + + "CREATE INDEX `{{prefix}}shares_groups_mapping_share_id_idx` ON `{{shares_groups_mapping}}` (`share_id`); " + + "CREATE INDEX `{{prefix}}shares_groups_mapping_group_id_idx` ON `{{shares_groups_mapping}}` (`group_id`);" + mysqlV34DownSQL = "DROP TABLE IF EXISTS `{{shares_groups_mapping}}`;" ) // MySQLProvider defines the auth provider for MySQL/MariaDB database @@ -329,6 +338,14 @@ func (p *MySQLProvider) getUsedQuota(username string) (int, int64, int64, int64, return sqlCommonGetUsedQuota(username, p.dbHandle) } +func (p *MySQLProvider) getAdminSignature(username string) (string, error) { + return sqlCommonGetAdminSignature(username, p.dbHandle) +} + +func (p *MySQLProvider) getUserSignature(username string) (string, error) { + return sqlCommonGetUserSignature(username, p.dbHandle) +} + func (p *MySQLProvider) setUpdatedAt(username string) { sqlCommonSetUpdatedAt(username, p.dbHandle) } @@ -583,12 +600,12 @@ func (p *MySQLProvider) addSharedSession(session Session) error { return sqlCommonAddSession(session, p.dbHandle) } -func (p *MySQLProvider) deleteSharedSession(key string) error { - return sqlCommonDeleteSession(key, p.dbHandle) +func (p *MySQLProvider) deleteSharedSession(key string, sessionType SessionType) error { + return sqlCommonDeleteSession(key, sessionType, p.dbHandle) } -func (p *MySQLProvider) getSharedSession(key string) (Session, error) { - return sqlCommonGetSession(key, p.dbHandle) +func (p *MySQLProvider) getSharedSession(key string, sessionType SessionType) (Session, error) { + return sqlCommonGetSession(key, sessionType, p.dbHandle) } func (p *MySQLProvider) cleanupSharedSessions(sessionType SessionType, before int64) error { @@ -776,11 +793,11 @@ func (p *MySQLProvider) initializeDatabase() error { if errors.Is(err, sql.ErrNoRows) { return errSchemaVersionEmpty } - logger.InfoToConsole("creating initial database schema, version 28") - providerLog(logger.LevelInfo, "creating initial database schema, version 28") + logger.InfoToConsole("creating initial database schema, version 33") + providerLog(logger.LevelInfo, "creating initial database schema, version 33") initialSQL := sqlReplaceAll(mysqlInitialSQL) - return sqlCommonExecSQLAndUpdateDBVersion(p.dbHandle, strings.Split(initialSQL, ";"), 28, true) + return sqlCommonExecSQLAndUpdateDBVersion(p.dbHandle, strings.Split(initialSQL, ";"), 33, true) } func (p *MySQLProvider) migrateDatabase() error { @@ -793,13 +810,13 @@ func (p *MySQLProvider) migrateDatabase() error { case version == sqlDatabaseVersion: providerLog(logger.LevelDebug, "sql database is up to date, current version: %d", version) return ErrNoInitRequired - case version < 28: - err = fmt.Errorf("database schema version %d is too old, please see the upgrading docs", version) + case version < 33: + err = errSchemaVersionTooOld(version) providerLog(logger.LevelError, "%v", err) logger.ErrorToConsole("%v", err) return err - case version == 28: - return updateMySQLDatabaseFrom28To29(p.dbHandle) + case version == 33: + return updateMySQLDatabaseFromV33(p.dbHandle) default: if version > sqlDatabaseVersion { providerLog(logger.LevelError, "database schema version %d is newer than the supported one: %d", version, @@ -822,8 +839,8 @@ func (p *MySQLProvider) revertDatabase(targetVersion int) error { } switch dbVersion.Version { - case 29: - return downgradeMySQLDatabaseFrom29To28(p.dbHandle) + case 34: + return downgradeMySQLDatabaseFromV34(p.dbHandle) default: return fmt.Errorf("database schema version not handled: %d", dbVersion.Version) } @@ -862,18 +879,29 @@ func (p *MySQLProvider) normalizeError(err error, fieldType int) error { return err } -func updateMySQLDatabaseFrom28To29(dbHandle *sql.DB) error { - logger.InfoToConsole("updating database schema version: 28 -> 29") - providerLog(logger.LevelInfo, "updating database schema version: 28 -> 29") - - sql := strings.ReplaceAll(mysqlV29SQL, "{{users}}", sqlTableUsers) - return sqlCommonExecSQLAndUpdateDBVersion(dbHandle, strings.Split(sql, ";"), 29, true) +func updateMySQLDatabaseFromV33(dbHandle *sql.DB) error { + return updateMySQLDatabaseFrom33To34(dbHandle) } -func downgradeMySQLDatabaseFrom29To28(dbHandle *sql.DB) error { - logger.InfoToConsole("downgrading database schema version: 29 -> 28") - providerLog(logger.LevelInfo, "downgrading database schema version: 29 -> 28") - - sql := strings.ReplaceAll(mysqlV29DownSQL, "{{users}}", sqlTableUsers) - return sqlCommonExecSQLAndUpdateDBVersion(dbHandle, strings.Split(sql, ";"), 28, false) +func downgradeMySQLDatabaseFromV34(dbHandle *sql.DB) error { + return downgradeMySQLDatabaseFrom34To33(dbHandle) +} + +func updateMySQLDatabaseFrom33To34(dbHandle *sql.DB) error { + logger.InfoToConsole("updating database schema version: 33 -> 34") + providerLog(logger.LevelInfo, "updating database schema version: 33 -> 34") + + sql := strings.ReplaceAll(mysqlV34SQL, "{{prefix}}", config.SQLTablesPrefix) + sql = strings.ReplaceAll(sql, "{{shares}}", sqlTableShares) + sql = strings.ReplaceAll(sql, "{{shares_groups_mapping}}", sqlTableSharesGroupsMapping) + sql = strings.ReplaceAll(sql, "{{groups}}", sqlTableGroups) + return sqlCommonExecSQLAndUpdateDBVersion(dbHandle, strings.Split(sql, ";"), 34, true) +} + +func downgradeMySQLDatabaseFrom34To33(dbHandle *sql.DB) error { + logger.InfoToConsole("downgrading database schema version: 34 -> 33") + providerLog(logger.LevelInfo, "downgrading database schema version: 34 -> 33") + + sql := strings.ReplaceAll(mysqlV34DownSQL, "{{shares_groups_mapping}}", sqlTableSharesGroupsMapping) + return sqlCommonExecSQLAndUpdateDBVersion(dbHandle, strings.Split(sql, ";"), 33, false) } diff --git a/internal/dataprovider/mysql_disabled.go b/internal/dataprovider/mysql_disabled.go index c6c09ded..203092b2 100644 --- a/internal/dataprovider/mysql_disabled.go +++ b/internal/dataprovider/mysql_disabled.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build nomysql -// +build nomysql package dataprovider diff --git a/internal/dataprovider/node.go b/internal/dataprovider/node.go index a1c8b2c4..4b8fc803 100644 --- a/internal/dataprovider/node.go +++ b/internal/dataprovider/node.go @@ -17,21 +17,21 @@ package dataprovider import ( "bytes" "context" + "crypto/sha256" + "encoding/hex" "encoding/json" "errors" "fmt" - "hash/fnv" "io" "net/http" "strconv" "strings" "time" - "github.com/lestrrat-go/jwx/v2/jwa" - "github.com/lestrrat-go/jwx/v2/jwt" - "github.com/rs/xid" + "github.com/go-jose/go-jose/v4" "github.com/drakkan/sftpgo/v2/internal/httpclient" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/kms" "github.com/drakkan/sftpgo/v2/internal/logger" "github.com/drakkan/sftpgo/v2/internal/util" @@ -45,7 +45,8 @@ const ( const ( // NodeTokenHeader defines the header to use for the node auth token - NodeTokenHeader = "X-SFTPGO-Node" + NodeTokenHeader = "X-SFTPGO-Node" + nodeTokenAudience = "node" ) var ( @@ -99,7 +100,7 @@ func (n *NodeData) validate() error { if n.Proto != NodeProtoHTTP && n.Proto != NodeProtoHTTPS { return util.NewValidationError(fmt.Sprintf("invalid node proto: %s", n.Proto)) } - n.Key = kms.NewPlainSecret(util.BytesToString(util.GenerateRandomBytes(32))) + n.Key = kms.NewPlainSecret(util.GenerateOpaqueString()) n.Key.SetAdditionalData(n.Host) if err := n.Key.Encrypt(); err != nil { return fmt.Errorf("unable to encrypt node key: %w", err) @@ -108,12 +109,12 @@ func (n *NodeData) validate() error { } func (n *NodeData) getNodeName() string { - h := fnv.New64a() + h := sha256.New() var b bytes.Buffer - b.WriteString(fmt.Sprintf("%s:%d", n.Host, n.Port)) + fmt.Fprintf(&b, "%s:%d", n.Host, n.Port) h.Write(b.Bytes()) - return strconv.FormatUint(h.Sum64(), 10) + return hex.EncodeToString(h.Sum(nil)) } // Node defines a cluster node @@ -131,33 +132,26 @@ func (n *Node) validate() error { return n.Data.validate() } -func (n *Node) authenticate(token string) (string, string, error) { +func (n *Node) authenticate(token string) (*jwt.Claims, error) { if err := n.Data.Key.TryDecrypt(); err != nil { providerLog(logger.LevelError, "unable to decrypt node key: %v", err) - return "", "", err + return nil, err } if token == "" { - return "", "", ErrInvalidCredentials + return nil, ErrInvalidCredentials } - t, err := jwt.Parse([]byte(token), jwt.WithKey(jwa.HS256, []byte(n.Data.Key.GetPayload())), jwt.WithValidate(true)) + claims, err := jwt.VerifyTokenWithKey(token, []jose.SignatureAlgorithm{jose.HS256}, []byte(n.Data.Key.GetPayload())) if err != nil { - return "", "", fmt.Errorf("unable to parse and validate token: %v", err) + return nil, fmt.Errorf("unable to parse and validate token: %v", err) } - var adminUsername, role string - if admin, ok := t.Get("admin"); ok { - if val, ok := admin.(string); ok && val != "" { - adminUsername = val - } + if claims.Username == "" { + return nil, errors.New("no admin username associated with node token") } - if adminUsername == "" { - return "", "", errors.New("no admin username associated with node token") + if !claims.Audience.Contains(nodeTokenAudience) { + return nil, errors.New("invalid node token audience") } - if r, ok := t.Get("role"); ok { - if val, ok := r.(string); ok && val != "" { - role = val - } - } - return adminUsername, role, nil + + return claims, nil } // getBaseURL returns the base URL for this node @@ -174,35 +168,37 @@ func (n *Node) getBaseURL() string { } // generateAuthToken generates a new auth token -func (n *Node) generateAuthToken(username, role string) (string, error) { +func (n *Node) generateAuthToken(username, role string, permissions []string) (string, error) { if err := n.Data.Key.TryDecrypt(); err != nil { return "", fmt.Errorf("unable to decrypt node key: %w", err) } - now := time.Now().UTC() - - t := jwt.New() - t.Set("admin", username) //nolint:errcheck - t.Set("role", role) //nolint:errcheck - t.Set(jwt.JwtIDKey, xid.New().String()) //nolint:errcheck - t.Set(jwt.NotBeforeKey, now.Add(-30*time.Second)) //nolint:errcheck - t.Set(jwt.ExpirationKey, now.Add(1*time.Minute)) //nolint:errcheck - - payload, err := jwt.Sign(t, jwt.WithKey(jwa.HS256, []byte(n.Data.Key.GetPayload()))) + signer, err := jwt.NewSigner(jose.HS256, []byte(n.Data.Key.GetPayload())) + if err != nil { + return "", fmt.Errorf("unable to create signer: %w", err) + } + claims := &jwt.Claims{ + Username: username, + Role: role, + Permissions: permissions, + } + claims.Audience = []string{nodeTokenAudience} + claims.SetExpiry(time.Now().Add(1 * time.Minute)) + payload, err := signer.Sign(claims) if err != nil { return "", fmt.Errorf("unable to sign authentication token: %w", err) } - return util.BytesToString(payload), nil + return payload, nil } func (n *Node) prepareRequest(ctx context.Context, username, role, relativeURL, method string, - body io.Reader, + permissions []string, body io.Reader, ) (*http.Request, error) { url := fmt.Sprintf("%s%s", n.getBaseURL(), relativeURL) req, err := http.NewRequestWithContext(ctx, method, url, body) if err != nil { return nil, err } - token, err := n.generateAuthToken(username, role) + token, err := n.generateAuthToken(username, role, permissions) if err != nil { return nil, err } @@ -212,11 +208,11 @@ func (n *Node) prepareRequest(ctx context.Context, username, role, relativeURL, // SendGetRequest sends an HTTP GET request to this node. // The responseHolder must be a pointer -func (n *Node) SendGetRequest(username, role, relativeURL string, responseHolder any) error { +func (n *Node) SendGetRequest(username, role, relativeURL string, permissions []string, responseHolder any) error { ctx, cancel := context.WithTimeout(context.Background(), nodeReqTimeout) defer cancel() - req, err := n.prepareRequest(ctx, username, role, relativeURL, http.MethodGet, nil) + req, err := n.prepareRequest(ctx, username, role, relativeURL, http.MethodGet, permissions, nil) if err != nil { return err } @@ -244,11 +240,11 @@ func (n *Node) SendGetRequest(username, role, relativeURL string, responseHolder } // SendDeleteRequest sends an HTTP DELETE request to this node -func (n *Node) SendDeleteRequest(username, role, relativeURL string) error { +func (n *Node) SendDeleteRequest(username, role, relativeURL string, permissions []string) error { ctx, cancel := context.WithTimeout(context.Background(), nodeReqTimeout) defer cancel() - req, err := n.prepareRequest(ctx, username, role, relativeURL, http.MethodDelete, nil) + req, err := n.prepareRequest(ctx, username, role, relativeURL, http.MethodDelete, permissions, nil) if err != nil { return err } @@ -268,9 +264,9 @@ func (n *Node) SendDeleteRequest(username, role, relativeURL string) error { } // AuthenticateNodeToken check the validity of the provided token -func AuthenticateNodeToken(token string) (string, string, error) { +func AuthenticateNodeToken(token string) (*jwt.Claims, error) { if currentNode == nil { - return "", "", errNoClusterNodes + return nil, errNoClusterNodes } return currentNode.authenticate(token) } diff --git a/internal/dataprovider/pgsql.go b/internal/dataprovider/pgsql.go index 3e7d69d2..c4f7c93a 100644 --- a/internal/dataprovider/pgsql.go +++ b/internal/dataprovider/pgsql.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build !nopgsql -// +build !nopgsql package dataprovider @@ -24,6 +23,7 @@ import ( "errors" "fmt" "net" + "slices" "strconv" "strings" "time" @@ -40,11 +40,11 @@ import ( const ( pgsqlResetSQL = `DROP TABLE IF EXISTS "{{api_keys}}" CASCADE; -DROP TABLE IF EXISTS "{{folders_mapping}}" CASCADE; DROP TABLE IF EXISTS "{{users_folders_mapping}}" CASCADE; DROP TABLE IF EXISTS "{{users_groups_mapping}}" CASCADE; DROP TABLE IF EXISTS "{{admins_groups_mapping}}" CASCADE; DROP TABLE IF EXISTS "{{groups_folders_mapping}}" CASCADE; +DROP TABLE IF EXISTS "{{shares_groups_mapping}}" CASCADE; DROP TABLE IF EXISTS "{{admins}}" CASCADE; DROP TABLE IF EXISTS "{{folders}}" CASCADE; DROP TABLE IF EXISTS "{{shares}}" CASCADE; @@ -85,8 +85,8 @@ CREATE TABLE "{{folders}}" ("id" integer NOT NULL PRIMARY KEY GENERATED ALWAYS A "filesystem" text NULL); CREATE TABLE "{{groups}}" ("id" integer NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY, "name" varchar(255) NOT NULL UNIQUE, "description" varchar(512) NULL, "created_at" bigint NOT NULL, "updated_at" bigint NOT NULL, "user_settings" text NULL); -CREATE TABLE "{{shared_sessions}}" ("key" varchar(128) NOT NULL PRIMARY KEY, -"data" text NOT NULL, "type" integer NOT NULL, "timestamp" bigint NOT NULL); +CREATE TABLE "{{shared_sessions}}" ("key" varchar(128) NOT NULL, "type" integer NOT NULL, +"data" text NOT NULL, "timestamp" bigint NOT NULL, PRIMARY KEY ("key", "type")); CREATE TABLE "{{users}}" ("id" integer NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY, "username" varchar(255) NOT NULL UNIQUE, "status" integer NOT NULL, "expiration_date" bigint NOT NULL, "description" varchar(512) NULL, "password" text NULL, "public_keys" text NULL, "home_dir" text NOT NULL, "uid" bigint NOT NULL, "gid" bigint NOT NULL, "max_sessions" integer NOT NULL, @@ -95,14 +95,14 @@ CREATE TABLE "{{users}}" ("id" integer NOT NULL PRIMARY KEY GENERATED ALWAYS AS "download_bandwidth" integer NOT NULL, "last_login" bigint NOT NULL, "filters" text NULL, "filesystem" text NULL, "additional_info" text NULL, "created_at" bigint NOT NULL, "updated_at" bigint NOT NULL, "email" varchar(255) NULL, "upload_data_transfer" integer NOT NULL, "download_data_transfer" integer NOT NULL, "total_data_transfer" integer NOT NULL, -"used_upload_data_transfer" integer NOT NULL, "used_download_data_transfer" integer NOT NULL, "deleted_at" bigint NOT NULL, +"used_upload_data_transfer" bigint NOT NULL, "used_download_data_transfer" bigint NOT NULL, "deleted_at" bigint NOT NULL, "first_download" bigint NOT NULL, "first_upload" bigint NOT NULL, "last_password_change" bigint NOT NULL, "role_id" integer NULL); CREATE TABLE "{{groups_folders_mapping}}" ("id" integer NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY, "group_id" integer NOT NULL, -"folder_id" integer NOT NULL, "virtual_path" text NOT NULL, "quota_size" bigint NOT NULL, "quota_files" integer NOT NULL); +"folder_id" integer NOT NULL, "virtual_path" text NOT NULL, "quota_size" bigint NOT NULL, "quota_files" integer NOT NULL, "sort_order" integer NOT NULL); CREATE TABLE "{{users_groups_mapping}}" ("id" integer NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY, "user_id" integer NOT NULL, -"group_id" integer NOT NULL, "group_type" integer NOT NULL); +"group_id" integer NOT NULL, "group_type" integer NOT NULL, "sort_order" integer NOT NULL); CREATE TABLE "{{users_folders_mapping}}" ("id" integer NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY, "virtual_path" text NOT NULL, -"quota_size" bigint NOT NULL, "quota_files" integer NOT NULL, "folder_id" integer NOT NULL, "user_id" integer NOT NULL); +"quota_size" bigint NOT NULL, "quota_files" integer NOT NULL, "sort_order" integer NOT NULL, "folder_id" integer NOT NULL, "user_id" integer NOT NULL); ALTER TABLE "{{users_folders_mapping}}" ADD CONSTRAINT "{{prefix}}unique_user_folder_mapping" UNIQUE ("user_id", "folder_id"); ALTER TABLE "{{users_folders_mapping}}" ADD CONSTRAINT "{{prefix}}users_folders_mapping_folder_id_fk_folders_id" FOREIGN KEY ("folder_id") REFERENCES "{{folders}}" ("id") MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE; @@ -112,7 +112,7 @@ CREATE TABLE "{{shares}}" ("id" integer NOT NULL PRIMARY KEY GENERATED ALWAYS AS "share_id" varchar(60) NOT NULL UNIQUE, "name" varchar(255) NOT NULL, "description" varchar(512) NULL, "scope" integer NOT NULL, "paths" text NOT NULL, "created_at" bigint NOT NULL, "updated_at" bigint NOT NULL, "last_use_at" bigint NOT NULL, "expires_at" bigint NOT NULL, "password" text NULL, -"max_tokens" integer NOT NULL, "used_tokens" integer NOT NULL, "allow_from" text NULL, +"max_tokens" integer NOT NULL, "used_tokens" integer NOT NULL, "allow_from" text NULL, "options" text NULL, "user_id" integer NOT NULL); ALTER TABLE "{{shares}}" ADD CONSTRAINT "{{prefix}}shares_user_id_fk_users_id" FOREIGN KEY ("user_id") REFERENCES "{{users}}" ("id") MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE; @@ -132,12 +132,14 @@ FOREIGN KEY ("group_id") REFERENCES "{{groups}}" ("id") MATCH SIMPLE ON UPDATE N CREATE INDEX "{{prefix}}users_groups_mapping_user_id_idx" ON "{{users_groups_mapping}}" ("user_id"); ALTER TABLE "{{users_groups_mapping}}" ADD CONSTRAINT "{{prefix}}users_groups_mapping_user_id_fk_users_id" FOREIGN KEY ("user_id") REFERENCES "{{users}}" ("id") MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE; +CREATE INDEX "{{prefix}}users_groups_mapping_sort_order_idx" ON "{{users_groups_mapping}}" ("sort_order"); CREATE INDEX "{{prefix}}groups_folders_mapping_folder_id_idx" ON "{{groups_folders_mapping}}" ("folder_id"); ALTER TABLE "{{groups_folders_mapping}}" ADD CONSTRAINT "{{prefix}}groups_folders_mapping_folder_id_fk_folders_id" FOREIGN KEY ("folder_id") REFERENCES "{{folders}}" ("id") MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE; CREATE INDEX "{{prefix}}groups_folders_mapping_group_id_idx" ON "{{groups_folders_mapping}}" ("group_id"); ALTER TABLE "{{groups_folders_mapping}}" ADD CONSTRAINT "{{prefix}}groups_folders_mapping_group_id_fk_groups_id" FOREIGN KEY ("group_id") REFERENCES "{{groups}}" ("id") MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE; +CREATE INDEX "{{prefix}}groups_folders_mapping_sort_order_idx" ON "{{groups_folders_mapping}}" ("sort_order"); CREATE TABLE "{{events_rules}}" ("id" integer NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY, "name" varchar(255) NOT NULL UNIQUE, "status" integer NOT NULL, "description" varchar(512) NULL, "created_at" bigint NOT NULL, "updated_at" bigint NOT NULL, "trigger" integer NOT NULL, "conditions" text NOT NULL, "deleted_at" bigint NOT NULL); @@ -153,7 +155,7 @@ FOREIGN KEY ("rule_id") REFERENCES "{{events_rules}}" ("id") MATCH SIMPLE ON UPD ALTER TABLE "{{rules_actions_mapping}}" ADD CONSTRAINT "{{prefix}}rules_actions_mapping_action_id_fk_events_targets_id" FOREIGN KEY ("action_id") REFERENCES "{{events_actions}}" ("id") MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION; CREATE TABLE "{{admins_groups_mapping}}" ("id" integer NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY, -"admin_id" integer NOT NULL, "group_id" integer NOT NULL, "options" text NOT NULL); +"admin_id" integer NOT NULL, "group_id" integer NOT NULL, "options" text NOT NULL, "sort_order" integer NOT NULL); ALTER TABLE "{{admins_groups_mapping}}" ADD CONSTRAINT "{{prefix}}unique_admin_group_mapping" UNIQUE ("admin_id", "group_id"); ALTER TABLE "{{admins_groups_mapping}}" ADD CONSTRAINT "{{prefix}}admins_groups_mapping_admin_id_fk_admins_id" FOREIGN KEY ("admin_id") REFERENCES "{{admins}}" ("id") MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE; @@ -176,6 +178,7 @@ CREATE TABLE "{{configs}}" ("id" integer NOT NULL PRIMARY KEY GENERATED ALWAYS A INSERT INTO {{configs}} (configs) VALUES ('{}'); CREATE INDEX "{{prefix}}users_folders_mapping_folder_id_idx" ON "{{users_folders_mapping}}" ("folder_id"); CREATE INDEX "{{prefix}}users_folders_mapping_user_id_idx" ON "{{users_folders_mapping}}" ("user_id"); +CREATE INDEX "{{prefix}}users_folders_mapping_sort_order_idx" ON "{{users_folders_mapping}}" ("sort_order"); CREATE INDEX "{{prefix}}api_keys_admin_id_idx" ON "{{api_keys}}" ("admin_id"); CREATE INDEX "{{prefix}}api_keys_user_id_idx" ON "{{api_keys}}" ("user_id"); CREATE INDEX "{{prefix}}users_updated_at_idx" ON "{{users}}" ("updated_at"); @@ -198,6 +201,7 @@ CREATE INDEX "{{prefix}}rules_actions_mapping_action_id_idx" ON "{{rules_actions CREATE INDEX "{{prefix}}rules_actions_mapping_order_idx" ON "{{rules_actions_mapping}}" ("order"); CREATE INDEX "{{prefix}}admins_groups_mapping_admin_id_idx" ON "{{admins_groups_mapping}}" ("admin_id"); CREATE INDEX "{{prefix}}admins_groups_mapping_group_id_idx" ON "{{admins_groups_mapping}}" ("group_id"); +CREATE INDEX "{{prefix}}admins_groups_mapping_sort_order_idx" ON "{{admins_groups_mapping}}" ("sort_order"); CREATE INDEX "{{prefix}}admins_role_id_idx" ON "{{admins}}" ("role_id"); CREATE INDEX "{{prefix}}users_role_id_idx" ON "{{users}}" ("role_id"); CREATE INDEX "{{prefix}}ip_lists_type_idx" ON "{{ip_lists}}" ("type"); @@ -205,16 +209,24 @@ CREATE INDEX "{{prefix}}ip_lists_ipornet_idx" ON "{{ip_lists}}" ("ipornet"); CREATE INDEX "{{prefix}}ip_lists_updated_at_idx" ON "{{ip_lists}}" ("updated_at"); CREATE INDEX "{{prefix}}ip_lists_deleted_at_idx" ON "{{ip_lists}}" ("deleted_at"); CREATE INDEX "{{prefix}}ip_lists_first_last_idx" ON "{{ip_lists}}" ("first", "last"); -INSERT INTO {{schema_version}} (version) VALUES (28); +INSERT INTO {{schema_version}} (version) VALUES (33); ` // not supported in CockroachDB ipListsLikeIndex = `CREATE INDEX "{{prefix}}ip_lists_ipornet_like_idx" ON "{{ip_lists}}" ("ipornet" varchar_pattern_ops);` - pgsqlV29SQL = `ALTER TABLE "{{users}}" ALTER COLUMN "used_download_data_transfer" TYPE bigint; -ALTER TABLE "{{users}}" ALTER COLUMN "used_upload_data_transfer" TYPE bigint; -` - pgsqlV29DownSQL = `ALTER TABLE "{{users}}" ALTER COLUMN "used_upload_data_transfer" TYPE integer; -ALTER TABLE "{{users}}" ALTER COLUMN "used_download_data_transfer" TYPE integer; + pgsqlV34SQL = `CREATE TABLE "{{shares_groups_mapping}}" ( +"id" integer NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, +"share_id" integer NOT NULL, +"group_id" integer NOT NULL, +"permissions" integer NOT NULL, +"sort_order" integer NOT NULL, +CONSTRAINT "{{prefix}}unique_share_group_mapping" UNIQUE ("share_id", "group_id"), +CONSTRAINT "{{prefix}}shares_groups_mapping_share_id_fk" FOREIGN KEY ("share_id") REFERENCES "{{shares}}"("id") ON DELETE CASCADE, +CONSTRAINT "{{prefix}}shares_groups_mapping_group_id_fk" FOREIGN KEY ("group_id") REFERENCES "{{groups}}"("id") ON DELETE CASCADE); +CREATE INDEX "{{prefix}}shares_groups_mapping_sort_order_idx" ON "{{shares_groups_mapping}}" ("sort_order"); +CREATE INDEX "{{prefix}}shares_groups_mapping_share_id_idx" ON "{{shares_groups_mapping}}" ("share_id"); +CREATE INDEX "{{prefix}}shares_groups_mapping_group_id_idx" ON "{{shares_groups_mapping}}" ("group_id"); ` + pgsqlV34DownSQL = `DROP TABLE IF EXISTS "{{shares_groups_mapping}}";` ) var ( @@ -274,7 +286,7 @@ func getPGSQLHostsAndPorts(configHost string, configPort int) (string, string) { defaultPort = "5432" } - for _, hostport := range strings.Split(configHost, ",") { + for hostport := range strings.SplitSeq(configHost, ",") { hostport = strings.TrimSpace(hostport) if hostport == "" { continue @@ -311,7 +323,7 @@ func getPGSQLConnectionString(redactedPwd bool) string { if config.DisableSNI { connectionString += " sslsni=0" } - if util.Contains(pgSQLTargetSessionAttrs, config.TargetSessionAttrs) { + if slices.Contains(pgSQLTargetSessionAttrs, config.TargetSessionAttrs) { connectionString += fmt.Sprintf(" target_session_attrs='%s'", config.TargetSessionAttrs) } } else { @@ -348,6 +360,14 @@ func (p *PGSQLProvider) getUsedQuota(username string) (int, int64, int64, int64, return sqlCommonGetUsedQuota(username, p.dbHandle) } +func (p *PGSQLProvider) getAdminSignature(username string) (string, error) { + return sqlCommonGetAdminSignature(username, p.dbHandle) +} + +func (p *PGSQLProvider) getUserSignature(username string) (string, error) { + return sqlCommonGetUserSignature(username, p.dbHandle) +} + func (p *PGSQLProvider) setUpdatedAt(username string) { sqlCommonSetUpdatedAt(username, p.dbHandle) } @@ -602,12 +622,12 @@ func (p *PGSQLProvider) addSharedSession(session Session) error { return sqlCommonAddSession(session, p.dbHandle) } -func (p *PGSQLProvider) deleteSharedSession(key string) error { - return sqlCommonDeleteSession(key, p.dbHandle) +func (p *PGSQLProvider) deleteSharedSession(key string, sessionType SessionType) error { + return sqlCommonDeleteSession(key, sessionType, p.dbHandle) } -func (p *PGSQLProvider) getSharedSession(key string) (Session, error) { - return sqlCommonGetSession(key, p.dbHandle) +func (p *PGSQLProvider) getSharedSession(key string, sessionType SessionType) (Session, error) { + return sqlCommonGetSession(key, sessionType, p.dbHandle) } func (p *PGSQLProvider) cleanupSharedSessions(sessionType SessionType, before int64) error { @@ -795,8 +815,8 @@ func (p *PGSQLProvider) initializeDatabase() error { if errors.Is(err, sql.ErrNoRows) { return errSchemaVersionEmpty } - logger.InfoToConsole("creating initial database schema, version 28") - providerLog(logger.LevelInfo, "creating initial database schema, version 28") + logger.InfoToConsole("creating initial database schema, version 33") + providerLog(logger.LevelInfo, "creating initial database schema, version 33") var initialSQL string if config.Driver == CockroachDataProviderName { initialSQL = sqlReplaceAll(pgsqlInitial) @@ -805,10 +825,10 @@ func (p *PGSQLProvider) initializeDatabase() error { initialSQL = sqlReplaceAll(pgsqlInitial + ipListsLikeIndex) } - return sqlCommonExecSQLAndUpdateDBVersion(p.dbHandle, []string{initialSQL}, 28, true) + return sqlCommonExecSQLAndUpdateDBVersion(p.dbHandle, []string{initialSQL}, 33, true) } -func (p *PGSQLProvider) migrateDatabase() error { //nolint:dupl +func (p *PGSQLProvider) migrateDatabase() error { dbVersion, err := sqlCommonGetDatabaseVersion(p.dbHandle, true) if err != nil { return err @@ -818,13 +838,13 @@ func (p *PGSQLProvider) migrateDatabase() error { //nolint:dupl case version == sqlDatabaseVersion: providerLog(logger.LevelDebug, "sql database is up to date, current version: %d", version) return ErrNoInitRequired - case version < 28: - err = fmt.Errorf("database schema version %d is too old, please see the upgrading docs", version) + case version < 33: + err = errSchemaVersionTooOld(version) providerLog(logger.LevelError, "%v", err) logger.ErrorToConsole("%v", err) return err - case version == 28: - return updatePGSQLDatabaseFrom28To29(p.dbHandle) + case version == 33: + return updatePGSQLDatabaseFromV33(p.dbHandle) default: if version > sqlDatabaseVersion { providerLog(logger.LevelError, "database schema version %d is newer than the supported one: %d", version, @@ -847,8 +867,8 @@ func (p *PGSQLProvider) revertDatabase(targetVersion int) error { } switch dbVersion.Version { - case 29: - return downgradePGSQLDatabaseFrom29To28(p.dbHandle) + case 34: + return downgradePGSQLDatabaseFromV34(p.dbHandle) default: return fmt.Errorf("database schema version not handled: %d", dbVersion.Version) } @@ -887,18 +907,29 @@ func (p *PGSQLProvider) normalizeError(err error, fieldType int) error { return err } -func updatePGSQLDatabaseFrom28To29(dbHandle *sql.DB) error { - logger.InfoToConsole("updating database schema version: 28 -> 29") - providerLog(logger.LevelInfo, "updating database schema version: 28 -> 29") - - sql := strings.ReplaceAll(pgsqlV29SQL, "{{users}}", sqlTableUsers) - return sqlCommonExecSQLAndUpdateDBVersion(dbHandle, []string{sql}, 29, true) +func updatePGSQLDatabaseFromV33(dbHandle *sql.DB) error { + return updatePGSQLDatabaseFrom33To34(dbHandle) } -func downgradePGSQLDatabaseFrom29To28(dbHandle *sql.DB) error { - logger.InfoToConsole("downgrading database schema version: 29 -> 28") - providerLog(logger.LevelInfo, "downgrading database schema version: 29 -> 28") - - sql := strings.ReplaceAll(pgsqlV29DownSQL, "{{users}}", sqlTableUsers) - return sqlCommonExecSQLAndUpdateDBVersion(dbHandle, []string{sql}, 28, false) +func downgradePGSQLDatabaseFromV34(dbHandle *sql.DB) error { + return downgradePGSQLDatabaseFrom34To33(dbHandle) +} + +func updatePGSQLDatabaseFrom33To34(dbHandle *sql.DB) error { + logger.InfoToConsole("updating database schema version: 33 -> 34") + providerLog(logger.LevelInfo, "updating database schema version: 33 -> 34") + + sql := strings.ReplaceAll(pgsqlV34SQL, "{{prefix}}", config.SQLTablesPrefix) + sql = strings.ReplaceAll(sql, "{{shares}}", sqlTableShares) + sql = strings.ReplaceAll(sql, "{{shares_groups_mapping}}", sqlTableSharesGroupsMapping) + sql = strings.ReplaceAll(sql, "{{groups}}", sqlTableGroups) + return sqlCommonExecSQLAndUpdateDBVersion(dbHandle, []string{sql}, 34, true) +} + +func downgradePGSQLDatabaseFrom34To33(dbHandle *sql.DB) error { + logger.InfoToConsole("downgrading database schema version: 34 -> 33") + providerLog(logger.LevelInfo, "downgrading database schema version: 34 -> 33") + + sql := strings.ReplaceAll(pgsqlV34DownSQL, "{{shares_groups_mapping}}", sqlTableSharesGroupsMapping) + return sqlCommonExecSQLAndUpdateDBVersion(dbHandle, []string{sql}, 33, false) } diff --git a/internal/dataprovider/pgsql_disabled.go b/internal/dataprovider/pgsql_disabled.go index a561c5c9..899b5380 100644 --- a/internal/dataprovider/pgsql_disabled.go +++ b/internal/dataprovider/pgsql_disabled.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build nopgsql -// +build nopgsql package dataprovider diff --git a/internal/dataprovider/role.go b/internal/dataprovider/role.go index dffe0321..5f1154e0 100644 --- a/internal/dataprovider/role.go +++ b/internal/dataprovider/role.go @@ -57,6 +57,9 @@ func (r *Role) validate() error { if r.Name == "" { return util.NewI18nError(util.NewValidationError("name is mandatory"), util.I18nErrorNameRequired) } + if !util.IsNameValid(r.Name) { + return util.NewI18nError(errInvalidInput, util.I18nErrorInvalidInput) + } if len(r.Name) > 255 { return util.NewValidationError("name is too long, 255 is the maximum length allowed") } diff --git a/internal/dataprovider/scheduler.go b/internal/dataprovider/scheduler.go index 71e9ead8..085066a5 100644 --- a/internal/dataprovider/scheduler.go +++ b/internal/dataprovider/scheduler.go @@ -84,11 +84,14 @@ func addScheduledCacheUpdates() error { func checkDataprovider() { if currentNode != nil { - if err := provider.updateNodeTimestamp(); err != nil { + err := provider.updateNodeTimestamp() + if err != nil { providerLog(logger.LevelError, "unable to update node timestamp: %v", err) } else { providerLog(logger.LevelDebug, "node timestamp updated") } + metric.UpdateDataProviderAvailability(err) + return } err := provider.checkAvailability() if err != nil { diff --git a/internal/dataprovider/share.go b/internal/dataprovider/share.go index 7e8a4798..6d2881b0 100644 --- a/internal/dataprovider/share.go +++ b/internal/dataprovider/share.go @@ -89,6 +89,11 @@ func (s *Share) GetAllowedFromAsString() string { return strings.Join(s.AllowFrom, ",") } +// IsPasswordHashed returns true if the password is hashed +func (s *Share) IsPasswordHashed() bool { + return util.IsStringPrefixInSlice(s.Password, hashPwdPrefixes) +} + func (s *Share) getACopy() Share { allowFrom := make([]string, len(s.AllowFrom)) copy(allowFrom, s.AllowFrom) @@ -141,7 +146,7 @@ func (s *Share) HasRedactedPassword() bool { func (s *Share) hashPassword() error { if s.Password != "" && !util.IsStringPrefixInSlice(s.Password, internalHashPwdPrefixes) { - user, err := UserExists(s.Username, "") + user, err := GetUserWithGroupSettings(s.Username, "") if err != nil { return util.NewGenericError(fmt.Sprintf("unable to validate user: %v", err)) } @@ -201,13 +206,16 @@ func (s *Share) validatePaths() error { return nil } -func (s *Share) validate() error { +func (s *Share) validate() error { //nolint:gocyclo if s.ShareID == "" { return util.NewValidationError("share_id is mandatory") } if s.Name == "" { return util.NewI18nError(util.NewValidationError("name is mandatory"), util.I18nErrorNameRequired) } + if !util.IsNameValid(s.Name) { + return util.NewI18nError(errInvalidInput, util.I18nErrorInvalidInput) + } if s.Scope < ShareScopeRead || s.Scope > ShareScopeReadWrite { return util.NewI18nError(util.NewValidationError(fmt.Sprintf("invalid scope: %v", s.Scope)), util.I18nErrorShareScope) } diff --git a/internal/dataprovider/sqlcommon.go b/internal/dataprovider/sqlcommon.go index 3a5e5c1c..768adb31 100644 --- a/internal/dataprovider/sqlcommon.go +++ b/internal/dataprovider/sqlcommon.go @@ -23,6 +23,7 @@ import ( "fmt" "net/netip" "runtime/debug" + "strconv" "strings" "time" @@ -35,7 +36,7 @@ import ( ) const ( - sqlDatabaseVersion = 29 + sqlDatabaseVersion = 34 defaultSQLQueryTimeout = 10 * time.Second longSQLQueryTimeout = 60 * time.Second ) @@ -70,6 +71,7 @@ func sqlReplaceAll(sql string) string { sql = strings.ReplaceAll(sql, "{{groups_folders_mapping}}", sqlTableGroupsFoldersMapping) sql = strings.ReplaceAll(sql, "{{api_keys}}", sqlTableAPIKeys) sql = strings.ReplaceAll(sql, "{{shares}}", sqlTableShares) + sql = strings.ReplaceAll(sql, "{{shares_groups_mapping}}", sqlTableSharesGroupsMapping) sql = strings.ReplaceAll(sql, "{{defender_events}}", sqlTableDefenderEvents) sql = strings.ReplaceAll(sql, "{{defender_hosts}}", sqlTableDefenderHosts) sql = strings.ReplaceAll(sql, "{{active_transfers}}", sqlTableActiveTransfers) @@ -1248,6 +1250,32 @@ func sqlCommonUpdateQuota(username string, filesAdd int, sizeAdd int64, reset bo return err } +func sqlCommonGetAdminSignature(username string, dbHandle *sql.DB) (string, error) { + ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout) + defer cancel() + + q := getAdminSignatureQuery() + var updatedAt int64 + err := dbHandle.QueryRowContext(ctx, q, username).Scan(&updatedAt) + if err != nil { + return "", err + } + return strconv.FormatInt(updatedAt, 10), nil +} + +func sqlCommonGetUserSignature(username string, dbHandle *sql.DB) (string, error) { + ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout) + defer cancel() + + q := getUserSignatureQuery() + var updatedAt int64 + err := dbHandle.QueryRowContext(ctx, q, username).Scan(&updatedAt) + if err != nil { + return "", err + } + return strconv.FormatInt(updatedAt, 10), nil +} + func sqlCommonGetUsedQuota(username string, dbHandle *sql.DB) (int, int64, int64, int64, error) { ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout) defer cancel() @@ -2496,9 +2524,9 @@ func sqlCommonClearUserGroupMapping(ctx context.Context, user *User, dbHandle sq return err } -func sqlCommonAddUserFolderMapping(ctx context.Context, user *User, folder *vfs.VirtualFolder, dbHandle sqlQuerier) error { +func sqlCommonAddUserFolderMapping(ctx context.Context, user *User, folder *vfs.VirtualFolder, sortOrder int, dbHandle sqlQuerier) error { q := getAddUserFolderMappingQuery() - _, err := dbHandle.ExecContext(ctx, q, folder.VirtualPath, folder.QuotaSize, folder.QuotaFiles, folder.Name, user.Username) + _, err := dbHandle.ExecContext(ctx, q, folder.VirtualPath, folder.QuotaSize, folder.QuotaFiles, folder.Name, user.Username, sortOrder) return err } @@ -2508,27 +2536,29 @@ func sqlCommonClearAdminGroupMapping(ctx context.Context, admin *Admin, dbHandle return err } -func sqlCommonAddGroupFolderMapping(ctx context.Context, group *Group, folder *vfs.VirtualFolder, dbHandle sqlQuerier) error { +func sqlCommonAddGroupFolderMapping(ctx context.Context, group *Group, folder *vfs.VirtualFolder, sortOrder int, + dbHandle sqlQuerier, +) error { q := getAddGroupFolderMappingQuery() - _, err := dbHandle.ExecContext(ctx, q, folder.VirtualPath, folder.QuotaSize, folder.QuotaFiles, folder.Name, group.Name) + _, err := dbHandle.ExecContext(ctx, q, folder.VirtualPath, folder.QuotaSize, folder.QuotaFiles, folder.Name, group.Name, sortOrder) return err } -func sqlCommonAddUserGroupMapping(ctx context.Context, username, groupName string, groupType int, dbHandle sqlQuerier) error { +func sqlCommonAddUserGroupMapping(ctx context.Context, username, groupName string, groupType, sortOrder int, dbHandle sqlQuerier) error { q := getAddUserGroupMappingQuery() - _, err := dbHandle.ExecContext(ctx, q, username, groupName, groupType) + _, err := dbHandle.ExecContext(ctx, q, username, groupName, groupType, sortOrder) return err } func sqlCommonAddAdminGroupMapping(ctx context.Context, username, groupName string, mappingOptions AdminGroupMappingOptions, - dbHandle sqlQuerier, + sortOrder int, dbHandle sqlQuerier, ) error { options, err := json.Marshal(mappingOptions) if err != nil { return err } q := getAddAdminGroupMappingQuery() - _, err = dbHandle.ExecContext(ctx, q, username, groupName, options) + _, err = dbHandle.ExecContext(ctx, q, username, groupName, options, sortOrder) return err } @@ -2539,7 +2569,7 @@ func generateGroupVirtualFoldersMapping(ctx context.Context, group *Group, dbHan } for idx := range group.VirtualFolders { vfolder := &group.VirtualFolders[idx] - err = sqlCommonAddGroupFolderMapping(ctx, group, vfolder, dbHandle) + err = sqlCommonAddGroupFolderMapping(ctx, group, vfolder, idx, dbHandle) if err != nil { return err } @@ -2554,7 +2584,7 @@ func generateUserVirtualFoldersMapping(ctx context.Context, user *User, dbHandle } for idx := range user.VirtualFolders { vfolder := &user.VirtualFolders[idx] - err = sqlCommonAddUserFolderMapping(ctx, user, vfolder, dbHandle) + err = sqlCommonAddUserFolderMapping(ctx, user, vfolder, idx, dbHandle) if err != nil { return err } @@ -2567,8 +2597,8 @@ func generateUserGroupMapping(ctx context.Context, user *User, dbHandle sqlQueri if err != nil { return err } - for _, group := range user.Groups { - err = sqlCommonAddUserGroupMapping(ctx, user.Username, group.Name, group.Type, dbHandle) + for idx, group := range user.Groups { + err = sqlCommonAddUserGroupMapping(ctx, user.Username, group.Name, group.Type, idx, dbHandle) if err != nil { return err } @@ -2581,8 +2611,8 @@ func generateAdminGroupMapping(ctx context.Context, admin *Admin, dbHandle sqlQu if err != nil { return err } - for _, group := range admin.Groups { - err = sqlCommonAddAdminGroupMapping(ctx, admin.Username, group.Name, group.Options, dbHandle) + for idx, group := range admin.Groups { + err = sqlCommonAddAdminGroupMapping(ctx, admin.Username, group.Name, group.Options, idx, dbHandle) if err != nil { return err } @@ -3238,14 +3268,14 @@ func sqlCommonAddSession(session Session, dbHandle *sql.DB) error { return err } -func sqlCommonGetSession(key string, dbHandle sqlQuerier) (Session, error) { +func sqlCommonGetSession(key string, sessionType SessionType, dbHandle sqlQuerier) (Session, error) { var session Session ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout) defer cancel() q := getSessionQuery() var data []byte // type hint, some driver will use string instead of []byte if the type is any - err := dbHandle.QueryRowContext(ctx, q, key).Scan(&session.Key, &data, &session.Type, &session.Timestamp) + err := dbHandle.QueryRowContext(ctx, q, key, sessionType).Scan(&session.Key, &data, &session.Type, &session.Timestamp) if err != nil { if errors.Is(err, sql.ErrNoRows) { return session, util.NewRecordNotFoundError(err.Error()) @@ -3256,12 +3286,12 @@ func sqlCommonGetSession(key string, dbHandle sqlQuerier) (Session, error) { return session, nil } -func sqlCommonDeleteSession(key string, dbHandle *sql.DB) error { +func sqlCommonDeleteSession(key string, sessionType SessionType, dbHandle *sql.DB) error { ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout) defer cancel() q := getDeleteSessionQuery() - res, err := dbHandle.ExecContext(ctx, q, key) + res, err := dbHandle.ExecContext(ctx, q, key, sessionType) if err != nil { return err } @@ -3936,16 +3966,22 @@ func sqlCommonUpdateDatabaseVersion(ctx context.Context, dbHandle sqlQuerier, ve } func sqlCommonExecSQLAndUpdateDBVersion(dbHandle *sql.DB, sqlQueries []string, newVersion int, isUp bool) error { - if err := sqlAcquireLock(dbHandle); err != nil { - return err - } - defer sqlReleaseLock(dbHandle) - ctx, cancel := context.WithTimeout(context.Background(), longSQLQueryTimeout) defer cancel() + conn, err := dbHandle.Conn(ctx) + if err != nil { + return fmt.Errorf("unable to get connection from pool: %w", err) + } + defer conn.Close() + + if err := sqlAcquireLock(conn); err != nil { + return err + } + defer sqlReleaseLock(conn) + if newVersion > 0 { - currentVersion, err := sqlCommonGetDatabaseVersion(dbHandle, false) + currentVersion, err := sqlCommonGetDatabaseVersion(conn, false) if err == nil { if (isUp && currentVersion.Version >= newVersion) || (!isUp && currentVersion.Version <= newVersion) { providerLog(logger.LevelInfo, "current schema version: %v, requested: %v, did you execute simultaneous migrations?", @@ -3955,7 +3991,7 @@ func sqlCommonExecSQLAndUpdateDBVersion(dbHandle *sql.DB, sqlQueries []string, n } } - return sqlCommonExecuteTx(ctx, dbHandle, func(tx *sql.Tx) error { + return sqlCommonExecuteTxOnConn(ctx, conn, func(tx *sql.Tx) error { for _, q := range sqlQueries { if strings.TrimSpace(q) == "" { continue @@ -3972,7 +4008,7 @@ func sqlCommonExecSQLAndUpdateDBVersion(dbHandle *sql.DB, sqlQueries []string, n }) } -func sqlAcquireLock(dbHandle *sql.DB) error { +func sqlAcquireLock(dbHandle *sql.Conn) error { ctx, cancel := context.WithTimeout(context.Background(), longSQLQueryTimeout) defer cancel() @@ -4001,7 +4037,7 @@ func sqlAcquireLock(dbHandle *sql.DB) error { return nil } -func sqlReleaseLock(dbHandle *sql.DB) { +func sqlReleaseLock(dbHandle *sql.Conn) { ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout) defer cancel() @@ -4023,6 +4059,20 @@ func sqlReleaseLock(dbHandle *sql.DB) { } } +func sqlCommonExecuteTxOnConn(ctx context.Context, conn *sql.Conn, txFn func(*sql.Tx) error) error { + tx, err := conn.BeginTx(ctx, nil) + if err != nil { + return err + } + + err = txFn(tx) + if err != nil { + tx.Rollback() //nolint:errcheck + return err + } + return tx.Commit() +} + func sqlCommonExecuteTx(ctx context.Context, dbHandle *sql.DB, txFn func(*sql.Tx) error) error { if config.Driver == CockroachDataProviderName { return crdb.ExecuteTx(ctx, dbHandle, nil, txFn) diff --git a/internal/dataprovider/sqlite.go b/internal/dataprovider/sqlite.go index 4a21c21c..98d2d2b9 100644 --- a/internal/dataprovider/sqlite.go +++ b/internal/dataprovider/sqlite.go @@ -12,8 +12,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -//go:build !nosqlite -// +build !nosqlite +//go:build !nosqlite && cgo package dataprovider @@ -24,6 +23,7 @@ import ( "errors" "fmt" "path/filepath" + "strings" "time" "github.com/mattn/go-sqlite3" @@ -36,11 +36,11 @@ import ( const ( sqliteResetSQL = `DROP TABLE IF EXISTS "{{api_keys}}"; -DROP TABLE IF EXISTS "{{folders_mapping}}"; DROP TABLE IF EXISTS "{{users_folders_mapping}}"; DROP TABLE IF EXISTS "{{users_groups_mapping}}"; DROP TABLE IF EXISTS "{{admins_groups_mapping}}"; DROP TABLE IF EXISTS "{{groups_folders_mapping}}"; +DROP TABLE IF EXISTS "{{shares_groups_mapping}}"; DROP TABLE IF EXISTS "{{admins}}"; DROP TABLE IF EXISTS "{{folders}}"; DROP TABLE IF EXISTS "{{shares}}"; @@ -82,8 +82,8 @@ CREATE TABLE "{{folders}}" ("id" integer NOT NULL PRIMARY KEY, "name" varchar(25 "last_quota_update" bigint NOT NULL, "filesystem" text NULL); CREATE TABLE "{{groups}}" ("id" integer NOT NULL PRIMARY KEY, "name" varchar(255) NOT NULL UNIQUE, "description" varchar(512) NULL, "created_at" bigint NOT NULL, "updated_at" bigint NOT NULL, "user_settings" text NULL); -CREATE TABLE "{{shared_sessions}}" ("key" varchar(128) NOT NULL PRIMARY KEY, "data" text NOT NULL, -"type" integer NOT NULL, "timestamp" bigint NOT NULL); +CREATE TABLE "{{shared_sessions}}" ("key" varchar(128) NOT NULL, "type" integer NOT NULL, +"data" text NOT NULL, "timestamp" bigint NOT NULL, PRIMARY KEY ("key", "type")); CREATE TABLE "{{users}}" ("id" integer NOT NULL PRIMARY KEY, "username" varchar(255) NOT NULL UNIQUE, "status" integer NOT NULL, "expiration_date" bigint NOT NULL, "description" varchar(512) NULL, "password" text NULL, "public_keys" text NULL, "home_dir" text NOT NULL, "uid" bigint NOT NULL, "gid" bigint NOT NULL, @@ -98,21 +98,21 @@ CREATE TABLE "{{users}}" ("id" integer NOT NULL PRIMARY KEY, "username" varchar( CREATE TABLE "{{groups_folders_mapping}}" ("id" integer NOT NULL PRIMARY KEY, "folder_id" integer NOT NULL REFERENCES "{{folders}}" ("id") ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, "group_id" integer NOT NULL REFERENCES "{{groups}}" ("id") ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, -"virtual_path" text NOT NULL, "quota_size" bigint NOT NULL, "quota_files" integer NOT NULL, +"virtual_path" text NOT NULL, "quota_size" bigint NOT NULL, "quota_files" integer NOT NULL, "sort_order" integer NOT NULL, CONSTRAINT "{{prefix}}unique_group_folder_mapping" UNIQUE ("group_id", "folder_id")); CREATE TABLE "{{users_groups_mapping}}" ("id" integer NOT NULL PRIMARY KEY, "user_id" integer NOT NULL REFERENCES "{{users}}" ("id") ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, "group_id" integer NOT NULL REFERENCES "{{groups}}" ("id") ON DELETE NO ACTION, -"group_type" integer NOT NULL, CONSTRAINT "{{prefix}}unique_user_group_mapping" UNIQUE ("user_id", "group_id")); +"group_type" integer NOT NULL, "sort_order" integer NOT NULL, CONSTRAINT "{{prefix}}unique_user_group_mapping" UNIQUE ("user_id", "group_id")); CREATE TABLE "{{users_folders_mapping}}" ("id" integer NOT NULL PRIMARY KEY, "user_id" integer NOT NULL REFERENCES "{{users}}" ("id") ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, "folder_id" integer NOT NULL REFERENCES "{{folders}}" ("id") ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, -"virtual_path" text NOT NULL, "quota_size" bigint NOT NULL, "quota_files" integer NOT NULL, +"virtual_path" text NOT NULL, "quota_size" bigint NOT NULL, "quota_files" integer NOT NULL, "sort_order" integer NOT NULL, CONSTRAINT "{{prefix}}unique_user_folder_mapping" UNIQUE ("user_id", "folder_id")); CREATE TABLE "{{shares}}" ("id" integer NOT NULL PRIMARY KEY, "share_id" varchar(60) NOT NULL UNIQUE, "name" varchar(255) NOT NULL, "description" varchar(512) NULL, "scope" integer NOT NULL, "paths" text NOT NULL, "created_at" bigint NOT NULL, "updated_at" bigint NOT NULL, "last_use_at" bigint NOT NULL, "expires_at" bigint NOT NULL, -"password" text NULL, "max_tokens" integer NOT NULL, "used_tokens" integer NOT NULL, "allow_from" text NULL, +"password" text NULL, "max_tokens" integer NOT NULL, "used_tokens" integer NOT NULL, "allow_from" text NULL, "options" text NULL, "user_id" integer NOT NULL REFERENCES "{{users}}" ("id") ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED); CREATE TABLE "{{api_keys}}" ("id" integer NOT NULL PRIMARY KEY, "name" varchar(255) NOT NULL, "key_id" varchar(50) NOT NULL UNIQUE, "api_key" varchar(255) NOT NULL UNIQUE, "scope" integer NOT NULL, @@ -134,7 +134,7 @@ CREATE TABLE "{{tasks}}" ("id" integer NOT NULL PRIMARY KEY, "name" varchar(255) CREATE TABLE "{{admins_groups_mapping}}" ("id" integer NOT NULL PRIMARY KEY, "admin_id" integer NOT NULL REFERENCES "{{admins}}" ("id") ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, "group_id" integer NOT NULL REFERENCES "{{groups}}" ("id") ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, -"options" text NOT NULL, CONSTRAINT "{{prefix}}unique_admin_group_mapping" UNIQUE ("admin_id", "group_id")); +"options" text NOT NULL, "sort_order" integer NOT NULL, CONSTRAINT "{{prefix}}unique_admin_group_mapping" UNIQUE ("admin_id", "group_id")); CREATE TABLE "{{ip_lists}}" ("id" integer NOT NULL PRIMARY KEY, "type" integer NOT NULL, "ipornet" varchar(50) NOT NULL, "mode" integer NOT NULL, "description" varchar(512) NULL, "first" BLOB NOT NULL, "last" BLOB NOT NULL, "ip_type" integer NOT NULL, "protocols" integer NOT NULL, @@ -144,10 +144,13 @@ CREATE TABLE "{{configs}}" ("id" integer NOT NULL PRIMARY KEY, "configs" text NO INSERT INTO {{configs}} (configs) VALUES ('{}'); CREATE INDEX "{{prefix}}users_folders_mapping_folder_id_idx" ON "{{users_folders_mapping}}" ("folder_id"); CREATE INDEX "{{prefix}}users_folders_mapping_user_id_idx" ON "{{users_folders_mapping}}" ("user_id"); +CREATE INDEX "{{prefix}}users_folders_mapping_sort_order_idx" ON "{{users_folders_mapping}}" ("sort_order"); CREATE INDEX "{{prefix}}users_groups_mapping_group_id_idx" ON "{{users_groups_mapping}}" ("group_id"); CREATE INDEX "{{prefix}}users_groups_mapping_user_id_idx" ON "{{users_groups_mapping}}" ("user_id"); +CREATE INDEX "{{prefix}}users_groups_mapping_sort_order_idx" ON "{{users_groups_mapping}}" ("sort_order"); CREATE INDEX "{{prefix}}groups_folders_mapping_folder_id_idx" ON "{{groups_folders_mapping}}" ("folder_id"); CREATE INDEX "{{prefix}}groups_folders_mapping_group_id_idx" ON "{{groups_folders_mapping}}" ("group_id"); +CREATE INDEX "{{prefix}}groups_folders_mapping_sort_order_idx" ON "{{groups_folders_mapping}}" ("sort_order"); CREATE INDEX "{{prefix}}api_keys_admin_id_idx" ON "{{api_keys}}" ("admin_id"); CREATE INDEX "{{prefix}}api_keys_user_id_idx" ON "{{api_keys}}" ("user_id"); CREATE INDEX "{{prefix}}users_updated_at_idx" ON "{{users}}" ("updated_at"); @@ -170,6 +173,7 @@ CREATE INDEX "{{prefix}}rules_actions_mapping_action_id_idx" ON "{{rules_actions CREATE INDEX "{{prefix}}rules_actions_mapping_order_idx" ON "{{rules_actions_mapping}}" ("order"); CREATE INDEX "{{prefix}}admins_groups_mapping_admin_id_idx" ON "{{admins_groups_mapping}}" ("admin_id"); CREATE INDEX "{{prefix}}admins_groups_mapping_group_id_idx" ON "{{admins_groups_mapping}}" ("group_id"); +CREATE INDEX "{{prefix}}admins_groups_mapping_sort_order_idx" ON "{{admins_groups_mapping}}" ("sort_order"); CREATE INDEX "{{prefix}}users_role_id_idx" ON "{{users}}" ("role_id"); CREATE INDEX "{{prefix}}admins_role_id_idx" ON "{{admins}}" ("role_id"); CREATE INDEX "{{prefix}}ip_lists_type_idx" ON "{{ip_lists}}" ("type"); @@ -178,8 +182,22 @@ CREATE INDEX "{{prefix}}ip_lists_ip_type_idx" ON "{{ip_lists}}" ("ip_type"); CREATE INDEX "{{prefix}}ip_lists_ip_updated_at_idx" ON "{{ip_lists}}" ("updated_at"); CREATE INDEX "{{prefix}}ip_lists_ip_deleted_at_idx" ON "{{ip_lists}}" ("deleted_at"); CREATE INDEX "{{prefix}}ip_lists_first_last_idx" ON "{{ip_lists}}" ("first", "last"); -INSERT INTO {{schema_version}} (version) VALUES (28); +INSERT INTO {{schema_version}} (version) VALUES (33); ` + sqliteV34SQL = ` +CREATE TABLE "{{shares_groups_mapping}}" ( + "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, + "share_id" integer NOT NULL REFERENCES "{{shares}}" ("id") ON DELETE CASCADE, + "group_id" integer NOT NULL REFERENCES "{{groups}}" ("id") ON DELETE CASCADE, + "permissions" integer NOT NULL, + "sort_order" integer NOT NULL, + CONSTRAINT "{{prefix}}unique_share_group_mapping" UNIQUE ("share_id", "group_id") +); +CREATE INDEX "{{prefix}}shares_groups_mapping_sort_order_idx" ON "{{shares_groups_mapping}}" ("sort_order"); +CREATE INDEX "{{prefix}}shares_groups_mapping_group_id_idx" ON "{{shares_groups_mapping}}" ("group_id"); +CREATE INDEX "{{prefix}}shares_groups_mapping_share_id_idx" ON "{{shares_groups_mapping}}" ("share_id"); +` + sqliteV34DownSQL = `DROP TABLE IF EXISTS "{{shares_groups_mapping}}";` ) // SQLiteProvider defines the auth provider for SQLite database @@ -215,7 +233,7 @@ func initializeSQLiteProvider(basePath string) error { providerLog(logger.LevelDebug, "sqlite database handle created, connection string: %q", connectionString) dbHandle.SetMaxOpenConns(1) provider = &SQLiteProvider{dbHandle: dbHandle} - return nil + return executePragmaOptimize(dbHandle) } func (p *SQLiteProvider) checkAvailability() error { @@ -246,6 +264,14 @@ func (p *SQLiteProvider) getUsedQuota(username string) (int, int64, int64, int64 return sqlCommonGetUsedQuota(username, p.dbHandle) } +func (p *SQLiteProvider) getAdminSignature(username string) (string, error) { + return sqlCommonGetAdminSignature(username, p.dbHandle) +} + +func (p *SQLiteProvider) getUserSignature(username string) (string, error) { + return sqlCommonGetUserSignature(username, p.dbHandle) +} + func (p *SQLiteProvider) setUpdatedAt(username string) { sqlCommonSetUpdatedAt(username, p.dbHandle) } @@ -500,12 +526,12 @@ func (p *SQLiteProvider) addSharedSession(session Session) error { return sqlCommonAddSession(session, p.dbHandle) } -func (p *SQLiteProvider) deleteSharedSession(key string) error { - return sqlCommonDeleteSession(key, p.dbHandle) +func (p *SQLiteProvider) deleteSharedSession(key string, sessionType SessionType) error { + return sqlCommonDeleteSession(key, sessionType, p.dbHandle) } -func (p *SQLiteProvider) getSharedSession(key string) (Session, error) { - return sqlCommonGetSession(key, p.dbHandle) +func (p *SQLiteProvider) getSharedSession(key string, sessionType SessionType) (Session, error) { + return sqlCommonGetSession(key, sessionType, p.dbHandle) } func (p *SQLiteProvider) cleanupSharedSessions(sessionType SessionType, before int64) error { @@ -693,13 +719,13 @@ func (p *SQLiteProvider) initializeDatabase() error { if errors.Is(err, sql.ErrNoRows) { return errSchemaVersionEmpty } - logger.InfoToConsole("creating initial database schema, version 28") - providerLog(logger.LevelInfo, "creating initial database schema, version 28") + logger.InfoToConsole("creating initial database schema, version 33") + providerLog(logger.LevelInfo, "creating initial database schema, version 33") sql := sqlReplaceAll(sqliteInitialSQL) - return sqlCommonExecSQLAndUpdateDBVersion(p.dbHandle, []string{sql}, 28, true) + return sqlCommonExecSQLAndUpdateDBVersion(p.dbHandle, []string{sql}, 33, true) } -func (p *SQLiteProvider) migrateDatabase() error { //nolint:dupl +func (p *SQLiteProvider) migrateDatabase() error { dbVersion, err := sqlCommonGetDatabaseVersion(p.dbHandle, true) if err != nil { return err @@ -709,13 +735,13 @@ func (p *SQLiteProvider) migrateDatabase() error { //nolint:dupl case version == sqlDatabaseVersion: providerLog(logger.LevelDebug, "sql database is up to date, current version: %d", version) return ErrNoInitRequired - case version < 28: - err = fmt.Errorf("database schema version %d is too old, please see the upgrading docs", version) + case version < 33: + err = errSchemaVersionTooOld(version) providerLog(logger.LevelError, "%v", err) logger.ErrorToConsole("%v", err) return err - case version == 28: - return updateSQLiteDatabaseFrom28To29(p.dbHandle) + case version == 33: + return updateSQLiteDatabaseFromV33(p.dbHandle) default: if version > sqlDatabaseVersion { providerLog(logger.LevelError, "database schema version %d is newer than the supported one: %d", version, @@ -738,8 +764,8 @@ func (p *SQLiteProvider) revertDatabase(targetVersion int) error { } switch dbVersion.Version { - case 29: - return downgradeSQLiteDatabaseFrom29To28(p.dbHandle) + case 34: + return downgradeSQLiteDatabaseFromV34(p.dbHandle) default: return fmt.Errorf("database schema version not handled: %d", dbVersion.Version) } @@ -777,24 +803,39 @@ func (p *SQLiteProvider) normalizeError(err error, fieldType int) error { return err } -func updateSQLiteDatabaseFrom28To29(dbHandle *sql.DB) error { - logger.InfoToConsole("updating database schema version: 28 -> 29") - providerLog(logger.LevelInfo, "updating database schema version: 28 -> 29") - +func executePragmaOptimize(dbHandle *sql.DB) error { ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout) defer cancel() - return sqlCommonUpdateDatabaseVersion(ctx, dbHandle, 29) + _, err := dbHandle.ExecContext(ctx, "PRAGMA optimize;") + return err } -func downgradeSQLiteDatabaseFrom29To28(dbHandle *sql.DB) error { - logger.InfoToConsole("downgrading database schema version: 29 -> 28") - providerLog(logger.LevelInfo, "downgrading database schema version: 29 -> 28") +func updateSQLiteDatabaseFromV33(dbHandle *sql.DB) error { + return updateSQLiteDatabaseFrom33To34(dbHandle) +} - ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout) - defer cancel() +func downgradeSQLiteDatabaseFromV34(dbHandle *sql.DB) error { + return downgradeSQLiteDatabaseFrom34To33(dbHandle) +} - return sqlCommonUpdateDatabaseVersion(ctx, dbHandle, 28) +func updateSQLiteDatabaseFrom33To34(dbHandle *sql.DB) error { + logger.InfoToConsole("updating database schema version: 33 -> 34") + providerLog(logger.LevelInfo, "updating database schema version: 33 -> 34") + + sql := strings.ReplaceAll(sqliteV34SQL, "{{prefix}}", config.SQLTablesPrefix) + sql = strings.ReplaceAll(sql, "{{shares}}", sqlTableShares) + sql = strings.ReplaceAll(sql, "{{shares_groups_mapping}}", sqlTableSharesGroupsMapping) + sql = strings.ReplaceAll(sql, "{{groups}}", sqlTableGroups) + return sqlCommonExecSQLAndUpdateDBVersion(dbHandle, []string{sql}, 34, true) +} + +func downgradeSQLiteDatabaseFrom34To33(dbHandle *sql.DB) error { + logger.InfoToConsole("downgrading database schema version: 34 -> 33") + providerLog(logger.LevelInfo, "downgrading database schema version: 34 -> 33") + + sql := strings.ReplaceAll(sqliteV34DownSQL, "{{shares_groups_mapping}}", sqlTableSharesGroupsMapping) + return sqlCommonExecSQLAndUpdateDBVersion(dbHandle, []string{sql}, 33, false) } /*func setPragmaFK(dbHandle *sql.DB, value string) error { diff --git a/internal/dataprovider/sqlite_disabled.go b/internal/dataprovider/sqlite_disabled.go index 6c7ea18d..22138967 100644 --- a/internal/dataprovider/sqlite_disabled.go +++ b/internal/dataprovider/sqlite_disabled.go @@ -12,8 +12,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -//go:build nosqlite -// +build nosqlite +//go:build nosqlite || !cgo package dataprovider diff --git a/internal/dataprovider/sqlqueries.go b/internal/dataprovider/sqlqueries.go index 2ce95b5c..2d5aaf6b 100644 --- a/internal/dataprovider/sqlqueries.go +++ b/internal/dataprovider/sqlqueries.go @@ -81,25 +81,27 @@ func getAddSessionQuery() string { "ON DUPLICATE KEY UPDATE `data`=VALUES(`data`), `timestamp`=VALUES(`timestamp`)", sqlTableSharedSessions, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3]) } - return fmt.Sprintf(`INSERT INTO %s (key,data,type,timestamp) VALUES (%s,%s,%s,%s) ON CONFLICT(key) DO UPDATE SET data= + return fmt.Sprintf(`INSERT INTO %s (key,data,type,timestamp) VALUES (%s,%s,%s,%s) ON CONFLICT(key,type) DO UPDATE SET data= EXCLUDED.data, timestamp=EXCLUDED.timestamp`, sqlTableSharedSessions, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3]) } func getDeleteSessionQuery() string { if config.Driver == MySQLDataProviderName { - return fmt.Sprintf("DELETE FROM %s WHERE `key` = %s", sqlTableSharedSessions, sqlPlaceholders[0]) + return fmt.Sprintf("DELETE FROM %s WHERE `key` = %s AND `type` = %s", + sqlTableSharedSessions, sqlPlaceholders[0], sqlPlaceholders[1]) } - return fmt.Sprintf(`DELETE FROM %s WHERE key = %s`, sqlTableSharedSessions, sqlPlaceholders[0]) + return fmt.Sprintf(`DELETE FROM %s WHERE key = %s AND type = %s`, + sqlTableSharedSessions, sqlPlaceholders[0], sqlPlaceholders[1]) } func getSessionQuery() string { if config.Driver == MySQLDataProviderName { - return fmt.Sprintf("SELECT `key`,`data`,`type`,`timestamp` FROM %s WHERE `key` = %s", sqlTableSharedSessions, - sqlPlaceholders[0]) + return fmt.Sprintf("SELECT `key`,`data`,`type`,`timestamp` FROM %s WHERE `key` = %s AND `type` = %s", + sqlTableSharedSessions, sqlPlaceholders[0], sqlPlaceholders[1]) } - return fmt.Sprintf(`SELECT key,data,type,timestamp FROM %s WHERE key = %s`, sqlTableSharedSessions, - sqlPlaceholders[0]) + return fmt.Sprintf(`SELECT key,data,type,timestamp FROM %s WHERE key = %s AND type = %s`, + sqlTableSharedSessions, sqlPlaceholders[0], sqlPlaceholders[1]) } func getCleanupSessionsQuery() string { @@ -650,6 +652,14 @@ func getUpdateQuotaQuery(reset bool) string { WHERE username = %s`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3]) } +func getAdminSignatureQuery() string { + return fmt.Sprintf(`SELECT updated_at FROM %s WHERE username = %s`, sqlTableAdmins, sqlPlaceholders[0]) +} + +func getUserSignatureQuery() string { + return fmt.Sprintf(`SELECT updated_at FROM %s WHERE username = %s`, sqlTableUsers, sqlPlaceholders[0]) +} + func getSetUpdateAtQuery() string { return fmt.Sprintf(`UPDATE %s SET updated_at = %s WHERE username = %s`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1]) } @@ -757,10 +767,10 @@ func getClearUserGroupMappingQuery() string { } func getAddUserGroupMappingQuery() string { - return fmt.Sprintf(`INSERT INTO %s (user_id,group_id,group_type) VALUES ((SELECT id FROM %s WHERE username = %s), - (SELECT id FROM %s WHERE name = %s),%s)`, + return fmt.Sprintf(`INSERT INTO %s (user_id,group_id,group_type,sort_order) VALUES ((SELECT id FROM %s WHERE username = %s), + (SELECT id FROM %s WHERE name = %s),%s,%s)`, sqlTableUsersGroupsMapping, sqlTableUsers, sqlPlaceholders[0], getSQLQuotedName(sqlTableGroups), - sqlPlaceholders[1], sqlPlaceholders[2]) + sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3]) } func getClearAdminGroupMappingQuery() string { @@ -769,10 +779,10 @@ func getClearAdminGroupMappingQuery() string { } func getAddAdminGroupMappingQuery() string { - return fmt.Sprintf(`INSERT INTO %s (admin_id,group_id,options) VALUES ((SELECT id FROM %s WHERE username = %s), - (SELECT id FROM %s WHERE name = %s),%s)`, + return fmt.Sprintf(`INSERT INTO %s (admin_id,group_id,options,sort_order) VALUES ((SELECT id FROM %s WHERE username = %s), + (SELECT id FROM %s WHERE name = %s),%s,%s)`, sqlTableAdminsGroupsMapping, sqlTableAdmins, sqlPlaceholders[0], getSQLQuotedName(sqlTableGroups), - sqlPlaceholders[1], sqlPlaceholders[2]) + sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3]) } func getClearGroupFolderMappingQuery() string { @@ -781,10 +791,10 @@ func getClearGroupFolderMappingQuery() string { } func getAddGroupFolderMappingQuery() string { - return fmt.Sprintf(`INSERT INTO %s (virtual_path,quota_size,quota_files,folder_id,group_id) - VALUES (%s,%s,%s,(SELECT id FROM %s WHERE name = %s),(SELECT id FROM %s WHERE name = %s))`, + return fmt.Sprintf(`INSERT INTO %s (virtual_path,quota_size,quota_files,folder_id,group_id,sort_order) + VALUES (%s,%s,%s,(SELECT id FROM %s WHERE name = %s),(SELECT id FROM %s WHERE name = %s),%s)`, sqlTableGroupsFoldersMapping, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlTableFolders, - sqlPlaceholders[3], getSQLQuotedName(sqlTableGroups), sqlPlaceholders[4]) + sqlPlaceholders[3], getSQLQuotedName(sqlTableGroups), sqlPlaceholders[4], sqlPlaceholders[5]) } func getClearUserFolderMappingQuery() string { @@ -793,10 +803,10 @@ func getClearUserFolderMappingQuery() string { } func getAddUserFolderMappingQuery() string { - return fmt.Sprintf(`INSERT INTO %s (virtual_path,quota_size,quota_files,folder_id,user_id) - VALUES (%s,%s,%s,(SELECT id FROM %s WHERE name = %s),(SELECT id FROM %s WHERE username = %s))`, + return fmt.Sprintf(`INSERT INTO %s (virtual_path,quota_size,quota_files,folder_id,user_id,sort_order) + VALUES (%s,%s,%s,(SELECT id FROM %s WHERE name = %s),(SELECT id FROM %s WHERE username = %s),%s)`, sqlTableUsersFoldersMapping, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlTableFolders, - sqlPlaceholders[3], sqlTableUsers, sqlPlaceholders[4]) + sqlPlaceholders[3], sqlTableUsers, sqlPlaceholders[4], sqlPlaceholders[5]) } func getFoldersQuery(order string, minimal bool) string { @@ -838,7 +848,7 @@ func getRelatedGroupsForUsersQuery(users []User) string { sb.WriteString(")") } return fmt.Sprintf(`SELECT g.name,ug.group_type,ug.user_id FROM %s g INNER JOIN %s ug ON g.id = ug.group_id WHERE - ug.user_id IN %s ORDER BY g.name`, getSQLQuotedName(sqlTableGroups), sqlTableUsersGroupsMapping, sb.String()) + ug.user_id IN %s ORDER BY ug.sort_order`, getSQLQuotedName(sqlTableGroups), sqlTableUsersGroupsMapping, sb.String()) } func getRelatedGroupsForAdminsQuery(admins []Admin) string { @@ -855,7 +865,7 @@ func getRelatedGroupsForAdminsQuery(admins []Admin) string { sb.WriteString(")") } return fmt.Sprintf(`SELECT g.name,ag.options,ag.admin_id FROM %s g INNER JOIN %s ag ON g.id = ag.group_id WHERE - ag.admin_id IN %s ORDER BY g.name`, getSQLQuotedName(sqlTableGroups), sqlTableAdminsGroupsMapping, sb.String()) + ag.admin_id IN %s ORDER BY ag.sort_order`, getSQLQuotedName(sqlTableGroups), sqlTableAdminsGroupsMapping, sb.String()) } func getRelatedFoldersForUsersQuery(users []User) string { @@ -873,7 +883,7 @@ func getRelatedFoldersForUsersQuery(users []User) string { } return fmt.Sprintf(`SELECT f.id,f.name,f.path,f.used_quota_size,f.used_quota_files,f.last_quota_update,fm.virtual_path, fm.quota_size,fm.quota_files,fm.user_id,f.filesystem,f.description FROM %s f INNER JOIN %s fm ON f.id = fm.folder_id WHERE - fm.user_id IN %s ORDER BY f.name`, sqlTableFolders, sqlTableUsersFoldersMapping, sb.String()) + fm.user_id IN %s ORDER BY fm.sort_order`, sqlTableFolders, sqlTableUsersFoldersMapping, sb.String()) } func getRelatedUsersForFoldersQuery(folders []vfs.BaseVirtualFolder) string { @@ -960,7 +970,7 @@ func getRelatedFoldersForGroupsQuery(groups []Group) string { } return fmt.Sprintf(`SELECT f.id,f.name,f.path,f.used_quota_size,f.used_quota_files,f.last_quota_update,fm.virtual_path, fm.quota_size,fm.quota_files,fm.group_id,f.filesystem,f.description FROM %s f INNER JOIN %s fm ON f.id = fm.folder_id WHERE - fm.group_id IN %s ORDER BY f.name`, sqlTableFolders, sqlTableGroupsFoldersMapping, sb.String()) + fm.group_id IN %s ORDER BY fm.sort_order`, sqlTableFolders, sqlTableGroupsFoldersMapping, sb.String()) } func getActiveTransfersQuery() string { diff --git a/internal/dataprovider/unixcrypt.go b/internal/dataprovider/unixcrypt.go index 9799e8a4..26c8f646 100644 --- a/internal/dataprovider/unixcrypt.go +++ b/internal/dataprovider/unixcrypt.go @@ -12,8 +12,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -//go:build unixcrypt -// +build unixcrypt +//go:build unixcrypt && cgo package dataprovider diff --git a/internal/dataprovider/unixcrypt_disabled.go b/internal/dataprovider/unixcrypt_disabled.go index ecf76997..3e865110 100644 --- a/internal/dataprovider/unixcrypt_disabled.go +++ b/internal/dataprovider/unixcrypt_disabled.go @@ -12,8 +12,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -//go:build !unixcrypt -// +build !unixcrypt +//go:build !unixcrypt || !cgo package dataprovider diff --git a/internal/dataprovider/user.go b/internal/dataprovider/user.go index 80970c26..8cea928d 100644 --- a/internal/dataprovider/user.go +++ b/internal/dataprovider/user.go @@ -22,6 +22,8 @@ import ( "net" "os" "path" + "path/filepath" + "slices" "strconv" "strings" "time" @@ -123,6 +125,8 @@ type UserFilters struct { sdk.BaseUserFilters // User must change password from WebClient/REST API at next login. RequirePasswordChange bool `json:"require_password_change,omitempty"` + // AdditionalEmails defines additional email addresses + AdditionalEmails []string `json:"additional_emails,omitempty"` // Time-based one time passwords configuration TOTPConfig UserTOTPConfig `json:"totp_config,omitempty"` // Recovery codes to use if the user loses access to their second factor auth device. @@ -342,7 +346,11 @@ func (u *User) isTimeBasedAccessAllowed(when time.Time) bool { if when.IsZero() { when = time.Now() } - when = when.UTC() + if UseLocalTime() { + when = when.Local() + } else { + when = when.UTC() + } weekDay := when.Weekday() hhMM := when.Format("15:04") for _, p := range u.Filters.AccessTime { @@ -399,6 +407,15 @@ func (u *User) CheckMaxShareExpiration(expiresAt time.Time) error { return nil } +// GetEmailAddresses returns all the email addresses. +func (u *User) GetEmailAddresses() []string { + var res []string + if u.Email != "" { + res = append(res, u.Email) + } + return slices.Concat(res, u.Filters.AdditionalEmails) +} + // GetSubDirPermissions returns permissions for sub directories func (u *User) GetSubDirPermissions() []sdk.DirectoryPermissions { var result []sdk.DirectoryPermissions @@ -840,20 +857,20 @@ func (u *User) HasPermissionsInside(virtualPath string) bool { // HasPerm returns true if the user has the given permission or any permission func (u *User) HasPerm(permission, path string) bool { perms := u.GetPermissionsForPath(path) - if util.Contains(perms, PermAny) { + if slices.Contains(perms, PermAny) { return true } - return util.Contains(perms, permission) + return slices.Contains(perms, permission) } // HasAnyPerm returns true if the user has at least one of the given permissions func (u *User) HasAnyPerm(permissions []string, path string) bool { perms := u.GetPermissionsForPath(path) - if util.Contains(perms, PermAny) { + if slices.Contains(perms, PermAny) { return true } for _, permission := range permissions { - if util.Contains(perms, permission) { + if slices.Contains(perms, permission) { return true } } @@ -863,11 +880,11 @@ func (u *User) HasAnyPerm(permissions []string, path string) bool { // HasPerms returns true if the user has all the given permissions func (u *User) HasPerms(permissions []string, path string) bool { perms := u.GetPermissionsForPath(path) - if util.Contains(perms, PermAny) { + if slices.Contains(perms, PermAny) { return true } for _, permission := range permissions { - if !util.Contains(perms, permission) { + if !slices.Contains(perms, permission) { return false } } @@ -927,11 +944,11 @@ func (u *User) IsLoginMethodAllowed(loginMethod, protocol string) bool { if len(u.Filters.DeniedLoginMethods) == 0 { return true } - if util.Contains(u.Filters.DeniedLoginMethods, loginMethod) { + if slices.Contains(u.Filters.DeniedLoginMethods, loginMethod) { return false } if protocol == protocolSSH && loginMethod == LoginMethodPassword { - if util.Contains(u.Filters.DeniedLoginMethods, SSHLoginMethodPassword) { + if slices.Contains(u.Filters.DeniedLoginMethods, SSHLoginMethodPassword) { return false } } @@ -965,10 +982,10 @@ func (u *User) IsPartialAuth() bool { method == SSHLoginMethodPassword { continue } - if method == LoginMethodPassword && util.Contains(u.Filters.DeniedLoginMethods, SSHLoginMethodPassword) { + if method == LoginMethodPassword && slices.Contains(u.Filters.DeniedLoginMethods, SSHLoginMethodPassword) { continue } - if !util.Contains(SSHMultiStepsLoginMethods, method) { + if !slices.Contains(SSHMultiStepsLoginMethods, method) { return false } } @@ -982,7 +999,7 @@ func (u *User) GetAllowedLoginMethods() []string { if method == SSHLoginMethodPassword { continue } - if !util.Contains(u.Filters.DeniedLoginMethods, method) { + if !slices.Contains(u.Filters.DeniedLoginMethods, method) { allowedMethods = append(allowedMethods, method) } } @@ -1052,7 +1069,7 @@ func (u *User) IsFileAllowed(virtualPath string) (bool, int) { // CanManageMFA returns true if the user can add a multi-factor authentication configuration func (u *User) CanManageMFA() bool { - if util.Contains(u.Filters.WebClient, sdk.WebClientMFADisabled) { + if slices.Contains(u.Filters.WebClient, sdk.WebClientMFADisabled) { return false } return len(mfa.GetAvailableTOTPConfigs()) > 0 @@ -1073,39 +1090,39 @@ func (u *User) skipExternalAuth() bool { // CanManageShares returns true if the user can add, update and list shares func (u *User) CanManageShares() bool { - return !util.Contains(u.Filters.WebClient, sdk.WebClientSharesDisabled) + return !slices.Contains(u.Filters.WebClient, sdk.WebClientSharesDisabled) } // CanResetPassword returns true if this user is allowed to reset its password func (u *User) CanResetPassword() bool { - return !util.Contains(u.Filters.WebClient, sdk.WebClientPasswordResetDisabled) + return !slices.Contains(u.Filters.WebClient, sdk.WebClientPasswordResetDisabled) } // CanChangePassword returns true if this user is allowed to change its password func (u *User) CanChangePassword() bool { - return !util.Contains(u.Filters.WebClient, sdk.WebClientPasswordChangeDisabled) + return !slices.Contains(u.Filters.WebClient, sdk.WebClientPasswordChangeDisabled) } // CanChangeAPIKeyAuth returns true if this user is allowed to enable/disable API key authentication func (u *User) CanChangeAPIKeyAuth() bool { - return !util.Contains(u.Filters.WebClient, sdk.WebClientAPIKeyAuthChangeDisabled) + return !slices.Contains(u.Filters.WebClient, sdk.WebClientAPIKeyAuthChangeDisabled) } // CanChangeInfo returns true if this user is allowed to change its info such as email and description func (u *User) CanChangeInfo() bool { - return !util.Contains(u.Filters.WebClient, sdk.WebClientInfoChangeDisabled) + return !slices.Contains(u.Filters.WebClient, sdk.WebClientInfoChangeDisabled) } // CanManagePublicKeys returns true if this user is allowed to manage public keys // from the WebClient. Used in WebClient UI func (u *User) CanManagePublicKeys() bool { - return !util.Contains(u.Filters.WebClient, sdk.WebClientPubKeyChangeDisabled) + return !slices.Contains(u.Filters.WebClient, sdk.WebClientPubKeyChangeDisabled) } // CanManageTLSCerts returns true if this user is allowed to manage TLS certificates // from the WebClient. Used in WebClient UI func (u *User) CanManageTLSCerts() bool { - return !util.Contains(u.Filters.WebClient, sdk.WebClientTLSCertChangeDisabled) + return !slices.Contains(u.Filters.WebClient, sdk.WebClientTLSCertChangeDisabled) } // CanUpdateProfile returns true if the user is allowed to update the profile. @@ -1117,7 +1134,7 @@ func (u *User) CanUpdateProfile() bool { // CanAddFilesFromWeb returns true if the client can add files from the web UI. // The specified target is the directory where the files must be uploaded func (u *User) CanAddFilesFromWeb(target string) bool { - if util.Contains(u.Filters.WebClient, sdk.WebClientWriteDisabled) { + if slices.Contains(u.Filters.WebClient, sdk.WebClientWriteDisabled) { return false } return u.HasPerm(PermUpload, target) || u.HasPerm(PermOverwrite, target) @@ -1126,7 +1143,7 @@ func (u *User) CanAddFilesFromWeb(target string) bool { // CanAddDirsFromWeb returns true if the client can add directories from the web UI. // The specified target is the directory where the new directory must be created func (u *User) CanAddDirsFromWeb(target string) bool { - if util.Contains(u.Filters.WebClient, sdk.WebClientWriteDisabled) { + if slices.Contains(u.Filters.WebClient, sdk.WebClientWriteDisabled) { return false } return u.HasPerm(PermCreateDirs, target) @@ -1135,7 +1152,7 @@ func (u *User) CanAddDirsFromWeb(target string) bool { // CanRenameFromWeb returns true if the client can rename objects from the web UI. // The specified src and dest are the source and target directories for the rename. func (u *User) CanRenameFromWeb(src, dest string) bool { - if util.Contains(u.Filters.WebClient, sdk.WebClientWriteDisabled) { + if slices.Contains(u.Filters.WebClient, sdk.WebClientWriteDisabled) { return false } return u.HasAnyPerm(permsRenameAny, src) && u.HasAnyPerm(permsRenameAny, dest) @@ -1144,7 +1161,7 @@ func (u *User) CanRenameFromWeb(src, dest string) bool { // CanDeleteFromWeb returns true if the client can delete objects from the web UI. // The specified target is the parent directory for the object to delete func (u *User) CanDeleteFromWeb(target string) bool { - if util.Contains(u.Filters.WebClient, sdk.WebClientWriteDisabled) { + if slices.Contains(u.Filters.WebClient, sdk.WebClientWriteDisabled) { return false } return u.HasAnyPerm(permsDeleteAny, target) @@ -1153,7 +1170,7 @@ func (u *User) CanDeleteFromWeb(target string) bool { // CanCopyFromWeb returns true if the client can copy objects from the web UI. // The specified src and dest are the source and target directories for the copy. func (u *User) CanCopyFromWeb(src, dest string) bool { - if util.Contains(u.Filters.WebClient, sdk.WebClientWriteDisabled) { + if slices.Contains(u.Filters.WebClient, sdk.WebClientWriteDisabled) { return false } if !u.HasPerm(PermListItems, src) { @@ -1213,7 +1230,7 @@ func (u *User) MustSetSecondFactor() bool { return true } for _, p := range u.Filters.TwoFactorAuthProtocols { - if !util.Contains(u.Filters.TOTPConfig.Protocols, p) { + if !slices.Contains(u.Filters.TOTPConfig.Protocols, p) { return true } } @@ -1224,11 +1241,11 @@ func (u *User) MustSetSecondFactor() bool { // MustSetSecondFactorForProtocol returns true if the user must set a second factor authentication // for the specified protocol func (u *User) MustSetSecondFactorForProtocol(protocol string) bool { - if util.Contains(u.Filters.TwoFactorAuthProtocols, protocol) { + if slices.Contains(u.Filters.TwoFactorAuthProtocols, protocol) { if !u.Filters.TOTPConfig.Enabled { return true } - if !util.Contains(u.Filters.TOTPConfig.Protocols, protocol) { + if !slices.Contains(u.Filters.TOTPConfig.Protocols, protocol) { return true } } @@ -1571,7 +1588,7 @@ func (u *User) mergeCryptFsConfig(group *Group) { func (u *User) mergeWithPrimaryGroup(group *Group, replacer *strings.Replacer) { if group.UserSettings.HomeDir != "" { - u.HomeDir = u.replacePlaceholder(group.UserSettings.HomeDir, replacer) + u.HomeDir = filepath.Clean(u.replacePlaceholder(group.UserSettings.HomeDir, replacer)) } if group.UserSettings.FsConfig.Provider != 0 { u.FsConfig = u.replaceFsConfigPlaceholders(group.UserSettings.FsConfig, replacer) @@ -1748,6 +1765,17 @@ func (u *User) hasRole(role string) bool { return role == u.Role } +func (u *User) applyNamingRules() { + u.Username = config.convertName(u.Username) + u.Role = config.convertName(u.Role) + for idx := range u.Groups { + u.Groups[idx].Name = config.convertName(u.Groups[idx].Name) + } + for idx := range u.VirtualFolders { + u.VirtualFolders[idx].Name = config.convertName(u.VirtualFolders[idx].Name) + } +} + func (u *User) getACopy() User { u.SetEmptySecretsIfNil() pubKeys := make([]string, len(u.PublicKeys)) @@ -1779,6 +1807,8 @@ func (u *User) getACopy() User { filters.TOTPConfig.Secret = u.Filters.TOTPConfig.Secret.Clone() filters.TOTPConfig.Protocols = make([]string, len(u.Filters.TOTPConfig.Protocols)) copy(filters.TOTPConfig.Protocols, u.Filters.TOTPConfig.Protocols) + filters.AdditionalEmails = make([]string, len(u.Filters.AdditionalEmails)) + copy(filters.AdditionalEmails, u.Filters.AdditionalEmails) filters.RecoveryCodes = make([]RecoveryCode, 0, len(u.Filters.RecoveryCodes)) for _, code := range u.Filters.RecoveryCodes { if code.Secret == nil { diff --git a/internal/ftpd/cryptfs_test.go b/internal/ftpd/cryptfs_test.go index c036b59a..23567fff 100644 --- a/internal/ftpd/cryptfs_test.go +++ b/internal/ftpd/cryptfs_test.go @@ -134,6 +134,7 @@ func TestBasicFTPHandlingCryptFs(t *testing.T) { assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 50*time.Millisecond) assert.Eventually(t, func() bool { return common.Connections.GetClientConnections() == 0 }, 1000*time.Millisecond, 50*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func TestBufferedCryptFs(t *testing.T) { @@ -179,6 +180,7 @@ func TestBufferedCryptFs(t *testing.T) { assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 50*time.Millisecond) assert.Eventually(t, func() bool { return common.Connections.GetClientConnections() == 0 }, 1000*time.Millisecond, 50*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func TestZeroBytesTransfersCryptFs(t *testing.T) { diff --git a/internal/ftpd/ftpd.go b/internal/ftpd/ftpd.go index 80dd1531..9fdfacf0 100644 --- a/internal/ftpd/ftpd.go +++ b/internal/ftpd/ftpd.go @@ -19,6 +19,7 @@ import ( "context" "errors" "fmt" + "log/slog" "net" "os" "path/filepath" @@ -66,8 +67,6 @@ type Binding struct { // Set to 1 to require TLS for both data and control connection. // Set to 2 to enable implicit TLS TLSMode int `json:"tls_mode" mapstructure:"tls_mode"` - // 0 disabled, 1 required - TLSSessionReuse int `json:"tls_session_reuse" mapstructure:"tls_session_reuse"` // Certificate and matching private key for this specific binding, if empty the global // ones will be used, if any CertificateFile string `json:"certificate_file" mapstructure:"certificate_file"` @@ -109,11 +108,6 @@ type Binding struct { // Please note that disabling the security checks you will make the FTP service vulnerable to bounce attacks // on active data connections, so change the default value only if you are on a trusted/internal network ActiveConnectionsSecurity int `json:"active_connections_security" mapstructure:"active_connections_security"` - // Set to 1 to silently ignore any client requests to perform ASCII translations via the TYPE command. - // That is, FTP clients can request ASCII translations, and SFTPGo will respond as the client expects, - // but will not actually perform the translation for either uploads or downloads. This behavior can be - // useful in circumstances involving older/mainframe clients and EBCDIC files. - IgnoreASCIITransferType int `json:"ignore_ascii_transfer_type" mapstructure:"ignore_ascii_transfer_type"` // Debug enables the FTP debug mode. In debug mode, every FTP command will be logged Debug bool `json:"debug" mapstructure:"debug"` ciphers []uint16 @@ -141,10 +135,6 @@ func (b *Binding) isTLSModeValid() bool { return b.TLSMode >= 0 && b.TLSMode <= 2 } -func (b *Binding) isTLSSessionReuseValid() bool { - return b.TLSSessionReuse >= 0 && b.TLSSessionReuse <= 1 -} - func (b *Binding) checkSecuritySettings() error { if b.PassiveConnectionsSecurity < 0 || b.PassiveConnectionsSecurity > 1 { return fmt.Errorf("invalid passive_connections_security: %v", b.PassiveConnectionsSecurity) @@ -412,9 +402,14 @@ func (c *Configuration) Initialize(configDir string) error { server := NewServer(c, configDir, binding, idx) go func(s *Server) { - ftpLogger := logger.LeveledLogger{Sender: "ftpserverlib"} + ftpLogger := logger.NewSlogAdapter("ftpserverlib", []slog.Attr{ + { + Key: "server_id", + Value: slog.StringValue(fmt.Sprintf("FTP_%d", s.ID)), + }, + }) ftpServer := ftpserver.NewFtpServer(s) - ftpServer.Logger = ftpLogger.With("server_id", fmt.Sprintf("FTP_%v", s.ID)) + ftpServer.Logger = slog.New(ftpLogger) logger.Info(logSender, "", "starting FTP serving, binding: %v", s.binding.GetAddress()) util.CheckTCP4Port(s.binding.Port) exitChannel <- ftpServer.ListenAndServe() diff --git a/internal/ftpd/ftpd_test.go b/internal/ftpd/ftpd_test.go index d59d0c3d..aebf5f37 100644 --- a/internal/ftpd/ftpd_test.go +++ b/internal/ftpd/ftpd_test.go @@ -37,6 +37,7 @@ import ( ftpserver "github.com/fclairamb/ftpserverlib" "github.com/jlaffaye/ftp" + "github.com/pkg/sftp" "github.com/pquerna/otp" "github.com/pquerna/otp/totp" "github.com/rs/zerolog" @@ -44,6 +45,7 @@ import ( sdkkms "github.com/sftpgo/sdk/kms" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "golang.org/x/crypto/ssh" "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/config" @@ -441,7 +443,6 @@ func TestMain(m *testing.M) { //nolint:gocyclo CertificateFile: certPath, CertificateKeyFile: keyPath, TLSMode: 1, - TLSSessionReuse: 1, ClientAuthType: 2, }, } @@ -528,16 +529,6 @@ func TestInitializationFailure(t *testing.T) { require.Error(t, err) require.Contains(t, err.Error(), "the provided passive IP \"127001\" is not valid") ftpdConf.Bindings[1].ForcePassiveIP = "" - ftpdConf.Bindings[1].TLSMode = 2 - ftpdConf.Bindings[1].TLSSessionReuse = 1 - err = ftpdConf.Initialize(configDir) - require.Error(t, err, "TLS session resumption should not be supported with implicit FTPS") - ftpdConf.Bindings[1].TLSMode = 0 - ftpdConf.Bindings[1].TLSSessionReuse = 100 - err = ftpdConf.Initialize(configDir) - require.Error(t, err) - assert.Contains(t, err.Error(), "unsupported TLS reuse mode") - ftpdConf.Bindings[1].TLSSessionReuse = 0 err = ftpdConf.Initialize(configDir) require.Error(t, err) @@ -638,6 +629,8 @@ func TestBasicFTPHandling(t *testing.T) { } err = ftpUploadFile(testFilePath, testFileName, testFileSize, client, 0) assert.NoError(t, err) + _, err = client.FileSize(path.Join("/", testDir)) + assert.Error(t, err) size, err := client.FileSize(path.Join("/", testDir, testFileName)) assert.NoError(t, err) assert.Equal(t, testFileSize, size) @@ -671,6 +664,7 @@ func TestBasicFTPHandling(t *testing.T) { assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 50*time.Millisecond) assert.Eventually(t, func() bool { return common.Connections.GetClientConnections() == 0 }, 1000*time.Millisecond, 50*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func TestHTTPFs(t *testing.T) { @@ -715,6 +709,7 @@ func TestHTTPFs(t *testing.T) { assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 50*time.Millisecond) assert.Eventually(t, func() bool { return common.Connections.GetClientConnections() == 0 }, 1000*time.Millisecond, 50*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func TestListDirWithWildcards(t *testing.T) { @@ -1735,6 +1730,66 @@ func TestMaxPerHostConnections(t *testing.T) { common.Config.MaxPerHostConnections = oldValue } +func TestMaxTransfers(t *testing.T) { + oldValue := common.Config.MaxPerHostConnections + common.Config.MaxPerHostConnections = 2 + + assert.Eventually(t, func() bool { + return common.Connections.GetClientConnections() == 0 + }, 1000*time.Millisecond, 50*time.Millisecond) + + user := getTestUser() + err := dataprovider.AddUser(&user, "", "", "") + assert.NoError(t, err) + user.Password = "" + + testFilePath := filepath.Join(homeBasePath, testFileName) + testFileSize := int64(65535) + err = createTestFile(testFilePath, testFileSize) + assert.NoError(t, err) + + conn, sftpClient, err := getSftpClient(user) + assert.NoError(t, err) + defer conn.Close() + defer sftpClient.Close() + + f1, err := sftpClient.Create("file1") + assert.NoError(t, err) + f2, err := sftpClient.Create("file2") + assert.NoError(t, err) + _, err = f1.Write([]byte(" ")) + assert.NoError(t, err) + _, err = f2.Write([]byte(" ")) + assert.NoError(t, err) + + client, err := getFTPClient(user, true, nil) + if assert.NoError(t, err) { + err = checkBasicFTP(client) + assert.NoError(t, err) + err = ftpUploadFile(testFilePath, testFileName, testFileSize, client, 0) + assert.Error(t, err) + localDownloadPath := filepath.Join(homeBasePath, testDLFileName) + err = ftpDownloadFile(testFileName, localDownloadPath, testFileSize, client, 0) + assert.Error(t, err) + err := client.Quit() + assert.NoError(t, err) + err = os.Remove(localDownloadPath) + assert.NoError(t, err) + } + + err = f1.Close() + assert.NoError(t, err) + err = f2.Close() + assert.NoError(t, err) + + err = dataprovider.DeleteUser(user.Username, "", "", "") + assert.NoError(t, err) + err = os.RemoveAll(user.GetHomeDir()) + assert.NoError(t, err) + + common.Config.MaxPerHostConnections = oldValue +} + func TestRateLimiter(t *testing.T) { oldConfig := config.GetCommonConfig() @@ -2451,7 +2506,7 @@ func TestLoginWithDatabaseCredentials(t *testing.T) { u := getTestUser() u.FsConfig.Provider = sdk.GCSFilesystemProvider u.FsConfig.GCSConfig.Bucket = "test" - u.FsConfig.GCSConfig.Credentials = kms.NewPlainSecret(`{ "type": "service_account" }`) + u.FsConfig.GCSConfig.Credentials = kms.NewPlainSecret(`{ "type": "service_account", "private_key": " ", "client_email": "example@iam.gserviceaccount.com" }`) user, _, err := httpdtest.AddUser(u, http.StatusCreated) assert.NoError(t, err) assert.Equal(t, sdkkms.SecretStatusSecretBox, user.FsConfig.GCSConfig.Credentials.GetStatus()) @@ -2544,14 +2599,14 @@ func TestRename(t *testing.T) { assert.NoError(t, err) err = client.MakeDir(path.Join(otherDir, testDir)) assert.NoError(t, err) - code, response, err := client.SendCommand(fmt.Sprintf("SITE CHMOD 0001 %v", otherDir)) + code, response, err := client.SendCommand("SITE CHMOD 0001 %v", otherDir) assert.NoError(t, err) assert.Equal(t, ftp.StatusCommandOK, code) assert.Equal(t, "SITE CHMOD command successful", response) err = client.Rename(testDir, path.Join(otherDir, testDir)) assert.Error(t, err) - code, response, err = client.SendCommand(fmt.Sprintf("SITE CHMOD 755 %v", otherDir)) + code, response, err = client.SendCommand("SITE CHMOD 755 %v", otherDir) assert.NoError(t, err) assert.Equal(t, ftp.StatusCommandOK, code) assert.Equal(t, "SITE CHMOD command successful", response) @@ -2611,7 +2666,7 @@ func TestSymlink(t *testing.T) { assert.NoError(t, err) err = ftpUploadFile(testFilePath, testFileName, testFileSize, client, 0) assert.NoError(t, err) - code, _, err := client.SendCommand(fmt.Sprintf("SITE SYMLINK %v %v", testFileName, testFileName+".link")) + code, _, err := client.SendCommand("SITE SYMLINK %v %v", testFileName, testFileName+".link") assert.NoError(t, err) assert.Equal(t, ftp.StatusCommandOK, code) @@ -2622,15 +2677,15 @@ func TestSymlink(t *testing.T) { assert.NoError(t, err) err = client.MakeDir(path.Join(otherDir, testDir)) assert.NoError(t, err) - code, response, err := client.SendCommand(fmt.Sprintf("SITE CHMOD 0001 %v", otherDir)) + code, response, err := client.SendCommand("SITE CHMOD 0001 %v", otherDir) assert.NoError(t, err) assert.Equal(t, ftp.StatusCommandOK, code) assert.Equal(t, "SITE CHMOD command successful", response) - code, _, err = client.SendCommand(fmt.Sprintf("SITE SYMLINK %v %v", testDir, path.Join(otherDir, testDir))) + code, _, err = client.SendCommand("SITE SYMLINK %v %v", testDir, path.Join(otherDir, testDir)) assert.NoError(t, err) assert.Equal(t, ftp.StatusFileUnavailable, code) - code, response, err = client.SendCommand(fmt.Sprintf("SITE CHMOD 755 %v", otherDir)) + code, response, err = client.SendCommand("SITE CHMOD 755 %v", otherDir) assert.NoError(t, err) assert.Equal(t, ftp.StatusCommandOK, code) assert.Equal(t, "SITE CHMOD command successful", response) @@ -2718,6 +2773,7 @@ func TestStat(t *testing.T) { func TestUploadOverwriteVfolder(t *testing.T) { u := getTestUser() + u.QuotaFiles = 1000 vdir := "/vdir" mappedPath := filepath.Join(os.TempDir(), "vdir") folderName := filepath.Base(mappedPath) @@ -2749,14 +2805,24 @@ func TestUploadOverwriteVfolder(t *testing.T) { assert.NoError(t, err) folder, _, err := httpdtest.GetFolderByName(folderName, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, folder.UsedQuotaSize) - assert.Equal(t, 1, folder.UsedQuotaFiles) + assert.Equal(t, int64(0), folder.UsedQuotaSize) + assert.Equal(t, 0, folder.UsedQuotaFiles) + user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) + assert.NoError(t, err) + assert.Equal(t, testFileSize, user.UsedQuotaSize) + assert.Equal(t, 1, user.UsedQuotaFiles) + err = ftpUploadFile(testFilePath, path.Join(vdir, testFileName), testFileSize, client, 0) assert.NoError(t, err) folder, _, err = httpdtest.GetFolderByName(folderName, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, folder.UsedQuotaSize) - assert.Equal(t, 1, folder.UsedQuotaFiles) + assert.Equal(t, int64(0), folder.UsedQuotaSize) + assert.Equal(t, 0, folder.UsedQuotaFiles) + user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) + assert.NoError(t, err) + assert.Equal(t, testFileSize, user.UsedQuotaSize) + assert.Equal(t, 1, user.UsedQuotaFiles) + err = client.Quit() assert.NoError(t, err) err = os.Remove(testFilePath) @@ -3051,7 +3117,7 @@ func TestChtimes(t *testing.T) { assert.NoError(t, err) mtime := time.Now().Format("20060102150405") - code, response, err := client.SendCommand(fmt.Sprintf("MFMT %v %v", mtime, testFileName)) + code, response, err := client.SendCommand("MFMT %v %v", mtime, testFileName) assert.NoError(t, err) assert.Equal(t, ftp.StatusFile, code) assert.Equal(t, fmt.Sprintf("Modify=%v; %v", mtime, testFileName), response) @@ -3088,12 +3154,12 @@ func TestMODEType(t *testing.T) { if assert.NoError(t, err) { code, response, err := client.SendCommand("MODE s") assert.NoError(t, err) - assert.Equal(t, ftp.StatusCommandOK, code) - assert.Equal(t, "Transfer mode set to 'S'", response) + assert.Equal(t, ftp.StatusNotImplementedParameter, code) + assert.Equal(t, "Unsupported mode", response) code, response, err = client.SendCommand("MODE S") assert.NoError(t, err) assert.Equal(t, ftp.StatusCommandOK, code) - assert.Equal(t, "Transfer mode set to 'S'", response) + assert.Equal(t, "Using stream mode", response) code, _, err = client.SendCommand("MODE Z") assert.NoError(t, err) @@ -3101,7 +3167,7 @@ func TestMODEType(t *testing.T) { code, _, err = client.SendCommand("MODE SS") assert.NoError(t, err) - assert.Equal(t, ftp.StatusBadArguments, code) + assert.Equal(t, ftp.StatusNotImplementedParameter, code) err = client.Quit() assert.NoError(t, err) @@ -3128,7 +3194,7 @@ func TestSTAT(t *testing.T) { assert.NoError(t, err) err = ftpUploadFile(testFilePath, path.Join(testDir, testFileName+"_1"), testFileSize, client, 0) assert.NoError(t, err) - code, response, err := client.SendCommand(fmt.Sprintf("STAT %s", testDir)) + code, response, err := client.SendCommand("STAT %s", testDir) assert.NoError(t, err) assert.Equal(t, ftp.StatusDirectory, code) assert.Contains(t, response, fmt.Sprintf("STAT %s", testDir)) @@ -3162,7 +3228,7 @@ func TestChown(t *testing.T) { assert.NoError(t, err) err = ftpUploadFile(testFilePath, testFileName, testFileSize, client, 0) assert.NoError(t, err) - code, response, err := client.SendCommand(fmt.Sprintf("SITE CHOWN 1000:1000 %v", testFileName)) + code, response, err := client.SendCommand("SITE CHOWN 1000:1000 %v", testFileName) assert.NoError(t, err) assert.Equal(t, ftp.StatusFileUnavailable, code) assert.Equal(t, "Couldn't chown: operation unsupported", response) @@ -3200,7 +3266,7 @@ func TestChmod(t *testing.T) { err = ftpUploadFile(testFilePath, testFileName, testFileSize, client, 0) assert.NoError(t, err) - code, response, err := client.SendCommand(fmt.Sprintf("SITE CHMOD 600 %v", testFileName)) + code, response, err := client.SendCommand("SITE CHMOD 600 %v", testFileName) assert.NoError(t, err) assert.Equal(t, ftp.StatusCommandOK, code) assert.Equal(t, "SITE CHMOD command successful", response) @@ -3363,12 +3429,12 @@ func TestHASH(t *testing.T) { err = f.Close() assert.NoError(t, err) - code, response, err := client.SendCommand(fmt.Sprintf("XSHA256 %v", testFileName)) + code, response, err := client.SendCommand("XSHA256 %v", testFileName) assert.NoError(t, err) assert.Equal(t, ftp.StatusRequestedFileActionOK, code) assert.Contains(t, response, hash) - code, response, err = client.SendCommand(fmt.Sprintf("HASH %v", testFileName)) + code, response, err = client.SendCommand("HASH %v", testFileName) assert.NoError(t, err) assert.Equal(t, ftp.StatusFile, code) assert.Contains(t, response, hash) @@ -3424,7 +3490,7 @@ func TestCombine(t *testing.T) { err = ftpUploadFile(testFilePath, testFileName+".2", testFileSize, client, 0) assert.NoError(t, err) - code, response, err := client.SendCommand(fmt.Sprintf("COMB %v %v %v", testFileName, testFileName+".1", testFileName+".2")) + code, response, err := client.SendCommand("COMB %v %v %v", testFileName, testFileName+".1", testFileName+".2") assert.NoError(t, err) if user.Username == defaultUsername { assert.Equal(t, ftp.StatusRequestedFileActionOK, code) @@ -3461,61 +3527,6 @@ func TestCombine(t *testing.T) { assert.NoError(t, err) } -func TestTLSSessionReuse(t *testing.T) { - u := getTestUser() - user, _, err := httpdtest.AddUser(u, http.StatusCreated) - assert.NoError(t, err) - - client, err := getFTPClientWithSessionReuse(user, nil) - if assert.NoError(t, err) { - err = checkBasicFTP(client) - assert.NoError(t, err) - - testFilePath := filepath.Join(homeBasePath, testFileName) - testFileSize := int64(65535) - err = createTestFile(testFilePath, testFileSize) - assert.NoError(t, err) - - err = ftpUploadFile(testFilePath, testFileName, testFileSize, client, 0) - assert.NoError(t, err) - - localDownloadPath := filepath.Join(homeBasePath, testDLFileName) - err = ftpDownloadFile(testFileName, localDownloadPath, testFileSize, client, 0) - assert.NoError(t, err) - - entries, err := client.List("/") - assert.NoError(t, err) - assert.Len(t, entries, 1) - - err = client.Quit() - assert.NoError(t, err) - err = os.Remove(testFilePath) - assert.NoError(t, err) - err = os.Remove(localDownloadPath) - assert.NoError(t, err) - } - - // this TLS config does not support session resumption - tlsConfig := &tls.Config{ - ServerName: "localhost", - InsecureSkipVerify: true, // use this for tests only - MinVersion: tls.VersionTLS12, - } - client, err = getFTPClientWithSessionReuse(user, tlsConfig) - if assert.NoError(t, err) { - err = checkBasicFTP(client) - assert.Error(t, err) - - err = client.Quit() - assert.NoError(t, err) - } - - _, err = httpdtest.RemoveUser(user, http.StatusOK) - assert.NoError(t, err) - err = os.RemoveAll(user.GetHomeDir()) - assert.NoError(t, err) -} - func TestClientCertificateAuthRevokedCert(t *testing.T) { u := getTestUser() u.Username = tlsClient2Username @@ -3951,6 +3962,7 @@ func TestNestedVirtualFolders(t *testing.T) { assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 50*time.Millisecond) assert.Eventually(t, func() bool { return common.Connections.GetClientConnections() == 0 }, 1000*time.Millisecond, 50*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func checkBasicFTP(client *ftp.ServerConn) error { @@ -4202,6 +4214,30 @@ func getPreLoginScriptContent(user dataprovider.User, nonJSONResponse bool) []by return content } +func getSftpClient(user dataprovider.User) (*ssh.Client, *sftp.Client, error) { + var sftpClient *sftp.Client + config := &ssh.ClientConfig{ + User: user.Username, + HostKeyCallback: ssh.InsecureIgnoreHostKey(), + Timeout: 5 * time.Second, + } + if user.Password != "" { + config.Auth = []ssh.AuthMethod{ssh.Password(user.Password)} + } else { + config.Auth = []ssh.AuthMethod{ssh.Password(defaultPassword)} + } + + conn, err := ssh.Dial("tcp", sftpServerAddr, config) + if err != nil { + return conn, sftpClient, err + } + sftpClient, err = sftp.NewClient(conn) + if err != nil { + conn.Close() + } + return conn, sftpClient, err +} + func getExitCodeScriptContent(exitCode int) []byte { content := []byte("#!/bin/sh\n\n") content = append(content, []byte(fmt.Sprintf("exit %v", exitCode))...) diff --git a/internal/ftpd/handler.go b/internal/ftpd/handler.go index 036c3977..613eaa07 100644 --- a/internal/ftpd/handler.go +++ b/internal/ftpd/handler.go @@ -29,6 +29,7 @@ import ( "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/dataprovider" "github.com/drakkan/sftpgo/v2/internal/logger" + "github.com/drakkan/sftpgo/v2/internal/util" "github.com/drakkan/sftpgo/v2/internal/vfs" ) @@ -97,6 +98,7 @@ func (c *Connection) Create(_ string) (afero.File, error) { // Mkdir creates a directory using the connection filesystem func (c *Connection) Mkdir(name string, _ os.FileMode) error { c.UpdateLastActivity() + name = util.CleanPath(name) return c.CreateDir(name, true) } @@ -120,6 +122,7 @@ func (c *Connection) OpenFile(_ string, _ int, _ os.FileMode) (afero.File, error // We implements ClientDriverExtensionRemoveDir for directories func (c *Connection) Remove(name string) error { c.UpdateLastActivity() + name = util.CleanPath(name) fs, p, err := c.GetFsAndResolvedPath(name) if err != nil { @@ -147,6 +150,8 @@ func (c *Connection) RemoveAll(_ string) error { // Rename renames a file or a directory func (c *Connection) Rename(oldname, newname string) error { c.UpdateLastActivity() + oldname = util.CleanPath(oldname) + newname = util.CleanPath(newname) return c.BaseConnection.Rename(oldname, newname) } @@ -155,6 +160,7 @@ func (c *Connection) Rename(oldname, newname string) error { // if any happens func (c *Connection) Stat(name string) (os.FileInfo, error) { c.UpdateLastActivity() + name = util.CleanPath(name) c.doWildcardListDir = false if !c.User.HasPerm(dataprovider.PermListItems, path.Dir(name)) { @@ -198,6 +204,7 @@ func (c *Connection) Chown(_ string, _, _ int) error { // Chmod changes the mode of the named file/directory func (c *Connection) Chmod(name string, mode os.FileMode) error { c.UpdateLastActivity() + name = util.CleanPath(name) attrs := common.StatAttributes{ Flags: common.StatAttrPerms, @@ -209,6 +216,7 @@ func (c *Connection) Chmod(name string, mode os.FileMode) error { // Chtimes changes the access and modification times of the named file func (c *Connection) Chtimes(name string, atime time.Time, mtime time.Time) error { c.UpdateLastActivity() + name = util.CleanPath(name) attrs := common.StatAttributes{ Flags: common.StatAttrTimes, @@ -221,6 +229,7 @@ func (c *Connection) Chtimes(name string, atime time.Time, mtime time.Time) erro // GetAvailableSpace implements ClientDriverExtensionAvailableSpace interface func (c *Connection) GetAvailableSpace(dirName string) (int64, error) { c.UpdateLastActivity() + dirName = util.CleanPath(dirName) diskQuota, transferQuota := c.HasSpace(false, false, path.Join(dirName, "fakefile.txt")) if !diskQuota.HasSpace || !transferQuota.HasUploadSpace() { @@ -279,6 +288,7 @@ func (c *Connection) AllocateSpace(_ int) error { // RemoveDir implements ClientDriverExtensionRemoveDir func (c *Connection) RemoveDir(name string) error { c.UpdateLastActivity() + name = util.CleanPath(name) return c.BaseConnection.RemoveDir(name) } @@ -286,13 +296,16 @@ func (c *Connection) RemoveDir(name string) error { // Symlink implements ClientDriverExtensionSymlink func (c *Connection) Symlink(oldname, newname string) error { c.UpdateLastActivity() + oldname = util.CleanPath(oldname) + newname = util.CleanPath(newname) - return c.BaseConnection.CreateSymlink(oldname, newname) + return c.CreateSymlink(oldname, newname) } // ReadDir implements ClientDriverExtensionFilelist -func (c *Connection) ReadDir(name string) (ftpserver.DirLister, error) { +func (c *Connection) ReadDir(name string) ([]os.FileInfo, error) { c.UpdateLastActivity() + name = util.CleanPath(name) if c.doWildcardListDir { c.doWildcardListDir = false @@ -306,21 +319,27 @@ func (c *Connection) ReadDir(name string) (ftpserver.DirLister, error) { if err != nil { return nil, err } - return &patternDirLister{ + patternLister := &patternDirLister{ DirLister: lister, pattern: baseName, lastCommand: c.clientContext.GetLastCommand(), dirName: name, - connectionPath: c.clientContext.Path(), - }, nil + connectionPath: util.CleanPath(c.clientContext.Path()), + } + return consumeDirLister(patternLister) } - return c.ListDir(name) + lister, err := c.ListDir(name) + if err != nil { + return nil, err + } + return consumeDirLister(lister) } // GetHandle implements ClientDriverExtentionFileTransfer func (c *Connection) GetHandle(name string, flags int, offset int64) (ftpserver.FileTransfer, error) { c.UpdateLastActivity() + name = util.CleanPath(name) fs, p, err := c.GetFsAndResolvedPath(name) if err != nil { @@ -331,6 +350,11 @@ func (c *Connection) GetHandle(name string, flags int, offset int64) (ftpserver. return nil, errCOMBNotSupported } + if err := common.Connections.IsNewTransferAllowed(c.User.Username); err != nil { + c.Log(logger.LevelInfo, "denying transfer due to count limits") + return nil, c.GetPermissionDeniedError() + } + if flags&os.O_WRONLY != 0 { return c.uploadFile(fs, p, name, flags) } @@ -465,7 +489,7 @@ func (c *Connection) handleFTPUploadToExistingFile(fs vfs.Fs, flags int, resolve } if common.Config.IsAtomicUploadEnabled() && fs.IsAtomicUploadSupported() { - _, _, err = fs.Rename(resolvedPath, filePath) + _, _, err = fs.Rename(resolvedPath, filePath, 0) if err != nil { c.Log(logger.LevelError, "error renaming existing file for atomic upload, source: %q, dest: %q, err: %+v", resolvedPath, filePath, err) @@ -493,10 +517,7 @@ func (c *Connection) handleFTPUploadToExistingFile(fs vfs.Fs, flags int, resolve if vfs.HasTruncateSupport(fs) { vfolder, err := c.User.GetVirtualFolderForPath(path.Dir(requestPath)) if err == nil { - dataprovider.UpdateVirtualFolderQuota(&vfolder.BaseVirtualFolder, 0, -fileSize, false) //nolint:errcheck - if vfolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&c.User, 0, -fileSize, false) //nolint:errcheck - } + dataprovider.UpdateUserFolderQuota(&vfolder, &c.User, 0, -fileSize, false) } else { dataprovider.UpdateUserQuota(&c.User, 0, -fileSize, false) //nolint:errcheck } @@ -581,3 +602,24 @@ func (l *patternDirLister) Next(limit int) ([]os.FileInfo, error) { } } } + +func consumeDirLister(lister vfs.DirLister) ([]os.FileInfo, error) { + defer lister.Close() + + var results []os.FileInfo + + for { + files, err := lister.Next(vfs.ListerBatchSize) + finished := errors.Is(err, io.EOF) + results = append(results, files...) + if err != nil && !finished { + return results, err + } + if finished { + lister.Close() + break + } + } + + return results, nil +} diff --git a/internal/ftpd/internal_test.go b/internal/ftpd/internal_test.go index 646968cc..4e167524 100644 --- a/internal/ftpd/internal_test.go +++ b/internal/ftpd/internal_test.go @@ -404,7 +404,7 @@ func (fs MockOsFs) Remove(name string, _ bool) error { } // Rename renames (moves) source to target -func (fs MockOsFs) Rename(source, target string) (int, int64, error) { +func (fs MockOsFs) Rename(source, target string, _ int) (int, int64, error) { if fs.err != nil { return -1, -1, fs.err } @@ -527,15 +527,24 @@ func TestServerGetSettings(t *testing.T) { Bindings: []Binding{binding}, PassivePortRange: PortRange{ Start: 10000, - End: 11000, + End: 10000, }, } assert.False(t, binding.HasProxy()) server := NewServer(c, configDir, binding, 0) settings, err := server.GetSettings() assert.NoError(t, err) - assert.Equal(t, 10000, settings.PassiveTransferPortRange.Start) - assert.Equal(t, 11000, settings.PassiveTransferPortRange.End) + if ranger, ok := settings.PassiveTransferPortRange.(*ftpserver.PortRange); ok { + assert.Equal(t, 10000, ranger.Start) + assert.Equal(t, 10000, ranger.End) + } + c.PassivePortRange.End = 11000 + settings, err = server.GetSettings() + assert.NoError(t, err) + if ranger, ok := settings.PassiveTransferPortRange.(*ftpserver.PortRange); ok { + assert.Equal(t, 10000, ranger.Start) + assert.Equal(t, 11000, ranger.End) + } common.Config.ProxyProtocol = 1 _, err = server.GetSettings() @@ -664,6 +673,7 @@ func TestClientVersion(t *testing.T) { common.Connections.Remove(connection.GetID()) } assert.Len(t, common.Connections.GetStats(""), 0) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func TestDriverMethodsNotImplemented(t *testing.T) { @@ -689,16 +699,26 @@ func TestDriverMethodsNotImplemented(t *testing.T) { func TestExtraData(t *testing.T) { mockCC := mockFTPClientContext{} - _, ok := mockCC.Extra().(bool) + _, ok := mockCC.Extra().(*tlsState) require.False(t, ok) - mockCC.SetExtra(false) - val, ok := mockCC.Extra().(bool) + mockCC.SetExtra(&tlsState{ + LoginWithMutualTLS: false, + Version: tls.VersionName(tls.VersionTLS13), + Cipher: tls.CipherSuiteName(tls.TLS_AES_128_GCM_SHA256), + KEX: tls.X25519MLKEM768.String(), + }) + state, ok := mockCC.Extra().(*tlsState) require.True(t, ok) - require.False(t, val) - mockCC.SetExtra(true) - val, ok = mockCC.Extra().(bool) + require.False(t, state.LoginWithMutualTLS) + require.Equal(t, tls.VersionName(tls.VersionTLS13), state.Version) + require.Equal(t, tls.CipherSuiteName(tls.TLS_AES_128_GCM_SHA256), state.Cipher) + require.Equal(t, tls.X25519MLKEM768.String(), state.KEX) + mockCC.SetExtra(&tlsState{ + LoginWithMutualTLS: true, + }) + state, ok = mockCC.Extra().(*tlsState) require.True(t, ok) - require.True(t, val) + require.True(t, state.LoginWithMutualTLS) } func TestResolvePathErrors(t *testing.T) { @@ -885,7 +905,6 @@ func TestTransferErrors(t *testing.T) { fs := newMockOsFs(nil, nil, false, connID, user.GetHomeDir()) connection := &Connection{ BaseConnection: common.NewBaseConnection(connID, common.ProtocolFTP, "", "", user), - clientContext: mockCC, } baseTransfer := common.NewBaseTransfer(file, connection.BaseConnection, nil, file.Name(), file.Name(), testfile, common.TransferDownload, 0, 0, 0, 0, false, fs, dataprovider.TransferQuota{}) @@ -919,6 +938,7 @@ func TestTransferErrors(t *testing.T) { pipeWriter := vfs.NewPipeWriter(w) baseTransfer = common.NewBaseTransfer(nil, connection.BaseConnection, nil, testfile, testfile, testfile, common.TransferUpload, 0, 0, 0, 0, false, fs, dataprovider.TransferQuota{}) + tr.Connection.RemoveTransfer(tr) tr = newTransfer(baseTransfer, pipeWriter, nil, 0) err = r.Close() @@ -934,6 +954,7 @@ func TestTransferErrors(t *testing.T) { if assert.Error(t, err) { assert.EqualError(t, err, common.ErrOpUnsupported.Error()) } + tr.Connection.RemoveTransfer(tr) err = os.Remove(testfile) assert.NoError(t, err) } diff --git a/internal/ftpd/server.go b/internal/ftpd/server.go index ecd1edb3..2e5790ae 100644 --- a/internal/ftpd/server.go +++ b/internal/ftpd/server.go @@ -22,6 +22,7 @@ import ( "net" "os" "path/filepath" + "slices" ftpserver "github.com/fclairamb/ftpserverlib" "github.com/sftpgo/sdk/plugin/notifier" @@ -35,6 +36,15 @@ import ( "github.com/drakkan/sftpgo/v2/internal/version" ) +// tlsState tracks TLS connection state for a client +type tlsState struct { + // LoginWithMutualTLS indicates whether the user logged in using TLS certificate authentication + LoginWithMutualTLS bool + Version string + Cipher string + KEX string +} + // Server implements the ftpserverlib MainDriver interface type Server struct { ID int @@ -82,7 +92,7 @@ func (s *Server) GetSettings() (*ftpserver.Settings, error) { return nil, err } var portRange *ftpserver.PortRange - if s.config.PassivePortRange.Start > 0 && s.config.PassivePortRange.End > s.config.PassivePortRange.Start { + if s.config.PassivePortRange.Start > 0 && s.config.PassivePortRange.End >= s.config.PassivePortRange.Start { portRange = &ftpserver.PortRange{ Start: s.config.PassivePortRange.Start, End: s.config.PassivePortRange.End, @@ -109,34 +119,31 @@ func (s *Server) GetSettings() (*ftpserver.Settings, error) { return nil, fmt.Errorf("unsupported TLS mode: %d", s.binding.TLSMode) } - if !s.binding.isTLSSessionReuseValid() { - return nil, fmt.Errorf("unsupported TLS reuse mode %d", s.binding.TLSSessionReuse) - } - - if (s.binding.TLSMode > 0 || s.binding.TLSSessionReuse > 0) && certMgr == nil { + if s.binding.TLSMode > 0 && certMgr == nil { return nil, errors.New("to enable TLS you need to provide a certificate") } - return &ftpserver.Settings{ - Listener: ftpListener, - ListenAddr: s.binding.GetAddress(), - PublicIPResolver: s.binding.passiveIPResolver, - PassiveTransferPortRange: portRange, - ActiveTransferPortNon20: s.config.ActiveTransfersPortNon20, - IdleTimeout: -1, - ConnectionTimeout: 20, - Banner: s.statusBanner, - TLSRequired: ftpserver.TLSRequirement(s.binding.TLSMode), - TLSSessionReuse: ftpserver.TLSSessionReuse(s.binding.TLSSessionReuse), - DisableSite: !s.config.EnableSite, - DisableActiveMode: s.config.DisableActiveMode, - EnableHASH: s.config.HASHSupport > 0, - EnableCOMB: s.config.CombineSupport > 0, - DefaultTransferType: ftpserver.TransferTypeBinary, - IgnoreASCIITranferType: s.binding.IgnoreASCIITransferType == 1, - ActiveConnectionsCheck: ftpserver.DataConnectionRequirement(s.binding.ActiveConnectionsSecurity), - PasvConnectionsCheck: ftpserver.DataConnectionRequirement(s.binding.PassiveConnectionsSecurity), - }, nil + settings := &ftpserver.Settings{ + Listener: ftpListener, + ListenAddr: s.binding.GetAddress(), + PublicIPResolver: s.binding.passiveIPResolver, + ActiveTransferPortNon20: s.config.ActiveTransfersPortNon20, + IdleTimeout: -1, + ConnectionTimeout: 20, + Banner: s.statusBanner, + TLSRequired: ftpserver.TLSRequirement(s.binding.TLSMode), + DisableSite: !s.config.EnableSite, + DisableActiveMode: s.config.DisableActiveMode, + EnableHASH: s.config.HASHSupport > 0, + EnableCOMB: s.config.CombineSupport > 0, + DefaultTransferType: ftpserver.TransferTypeBinary, + ActiveConnectionsCheck: ftpserver.DataConnectionRequirement(s.binding.ActiveConnectionsSecurity), + PasvConnectionsCheck: ftpserver.DataConnectionRequirement(s.binding.PassiveConnectionsSecurity), + } + if portRange != nil { + settings.PassiveTransferPortRange = portRange + } + return settings, nil } // ClientConnected is called to send the very first welcome message @@ -180,27 +187,26 @@ func (s *Server) ClientDisconnected(cc ftpserver.ClientContext) { // AuthUser authenticates the user and selects an handling driver func (s *Server) AuthUser(cc ftpserver.ClientContext, username, password string) (ftpserver.ClientDriver, error) { loginMethod := dataprovider.LoginMethodPassword - if verified, ok := cc.Extra().(bool); ok && verified { + tlsState, ok := cc.Extra().(*tlsState) + if ok && tlsState != nil && tlsState.LoginWithMutualTLS { loginMethod = dataprovider.LoginMethodTLSCertificateAndPwd } ipAddr := util.GetIPFromRemoteAddress(cc.RemoteAddr().String()) user, err := dataprovider.CheckUserAndPass(username, password, ipAddr, common.ProtocolFTP) if err != nil { user.Username = username - updateLoginMetrics(&user, ipAddr, loginMethod, err) + updateLoginMetrics(&user, ipAddr, loginMethod, err, nil) return nil, dataprovider.ErrInvalidCredentials } connection, err := s.validateUser(user, cc, loginMethod) - defer updateLoginMetrics(&user, ipAddr, loginMethod, err) + defer updateLoginMetrics(&user, ipAddr, loginMethod, err, connection) if err != nil { return nil, err } setStartDirectory(user.Filters.StartDirectory, cc) - connection.Log(logger.LevelInfo, "User %q logged in with %q from ip %q, TLS enabled? %t", - user.Username, loginMethod, ipAddr, cc.HasTLSForControl()) dataprovider.UpdateLastLogin(&user) return connection, nil } @@ -234,42 +240,52 @@ func (s *Server) WrapPassiveListener(listener net.Listener) (net.Listener, error // VerifyConnection checks whether a user should be authenticated using a client certificate without prompting for a password func (s *Server) VerifyConnection(cc ftpserver.ClientContext, user string, tlsConn *tls.Conn) (ftpserver.ClientDriver, error) { + if tlsConn == nil { + return nil, nil + } + state := tlsConn.ConnectionState() + cc.SetExtra(&tlsState{ + LoginWithMutualTLS: false, + Cipher: tls.CipherSuiteName(state.CipherSuite), + Version: tls.VersionName(state.Version), + KEX: state.CurveID.String(), + }) if !s.binding.isMutualTLSEnabled() { return nil, nil } - cc.SetExtra(false) - if tlsConn != nil { - state := tlsConn.ConnectionState() - if len(state.PeerCertificates) > 0 { - ipAddr := util.GetIPFromRemoteAddress(cc.RemoteAddr().String()) - dbUser, err := dataprovider.CheckUserBeforeTLSAuth(user, ipAddr, common.ProtocolFTP, state.PeerCertificates[0]) + + if len(state.PeerCertificates) > 0 { + ipAddr := util.GetIPFromRemoteAddress(cc.RemoteAddr().String()) + dbUser, err := dataprovider.CheckUserBeforeTLSAuth(user, ipAddr, common.ProtocolFTP, state.PeerCertificates[0]) + if err != nil { + dbUser.Username = user + updateLoginMetrics(&dbUser, ipAddr, dataprovider.LoginMethodTLSCertificate, err, nil) + return nil, dataprovider.ErrInvalidCredentials + } + if dbUser.IsTLSVerificationEnabled() { + dbUser, err = dataprovider.CheckUserAndTLSCert(user, ipAddr, common.ProtocolFTP, state.PeerCertificates[0]) if err != nil { - dbUser.Username = user - updateLoginMetrics(&dbUser, ipAddr, dataprovider.LoginMethodTLSCertificate, err) - return nil, dataprovider.ErrInvalidCredentials + return nil, err } - if dbUser.IsTLSVerificationEnabled() { - dbUser, err = dataprovider.CheckUserAndTLSCert(user, ipAddr, common.ProtocolFTP, state.PeerCertificates[0]) + + cc.SetExtra(&tlsState{ + LoginWithMutualTLS: true, + Cipher: tls.CipherSuiteName(state.CipherSuite), + Version: tls.VersionName(state.Version), + KEX: state.CurveID.String(), + }) + + if dbUser.IsLoginMethodAllowed(dataprovider.LoginMethodTLSCertificate, common.ProtocolFTP) { + connection, err := s.validateUser(dbUser, cc, dataprovider.LoginMethodTLSCertificate) + + defer updateLoginMetrics(&dbUser, ipAddr, dataprovider.LoginMethodTLSCertificate, err, connection) + if err != nil { return nil, err } - - cc.SetExtra(true) - - if dbUser.IsLoginMethodAllowed(dataprovider.LoginMethodTLSCertificate, common.ProtocolFTP) { - connection, err := s.validateUser(dbUser, cc, dataprovider.LoginMethodTLSCertificate) - - defer updateLoginMetrics(&dbUser, ipAddr, dataprovider.LoginMethodTLSCertificate, err) - - if err != nil { - return nil, err - } - setStartDirectory(dbUser.Filters.StartDirectory, cc) - connection.Log(logger.LevelInfo, "User id: %d, logged in with FTP using a TLS certificate, username: %q, home_dir: %q remote addr: %q", - dbUser.ID, dbUser.Username, dbUser.HomeDir, ipAddr) - dataprovider.UpdateLastLogin(&dbUser) - return connection, nil - } + setStartDirectory(dbUser.Filters.StartDirectory, cc) + dataprovider.UpdateLastLogin(&dbUser) + return connection, nil } } } @@ -295,9 +311,7 @@ func (s *Server) buildTLSConfig() { s.binding.GetAddress(), s.binding.ciphers, certID) if s.binding.isMutualTLSEnabled() { s.tlsConfig.ClientCAs = certMgr.GetRootCAs() - if s.binding.TLSSessionReuse != int(ftpserver.TLSSessionReuseRequired) { - s.tlsConfig.VerifyConnection = s.verifyTLSConnection - } + s.tlsConfig.VerifyConnection = s.verifyTLSConnection switch s.binding.ClientAuthType { case 1: s.tlsConfig.ClientAuth = tls.RequireAndVerifyClientCert @@ -361,7 +375,7 @@ func (s *Server) validateUser(user dataprovider.User, cc ftpserver.ClientContext user.Username, user.HomeDir) return nil, fmt.Errorf("cannot login user with invalid home dir: %q", user.HomeDir) } - if util.Contains(user.Filters.DeniedProtocols, common.ProtocolFTP) { + if slices.Contains(user.Filters.DeniedProtocols, common.ProtocolFTP) { logger.Info(logSender, connectionID, "cannot login user %q, protocol FTP is not allowed", user.Username) return nil, fmt.Errorf("protocol FTP is not allowed for user %q", user.Username) } @@ -416,13 +430,19 @@ func setStartDirectory(startDirectory string, cc ftpserver.ClientContext) { cc.SetPath(startDirectory) } -func updateLoginMetrics(user *dataprovider.User, ip, loginMethod string, err error) { +func updateLoginMetrics(user *dataprovider.User, ip, loginMethod string, err error, c *Connection) { metric.AddLoginAttempt(loginMethod) if err == nil { + info := "" + if tlsState, ok := c.clientContext.Extra().(*tlsState); ok && tlsState != nil { + info = fmt.Sprintf("%s - %s - %s", tlsState.Version, tlsState.Cipher, tlsState.KEX) + } + logger.LoginLog(user.Username, ip, loginMethod, common.ProtocolFTP, c.ID, c.GetClientVersion(), + c.clientContext.HasTLSForControl(), info) plugin.Handler.NotifyLogEvent(notifier.LogEventTypeLoginOK, common.ProtocolFTP, user.Username, ip, "", nil) + common.DelayLogin(nil) } else if err != common.ErrInternalFailure { - logger.ConnectionFailedLog(user.Username, ip, loginMethod, - common.ProtocolFTP, err.Error()) + logger.ConnectionFailedLog(user.Username, ip, loginMethod, common.ProtocolFTP, err.Error()) event := common.HostEventLoginFailed logEv := notifier.LogEventTypeLoginFailed if errors.Is(err, util.ErrNotFound) { @@ -431,6 +451,9 @@ func updateLoginMetrics(user *dataprovider.User, ip, loginMethod string, err err } common.AddDefenderEvent(ip, common.ProtocolFTP, event) plugin.Handler.NotifyLogEvent(logEv, common.ProtocolFTP, user.Username, ip, "", err) + if loginMethod != dataprovider.LoginMethodTLSCertificate { + common.DelayLogin(err) + } } metric.AddLoginResult(loginMethod, err) dataprovider.ExecutePostLoginHook(user, loginMethod, ip, common.ProtocolFTP, err) diff --git a/internal/ftpd/transfer.go b/internal/ftpd/transfer.go index ed0ce660..071f8b1e 100644 --- a/internal/ftpd/transfer.go +++ b/internal/ftpd/transfer.go @@ -136,7 +136,7 @@ func (t *transfer) closeIO() error { } else if t.reader != nil { err = t.reader.Close() if metadater, ok := t.reader.(vfs.Metadater); ok { - t.BaseTransfer.SetMetadata(metadater.Metadata()) + t.SetMetadata(metadater.Metadata()) } } return err diff --git a/internal/httpd/api_admin.go b/internal/httpd/api_admin.go index b232362c..2fd093a0 100644 --- a/internal/httpd/api_admin.go +++ b/internal/httpd/api_admin.go @@ -21,10 +21,10 @@ import ( "net/http" "net/url" - "github.com/go-chi/jwtauth/v5" "github.com/go-chi/render" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/smtp" "github.com/drakkan/sftpgo/v2/internal/util" ) @@ -68,7 +68,7 @@ func renderAdmin(w http.ResponseWriter, r *http.Request, username string, status func addAdmin(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -90,7 +90,7 @@ func addAdmin(w http.ResponseWriter, r *http.Request) { func disableAdmin2FA(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -138,7 +138,7 @@ func updateAdmin(w http.ResponseWriter, r *http.Request) { return } - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -149,8 +149,8 @@ func updateAdmin(w http.ResponseWriter, r *http.Request) { http.StatusBadRequest) return } - if claims.isCriticalPermRemoved(updatedAdmin.Permissions) { - sendAPIResponse(w, r, errors.New("you cannot remove these permissions to yourself"), "", http.StatusBadRequest) + if !util.SlicesEqual(admin.Permissions, updatedAdmin.Permissions) { + sendAPIResponse(w, r, errors.New("you cannot change your permissions"), "", http.StatusBadRequest) return } if updatedAdmin.Status == 0 { @@ -182,7 +182,7 @@ func updateAdmin(w http.ResponseWriter, r *http.Request) { func deleteAdmin(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) username := getURLParam(r, "username") - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -202,7 +202,7 @@ func deleteAdmin(w http.ResponseWriter, r *http.Request) { func getAdminProfile(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -224,7 +224,7 @@ func getAdminProfile(w http.ResponseWriter, r *http.Request) { func updateAdminProfile(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -297,6 +297,7 @@ func changeAdminPassword(w http.ResponseWriter, r *http.Request) { sendAPIResponse(w, r, err, "", getRespStatus(err)) return } + invalidateToken(r) sendAPIResponse(w, r, err, "Password updated", http.StatusOK) } @@ -316,7 +317,7 @@ func doChangeAdminPassword(r *http.Request, currentPassword, newPassword, confir util.I18nErrorChangePwdNoDifferent, ) } - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil { return util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken) } @@ -334,14 +335,3 @@ func doChangeAdminPassword(r *http.Request, currentPassword, newPassword, confir return dataprovider.UpdateAdmin(&admin, dataprovider.ActionExecutorSelf, util.GetIPFromRemoteAddress(r.RemoteAddr), claims.Role) } - -func getTokenClaims(r *http.Request) (jwtTokenClaims, error) { - tokenClaims := jwtTokenClaims{} - _, claims, err := jwtauth.FromContext(r.Context()) - if err != nil { - return tokenClaims, err - } - tokenClaims.Decode(claims) - - return tokenClaims, nil -} diff --git a/internal/httpd/api_configs.go b/internal/httpd/api_configs.go index 399c7ad2..520f81a9 100644 --- a/internal/httpd/api_configs.go +++ b/internal/httpd/api_configs.go @@ -66,7 +66,7 @@ func testSMTPConfig(w http.ResponseWriter, r *http.Request) { } } if req.AuthType == 3 { - if err := req.Config.OAuth2.Validate(); err != nil { + if err := req.OAuth2.Validate(); err != nil { sendAPIResponse(w, r, err, "", http.StatusBadRequest) return } @@ -85,7 +85,7 @@ type oauth2TokenRequest struct { BaseRedirectURL string `json:"base_redirect_url"` } -func handleSMTPOAuth2TokenRequestPost(w http.ResponseWriter, r *http.Request) { +func (s *httpdServer) handleSMTPOAuth2TokenRequestPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) var req oauth2TokenRequest @@ -106,20 +106,20 @@ func handleSMTPOAuth2TokenRequestPost(w http.ResponseWriter, r *http.Request) { } configs.SetNilsToEmpty() if err := configs.SMTP.TryDecrypt(); err == nil { - req.OAuth2Config.ClientSecret = configs.SMTP.OAuth2.ClientSecret.GetPayload() + req.ClientSecret = configs.SMTP.OAuth2.ClientSecret.GetPayload() } } - cfg := req.OAuth2Config.GetOAuth2() + cfg := req.GetOAuth2() cfg.RedirectURL = req.BaseRedirectURL + webOAuth2RedirectPath clientSecret := kms.NewPlainSecret(cfg.ClientSecret) clientSecret.SetAdditionalData(xid.New().String()) pendingAuth := newOAuth2PendingAuth(req.Provider, cfg.RedirectURL, cfg.ClientID, clientSecret) oauth2Mgr.addPendingAuth(pendingAuth) - stateToken := createOAuth2Token(pendingAuth.State, util.GetIPFromRemoteAddress(r.RemoteAddr)) + stateToken := createOAuth2Token(s.csrfTokenAuth, pendingAuth.State, util.GetIPFromRemoteAddress(r.RemoteAddr)) if stateToken == "" { sendAPIResponse(w, r, nil, "unable to create state token", http.StatusInternalServerError) return } - u := cfg.AuthCodeURL(stateToken, oauth2.AccessTypeOffline) + u := cfg.AuthCodeURL(stateToken, oauth2.AccessTypeOffline, oauth2.S256ChallengeOption(pendingAuth.Verifier)) sendAPIResponse(w, r, nil, u, http.StatusOK) } diff --git a/internal/httpd/api_eventrule.go b/internal/httpd/api_eventrule.go index a4daaaa6..b8474af4 100644 --- a/internal/httpd/api_eventrule.go +++ b/internal/httpd/api_eventrule.go @@ -24,6 +24,7 @@ import ( "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/util" ) @@ -42,7 +43,7 @@ func getEventActions(w http.ResponseWriter, r *http.Request) { render.JSON(w, r, actions) } -func renderEventAction(w http.ResponseWriter, r *http.Request, name string, claims *jwtTokenClaims, status int) { +func renderEventAction(w http.ResponseWriter, r *http.Request, name string, claims *jwt.Claims, status int) { action, err := dataprovider.EventActionExists(name) if err != nil { sendAPIResponse(w, r, err, "", getRespStatus(err)) @@ -61,19 +62,19 @@ func renderEventAction(w http.ResponseWriter, r *http.Request, name string, clai func getEventActionByName(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return } name := getURLParam(r, "name") - renderEventAction(w, r, name, &claims, http.StatusOK) + renderEventAction(w, r, name, claims, http.StatusOK) } func addEventAction(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -91,12 +92,12 @@ func addEventAction(w http.ResponseWriter, r *http.Request) { return } w.Header().Add("Location", fmt.Sprintf("%s/%s", eventActionsPath, url.PathEscape(action.Name))) - renderEventAction(w, r, action.Name, &claims, http.StatusCreated) + renderEventAction(w, r, action.Name, claims, http.StatusCreated) } func updateEventAction(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -136,7 +137,7 @@ func updateEventAction(w http.ResponseWriter, r *http.Request) { func deleteEventAction(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -165,7 +166,7 @@ func getEventRules(w http.ResponseWriter, r *http.Request) { render.JSON(w, r, rules) } -func renderEventRule(w http.ResponseWriter, r *http.Request, name string, claims *jwtTokenClaims, status int) { +func renderEventRule(w http.ResponseWriter, r *http.Request, name string, claims *jwt.Claims, status int) { rule, err := dataprovider.EventRuleExists(name) if err != nil { sendAPIResponse(w, r, err, "", getRespStatus(err)) @@ -184,19 +185,19 @@ func renderEventRule(w http.ResponseWriter, r *http.Request, name string, claims func getEventRuleByName(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return } name := getURLParam(r, "name") - renderEventRule(w, r, name, &claims, http.StatusOK) + renderEventRule(w, r, name, claims, http.StatusOK) } func addEventRule(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -213,12 +214,12 @@ func addEventRule(w http.ResponseWriter, r *http.Request) { return } w.Header().Add("Location", fmt.Sprintf("%s/%s", eventRulesPath, url.PathEscape(rule.Name))) - renderEventRule(w, r, rule.Name, &claims, http.StatusCreated) + renderEventRule(w, r, rule.Name, claims, http.StatusCreated) } func updateEventRule(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -249,7 +250,7 @@ func updateEventRule(w http.ResponseWriter, r *http.Request) { func deleteEventRule(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return diff --git a/internal/httpd/api_events.go b/internal/httpd/api_events.go index 5c218271..a5ad1a5c 100644 --- a/internal/httpd/api_events.go +++ b/internal/httpd/api_events.go @@ -27,6 +27,7 @@ import ( "github.com/sftpgo/sdk/plugin/notifier" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/plugin" "github.com/drakkan/sftpgo/v2/internal/util" ) @@ -68,8 +69,8 @@ func getCommonSearchParamsFromRequest(r *http.Request) (eventsearcher.CommonSear } c.EndTimestamp = ts } - c.Username = r.URL.Query().Get("username") - c.IP = r.URL.Query().Get("ip") + c.Username = strings.TrimSpace(r.URL.Query().Get("username")) + c.IP = strings.TrimSpace(r.URL.Query().Get("ip")) c.InstanceIDs = getCommaSeparatedQueryParam(r, "instance_ids") c.FromID = r.URL.Query().Get("from_id") @@ -93,9 +94,9 @@ func getFsSearchParamsFromRequest(r *http.Request) (eventsearcher.FsEventSearch, s.FsProvider = val } s.Actions = getCommaSeparatedQueryParam(r, "actions") - s.SSHCmd = r.URL.Query().Get("ssh_cmd") - s.Bucket = r.URL.Query().Get("bucket") - s.Endpoint = r.URL.Query().Get("endpoint") + s.SSHCmd = strings.TrimSpace(r.URL.Query().Get("ssh_cmd")) + s.Bucket = strings.TrimSpace(r.URL.Query().Get("bucket")) + s.Endpoint = strings.TrimSpace(r.URL.Query().Get("endpoint")) s.Protocols = getCommaSeparatedQueryParam(r, "protocols") statuses := getCommaSeparatedQueryParam(r, "statuses") for _, status := range statuses { @@ -117,7 +118,7 @@ func getProviderSearchParamsFromRequest(r *http.Request) (eventsearcher.Provider return s, err } s.Actions = getCommaSeparatedQueryParam(r, "actions") - s.ObjectName = r.URL.Query().Get("object_name") + s.ObjectName = strings.TrimSpace(r.URL.Query().Get("object_name")) s.ObjectTypes = getCommaSeparatedQueryParam(r, "object_types") return s, nil } @@ -143,7 +144,7 @@ func getLogSearchParamsFromRequest(r *http.Request) (eventsearcher.LogEventSearc func searchFsEvents(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -176,7 +177,7 @@ func searchFsEvents(w http.ResponseWriter, r *http.Request) { func searchProviderEvents(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -211,7 +212,7 @@ func searchProviderEvents(w http.ResponseWriter, r *http.Request) { func searchLogEvents(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return diff --git a/internal/httpd/api_folder.go b/internal/httpd/api_folder.go index debc8483..c46d4ab3 100644 --- a/internal/httpd/api_folder.go +++ b/internal/httpd/api_folder.go @@ -23,6 +23,7 @@ import ( "github.com/go-chi/render" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/util" "github.com/drakkan/sftpgo/v2/internal/vfs" ) @@ -45,7 +46,7 @@ func getFolders(w http.ResponseWriter, r *http.Request) { func addFolder(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -62,12 +63,12 @@ func addFolder(w http.ResponseWriter, r *http.Request) { return } w.Header().Add("Location", fmt.Sprintf("%s/%s", folderPath, url.PathEscape(folder.Name))) - renderFolder(w, r, folder.Name, &claims, http.StatusCreated) + renderFolder(w, r, folder.Name, claims, http.StatusCreated) } func updateFolder(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -100,7 +101,7 @@ func updateFolder(w http.ResponseWriter, r *http.Request) { sendAPIResponse(w, r, nil, "Folder updated", http.StatusOK) } -func renderFolder(w http.ResponseWriter, r *http.Request, name string, claims *jwtTokenClaims, status int) { +func renderFolder(w http.ResponseWriter, r *http.Request, name string, claims *jwt.Claims, status int) { folder, err := dataprovider.GetFolderByName(name) if err != nil { sendAPIResponse(w, r, err, "", getRespStatus(err)) @@ -119,18 +120,18 @@ func renderFolder(w http.ResponseWriter, r *http.Request, name string, claims *j func getFolderByName(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return } name := getURLParam(r, "name") - renderFolder(w, r, name, &claims, http.StatusOK) + renderFolder(w, r, name, claims, http.StatusOK) } func deleteFolder(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return diff --git a/internal/httpd/api_group.go b/internal/httpd/api_group.go index 125319d5..beae9ad2 100644 --- a/internal/httpd/api_group.go +++ b/internal/httpd/api_group.go @@ -23,6 +23,7 @@ import ( "github.com/go-chi/render" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/util" ) @@ -44,7 +45,7 @@ func getGroups(w http.ResponseWriter, r *http.Request) { func addGroup(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -61,12 +62,12 @@ func addGroup(w http.ResponseWriter, r *http.Request) { return } w.Header().Add("Location", fmt.Sprintf("%s/%s", groupPath, url.PathEscape(group.Name))) - renderGroup(w, r, group.Name, &claims, http.StatusCreated) + renderGroup(w, r, group.Name, claims, http.StatusCreated) } func updateGroup(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -98,7 +99,7 @@ func updateGroup(w http.ResponseWriter, r *http.Request) { sendAPIResponse(w, r, nil, "Group updated", http.StatusOK) } -func renderGroup(w http.ResponseWriter, r *http.Request, name string, claims *jwtTokenClaims, status int) { +func renderGroup(w http.ResponseWriter, r *http.Request, name string, claims *jwt.Claims, status int) { group, err := dataprovider.GroupExists(name) if err != nil { sendAPIResponse(w, r, err, "", getRespStatus(err)) @@ -117,18 +118,18 @@ func renderGroup(w http.ResponseWriter, r *http.Request, name string, claims *jw func getGroupByName(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return } name := getURLParam(r, "name") - renderGroup(w, r, name, &claims, http.StatusOK) + renderGroup(w, r, name, claims, http.StatusOK) } func deleteGroup(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return diff --git a/internal/httpd/api_http_user.go b/internal/httpd/api_http_user.go index a65ddda5..45bbd52f 100644 --- a/internal/httpd/api_http_user.go +++ b/internal/httpd/api_http_user.go @@ -31,12 +31,13 @@ import ( "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/logger" "github.com/drakkan/sftpgo/v2/internal/util" ) func getUserConnection(w http.ResponseWriter, r *http.Request) (*Connection, error) { - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return nil, fmt.Errorf("invalid token claims %w", err) @@ -49,15 +50,12 @@ func getUserConnection(w http.ResponseWriter, r *http.Request) (*Connection, err connID := xid.New().String() protocol := getProtocolFromRequest(r) connectionID := fmt.Sprintf("%v_%v", protocol, connID) - if err := checkHTTPClientUser(&user, r, connectionID, false); err != nil { + if err := checkHTTPClientUser(&user, r, connectionID, false, false); err != nil { sendAPIResponse(w, r, err, http.StatusText(http.StatusForbidden), http.StatusForbidden) return nil, err } - connection := &Connection{ - BaseConnection: common.NewBaseConnection(connID, protocol, util.GetHTTPLocalAddress(r), - r.RemoteAddr, user), - request: r, - } + baseConn := common.NewBaseConnection(connID, protocol, util.GetHTTPLocalAddress(r), r.RemoteAddr, user) + connection := newConnection(baseConn, w, r) if err = common.Connections.Add(connection); err != nil { sendAPIResponse(w, r, err, "Unable to add connection", http.StatusTooManyRequests) return connection, err @@ -317,6 +315,13 @@ func uploadUserFiles(w http.ResponseWriter, r *http.Request) { } defer common.Connections.Remove(connection.GetID()) + if err := common.Connections.IsNewTransferAllowed(connection.User.Username); err != nil { + connection.Log(logger.LevelInfo, "denying file write due to number of transfer limits") + sendAPIResponse(w, r, err, "Denying file write due to transfer count limits", + http.StatusConflict) + return + } + transferQuota := connection.GetTransferQuota() if !transferQuota.HasUploadSpace() { connection.Log(logger.LevelInfo, "denying file write due to transfer quota limits") @@ -453,7 +458,7 @@ func getUserFilesAsZipStream(w http.ResponseWriter, r *http.Request) { func getUserProfile(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -469,15 +474,16 @@ func getUserProfile(w http.ResponseWriter, r *http.Request) { Description: user.Description, AllowAPIKeyAuth: user.Filters.AllowAPIKeyAuth, }, - PublicKeys: user.PublicKeys, - TLSCerts: user.Filters.TLSCerts, + AdditionalEmails: user.Filters.AdditionalEmails, + PublicKeys: user.PublicKeys, + TLSCerts: user.Filters.TLSCerts, } render.JSON(w, r, resp) } func updateUserProfile(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -508,6 +514,7 @@ func updateUserProfile(w http.ResponseWriter, r *http.Request) { } if userMerged.CanChangeInfo() { user.Email = req.Email + user.Filters.AdditionalEmails = req.AdditionalEmails user.Description = req.Description } if err := dataprovider.UpdateUser(&user, dataprovider.ActionExecutorSelf, util.GetIPFromRemoteAddress(r.RemoteAddr), user.Role); err != nil { @@ -531,6 +538,7 @@ func changeUserPassword(w http.ResponseWriter, r *http.Request) { sendAPIResponse(w, r, err, "", getRespStatus(err)) return } + invalidateToken(r) sendAPIResponse(w, r, err, "Password updated", http.StatusOK) } @@ -550,7 +558,7 @@ func doChangeUserPassword(r *http.Request, currentPassword, newPassword, confirm util.I18nErrorChangePwdNoDifferent, ) } - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { return util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken) } diff --git a/internal/httpd/api_iplist.go b/internal/httpd/api_iplist.go index 5c1de975..d74b68d8 100644 --- a/internal/httpd/api_iplist.go +++ b/internal/httpd/api_iplist.go @@ -25,6 +25,7 @@ import ( "github.com/go-chi/render" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/util" ) @@ -68,7 +69,7 @@ func getIPListEntry(w http.ResponseWriter, r *http.Request) { func addIPListEntry(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -91,7 +92,7 @@ func addIPListEntry(w http.ResponseWriter, r *http.Request) { func updateIPListEntry(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -125,7 +126,7 @@ func updateIPListEntry(w http.ResponseWriter, r *http.Request) { func deleteIPListEntry(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return diff --git a/internal/httpd/api_keys.go b/internal/httpd/api_keys.go index d95d88de..a9a3bcb2 100644 --- a/internal/httpd/api_keys.go +++ b/internal/httpd/api_keys.go @@ -23,6 +23,7 @@ import ( "github.com/go-chi/render" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/util" ) @@ -56,7 +57,7 @@ func getAPIKeyByID(w http.ResponseWriter, r *http.Request) { func addAPIKey(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -87,7 +88,7 @@ func addAPIKey(w http.ResponseWriter, r *http.Request) { func updateAPIKey(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -119,7 +120,7 @@ func updateAPIKey(w http.ResponseWriter, r *http.Request) { func deleteAPIKey(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) keyID := getURLParam(r, "id") - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return diff --git a/internal/httpd/api_maintenance.go b/internal/httpd/api_maintenance.go index 10347de8..560c702e 100644 --- a/internal/httpd/api_maintenance.go +++ b/internal/httpd/api_maintenance.go @@ -29,6 +29,7 @@ import ( "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/logger" "github.com/drakkan/sftpgo/v2/internal/util" "github.com/drakkan/sftpgo/v2/internal/vfs" @@ -115,7 +116,7 @@ func dumpData(w http.ResponseWriter, r *http.Request) { func loadDataFromRequest(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, MaxRestoreSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -143,7 +144,7 @@ func loadDataFromRequest(w http.ResponseWriter, r *http.Request) { func loadData(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -551,9 +552,10 @@ func RestoreUsers(users []dataprovider.User, inputFile string, mode, scanQuota i return fmt.Errorf("unable to restore user %q: %w", user.Username, err) } if scanQuota == 1 || (scanQuota == 2 && user.HasQuotaRestrictions()) { - if common.QuotaScans.AddUserQuotaScan(user.Username, user.Role) { + user, err = dataprovider.GetUserWithGroupSettings(user.Username, "") + if err == nil && common.QuotaScans.AddUserQuotaScan(user.Username, user.Role) { logger.Debug(logSender, "", "starting quota scan for restored user: %q", user.Username) - go doUserQuotaScan(user) //nolint:errcheck + go doUserQuotaScan(&user) //nolint:errcheck } } } diff --git a/internal/httpd/api_mfa.go b/internal/httpd/api_mfa.go index 0b7e282e..73df7593 100644 --- a/internal/httpd/api_mfa.go +++ b/internal/httpd/api_mfa.go @@ -20,12 +20,14 @@ import ( "fmt" "io" "net/http" + "slices" "strconv" "strings" "github.com/go-chi/render" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/kms" "github.com/drakkan/sftpgo/v2/internal/mfa" "github.com/drakkan/sftpgo/v2/internal/util" @@ -65,13 +67,13 @@ func getTOTPConfigs(w http.ResponseWriter, r *http.Request) { func generateTOTPSecret(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return } var accountName string - if claims.hasUserAudience() { + if hasUserAudience(claims) { accountName = fmt.Sprintf("User %q", claims.Username) } else { accountName = fmt.Sprintf("Admin %q", claims.Username) @@ -112,7 +114,7 @@ func getQRCode(w http.ResponseWriter, r *http.Request) { func saveTOTPConfig(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -123,7 +125,7 @@ func saveTOTPConfig(w http.ResponseWriter, r *http.Request) { recoveryCodes = append(recoveryCodes, dataprovider.RecoveryCode{Secret: kms.NewPlainSecret(code)}) } baseURL := webBaseClientPath - if claims.hasUserAudience() { + if hasUserAudience(claims) { if err := saveUserTOTPConfig(claims.Username, r, recoveryCodes); err != nil { sendAPIResponse(w, r, err, "", getRespStatus(err)) return @@ -138,8 +140,7 @@ func saveTOTPConfig(w http.ResponseWriter, r *http.Request) { if claims.MustSetTwoFactorAuth { // force logout defer func() { - c := jwtTokenClaims{} - c.removeCookie(w, r, baseURL) + removeCookie(w, r, baseURL) }() } @@ -164,14 +165,14 @@ func validateTOTPPasscode(w http.ResponseWriter, r *http.Request) { func getRecoveryCodes(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return } recoveryCodes := make([]recoveryCode, 0, 12) var accountRecoveryCodes []dataprovider.RecoveryCode - if claims.hasUserAudience() { + if hasUserAudience(claims) { user, err := dataprovider.UserExists(claims.Username, "") if err != nil { sendAPIResponse(w, r, err, "", getRespStatus(err)) @@ -210,7 +211,7 @@ func getRecoveryCodes(w http.ResponseWriter, r *http.Request) { func generateRecoveryCodes(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -222,7 +223,7 @@ func generateRecoveryCodes(w http.ResponseWriter, r *http.Request) { recoveryCodes = append(recoveryCodes, code) accountRecoveryCodes = append(accountRecoveryCodes, dataprovider.RecoveryCode{Secret: kms.NewPlainSecret(code)}) } - if claims.hasUserAudience() { + if hasUserAudience(claims) { user, err := dataprovider.UserExists(claims.Username, "") if err != nil { sendAPIResponse(w, r, err, "", getRespStatus(err)) @@ -276,7 +277,7 @@ func saveUserTOTPConfig(username string, r *http.Request, recoveryCodes []datapr return util.NewValidationError("two-factor authentication must be enabled") } for _, p := range userMerged.Filters.TwoFactorAuthProtocols { - if !util.Contains(user.Filters.TOTPConfig.Protocols, p) { + if !slices.Contains(user.Filters.TOTPConfig.Protocols, p) { return util.NewValidationError(fmt.Sprintf("totp: the following protocols are required: %q", strings.Join(userMerged.Filters.TwoFactorAuthProtocols, ", "))) } diff --git a/internal/httpd/api_quota.go b/internal/httpd/api_quota.go index de6ff8bb..db339e39 100644 --- a/internal/httpd/api_quota.go +++ b/internal/httpd/api_quota.go @@ -23,6 +23,7 @@ import ( "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/logger" "github.com/drakkan/sftpgo/v2/internal/vfs" ) @@ -44,7 +45,7 @@ type transferQuotaUsage struct { func getUsersQuotaScans(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -91,7 +92,7 @@ func startFolderQuotaScan(w http.ResponseWriter, r *http.Request) { func updateUserTransferQuotaUsage(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -132,7 +133,7 @@ func updateUserTransferQuotaUsage(w http.ResponseWriter, r *http.Request) { } func doUpdateUserQuotaUsage(w http.ResponseWriter, r *http.Request, username string, usage quotaUsage) { - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -204,7 +205,7 @@ func doStartUserQuotaScan(w http.ResponseWriter, r *http.Request, username strin sendAPIResponse(w, r, nil, "Quota tracking is disabled!", http.StatusForbidden) return } - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -219,7 +220,7 @@ func doStartUserQuotaScan(w http.ResponseWriter, r *http.Request, username strin http.StatusConflict) return } - go doUserQuotaScan(user) //nolint:errcheck + go doUserQuotaScan(&user) //nolint:errcheck sendAPIResponse(w, r, err, "Scan started", http.StatusAccepted) } @@ -242,14 +243,14 @@ func doStartFolderQuotaScan(w http.ResponseWriter, r *http.Request, name string) sendAPIResponse(w, r, err, "Scan started", http.StatusAccepted) } -func doUserQuotaScan(user dataprovider.User) error { +func doUserQuotaScan(user *dataprovider.User) error { defer common.QuotaScans.RemoveUserQuotaScan(user.Username) numFiles, size, err := user.ScanQuota() if err != nil { logger.Warn(logSender, "", "error scanning user quota %q: %v", user.Username, err) return err } - err = dataprovider.UpdateUserQuota(&user, numFiles, size, true) + err = dataprovider.UpdateUserQuota(user, numFiles, size, true) logger.Debug(logSender, "", "user quota scanned, user: %q, error: %v", user.Username, err) return err } diff --git a/internal/httpd/api_retention.go b/internal/httpd/api_retention.go index a47a1119..1502a327 100644 --- a/internal/httpd/api_retention.go +++ b/internal/httpd/api_retention.go @@ -15,67 +15,20 @@ package httpd import ( - "fmt" "net/http" "github.com/go-chi/render" "github.com/drakkan/sftpgo/v2/internal/common" - "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" ) func getRetentionChecks(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return } render.JSON(w, r, common.RetentionChecks.Get(claims.Role)) } - -func startRetentionCheck(w http.ResponseWriter, r *http.Request) { - r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) - if err != nil || claims.Username == "" { - sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) - return - } - username := getURLParam(r, "username") - user, err := dataprovider.GetUserWithGroupSettings(username, claims.Role) - if err != nil { - sendAPIResponse(w, r, err, "", getRespStatus(err)) - return - } - var check common.RetentionCheck - - err = render.DecodeJSON(r.Body, &check.Folders) - if err != nil { - sendAPIResponse(w, r, err, "", http.StatusBadRequest) - return - } - - check.Notifications = getCommaSeparatedQueryParam(r, "notifications") - for _, notification := range check.Notifications { - if notification == common.RetentionCheckNotificationEmail { - admin, err := dataprovider.AdminExists(claims.Username) - if err != nil { - sendAPIResponse(w, r, err, "", getRespStatus(err)) - return - } - check.Email = admin.Email - } - } - if err := check.Validate(); err != nil { - sendAPIResponse(w, r, err, "Invalid retention check", http.StatusBadRequest) - return - } - c := common.RetentionChecks.Add(check, &user) - if c == nil { - sendAPIResponse(w, r, err, fmt.Sprintf("Another check is already in progress for user %q", username), - http.StatusConflict) - return - } - go c.Start() //nolint:errcheck - sendAPIResponse(w, r, err, "Check started", http.StatusAccepted) -} diff --git a/internal/httpd/api_role.go b/internal/httpd/api_role.go index 6e9a23ee..d8840155 100644 --- a/internal/httpd/api_role.go +++ b/internal/httpd/api_role.go @@ -23,6 +23,7 @@ import ( "github.com/go-chi/render" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/util" ) @@ -44,7 +45,7 @@ func getRoles(w http.ResponseWriter, r *http.Request) { func addRole(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -67,7 +68,7 @@ func addRole(w http.ResponseWriter, r *http.Request) { func updateRole(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -119,7 +120,7 @@ func getRoleByName(w http.ResponseWriter, r *http.Request) { func deleteRole(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return diff --git a/internal/httpd/api_shares.go b/internal/httpd/api_shares.go index c45f6f1f..1ea1542e 100644 --- a/internal/httpd/api_shares.go +++ b/internal/httpd/api_shares.go @@ -22,23 +22,24 @@ import ( "net/url" "os" "path" + "slices" "strings" "time" - "github.com/go-chi/jwtauth/v5" "github.com/go-chi/render" "github.com/rs/xid" "github.com/sftpgo/sdk" "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/logger" "github.com/drakkan/sftpgo/v2/internal/util" ) func getShares(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -58,7 +59,7 @@ func getShares(w http.ResponseWriter, r *http.Request) { func getShareByID(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -76,7 +77,7 @@ func getShareByID(w http.ResponseWriter, r *http.Request) { func addShare(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -107,7 +108,7 @@ func addShare(w http.ResponseWriter, r *http.Request) { share.Name = share.ShareID } if share.Password == "" { - if util.Contains(claims.Permissions, sdk.WebClientShareNoPasswordDisabled) { + if slices.Contains(claims.Permissions, sdk.WebClientShareNoPasswordDisabled) { sendAPIResponse(w, r, nil, "You are not authorized to share files/folders without a password", http.StatusForbidden) return @@ -125,7 +126,7 @@ func addShare(w http.ResponseWriter, r *http.Request) { func updateShare(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -155,7 +156,7 @@ func updateShare(w http.ResponseWriter, r *http.Request) { updatedShare.Password = share.Password } if updatedShare.Password == "" { - if util.Contains(claims.Permissions, sdk.WebClientShareNoPasswordDisabled) { + if slices.Contains(claims.Permissions, sdk.WebClientShareNoPasswordDisabled) { sendAPIResponse(w, r, nil, "You are not authorized to share files/folders without a password", http.StatusForbidden) return @@ -176,7 +177,7 @@ func updateShare(w http.ResponseWriter, r *http.Request) { func deleteShare(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) shareID := getURLParam(r, "id") - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -379,6 +380,12 @@ func (s *httpdServer) uploadFilesToShare(w http.ResponseWriter, r *http.Request) if err != nil { return } + if err := common.Connections.IsNewTransferAllowed(connection.User.Username); err != nil { + connection.Log(logger.LevelInfo, "denying file write due to number of transfer limits") + sendAPIResponse(w, r, err, "Denying file write due to transfer count limits", + http.StatusConflict) + return + } transferQuota := connection.GetTransferQuota() if !transferQuota.HasUploadSpace() { @@ -425,36 +432,41 @@ func (s *httpdServer) uploadFilesToShare(w http.ResponseWriter, r *http.Request) } } +func (s *httpdServer) getShareClaims(r *http.Request, shareID string) (context.Context, *jwt.Claims, error) { + token, err := jwt.VerifyRequest(s.tokenAuth, r, jwt.TokenFromCookie) + if err != nil || token == nil { + return nil, nil, errInvalidToken + } + tokenString := jwt.TokenFromCookie(r) + if tokenString == "" || invalidatedJWTTokens.Get(tokenString) { + return nil, nil, errInvalidToken + } + if !token.Audience.Contains(tokenAudienceWebShare) { + logger.Debug(logSender, "", "invalid token audience for share %q", shareID) + return nil, nil, errInvalidToken + } + ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) + if err := validateIPForToken(token, ipAddr); err != nil { + logger.Debug(logSender, "", "token for share %q is not valid for the ip address %q", shareID, ipAddr) + return nil, nil, err + } + if token.Username != shareID { + logger.Debug(logSender, "", "token not valid for share %q", shareID) + return nil, nil, errInvalidToken + } + ctx := jwt.NewContext(r.Context(), token, nil) + return ctx, token, nil +} + func (s *httpdServer) checkWebClientShareCredentials(w http.ResponseWriter, r *http.Request, share *dataprovider.Share) error { doRedirect := func() { redirectURL := path.Join(webClientPubSharesPath, share.ShareID, fmt.Sprintf("login?next=%s", url.QueryEscape(r.RequestURI))) http.Redirect(w, r, redirectURL, http.StatusFound) } - token, err := jwtauth.VerifyRequest(s.tokenAuth, r, jwtauth.TokenFromCookie) - if err != nil || token == nil { + if _, _, err := s.getShareClaims(r, share.ShareID); err != nil { doRedirect() - return errInvalidToken - } - if !util.Contains(token.Audience(), tokenAudienceWebShare) { - logger.Debug(logSender, "", "invalid token audience for share %q", share.ShareID) - doRedirect() - return errInvalidToken - } - if tokenValidationMode != tokenValidationNoIPMatch { - ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if !util.Contains(token.Audience(), ipAddr) { - logger.Debug(logSender, "", "token for share %q is not valid for the ip address %q", share.ShareID, ipAddr) - doRedirect() - return errInvalidToken - } - } - ctx := jwtauth.NewContext(r.Context(), token, nil) - claims, err := getTokenClaims(r.WithContext(ctx)) - if err != nil || claims.Username != share.ShareID { - logger.Debug(logSender, "", "token not valid for share %q", share.ShareID) - doRedirect() - return errInvalidToken + return err } return nil } @@ -480,7 +492,7 @@ func (s *httpdServer) checkPublicShare(w http.ResponseWriter, r *http.Request, v renderError(err, "", statusCode) return share, nil, err } - if !util.Contains(validScopes, share.Scope) { + if !slices.Contains(validScopes, share.Scope) { err := errors.New("invalid share scope") renderError(util.NewI18nError(err, util.I18nErrorShareScope), "", http.StatusForbidden) return share, nil, err @@ -494,7 +506,6 @@ func (s *httpdServer) checkPublicShare(w http.ResponseWriter, r *http.Request, v if share.Password != "" { if isWebClient { if err := s.checkWebClientShareCredentials(w, r, &share); err != nil { - handleDefenderEventLoginFailed(ipAddr, err) //nolint:errcheck return share, nil, dataprovider.ErrInvalidCredentials } } else { @@ -512,6 +523,7 @@ func (s *httpdServer) checkPublicShare(w http.ResponseWriter, r *http.Request, v return share, nil, dataprovider.ErrInvalidCredentials } } + common.DelayLogin(nil) } user, err := getUserForShare(share) if err != nil { @@ -519,11 +531,8 @@ func (s *httpdServer) checkPublicShare(w http.ResponseWriter, r *http.Request, v return share, nil, err } connID := xid.New().String() - connection := &Connection{ - BaseConnection: common.NewBaseConnection(connID, common.ProtocolHTTPShare, util.GetHTTPLocalAddress(r), - r.RemoteAddr, user), - request: r, - } + baseConn := common.NewBaseConnection(connID, common.ProtocolHTTPShare, util.GetHTTPLocalAddress(r), r.RemoteAddr, user) + connection := newConnection(baseConn, w, r) return share, connection, nil } @@ -536,7 +545,7 @@ func getUserForShare(share dataprovider.Share) (dataprovider.User, error) { if !user.CanManageShares() { return user, util.NewI18nError(util.NewRecordNotFoundError("this share does not exist"), util.I18nError404Message) } - if share.Password == "" && util.Contains(user.Filters.WebClient, sdk.WebClientShareNoPasswordDisabled) { + if share.Password == "" && slices.Contains(user.Filters.WebClient, sdk.WebClientShareNoPasswordDisabled) { return user, util.NewI18nError( fmt.Errorf("sharing without a password was disabled: %w", os.ErrPermission), util.I18nError403Message, @@ -561,6 +570,7 @@ func validateBrowsableShare(share dataprovider.Share, connection *Connection) er basePath := share.Paths[0] info, err := connection.Stat(basePath, 0) if err != nil { + connection.CloseFS() //nolint:errcheck return util.NewI18nError( fmt.Errorf("unable to check the share directory: %w", err), util.I18nErrorShareInvalidPath, diff --git a/internal/httpd/api_user.go b/internal/httpd/api_user.go index 7b55082a..4af45f30 100644 --- a/internal/httpd/api_user.go +++ b/internal/httpd/api_user.go @@ -27,6 +27,7 @@ import ( "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/logger" "github.com/drakkan/sftpgo/v2/internal/smtp" "github.com/drakkan/sftpgo/v2/internal/util" @@ -39,7 +40,7 @@ func getUsers(w http.ResponseWriter, r *http.Request) { if err != nil { return } - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -55,16 +56,16 @@ func getUsers(w http.ResponseWriter, r *http.Request) { func getUserByUsername(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return } username := getURLParam(r, "username") - renderUser(w, r, username, &claims, http.StatusOK) + renderUser(w, r, username, claims, http.StatusOK) } -func renderUser(w http.ResponseWriter, r *http.Request, username string, claims *jwtTokenClaims, status int) { +func renderUser(w http.ResponseWriter, r *http.Request, username string, claims *jwt.Claims, status int) { user, err := dataprovider.UserExists(username, claims.Role) if err != nil { sendAPIResponse(w, r, err, "", getRespStatus(err)) @@ -84,7 +85,7 @@ func renderUser(w http.ResponseWriter, r *http.Request, username string, claims func addUser(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -117,12 +118,12 @@ func addUser(w http.ResponseWriter, r *http.Request) { return } w.Header().Add("Location", fmt.Sprintf("%s/%s", userPath, url.PathEscape(user.Username))) - renderUser(w, r, user.Username, &claims, http.StatusCreated) + renderUser(w, r, user.Username, claims, http.StatusCreated) } func disableUser2FA(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -150,7 +151,7 @@ func disableUser2FA(w http.ResponseWriter, r *http.Request) { func updateUser(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -202,7 +203,7 @@ func updateUser(w http.ResponseWriter, r *http.Request) { func deleteUser(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -264,7 +265,9 @@ func disconnectUser(username, admin, role string) { logger.Warn(logSender, "", "unable to disconnect user %q, error getting node %q: %v", username, stat.Node, err) continue } - if err := n.SendDeleteRequest(admin, role, fmt.Sprintf("%s/%s", activeConnectionsPath, stat.ConnectionID)); err != nil { + perms := []string{dataprovider.PermAdminCloseConnections} + uri := fmt.Sprintf("%s/%s", activeConnectionsPath, stat.ConnectionID) + if err := n.SendDeleteRequest(admin, role, uri, perms); err != nil { logger.Warn(logSender, "", "unable to disconnect user %q from node %q, error: %v", username, n.Name, err) } } @@ -278,6 +281,9 @@ func updateEncryptedSecrets(fsConfig *vfs.Filesystem, currentFsConfig *vfs.Files if fsConfig.S3Config.AccessSecret.IsNotPlainAndNotEmpty() { fsConfig.S3Config.AccessSecret = currentFsConfig.S3Config.AccessSecret } + if fsConfig.S3Config.SSECustomerKey.IsNotPlainAndNotEmpty() { + fsConfig.S3Config.SSECustomerKey = currentFsConfig.S3Config.SSECustomerKey + } case sdk.AzureBlobFilesystemProvider: if fsConfig.AzBlobConfig.AccountKey.IsNotPlainAndNotEmpty() { fsConfig.AzBlobConfig.AccountKey = currentFsConfig.AzBlobConfig.AccountKey diff --git a/internal/httpd/api_utils.go b/internal/httpd/api_utils.go index 78d7219f..cef57b53 100644 --- a/internal/httpd/api_utils.go +++ b/internal/httpd/api_utils.go @@ -27,6 +27,7 @@ import ( "net/url" "os" "path" + "slices" "strconv" "strings" "sync" @@ -36,10 +37,12 @@ import ( "github.com/go-chi/chi/v5/middleware" "github.com/go-chi/render" "github.com/klauspost/compress/zip" + "github.com/rs/xid" "github.com/sftpgo/sdk/plugin/notifier" "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/logger" "github.com/drakkan/sftpgo/v2/internal/metric" "github.com/drakkan/sftpgo/v2/internal/plugin" @@ -70,8 +73,9 @@ type adminProfile struct { type userProfile struct { baseProfile - PublicKeys []string `json:"public_keys,omitempty"` - TLSCerts []string `json:"tls_certs,omitempty"` + AdditionalEmails []string `json:"additional_emails,omitempty"` + PublicKeys []string `json:"public_keys,omitempty"` + TLSCerts []string `json:"tls_certs,omitempty"` } func sendAPIResponse(w http.ResponseWriter, r *http.Request, err error, message string, code int) { @@ -158,7 +162,7 @@ func getURLPath(r *http.Request) string { func getCommaSeparatedQueryParam(r *http.Request, key string) []string { var result []string - for _, val := range strings.Split(r.URL.Query().Get(key), ",") { + for val := range strings.SplitSeq(r.URL.Query().Get(key), ",") { val = strings.TrimSpace(val) if val != "" { result = append(result, val) @@ -174,7 +178,7 @@ func getBoolQueryParam(r *http.Request, param string) bool { func getActiveConnections(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -188,7 +192,7 @@ func getActiveConnections(w http.ResponseWriter, r *http.Request) { func handleCloseConnection(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -214,7 +218,9 @@ func handleCloseConnection(w http.ResponseWriter, r *http.Request) { sendAPIResponse(w, r, nil, http.StatusText(status), status) return } - if err := n.SendDeleteRequest(claims.Username, claims.Role, fmt.Sprintf("%s/%s", activeConnectionsPath, connectionID)); err != nil { + perms := []string{dataprovider.PermAdminCloseConnections} + uri := fmt.Sprintf("%s/%s", activeConnectionsPath, connectionID) + if err := n.SendDeleteRequest(claims.Username, claims.Role, uri, perms); err != nil { logger.Warn(logSender, "", "unable to delete connection id %q from node %q: %v", connectionID, n.Name, err) sendAPIResponse(w, r, nil, "Not Found", http.StatusNotFound) return @@ -240,7 +246,8 @@ func getNodesConnections(admin, role string) []common.ConnectionStatus { defer wg.Done() var stats []common.ConnectionStatus - if err := node.SendGetRequest(admin, role, activeConnectionsPath, &stats); err != nil { + perms := []string{dataprovider.PermAdminViewConnections} + if err := node.SendGetRequest(admin, role, activeConnectionsPath, perms, &stats); err != nil { logger.Warn(logSender, "", "unable to get connections from node %s: %v", node.Name, err) return } @@ -362,6 +369,16 @@ func streamJSONArray(w http.ResponseWriter, chunkSize int, dataGetter func(limit streamData(w, []byte("]")) } +func renderPNGImage(w http.ResponseWriter, r *http.Request, b []byte) { + if len(b) == 0 { + ctx := context.WithValue(r.Context(), render.StatusCtxKey, http.StatusNotFound) + render.PlainText(w, r.WithContext(ctx), http.StatusText(http.StatusNotFound)) + return + } + w.Header().Set("Content-Type", "image/png") + streamData(w, b) +} + func getCompressedFileName(username string, files []string) string { if len(files) == 1 { name := path.Base(files[0]) @@ -383,7 +400,7 @@ func renderCompressedFiles(w http.ResponseWriter, conn *Connection, baseDir stri for _, file := range files { fullPath := util.CleanPath(path.Join(baseDir, file)) - if err := addZipEntry(wr, conn, fullPath, baseDir, 0); err != nil { + if err := addZipEntry(wr, conn, fullPath, baseDir, nil, 0); err != nil { if share != nil { dataprovider.UpdateShareLastUse(share, -1) //nolint:errcheck } @@ -399,16 +416,19 @@ func renderCompressedFiles(w http.ResponseWriter, conn *Connection, baseDir stri } } -func addZipEntry(wr *zip.Writer, conn *Connection, entryPath, baseDir string, recursion int) error { +func addZipEntry(wr *zip.Writer, conn *Connection, entryPath, baseDir string, info os.FileInfo, recursion int) error { if recursion >= util.MaxRecursion { conn.Log(logger.LevelDebug, "unable to add zip entry %q, recursion too depth: %d", entryPath, recursion) return util.ErrRecursionTooDeep } recursion++ - info, err := conn.Stat(entryPath, 1) - if err != nil { - conn.Log(logger.LevelDebug, "unable to add zip entry %q, stat error: %v", entryPath, err) - return err + var err error + if info == nil { + info, err = conn.Stat(entryPath, 1) + if err != nil { + conn.Log(logger.LevelDebug, "unable to add zip entry %q, stat error: %v", entryPath, err) + return err + } } entryName, err := getZipEntryName(entryPath, baseDir) if err != nil { @@ -440,7 +460,7 @@ func addZipEntry(wr *zip.Writer, conn *Connection, entryPath, baseDir string, re } for _, info := range contents { fullPath := util.CleanPath(path.Join(entryPath, info.Name())) - if err := addZipEntry(wr, conn, fullPath, baseDir, recursion); err != nil { + if err := addZipEntry(wr, conn, fullPath, baseDir, info, recursion); err != nil { return err } } @@ -686,10 +706,11 @@ func handleDefenderEventLoginFailed(ipAddr string, err error) error { err = dataprovider.ErrInvalidCredentials } common.AddDefenderEvent(ipAddr, common.ProtocolHTTP, event) + common.DelayLogin(err) return err } -func updateLoginMetrics(user *dataprovider.User, loginMethod, ip string, err error) { +func updateLoginMetrics(user *dataprovider.User, loginMethod, ip string, err error, r *http.Request) { metric.AddLoginAttempt(loginMethod) var protocol string switch loginMethod { @@ -699,7 +720,9 @@ func updateLoginMetrics(user *dataprovider.User, loginMethod, ip string, err err protocol = common.ProtocolHTTP } if err == nil { + logger.LoginLog(user.Username, ip, loginMethod, protocol, "", r.UserAgent(), r.TLS != nil, "") plugin.Handler.NotifyLogEvent(notifier.LogEventTypeLoginOK, protocol, user.Username, ip, "", nil) + common.DelayLogin(nil) } else if err != common.ErrInternalFailure && err != common.ErrNoCredentials { logger.ConnectionFailedLog(user.Username, ip, loginMethod, protocol, err.Error()) err = handleDefenderEventLoginFailed(ip, err) @@ -713,15 +736,15 @@ func updateLoginMetrics(user *dataprovider.User, loginMethod, ip string, err err dataprovider.ExecutePostLoginHook(user, loginMethod, ip, protocol, err) } -func checkHTTPClientUser(user *dataprovider.User, r *http.Request, connectionID string, checkSessions bool) error { - if util.Contains(user.Filters.DeniedProtocols, common.ProtocolHTTP) { +func checkHTTPClientUser(user *dataprovider.User, r *http.Request, connectionID string, checkSessions, isOIDCLogin bool) error { + if slices.Contains(user.Filters.DeniedProtocols, common.ProtocolHTTP) { logger.Info(logSender, connectionID, "cannot login user %q, protocol HTTP is not allowed", user.Username) return util.NewI18nError( fmt.Errorf("protocol HTTP is not allowed for user %q", user.Username), util.I18nErrorProtocolForbidden, ) } - if !isLoggedInWithOIDC(r) && !user.IsLoginMethodAllowed(dataprovider.LoginMethodPassword, common.ProtocolHTTP) { + if !isLoggedInWithOIDC(r) && !isOIDCLogin && !user.IsLoginMethodAllowed(dataprovider.LoginMethodPassword, common.ProtocolHTTP) { logger.Info(logSender, connectionID, "cannot login user %q, password login method is not allowed", user.Username) return util.NewI18nError( fmt.Errorf("login method password is not allowed for user %q", user.Username), @@ -746,8 +769,34 @@ func checkHTTPClientUser(user *dataprovider.User, r *http.Request, connectionID return nil } +func getActiveAdmin(username, ipAddr string) (dataprovider.Admin, error) { + admin, err := dataprovider.AdminExists(username) + if err != nil { + return admin, err + } + if err := admin.CanLogin(ipAddr); err != nil { + return admin, util.NewRecordNotFoundError(fmt.Sprintf("admin %q cannot login: %v", username, err)) + } + return admin, nil +} + +func getActiveUser(username string, r *http.Request) (dataprovider.User, error) { + user, err := dataprovider.GetUserWithGroupSettings(username, "") + if err != nil { + return user, err + } + if err := user.CheckLoginConditions(); err != nil { + return user, util.NewRecordNotFoundError(fmt.Sprintf("user %q cannot login: %v", username, err)) + } + if err := checkHTTPClientUser(&user, r, xid.New().String(), false, false); err != nil { + return user, util.NewRecordNotFoundError(fmt.Sprintf("user %q cannot login: %v", username, err)) + } + return user, nil +} + func handleForgotPassword(r *http.Request, username string, isAdmin bool) error { - var email, subject string + var emails []string + var subject string var err error var admin dataprovider.Admin var user dataprovider.User @@ -756,12 +805,14 @@ func handleForgotPassword(r *http.Request, username string, isAdmin bool) error return util.NewI18nError(util.NewValidationError("username is mandatory"), util.I18nErrorUsernameRequired) } if isAdmin { - admin, err = dataprovider.AdminExists(username) - email = admin.Email + admin, err = getActiveAdmin(username, util.GetIPFromRemoteAddress(r.RemoteAddr)) + if admin.Email != "" { + emails = []string{admin.Email} + } subject = fmt.Sprintf("Email Verification Code for admin %q", username) } else { - user, err = dataprovider.GetUserWithGroupSettings(username, "") - email = user.Email + user, err = getActiveUser(username, r) + emails = user.GetEmailAddresses() subject = fmt.Sprintf("Email Verification Code for user %q", username) if err == nil { if !isUserAllowedToResetPassword(r, &user) { @@ -775,13 +826,14 @@ func handleForgotPassword(r *http.Request, username string, isAdmin bool) error if err != nil { if errors.Is(err, util.ErrNotFound) { handleDefenderEventLoginFailed(util.GetIPFromRemoteAddress(r.RemoteAddr), err) //nolint:errcheck - logger.Debug(logSender, middleware.GetReqID(r.Context()), "username %q does not exists, reset password request silently ignored, is admin? %v", - username, isAdmin) + logger.Debug(logSender, middleware.GetReqID(r.Context()), + "username %q does not exists or cannot login, reset password request silently ignored, is admin? %t, err: %v", + username, isAdmin, err) return nil } return util.NewI18nError(util.NewGenericError("Error retrieving your account, please try again later"), util.I18nErrorGetUser) } - if email == "" { + if len(emails) == 0 { return util.NewI18nError( util.NewValidationError("Your account does not have an email address, it is not possible to reset your password by sending an email verification code"), util.I18nErrorPwdResetNoEmail, @@ -796,7 +848,7 @@ func handleForgotPassword(r *http.Request, username string, isAdmin bool) error return util.NewGenericError("Unable to render password reset template") } startTime := time.Now() - if err := smtp.SendEmail([]string{email}, nil, subject, body.String(), smtp.EmailContentTypeTextHTML); err != nil { + if err := smtp.SendEmail(emails, nil, subject, body.String(), smtp.EmailContentTypeTextHTML); err != nil { logger.Warn(logSender, middleware.GetReqID(r.Context()), "unable to send password reset code via email: %v, elapsed: %v", err, time.Since(startTime)) return util.NewI18nError( @@ -804,8 +856,8 @@ func handleForgotPassword(r *http.Request, username string, isAdmin bool) error util.I18nErrorPwdResetSendEmail, ) } - logger.Debug(logSender, middleware.GetReqID(r.Context()), "reset code sent via email to %q, email: %q, is admin? %v, elapsed: %v", - username, email, isAdmin, time.Since(startTime)) + logger.Debug(logSender, middleware.GetReqID(r.Context()), "reset code sent via email to %q, emails: %+v, is admin? %v, elapsed: %v", + username, emails, isAdmin, time.Since(startTime)) return resetCodesMgr.Add(c) } @@ -836,7 +888,7 @@ func handleResetPassword(r *http.Request, code, newPassword, confirmPassword str return &admin, &user, util.NewValidationError("invalid confirmation code") } if isAdmin { - admin, err = dataprovider.AdminExists(resetCode.Username) + admin, err = getActiveAdmin(resetCode.Username, ipAddr) if err != nil { return &admin, &user, util.NewValidationError("unable to associate the confirmation code with an existing admin") } @@ -849,7 +901,7 @@ func handleResetPassword(r *http.Request, code, newPassword, confirmPassword str err = resetCodesMgr.Delete(code) return &admin, &user, err } - user, err = dataprovider.GetUserWithGroupSettings(resetCode.Username, "") + user, err = getActiveUser(resetCode.Username, r) if err != nil { return &admin, &user, util.NewValidationError("Unable to associate the confirmation code with an existing user") } @@ -873,7 +925,7 @@ func isUserAllowedToResetPassword(r *http.Request, user *dataprovider.User) bool if !user.CanResetPassword() { return false } - if util.Contains(user.Filters.DeniedProtocols, common.ProtocolHTTP) { + if slices.Contains(user.Filters.DeniedProtocols, common.ProtocolHTTP) { return false } if !user.IsLoginMethodAllowed(dataprovider.LoginMethodPassword, common.ProtocolHTTP) { @@ -892,9 +944,18 @@ func getProtocolFromRequest(r *http.Request) string { return common.ProtocolHTTP } -func hideConfidentialData(claims *jwtTokenClaims, r *http.Request) bool { - if !claims.hasPerm(dataprovider.PermAdminManageSystem) { +func hideConfidentialData(claims *jwt.Claims, r *http.Request) bool { + if !claims.HasPerm(dataprovider.PermAdminAny) { return true } return r.URL.Query().Get("confidential_data") != "1" } + +func responseControllerDeadlines(rc *http.ResponseController, read, write time.Time) { + if err := rc.SetReadDeadline(read); err != nil { + logger.Error(logSender, "", "unable to set read timeout to %s: %v", read, err) + } + if err := rc.SetWriteDeadline(write); err != nil { + logger.Error(logSender, "", "unable to set write timeout to %s: %v", write, err) + } +} diff --git a/internal/httpd/auth_utils.go b/internal/httpd/auth_utils.go index 4650e2f6..ecd9ce86 100644 --- a/internal/httpd/auth_utils.go +++ b/internal/httpd/auth_utils.go @@ -15,16 +15,14 @@ package httpd import ( + "crypto/rand" "errors" "fmt" "net/http" "time" - "github.com/go-chi/jwtauth/v5" - "github.com/lestrrat-go/jwx/v2/jwt" - "github.com/rs/xid" - "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/logger" "github.com/drakkan/sftpgo/v2/internal/util" ) @@ -41,256 +39,123 @@ const ( tokenAudienceAPIUser tokenAudience = "APIUser" tokenAudienceCSRF tokenAudience = "CSRF" tokenAudienceOAuth2 tokenAudience = "OAuth2" -) - -type tokenValidation = int - -const ( - tokenValidationFull = iota - tokenValidationNoIPMatch tokenValidation = iota + tokenAudienceWebLogin tokenAudience = "WebLogin" ) const ( - claimUsernameKey = "username" - claimPermissionsKey = "permissions" - claimRole = "role" - claimAPIKey = "api_key" - claimNodeID = "node_id" - claimMustChangePasswordKey = "chpwd" - claimMustSetSecondFactorKey = "2fa_required" - claimRequiredTwoFactorProtocols = "2fa_protos" - claimHideUserPageSection = "hus" - basicRealm = "Basic realm=\"SFTPGo\"" - jwtCookieKey = "jwt" + tokenValidationModeDefault = 0 + tokenValidationModeNoIPMatch = 1 + tokenValidationModeUserSignature = 2 +) + +const ( + basicRealm = "Basic realm=\"SFTPGo\"" ) var ( - tokenDuration = 20 * time.Minute - shareTokenDuration = 12 * time.Hour + apiTokenDuration = 20 * time.Minute + cookieTokenDuration = 20 * time.Minute + shareTokenDuration = 2 * time.Hour // csrf token duration is greater than normal token duration to reduce issues // with the login form - csrfTokenDuration = 6 * time.Hour - tokenRefreshThreshold = 10 * time.Minute - tokenValidationMode = tokenValidationFull + csrfTokenDuration = 4 * time.Hour + cookieRefreshThreshold = 10 * time.Minute + maxTokenDuration = 12 * time.Hour + tokenValidationMode = tokenValidationModeDefault ) -type jwtTokenClaims struct { - Username string - Permissions []string - Role string - Signature string - Audience []string - APIKeyID string - NodeID string - MustSetTwoFactorAuth bool - MustChangePassword bool - RequiredTwoFactorProtocols []string - HideUserPageSections int +func isTokenDurationValid(minutes int) bool { + return minutes >= 1 && minutes <= 720 } -func (c *jwtTokenClaims) hasUserAudience() bool { - for _, audience := range c.Audience { - if audience == tokenAudienceWebClient || audience == tokenAudienceAPIUser { - return true +func updateTokensDuration(api, cookie, share int) { + if isTokenDurationValid(api) { + apiTokenDuration = time.Duration(api) * time.Minute + } + if isTokenDurationValid(cookie) { + cookieTokenDuration = time.Duration(cookie) * time.Minute + cookieRefreshThreshold = cookieTokenDuration / 2 + if cookieTokenDuration > csrfTokenDuration { + csrfTokenDuration = cookieTokenDuration } } - - return false + if isTokenDurationValid(share) { + shareTokenDuration = time.Duration(share) * time.Minute + } + logger.Debug(logSender, "", "API token duration %s, cookie token duration %s, cookie refresh threshold %s, share token duration %s, csrf token duration %s", + apiTokenDuration, cookieTokenDuration, cookieRefreshThreshold, shareTokenDuration, csrfTokenDuration) } -func (c *jwtTokenClaims) asMap() map[string]any { - claims := make(map[string]any) - - claims[claimUsernameKey] = c.Username - claims[claimPermissionsKey] = c.Permissions - if c.Role != "" { - claims[claimRole] = c.Role - } - if c.APIKeyID != "" { - claims[claimAPIKey] = c.APIKeyID - } - if c.NodeID != "" { - claims[claimNodeID] = c.NodeID - } - claims[jwt.SubjectKey] = c.Signature - if c.MustChangePassword { - claims[claimMustChangePasswordKey] = c.MustChangePassword - } - if c.MustSetTwoFactorAuth { - claims[claimMustSetSecondFactorKey] = c.MustSetTwoFactorAuth - } - if len(c.RequiredTwoFactorProtocols) > 0 { - claims[claimRequiredTwoFactorProtocols] = c.RequiredTwoFactorProtocols - } - if c.HideUserPageSections > 0 { - claims[claimHideUserPageSection] = c.HideUserPageSections - } - - return claims -} - -func (c *jwtTokenClaims) decodeSliceString(val any) []string { - switch v := val.(type) { - case []any: - result := make([]string, 0, len(v)) - for _, elem := range v { - switch elemValue := elem.(type) { - case string: - result = append(result, elemValue) - } - } - return result - case []string: - return v +func getTokenDuration(audience tokenAudience) time.Duration { + switch audience { + case tokenAudienceWebShare: + return shareTokenDuration + case tokenAudienceWebLogin, tokenAudienceCSRF: + return csrfTokenDuration + case tokenAudienceAPI, tokenAudienceAPIUser: + return apiTokenDuration + case tokenAudienceWebAdmin, tokenAudienceWebClient: + return cookieTokenDuration + case tokenAudienceWebAdminPartial, tokenAudienceWebClientPartial, tokenAudienceOAuth2: + return 5 * time.Minute default: - return nil + logger.Error(logSender, "", "token duration not handled for audience: %q", audience) + return 20 * time.Minute } } -func (c *jwtTokenClaims) decodeBoolean(val any) bool { - switch v := val.(type) { - case bool: - return v - default: - return false +func getMaxCookieDuration() time.Duration { + result := csrfTokenDuration + if shareTokenDuration > result { + result = shareTokenDuration } + if cookieTokenDuration > result { + result = cookieTokenDuration + } + return result } -func (c *jwtTokenClaims) decodeString(val any) string { - switch v := val.(type) { - case string: - return v - default: - return "" - } +func hasUserAudience(claims *jwt.Claims) bool { + return claims.HasAnyAudience([]string{tokenAudienceWebClient, tokenAudienceAPIUser}) } -func (c *jwtTokenClaims) Decode(token map[string]any) { - c.Permissions = nil - c.Username = c.decodeString(token[claimUsernameKey]) - c.Signature = c.decodeString(token[jwt.SubjectKey]) - - audience := token[jwt.AudienceKey] - switch v := audience.(type) { - case []string: - c.Audience = v - } - - if val, ok := token[claimAPIKey]; ok { - c.APIKeyID = c.decodeString(val) - } - - if val, ok := token[claimNodeID]; ok { - c.NodeID = c.decodeString(val) - } - - if val, ok := token[claimRole]; ok { - c.Role = c.decodeString(val) - } - - permissions := token[claimPermissionsKey] - c.Permissions = c.decodeSliceString(permissions) - - if val, ok := token[claimMustChangePasswordKey]; ok { - c.MustChangePassword = c.decodeBoolean(val) - } - - if val, ok := token[claimMustSetSecondFactorKey]; ok { - c.MustSetTwoFactorAuth = c.decodeBoolean(val) - } - - if val, ok := token[claimRequiredTwoFactorProtocols]; ok { - c.RequiredTwoFactorProtocols = c.decodeSliceString(val) - } - - if val, ok := token[claimHideUserPageSection]; ok { - switch v := val.(type) { - case float64: - c.HideUserPageSections = int(v) - } - } -} - -func (c *jwtTokenClaims) isCriticalPermRemoved(permissions []string) bool { - if util.Contains(permissions, dataprovider.PermAdminAny) { - return false - } - if (util.Contains(c.Permissions, dataprovider.PermAdminManageAdmins) || - util.Contains(c.Permissions, dataprovider.PermAdminAny)) && - !util.Contains(permissions, dataprovider.PermAdminManageAdmins) && - !util.Contains(permissions, dataprovider.PermAdminAny) { - return true - } - return false -} - -func (c *jwtTokenClaims) hasPerm(perm string) bool { - if util.Contains(c.Permissions, dataprovider.PermAdminAny) { - return true - } - - return util.Contains(c.Permissions, perm) -} - -func (c *jwtTokenClaims) createToken(tokenAuth *jwtauth.JWTAuth, audience tokenAudience, ip string) (jwt.Token, string, error) { - claims := c.asMap() - now := time.Now().UTC() - - claims[jwt.JwtIDKey] = xid.New().String() - claims[jwt.NotBeforeKey] = now.Add(-30 * time.Second) - claims[jwt.ExpirationKey] = now.Add(tokenDuration) - claims[jwt.AudienceKey] = []string{audience, ip} - - return tokenAuth.Encode(claims) -} - -func (c *jwtTokenClaims) createTokenResponse(tokenAuth *jwtauth.JWTAuth, audience tokenAudience, ip string) (map[string]any, error) { - token, tokenString, err := c.createToken(tokenAuth, audience, ip) - if err != nil { - return nil, err - } - - response := make(map[string]any) - response["access_token"] = tokenString - response["expires_at"] = token.Expiration().Format(time.RFC3339) - - return response, nil -} - -func (c *jwtTokenClaims) createAndSetCookie(w http.ResponseWriter, r *http.Request, tokenAuth *jwtauth.JWTAuth, +func createAndSetCookie(w http.ResponseWriter, r *http.Request, claims *jwt.Claims, tokenAuth *jwt.Signer, audience tokenAudience, ip string, ) error { - resp, err := c.createTokenResponse(tokenAuth, audience, ip) + duration := getTokenDuration(audience) + token, err := tokenAuth.SignWithParams(claims, audience, ip, duration) if err != nil { return err } + resp := claims.BuildTokenResponse(token) var basePath string if audience == tokenAudienceWebAdmin || audience == tokenAudienceWebAdminPartial { basePath = webBaseAdminPath } else { basePath = webBaseClientPath } - duration := tokenDuration - if audience == tokenAudienceWebShare { - duration = shareTokenDuration - } + setCookie(w, r, basePath, resp.Token, duration) + + return nil +} + +func setCookie(w http.ResponseWriter, r *http.Request, cookiePath, cookieValue string, duration time.Duration) { http.SetCookie(w, &http.Cookie{ - Name: jwtCookieKey, - Value: resp["access_token"].(string), - Path: basePath, + Name: jwt.CookieKey, + Value: cookieValue, + Path: cookiePath, Expires: time.Now().Add(duration), MaxAge: int(duration / time.Second), HttpOnly: true, Secure: isTLS(r), SameSite: http.SameSiteStrictMode, }) - - return nil } -func (c *jwtTokenClaims) removeCookie(w http.ResponseWriter, r *http.Request, cookiePath string) { +func removeCookie(w http.ResponseWriter, r *http.Request, cookiePath string) { + invalidateToken(r) http.SetCookie(w, &http.Cookie{ - Name: jwtCookieKey, + Name: jwt.CookieKey, Value: "", Path: cookiePath, Expires: time.Unix(0, 0), @@ -300,10 +165,9 @@ func (c *jwtTokenClaims) removeCookie(w http.ResponseWriter, r *http.Request, co SameSite: http.SameSiteStrictMode, }) w.Header().Add("Cache-Control", `no-cache="Set-Cookie"`) - invalidateToken(r) } -func tokenFromContext(r *http.Request) string { +func oidcTokenFromContext(r *http.Request) string { if token, ok := r.Context().Value(oidcGeneratedToken).(string); ok { return token } @@ -315,16 +179,16 @@ func isTLS(r *http.Request) bool { return true } if proto, ok := r.Context().Value(forwardedProtoKey).(string); ok { - return proto == "https" + return proto == "https" //nolint:goconst } return false } func isTokenInvalidated(r *http.Request) bool { var findTokenFns []func(r *http.Request) string - findTokenFns = append(findTokenFns, jwtauth.TokenFromHeader) - findTokenFns = append(findTokenFns, jwtauth.TokenFromCookie) - findTokenFns = append(findTokenFns, tokenFromContext) + findTokenFns = append(findTokenFns, jwt.TokenFromHeader) + findTokenFns = append(findTokenFns, jwt.TokenFromCookie) + findTokenFns = append(findTokenFns, oidcTokenFromContext) isTokenFound := false for _, fn := range findTokenFns { @@ -341,55 +205,78 @@ func isTokenInvalidated(r *http.Request) bool { } func invalidateToken(r *http.Request) { - tokenString := jwtauth.TokenFromHeader(r) + tokenString := jwt.TokenFromHeader(r) if tokenString != "" { - invalidatedJWTTokens.Add(tokenString, time.Now().Add(tokenDuration).UTC()) + invalidateTokenString(r, tokenString, apiTokenDuration) } - tokenString = jwtauth.TokenFromCookie(r) + tokenString = jwt.TokenFromCookie(r) if tokenString != "" { - invalidatedJWTTokens.Add(tokenString, time.Now().Add(tokenDuration).UTC()) + invalidateTokenString(r, tokenString, getMaxCookieDuration()) } } +func invalidateTokenString(r *http.Request, tokenString string, fallbackDuration time.Duration) { + token, err := jwt.FromContext(r.Context()) + if err != nil { + invalidatedJWTTokens.Add(tokenString, time.Now().Add(fallbackDuration).UTC()) + return + } + invalidatedJWTTokens.Add(tokenString, token.Expiry.Time().Add(1*time.Minute).UTC()) +} + func getUserFromToken(r *http.Request) *dataprovider.User { user := &dataprovider.User{} - _, claims, err := jwtauth.FromContext(r.Context()) + claims, err := jwt.FromContext(r.Context()) if err != nil { return user } - tokenClaims := jwtTokenClaims{} - tokenClaims.Decode(claims) - user.Username = tokenClaims.Username - user.Filters.WebClient = tokenClaims.Permissions - user.Role = tokenClaims.Role + user.Username = claims.Username + user.Filters.WebClient = claims.Permissions + user.Role = claims.Role return user } func getAdminFromToken(r *http.Request) *dataprovider.Admin { admin := &dataprovider.Admin{} - _, claims, err := jwtauth.FromContext(r.Context()) + claims, err := jwt.FromContext(r.Context()) if err != nil { return admin } - tokenClaims := jwtTokenClaims{} - tokenClaims.Decode(claims) - admin.Username = tokenClaims.Username - admin.Permissions = tokenClaims.Permissions - admin.Filters.Preferences.HideUserPageSections = tokenClaims.HideUserPageSections - admin.Role = tokenClaims.Role + admin.Username = claims.Username + admin.Permissions = claims.Permissions + admin.Filters.Preferences.HideUserPageSections = claims.HideUserPageSections + admin.Role = claims.Role return admin } -func createCSRFToken(ip string) string { - claims := make(map[string]any) - now := time.Now().UTC() +func createLoginCookie(w http.ResponseWriter, r *http.Request, csrfTokenAuth *jwt.Signer, tokenID, basePath, ip string, +) { + c := jwt.NewClaims(tokenAudienceWebLogin, ip, getTokenDuration(tokenAudienceWebLogin)) + c.ID = tokenID + resp, err := c.GenerateTokenResponse(csrfTokenAuth) + if err != nil { + return + } + setCookie(w, r, basePath, resp.Token, csrfTokenDuration) +} - claims[jwt.JwtIDKey] = xid.New().String() - claims[jwt.NotBeforeKey] = now.Add(-30 * time.Second) - claims[jwt.ExpirationKey] = now.Add(csrfTokenDuration) - claims[jwt.AudienceKey] = []string{tokenAudienceCSRF, ip} - - _, tokenString, err := csrfTokenAuth.Encode(claims) +func createCSRFToken(w http.ResponseWriter, r *http.Request, csrfTokenAuth *jwt.Signer, tokenID, + basePath string, +) string { + ip := util.GetIPFromRemoteAddress(r.RemoteAddr) + claims := jwt.NewClaims(tokenAudienceCSRF, ip, csrfTokenDuration) + claims.ID = rand.Text() + if tokenID != "" { + createLoginCookie(w, r, csrfTokenAuth, tokenID, basePath, ip) + claims.Ref = tokenID + } else { + if c, err := jwt.FromContext(r.Context()); err == nil { + claims.Ref = c.ID + } else { + logger.Error(logSender, "", "unable to add reference to CSRF token: %v", err) + } + } + tokenString, err := csrfTokenAuth.Sign(claims) if err != nil { logger.Debug(logSender, "", "unable to create CSRF token: %v", err) return "" @@ -397,38 +284,80 @@ func createCSRFToken(ip string) string { return tokenString } -func verifyCSRFToken(tokenString, ip string) error { - token, err := jwtauth.VerifyToken(csrfTokenAuth, tokenString) +func verifyCSRFToken(r *http.Request, csrfTokenAuth *jwt.Signer) error { + tokenString := r.Form.Get(csrfFormToken) + token, err := jwt.VerifyToken(csrfTokenAuth, tokenString) if err != nil || token == nil { logger.Debug(logSender, "", "error validating CSRF token %q: %v", tokenString, err) return fmt.Errorf("unable to verify form token: %v", err) } - if !util.Contains(token.Audience(), tokenAudienceCSRF) { + if !token.Audience.Contains(tokenAudienceCSRF) { logger.Debug(logSender, "", "error validating CSRF token audience") return errors.New("the form token is not valid") } - if tokenValidationMode != tokenValidationNoIPMatch { - if !util.Contains(token.Audience(), ip) { - logger.Debug(logSender, "", "error validating CSRF token IP audience") - return errors.New("the form token is not valid") - } + if err := validateIPForToken(token, util.GetIPFromRemoteAddress(r.RemoteAddr)); err != nil { + logger.Debug(logSender, "", "error validating CSRF token IP audience") + return errors.New("the form token is not valid") + } + return checkCSRFTokenRef(r, token) +} + +func checkCSRFTokenRef(r *http.Request, token *jwt.Claims) error { + claims, err := jwt.FromContext(r.Context()) + if err != nil { + logger.Debug(logSender, "", "error getting token claims for CSRF validation: %v", err) + return err + } + if token.ID == "" { + logger.Debug(logSender, "", "error validating CSRF token, missing reference") + return errors.New("the form token is not valid") + } + if claims.ID != token.Ref { + logger.Debug(logSender, "", "error validating CSRF reference, id %q, reference %q", claims.ID, token.ID) + return errors.New("unexpected form token") } return nil } -func createOAuth2Token(state, ip string) string { - claims := make(map[string]any) - now := time.Now().UTC() +func verifyLoginCookie(r *http.Request) error { + token, err := jwt.FromContext(r.Context()) + if err != nil { + logger.Debug(logSender, "", "error getting login token: %v", err) + return errInvalidToken + } + if isTokenInvalidated(r) { + logger.Debug(logSender, "", "the login token has been invalidated") + return errInvalidToken + } + if !token.Audience.Contains(tokenAudienceWebLogin) { + logger.Debug(logSender, "", "the token with id %q is not valid for audience %q", token.ID, tokenAudienceWebLogin) + return errInvalidToken + } + ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) + if err := validateIPForToken(token, ipAddr); err != nil { + return err + } + return nil +} - claims[jwt.JwtIDKey] = state - claims[jwt.NotBeforeKey] = now.Add(-30 * time.Second) - claims[jwt.ExpirationKey] = now.Add(3 * time.Minute) - claims[jwt.AudienceKey] = []string{tokenAudienceOAuth2, ip} +func verifyLoginCookieAndCSRFToken(r *http.Request, csrfTokenAuth *jwt.Signer) error { + if err := verifyLoginCookie(r); err != nil { + return err + } + if err := verifyCSRFToken(r, csrfTokenAuth); err != nil { + return err + } + return nil +} - _, tokenString, err := csrfTokenAuth.Encode(claims) +func createOAuth2Token(csrfTokenAuth *jwt.Signer, state, ip string) string { + claims := jwt.NewClaims(tokenAudienceOAuth2, ip, getTokenDuration(tokenAudienceOAuth2)) + claims.ID = state + + tokenString, err := csrfTokenAuth.Sign(claims) if err != nil { logger.Debug(logSender, "", "unable to create OAuth2 token: %v", err) return "" @@ -436,8 +365,8 @@ func createOAuth2Token(state, ip string) string { return tokenString } -func verifyOAuth2Token(tokenString, ip string) (string, error) { - token, err := jwtauth.VerifyToken(csrfTokenAuth, tokenString) +func verifyOAuth2Token(csrfTokenAuth *jwt.Signer, tokenString, ip string) (string, error) { + token, err := jwt.VerifyToken(csrfTokenAuth, tokenString) if err != nil || token == nil { logger.Debug(logSender, "", "error validating OAuth2 token %q: %v", tokenString, err) return "", util.NewI18nError( @@ -446,22 +375,62 @@ func verifyOAuth2Token(tokenString, ip string) (string, error) { ) } - if !util.Contains(token.Audience(), tokenAudienceOAuth2) { + if !token.Audience.Contains(tokenAudienceOAuth2) { logger.Debug(logSender, "", "error validating OAuth2 token audience") return "", util.NewI18nError(errors.New("invalid OAuth2 state"), util.I18nOAuth2InvalidState) } - if tokenValidationMode != tokenValidationNoIPMatch { - if !util.Contains(token.Audience(), ip) { - logger.Debug(logSender, "", "error validating OAuth2 token IP audience") - return "", util.NewI18nError(errors.New("invalid OAuth2 state"), util.I18nOAuth2InvalidState) - } + if err := validateIPForToken(token, ip); err != nil { + logger.Debug(logSender, "", "error validating OAuth2 token IP audience") + return "", util.NewI18nError(errors.New("invalid OAuth2 state"), util.I18nOAuth2InvalidState) } - if val, ok := token.Get(jwt.JwtIDKey); ok { - if state, ok := val.(string); ok { - return state, nil - } + if token.ID != "" { + return token.ID, nil } logger.Debug(logSender, "", "jti not found in OAuth2 token") return "", util.NewI18nError(errors.New("invalid OAuth2 state"), util.I18nOAuth2InvalidState) } + +func validateIPForToken(token *jwt.Claims, ip string) error { + if tokenValidationMode&tokenValidationModeNoIPMatch == 0 { + if !token.Audience.Contains(ip) { + return errInvalidToken + } + } + return nil +} + +func checkTokenSignature(r *http.Request, token *jwt.Claims) error { + if _, ok := r.Context().Value(oidcTokenKey).(string); ok { + return nil + } + var err error + if tokenValidationMode&tokenValidationModeUserSignature != 0 { + for _, audience := range token.Audience { + switch audience { + case tokenAudienceAPI, tokenAudienceWebAdmin: + err = validateSignatureForToken(token, dataprovider.GetAdminSignature) + case tokenAudienceAPIUser, tokenAudienceWebClient: + err = validateSignatureForToken(token, dataprovider.GetUserSignature) + } + } + } + if err != nil { + invalidateToken(r) + } + return err +} + +func validateSignatureForToken(token *jwt.Claims, getter func(string) (string, error)) error { + signature, err := getter(token.Username) + if err != nil { + logger.Debug(logSender, "", "unable to get signature for username %q: %v", token.Username, err) + return errInvalidToken + } + if signature != "" && signature == token.Subject { + return nil + } + logger.Debug(logSender, "", "signature mismatch for username %q, signature %q, token signature %q", + token.Username, signature, token.Subject) + return errInvalidToken +} diff --git a/internal/httpd/file.go b/internal/httpd/file.go index 5bc4627b..daa70b49 100644 --- a/internal/httpd/file.go +++ b/internal/httpd/file.go @@ -126,7 +126,7 @@ func (f *httpdFile) closeIO() error { } else if f.reader != nil { err = f.reader.Close() if metadater, ok := f.reader.(vfs.Metadater); ok { - f.BaseTransfer.SetMetadata(metadater.Metadata()) + f.SetMetadata(metadater.Metadata()) } } return err diff --git a/internal/httpd/handler.go b/internal/httpd/handler.go index d417cc4a..15b085fe 100644 --- a/internal/httpd/handler.go +++ b/internal/httpd/handler.go @@ -35,6 +35,17 @@ import ( type Connection struct { *common.BaseConnection request *http.Request + rc *http.ResponseController +} + +func newConnection(conn *common.BaseConnection, w http.ResponseWriter, r *http.Request) *Connection { + rc := http.NewResponseController(w) + responseControllerDeadlines(rc, time.Time{}, time.Time{}) + return &Connection{ + BaseConnection: conn, + request: r, + rc: rc, + } } // GetClientVersion returns the connected client's version. @@ -60,6 +71,9 @@ func (c *Connection) GetRemoteAddress() string { // Disconnect closes the active transfer func (c *Connection) Disconnect() (err error) { + if c.rc != nil { + responseControllerDeadlines(c.rc, time.Now().Add(5*time.Second), time.Now().Add(5*time.Second)) + } return c.SignalTransfersAbort() } @@ -97,6 +111,11 @@ func (c *Connection) ReadDir(name string) (vfs.DirLister, error) { func (c *Connection) getFileReader(name string, offset int64, method string) (io.ReadCloser, error) { c.UpdateLastActivity() + if err := common.Connections.IsNewTransferAllowed(c.User.Username); err != nil { + c.Log(logger.LevelInfo, "denying file read due to transfer count limits") + return nil, util.NewI18nError(c.GetPermissionDeniedError(), util.I18nError403Message) + } + transferQuota := c.GetTransferQuota() if !transferQuota.HasDownloadSpace() { c.Log(logger.LevelInfo, "denying file read due to quota limits") @@ -176,7 +195,7 @@ func (c *Connection) getFileWriter(name string) (io.WriteCloser, error) { } if common.Config.IsAtomicUploadEnabled() && fs.IsAtomicUploadSupported() { - _, _, err = fs.Rename(p, filePath) + _, _, err = fs.Rename(p, filePath, 0) if err != nil { c.Log(logger.LevelError, "error renaming existing file for atomic upload, source: %q, dest: %q, err: %+v", p, filePath, err) @@ -188,6 +207,10 @@ func (c *Connection) getFileWriter(name string) (io.WriteCloser, error) { } func (c *Connection) handleUploadFile(fs vfs.Fs, resolvedPath, filePath, requestPath string, isNewFile bool, fileSize int64) (io.WriteCloser, error) { + if err := common.Connections.IsNewTransferAllowed(c.User.Username); err != nil { + c.Log(logger.LevelInfo, "denying file write due to transfer count limits") + return nil, util.NewI18nError(c.GetPermissionDeniedError(), util.I18nError403Message) + } diskQuota, transferQuota := c.HasSpace(isNewFile, false, requestPath) if !diskQuota.HasSpace || !transferQuota.HasUploadSpace() { c.Log(logger.LevelInfo, "denying file write due to quota limits") @@ -213,10 +236,7 @@ func (c *Connection) handleUploadFile(fs vfs.Fs, resolvedPath, filePath, request if vfs.HasTruncateSupport(fs) { vfolder, err := c.User.GetVirtualFolderForPath(path.Dir(requestPath)) if err == nil { - dataprovider.UpdateVirtualFolderQuota(&vfolder.BaseVirtualFolder, 0, -fileSize, false) //nolint:errcheck - if vfolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&c.User, 0, -fileSize, false) //nolint:errcheck - } + dataprovider.UpdateUserFolderQuota(&vfolder, &c.User, 0, -fileSize, false) } else { dataprovider.UpdateUserQuota(&c.User, 0, -fileSize, false) //nolint:errcheck } @@ -323,6 +343,10 @@ func (t *throttledReader) GetRealFsPath(_ string) string { return "" } +func (t *throttledReader) GetFsPath() string { + return "" +} + func (t *throttledReader) SetTimes(_ string, _ time.Time, _ time.Time) bool { return false } diff --git a/internal/httpd/httpd.go b/internal/httpd/httpd.go index 62a4cdfb..13e39206 100644 --- a/internal/httpd/httpd.go +++ b/internal/httpd/httpd.go @@ -23,16 +23,16 @@ import ( "fmt" "net" "net/http" + "net/url" "os" "path" "path/filepath" "runtime" "strings" + "sync" "time" "github.com/go-chi/chi/v5" - "github.com/go-chi/jwtauth/v5" - "github.com/lestrrat-go/jwx/v2/jwa" "github.com/drakkan/sftpgo/v2/internal/acme" "github.com/drakkan/sftpgo/v2/internal/common" @@ -84,7 +84,6 @@ const ( user2FARecoveryCodesPath = "/api/v2/user/2fa/recoverycodes" userProfilePath = "/api/v2/user/profile" userSharesPath = "/api/v2/user/shares" - retentionBasePath = "/api/v2/retention/users" retentionChecksPath = "/api/v2/retention/users/checks" fsEventsPath = "/api/v2/events/fs" providerEventsPath = "/api/v2/events/provider" @@ -196,7 +195,6 @@ var ( cleanupTicker *time.Ticker cleanupDone chan bool invalidatedJWTTokens tokenManager - csrfTokenAuth *jwtauth.JWTAuth webRootPath string webBasePath string webBaseAdminPath string @@ -288,12 +286,88 @@ var ( installationCodeHint string fnInstallationCodeResolver FnInstallationCodeResolver configurationDir string + dbBrandingConfig brandingCache ) func init() { updateWebAdminURLs("") updateWebClientURLs("") acme.SetReloadHTTPDCertsFn(ReloadCertificateMgr) + common.SetUpdateBrandingFn(dbBrandingConfig.Set) +} + +type brandingCache struct { + mu sync.RWMutex + configs *dataprovider.BrandingConfigs +} + +func (b *brandingCache) Set(configs *dataprovider.BrandingConfigs) { + b.mu.Lock() + defer b.mu.Unlock() + + b.configs = configs +} + +func (b *brandingCache) getWebAdminLogo() []byte { + b.mu.RLock() + defer b.mu.RUnlock() + + return b.configs.WebAdmin.Logo +} + +func (b *brandingCache) getWebAdminFavicon() []byte { + b.mu.RLock() + defer b.mu.RUnlock() + + return b.configs.WebAdmin.Favicon +} + +func (b *brandingCache) getWebClientLogo() []byte { + b.mu.RLock() + defer b.mu.RUnlock() + + return b.configs.WebClient.Logo +} + +func (b *brandingCache) getWebClientFavicon() []byte { + b.mu.RLock() + defer b.mu.RUnlock() + + return b.configs.WebClient.Favicon +} + +func (b *brandingCache) mergeBrandingConfig(branding UIBranding, isWebClient bool) UIBranding { + b.mu.RLock() + defer b.mu.RUnlock() + + var urlPrefix string + var cfg dataprovider.BrandingConfig + if isWebClient { + cfg = b.configs.WebClient + urlPrefix = "webclient" + } else { + cfg = b.configs.WebAdmin + urlPrefix = "webadmin" + } + if cfg.Name != "" { + branding.Name = cfg.Name + } + if cfg.ShortName != "" { + branding.ShortName = cfg.ShortName + } + if cfg.DisclaimerName != "" { + branding.DisclaimerName = cfg.DisclaimerName + } + if cfg.DisclaimerURL != "" { + branding.DisclaimerPath = cfg.DisclaimerURL + } + if len(cfg.Logo) > 0 { + branding.LogoPath = path.Join("/", "branding", urlPrefix, "logo.png") + } + if len(cfg.Favicon) > 0 { + branding.FaviconPath = path.Join("/", "branding", urlPrefix, "favicon.png") + } + return branding } // FnInstallationCodeResolver defines a method to get the installation code. @@ -340,9 +414,17 @@ type SecurityConf struct { ContentSecurityPolicy string `json:"content_security_policy" mapstructure:"content_security_policy"` // PermissionsPolicy allows to set the Permissions-Policy header value. Default is "". PermissionsPolicy string `json:"permissions_policy" mapstructure:"permissions_policy"` - // CrossOriginOpenerPolicy allows to set the `Cross-Origin-Opener-Policy` header value. Default is "". + // CrossOriginOpenerPolicy allows to set the Cross-Origin-Opener-Policy header value. Default is "". CrossOriginOpenerPolicy string `json:"cross_origin_opener_policy" mapstructure:"cross_origin_opener_policy"` - proxyHeaders []string + // CrossOriginResourcePolicy allows to set the Cross-Origin-Resource-Policy header value. Default is "". + CrossOriginResourcePolicy string `json:"cross_origin_resource_policy" mapstructure:"cross_origin_resource_policy"` + // CrossOriginEmbedderPolicy allows to set the Cross-Origin-Embedder-Policy header value. Default is "". + CrossOriginEmbedderPolicy string `json:"cross_origin_embedder_policy" mapstructure:"cross_origin_embedder_policy"` + // CacheControl allows to set the Cache-Control header value. + CacheControl string `json:"cache_control" mapstructure:"cache_control"` + // ReferrerPolicy allows to set the Referrer-Policy header values. + ReferrerPolicy string `json:"referrer_policy" mapstructure:"referrer_policy"` + proxyHeaders []string } func (s *SecurityConf) updateProxyHeaders() { @@ -398,8 +480,6 @@ type UIBranding struct { // For example, if you create a directory named "branding" inside the static dir and // put the "mylogo.png" file in it, you must set "/branding/mylogo.png" as logo path. LogoPath string `json:"logo_path" mapstructure:"logo_path"` - // Path to the image to show on the login screen relative to "static_files_path" - LoginImagePath string `json:"login_image_path" mapstructure:"login_image_path"` // Path to your favicon relative to "static_files_path" FaviconPath string `json:"favicon_path" mapstructure:"favicon_path"` // DisclaimerName defines the name for the link to your optional disclaimer @@ -411,24 +491,23 @@ type UIBranding struct { // the default CSS files DefaultCSS []string `json:"default_css" mapstructure:"default_css"` // Additional CSS file paths, relative to "static_files_path", to include - ExtraCSS []string `json:"extra_css" mapstructure:"extra_css"` + ExtraCSS []string `json:"extra_css" mapstructure:"extra_css"` + DefaultLogoPath string `json:"-" mapstructure:"-"` + DefaultFaviconPath string `json:"-" mapstructure:"-"` } func (b *UIBranding) check() { + b.DefaultLogoPath = "/img/logo.png" + b.DefaultFaviconPath = "/favicon.png" if b.LogoPath != "" { b.LogoPath = util.CleanPath(b.LogoPath) } else { - b.LogoPath = "/img/logo.png" - } - if b.LoginImagePath != "" { - b.LoginImagePath = util.CleanPath(b.LoginImagePath) - } else { - b.LoginImagePath = "/img/login_image.png" + b.LogoPath = b.DefaultLogoPath } if b.FaviconPath != "" { b.FaviconPath = util.CleanPath(b.FaviconPath) } else { - b.FaviconPath = "/favicon.ico" + b.FaviconPath = b.DefaultFaviconPath } if b.DisclaimerPath != "" { if !strings.HasPrefix(b.DisclaimerPath, "https://") && !strings.HasPrefix(b.DisclaimerPath, "http://") { @@ -488,7 +567,21 @@ type Binding struct { // // You can combine the values. For example 3 means that you can only login using OIDC on // both WebClient and WebAdmin UI. + // Deprecated because it is not extensible, use DisabledLoginMethods EnabledLoginMethods int `json:"enabled_login_methods" mapstructure:"enabled_login_methods"` + // Defines the login methods disabled for the WebAdmin and WebClient UIs: + // + // - 1 means OIDC for the WebAdmin UI + // - 2 means OIDC for the WebClient UI + // - 4 means login form for the WebAdmin UI + // - 8 means login form for the WebClient UI + // - 16 means basic auth for admin REST API + // - 32 means basic auth for user REST API + // - 64 means API key auth for admins + // - 128 means API key auth for users + // You can combine the values. For example 12 means that you can only login using OIDC on + // both WebClient and WebAdmin UI. + DisabledLoginMethods int `json:"disabled_login_methods" mapstructure:"disabled_login_methods"` // you also need to provide a certificate for enabling HTTPS EnableHTTPS bool `json:"enable_https" mapstructure:"enable_https"` // Certificate and matching private key for this specific binding, if empty the global @@ -513,6 +606,9 @@ type Binding struct { TLSCipherSuites []string `json:"tls_cipher_suites" mapstructure:"tls_cipher_suites"` // HTTP protocols in preference order. Supported values: http/1.1, h2 Protocols []string `json:"tls_protocols" mapstructure:"tls_protocols"` + // Defines whether to use the common proxy protocol configuration or the + // binding-specific proxy header configuration. + ProxyMode int `json:"proxy_mode" mapstructure:"proxy_mode"` // List of IP addresses and IP ranges allowed to set client IP proxy headers and // X-Forwarded-Proto header. ProxyAllowed []string `json:"proxy_allowed" mapstructure:"proxy_allowed"` @@ -532,6 +628,12 @@ type Binding struct { HideLoginURL int `json:"hide_login_url" mapstructure:"hide_login_url"` // Enable the built-in OpenAPI renderer RenderOpenAPI bool `json:"render_openapi" mapstructure:"render_openapi"` + // BaseURL defines the external base URL for generating public links + // (currently share access link), bypassing the default browser-based + // detection. + BaseURL string `json:"base_url" mapstructure:"base_url"` + // Languages defines the list of enabled translations for the WebAdmin and WebClient UI. + Languages []string `json:"languages" mapstructure:"languages"` // Defining an OIDC configuration the web admin and web client UI will use OpenID to authenticate users. OIDC OIDC `json:"oidc" mapstructure:"oidc"` // Security defines security headers to add to HTTP responses and allows to restrict allowed hosts @@ -558,6 +660,36 @@ func (b *Binding) checkBranding() { } } +func (b *Binding) webAdminBranding() UIBranding { + return dbBrandingConfig.mergeBrandingConfig(b.Branding.WebAdmin, false) +} + +func (b *Binding) webClientBranding() UIBranding { + return dbBrandingConfig.mergeBrandingConfig(b.Branding.WebClient, true) +} + +func (b *Binding) languages() []string { + return b.Languages +} + +func (b *Binding) validateBaseURL() error { + if b.BaseURL == "" { + return nil + } + u, err := url.ParseRequestURI(b.BaseURL) + if err != nil { + return err + } + if u.Scheme != "http" && u.Scheme != "https" { + return fmt.Errorf("invalid base URL schema %s", b.BaseURL) + } + if u.Host == "" { + return fmt.Errorf("invalid base URL host %s", b.BaseURL) + } + b.BaseURL = strings.TrimRight(u.String(), "/") + return nil +} + func (b *Binding) parseAllowedProxy() error { if filepath.IsAbs(b.Address) && len(b.ProxyAllowed) > 0 { // unix domain socket @@ -591,47 +723,90 @@ func (b *Binding) IsValid() bool { return false } +func (b *Binding) check() error { + if err := b.parseAllowedProxy(); err != nil { + return err + } + if err := b.validateBaseURL(); err != nil { + return err + } + b.checkBranding() + b.Security.updateProxyHeaders() + return nil +} + func (b *Binding) isWebAdminOIDCLoginDisabled() bool { if b.EnableWebAdmin { - if b.EnabledLoginMethods == 0 { - return false - } - return b.EnabledLoginMethods&1 == 0 + return b.DisabledLoginMethods&1 != 0 } return false } func (b *Binding) isWebClientOIDCLoginDisabled() bool { if b.EnableWebClient { - if b.EnabledLoginMethods == 0 { - return false - } - return b.EnabledLoginMethods&2 == 0 + return b.DisabledLoginMethods&2 != 0 } return false } func (b *Binding) isWebAdminLoginFormDisabled() bool { if b.EnableWebAdmin { - if b.EnabledLoginMethods == 0 { - return false - } - return b.EnabledLoginMethods&4 == 0 + return b.DisabledLoginMethods&4 != 0 } return false } func (b *Binding) isWebClientLoginFormDisabled() bool { if b.EnableWebClient { - if b.EnabledLoginMethods == 0 { - return false - } - return b.EnabledLoginMethods&8 == 0 + return b.DisabledLoginMethods&8 != 0 } return false } +func (b *Binding) isAdminTokenEndpointDisabled() bool { + return b.DisabledLoginMethods&16 != 0 +} + +func (b *Binding) isUserTokenEndpointDisabled() bool { + return b.DisabledLoginMethods&32 != 0 +} + +func (b *Binding) isAdminAPIKeyAuthDisabled() bool { + return b.DisabledLoginMethods&64 != 0 +} + +func (b *Binding) isUserAPIKeyAuthDisabled() bool { + return b.DisabledLoginMethods&128 != 0 +} + +func (b *Binding) hasLoginForAPI() bool { + return !b.isAdminTokenEndpointDisabled() || !b.isUserTokenEndpointDisabled() || + !b.isAdminAPIKeyAuthDisabled() || !b.isUserAPIKeyAuthDisabled() +} + +// convertLoginMethods checks if the deprecated EnabledLoginMethods is set and +// convert the value to DisabledLoginMethods. +func (b *Binding) convertLoginMethods() { + if b.DisabledLoginMethods > 0 || b.EnabledLoginMethods == 0 { + // DisabledLoginMethods already in use or EnabledLoginMethods not set. + return + } + if b.EnabledLoginMethods&1 == 0 { + b.DisabledLoginMethods++ + } + if b.EnabledLoginMethods&2 == 0 { + b.DisabledLoginMethods += 2 + } + if b.EnabledLoginMethods&4 == 0 { + b.DisabledLoginMethods += 4 + } + if b.EnabledLoginMethods&8 == 0 { + b.DisabledLoginMethods += 8 + } +} + func (b *Binding) checkLoginMethods() error { + b.convertLoginMethods() if b.isWebAdminLoginFormDisabled() && b.isWebAdminOIDCLoginDisabled() { return errors.New("no login method available for WebAdmin UI") } @@ -648,6 +823,9 @@ func (b *Binding) checkLoginMethods() error { return errors.New("no login method available for WebClient UI") } } + if b.EnableRESTAPI && !b.hasLoginForAPI() { + return errors.New("no login method available for REST API") + } return nil } @@ -671,6 +849,17 @@ func (b *Binding) showClientLoginURL() bool { return true } +func (b *Binding) isMutualTLSEnabled() bool { + return b.ClientAuthType == 1 +} + +func (b *Binding) listenerWrapper() func(net.Listener) (net.Listener, error) { + if b.ProxyMode == 1 { + return common.Config.GetProxyListener + } + return nil +} + type defenderStatus struct { IsActive bool `json:"is_active"` } @@ -764,6 +953,12 @@ type Conf struct { // By default all the available security checks are enabled. Set to 1 to disable the requirement // that a token must be used by the same IP for which it was issued. TokenValidation int `json:"token_validation" mapstructure:"token_validation"` + // CookieLifetime defines the duration of cookies for WebAdmin and WebClient + CookieLifetime int `json:"cookie_lifetime" mapstructure:"cookie_lifetime"` + // ShareCookieLifetime defines the duration of cookies for public shares + ShareCookieLifetime int `json:"share_cookie_lifetime" mapstructure:"share_cookie_lifetime"` + // JWTLifetime defines the duration of JWT tokens used in REST API + JWTLifetime int `json:"jwt_lifetime" mapstructure:"jwt_lifetime"` // MaxUploadFileSize Defines the maximum request body size, in bytes, for Web Client/API HTTP upload requests. // 0 means no limit MaxUploadFileSize int64 `json:"max_upload_file_size" mapstructure:"max_upload_file_size"` @@ -872,11 +1067,7 @@ func (c *Conf) getKeyPairs(configDir string) []common.TLSKeyPair { } func (c *Conf) setTokenValidationMode() { - if c.TokenValidation == 1 { - tokenValidationMode = tokenValidationNoIPMatch - } else { - tokenValidationMode = tokenValidationFull - } + tokenValidationMode = c.TokenValidation } func (c *Conf) loadFromProvider() error { @@ -885,6 +1076,7 @@ func (c *Conf) loadFromProvider() error { return fmt.Errorf("unable to load config from provider: %w", err) } configs.SetNilsToEmpty() + dbBrandingConfig.Set(configs.Branding) if configs.ACME.Domain == "" || !configs.ACME.HasProtocol(common.ProtocolHTTP) { return nil } @@ -970,7 +1162,6 @@ func (c *Conf) Initialize(configDir string, isShared int) error { c.SigningPassphrase = passphrase } - csrfTokenAuth = jwtauth.New(jwa.HS256.String(), getSigningKey(c.SigningPassphrase), nil) hideSupportLink = c.HideSupportLink exitChannel := make(chan error, 1) @@ -979,11 +1170,9 @@ func (c *Conf) Initialize(configDir string, isShared int) error { if !binding.IsValid() { continue } - if err := binding.parseAllowedProxy(); err != nil { + if err := binding.check(); err != nil { return err } - binding.checkBranding() - binding.Security.updateProxyHeaders() go func(b Binding) { if err := b.OIDC.initialize(); err != nil { @@ -1004,7 +1193,8 @@ func (c *Conf) Initialize(configDir string, isShared int) error { maxUploadFileSize = c.MaxUploadFileSize installationCode = c.Setup.InstallationCode installationCodeHint = c.Setup.InstallationCodeHint - startCleanupTicker(tokenDuration / 2) + updateTokensDuration(c.JWTLifetime, c.CookieLifetime, c.ShareCookieLifetime) + startCleanupTicker(10 * time.Minute) c.setTokenValidationMode() return <-exitChannel } @@ -1177,10 +1367,12 @@ func updateWebAdminURLs(baseURL string) { } // GetHTTPRouter returns an HTTP handler suitable to use for test cases -func GetHTTPRouter(b Binding) http.Handler { +func GetHTTPRouter(b Binding) (http.Handler, error) { server := newHttpdServer(b, filepath.Join("..", "..", "static"), "", CorsConfig{}, filepath.Join("..", "..", "openapi")) - server.initializeRouter() - return server.router + if err := server.initializeRouter(); err != nil { + return nil, err + } + return server.router, nil } // the ticker cannot be started/stopped from multiple goroutines @@ -1218,11 +1410,14 @@ func stopCleanupTicker() { } func getSigningKey(signingPassphrase string) []byte { + var key []byte if signingPassphrase != "" { - sk := sha256.Sum256([]byte(signingPassphrase)) - return sk[:] + key = []byte(signingPassphrase) + } else { + key = util.GenerateRandomBytes(32) } - return util.GenerateRandomBytes(32) + sk := sha256.Sum256(key) + return sk[:] } // SetInstallationCodeResolver sets a function to call to resolve the installation code diff --git a/internal/httpd/httpd_test.go b/internal/httpd/httpd_test.go index c22d6075..be4f8d88 100644 --- a/internal/httpd/httpd_test.go +++ b/internal/httpd/httpd_test.go @@ -20,6 +20,9 @@ import ( "encoding/json" "errors" "fmt" + "image" + "image/color" + "image/png" "io" "io/fs" "math" @@ -33,6 +36,7 @@ import ( "path/filepath" "regexp" "runtime" + "slices" "strconv" "strings" "sync" @@ -42,9 +46,10 @@ import ( "github.com/go-chi/render" _ "github.com/go-sql-driver/mysql" _ "github.com/jackc/pgx/v5/stdlib" - "github.com/lithammer/shortuuid/v3" + "github.com/lithammer/shortuuid/v4" _ "github.com/mattn/go-sqlite3" "github.com/mhale/smtpd" + "github.com/pkg/sftp" "github.com/pquerna/otp" "github.com/pquerna/otp/totp" "github.com/rs/xid" @@ -121,7 +126,6 @@ const ( user2FARecoveryCodesPath = "/api/v2/user/2fa/recoverycodes" userProfilePath = "/api/v2/user/profile" userSharesPath = "/api/v2/user/shares" - retentionBasePath = "/api/v2/retention/users" fsEventsPath = "/api/v2/events/fs" providerEventsPath = "/api/v2/events/provider" logEventsPath = "/api/v2/events/logs" @@ -324,7 +328,7 @@ type recoveryCode struct { Used bool `json:"used"` } -func TestMain(m *testing.M) { +func TestMain(m *testing.M) { //nolint:gocyclo homeBasePath = os.TempDir() logfilePath := filepath.Join(configDir, "sftpgo_api_test.log") logger.InitLogger(logfilePath, 5, 1, 28, false, false, zerolog.DebugLevel) @@ -366,6 +370,24 @@ func TestMain(m *testing.M) { os.Exit(1) } + kmsConfig := config.GetKMSConfig() + err = kmsConfig.Initialize() + if err != nil { + logger.ErrorToConsole("error initializing kms: %v", err) + os.Exit(1) + } + err = plugin.Initialize(pluginsConfig, "debug") + if err != nil { + logger.ErrorToConsole("error initializing plugin: %v", err) + os.Exit(1) + } + mfaConfig := config.GetMFAConfig() + err = mfaConfig.Initialize() + if err != nil { + logger.ErrorToConsole("error initializing MFA: %v", err) + os.Exit(1) + } + err = dataprovider.Initialize(providerConf, configDir, true) if err != nil { logger.WarnToConsole("error initializing data provider: %v", err) @@ -385,23 +407,6 @@ func TestMain(m *testing.M) { httpConfig.RetryMax = 1 httpConfig.Timeout = 5 httpConfig.Initialize(configDir) //nolint:errcheck - kmsConfig := config.GetKMSConfig() - err = kmsConfig.Initialize() - if err != nil { - logger.ErrorToConsole("error initializing kms: %v", err) - os.Exit(1) - } - mfaConfig := config.GetMFAConfig() - err = mfaConfig.Initialize() - if err != nil { - logger.ErrorToConsole("error initializing MFA: %v", err) - os.Exit(1) - } - err = plugin.Initialize(pluginsConfig, "debug") - if err != nil { - logger.ErrorToConsole("error initializing plugin: %v", err) - os.Exit(1) - } httpdConf := config.GetHTTPDConfig() @@ -414,6 +419,7 @@ func TestMain(m *testing.M) { Value: "https", }, }, + CacheControl: "private", } httpdtest.SetBaseURL(httpBaseURL) // required to test sftpfs @@ -474,7 +480,12 @@ func TestMain(m *testing.M) { waitTCPListening(httpdConf.Bindings[0].GetAddress()) httpd.ReloadCertificateMgr() //nolint:errcheck - testServer = httptest.NewServer(httpd.GetHTTPRouter(httpdConf.Bindings[0])) + handler, err := httpd.GetHTTPRouter(httpdConf.Bindings[0]) + if err != nil { + logger.ErrorToConsole("unable to get http test handler: %v", err) + os.Exit(1) + } + testServer = httptest.NewServer(handler) defer testServer.Close() exitCode := m.Run() @@ -569,29 +580,36 @@ func TestInitialization(t *testing.T) { assert.Contains(t, err.Error(), "oidc") } httpdConf.Bindings[0].OIDC = httpd.OIDC{} + httpdConf.Bindings[0].BaseURL = "ftp://127.0.0.1" + err = httpdConf.Initialize(configDir, isShared) + if assert.Error(t, err) { + assert.Contains(t, err.Error(), "URL schema") + } + httpdConf.Bindings[0].BaseURL = "" httpdConf.Bindings[0].EnableWebClient = true httpdConf.Bindings[0].EnableWebAdmin = true - httpdConf.Bindings[0].EnabledLoginMethods = 1 + httpdConf.Bindings[0].EnableRESTAPI = true + httpdConf.Bindings[0].DisabledLoginMethods = 14 err = httpdConf.Initialize(configDir, isShared) if assert.Error(t, err) { assert.Contains(t, err.Error(), "no login method available for WebAdmin UI") } - httpdConf.Bindings[0].EnabledLoginMethods = 2 + httpdConf.Bindings[0].DisabledLoginMethods = 13 err = httpdConf.Initialize(configDir, isShared) if assert.Error(t, err) { assert.Contains(t, err.Error(), "no login method available for WebAdmin UI") } - httpdConf.Bindings[0].EnabledLoginMethods = 6 + httpdConf.Bindings[0].DisabledLoginMethods = 9 err = httpdConf.Initialize(configDir, isShared) if assert.Error(t, err) { assert.Contains(t, err.Error(), "no login method available for WebClient UI") } - httpdConf.Bindings[0].EnabledLoginMethods = 4 + httpdConf.Bindings[0].DisabledLoginMethods = 11 err = httpdConf.Initialize(configDir, isShared) if assert.Error(t, err) { assert.Contains(t, err.Error(), "no login method available for WebClient UI") } - httpdConf.Bindings[0].EnabledLoginMethods = 3 + httpdConf.Bindings[0].DisabledLoginMethods = 12 err = httpdConf.Initialize(configDir, isShared) if assert.Error(t, err) { assert.Contains(t, err.Error(), "no login method available for WebAdmin UI") @@ -601,6 +619,12 @@ func TestInitialization(t *testing.T) { if assert.Error(t, err) { assert.Contains(t, err.Error(), "no login method available for WebClient UI") } + httpdConf.Bindings[0].EnableWebClient = false + httpdConf.Bindings[0].DisabledLoginMethods = 240 + err = httpdConf.Initialize(configDir, isShared) + if assert.Error(t, err) { + assert.Contains(t, err.Error(), "no login method available for REST API") + } err = dataprovider.Close() assert.NoError(t, err) err = httpdConf.Initialize(configDir, isShared) @@ -617,6 +641,7 @@ func TestInitialization(t *testing.T) { func TestBasicUserHandling(t *testing.T) { u := getTestUser() u.Email = "user@user.com" + u.Filters.AdditionalEmails = []string{"email1@user.com", "email2@user.com"} user, resp, err := httpdtest.AddUser(u, http.StatusCreated) assert.NoError(t, err, string(resp)) _, resp, err = httpdtest.AddUser(u, http.StatusConflict) @@ -657,6 +682,12 @@ func TestBasicUserHandling(t *testing.T) { assert.NoError(t, err) assert.Contains(t, string(body), "Validation error: email") + user.Email = "" + user.Filters.AdditionalEmails = []string{"invalid@email"} + _, body, err = httpdtest.UpdateUser(user, http.StatusBadRequest, "") + assert.NoError(t, err) + assert.Contains(t, string(body), "Validation error: email") + _, err = httpdtest.RemoveUser(user, http.StatusOK) assert.NoError(t, err) } @@ -714,7 +745,7 @@ func TestRoleRelations(t *testing.T) { a.Role = role.Name _, resp, err = httpdtest.AddAdmin(a, http.StatusBadRequest) assert.NoError(t, err) - assert.Contains(t, string(resp), "a role admin cannot have the following permissions") + assert.Contains(t, string(resp), "a role admin cannot be a super admin") a.Permissions = []string{dataprovider.PermAdminAddUsers, dataprovider.PermAdminChangeUsers, dataprovider.PermAdminDeleteUsers, dataprovider.PermAdminViewUsers} @@ -874,6 +905,289 @@ func TestTLSCert(t *testing.T) { assert.NoError(t, err) } +func TestSortRelatedFolders(t *testing.T) { + folder1 := util.GenerateUniqueID() + folder2 := util.GenerateUniqueID() + folder3 := util.GenerateUniqueID() + + f1 := vfs.BaseVirtualFolder{ + Name: folder1, + MappedPath: filepath.Clean(os.TempDir()), + } + f2 := vfs.BaseVirtualFolder{ + Name: folder2, + MappedPath: filepath.Clean(os.TempDir()), + } + f3 := vfs.BaseVirtualFolder{ + Name: folder3, + MappedPath: filepath.Clean(os.TempDir()), + } + _, _, err := httpdtest.AddFolder(f1, http.StatusCreated) + assert.NoError(t, err) + _, _, err = httpdtest.AddFolder(f2, http.StatusCreated) + assert.NoError(t, err) + _, _, err = httpdtest.AddFolder(f3, http.StatusCreated) + assert.NoError(t, err) + + u := getTestUser() + u.VirtualFolders = []vfs.VirtualFolder{ + { + BaseVirtualFolder: f1, + VirtualPath: "/" + folder1, + }, + { + BaseVirtualFolder: f2, + VirtualPath: "/" + folder2, + }, + { + BaseVirtualFolder: f3, + VirtualPath: "/" + folder3, + }, + } + user, _, err := httpdtest.AddUser(u, http.StatusCreated) + assert.NoError(t, err) + user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) + assert.NoError(t, err) + if assert.Len(t, user.VirtualFolders, 3) { + assert.Equal(t, folder1, user.VirtualFolders[0].Name) + assert.Equal(t, folder2, user.VirtualFolders[1].Name) + assert.Equal(t, folder3, user.VirtualFolders[2].Name) + } + // Update + user.VirtualFolders = []vfs.VirtualFolder{ + { + BaseVirtualFolder: f2, + VirtualPath: "/" + folder2, + }, + { + BaseVirtualFolder: f1, + VirtualPath: "/" + folder1, + }, + { + BaseVirtualFolder: f3, + VirtualPath: "/" + folder3, + }, + } + user, _, err = httpdtest.UpdateUser(user, http.StatusOK, "") + assert.NoError(t, err) + user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) + assert.NoError(t, err) + if assert.Len(t, user.VirtualFolders, 3) { + assert.Equal(t, folder2, user.VirtualFolders[0].Name) + assert.Equal(t, folder1, user.VirtualFolders[1].Name) + assert.Equal(t, folder3, user.VirtualFolders[2].Name) + } + + g := getTestGroup() + g.VirtualFolders = []vfs.VirtualFolder{ + { + BaseVirtualFolder: f1, + VirtualPath: "/" + folder1, + }, + { + BaseVirtualFolder: f2, + VirtualPath: "/" + folder2, + }, + { + BaseVirtualFolder: f3, + VirtualPath: "/" + folder3, + }, + } + group, _, err := httpdtest.AddGroup(g, http.StatusCreated) + assert.NoError(t, err) + group, _, err = httpdtest.GetGroupByName(group.Name, http.StatusOK) + assert.NoError(t, err) + if assert.Len(t, group.VirtualFolders, 3) { + assert.Equal(t, folder1, group.VirtualFolders[0].Name) + assert.Equal(t, folder2, group.VirtualFolders[1].Name) + assert.Equal(t, folder3, group.VirtualFolders[2].Name) + } + group, _, err = httpdtest.GetGroupByName(group.Name, http.StatusOK) + assert.NoError(t, err) + group.VirtualFolders = []vfs.VirtualFolder{ + { + BaseVirtualFolder: f3, + VirtualPath: "/" + folder3, + }, + { + BaseVirtualFolder: f1, + VirtualPath: "/" + folder1, + }, + { + BaseVirtualFolder: f2, + VirtualPath: "/" + folder2, + }, + } + group, _, err = httpdtest.UpdateGroup(group, http.StatusOK) + assert.NoError(t, err) + group, _, err = httpdtest.GetGroupByName(group.Name, http.StatusOK) + assert.NoError(t, err) + if assert.Len(t, group.VirtualFolders, 3) { + assert.Equal(t, folder3, group.VirtualFolders[0].Name) + assert.Equal(t, folder1, group.VirtualFolders[1].Name) + assert.Equal(t, folder2, group.VirtualFolders[2].Name) + } + + _, err = httpdtest.RemoveUser(user, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveGroup(group, http.StatusOK) + assert.NoError(t, err) + + _, err = httpdtest.RemoveFolder(f1, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveFolder(f2, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveFolder(f3, http.StatusOK) + assert.NoError(t, err) +} + +func TestSortRelatedGroups(t *testing.T) { + name1 := util.GenerateUniqueID() + name2 := util.GenerateUniqueID() + name3 := util.GenerateUniqueID() + + g1 := getTestGroup() + g1.Name = name1 + g2 := getTestGroup() + g2.Name = name2 + g3 := getTestGroup() + g3.Name = name3 + + group1, _, err := httpdtest.AddGroup(g1, http.StatusCreated) + assert.NoError(t, err) + group2, _, err := httpdtest.AddGroup(g2, http.StatusCreated) + assert.NoError(t, err) + group3, _, err := httpdtest.AddGroup(g3, http.StatusCreated) + assert.NoError(t, err) + + u := getTestUser() + u.Groups = []sdk.GroupMapping{ + { + Name: name1, + }, + } + _, _, err = httpdtest.AddUser(u, http.StatusBadRequest) + assert.NoError(t, err) + u.Groups = []sdk.GroupMapping{ + { + Name: name1, + Type: sdk.GroupTypePrimary, + }, + { + Name: name2, + Type: sdk.GroupTypeSecondary, + }, + { + Name: name3, + Type: sdk.GroupTypeMembership, + }, + } + user, _, err := httpdtest.AddUser(u, http.StatusCreated) + assert.NoError(t, err) + user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) + assert.NoError(t, err) + if assert.Len(t, user.Groups, 3) { + assert.Equal(t, name1, user.Groups[0].Name) + assert.Equal(t, name2, user.Groups[1].Name) + assert.Equal(t, name3, user.Groups[2].Name) + } + user.Groups = []sdk.GroupMapping{ + { + Name: name2, + Type: sdk.GroupTypeSecondary, + }, + { + Name: name3, + Type: sdk.GroupTypeMembership, + }, + { + Name: name1, + Type: sdk.GroupTypePrimary, + }, + } + user, _, err = httpdtest.UpdateUser(user, http.StatusOK, "") + assert.NoError(t, err) + user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) + assert.NoError(t, err) + if assert.Len(t, user.Groups, 3) { + assert.Equal(t, name2, user.Groups[0].Name) + assert.Equal(t, name3, user.Groups[1].Name) + assert.Equal(t, name1, user.Groups[2].Name) + } + + a := getTestAdmin() + a.Username = altAdminUsername + a.Groups = []dataprovider.AdminGroupMapping{ + { + Name: name3, + Options: dataprovider.AdminGroupMappingOptions{ + AddToUsersAs: dataprovider.GroupAddToUsersAsSecondary, + }, + }, + { + Name: name2, + Options: dataprovider.AdminGroupMappingOptions{ + AddToUsersAs: dataprovider.GroupAddToUsersAsPrimary, + }, + }, + { + Name: name1, + Options: dataprovider.AdminGroupMappingOptions{ + AddToUsersAs: dataprovider.GroupAddToUsersAsMembership, + }, + }, + } + admin, _, err := httpdtest.AddAdmin(a, http.StatusCreated) + assert.NoError(t, err) + admin, _, err = httpdtest.GetAdminByUsername(admin.Username, http.StatusOK) + assert.NoError(t, err) + if assert.Len(t, admin.Groups, 3) { + assert.Equal(t, name3, admin.Groups[0].Name) + assert.Equal(t, name2, admin.Groups[1].Name) + assert.Equal(t, name1, admin.Groups[2].Name) + } + admin.Groups = []dataprovider.AdminGroupMapping{ + { + Name: name1, + Options: dataprovider.AdminGroupMappingOptions{ + AddToUsersAs: dataprovider.GroupAddToUsersAsPrimary, + }, + }, + { + Name: name3, + Options: dataprovider.AdminGroupMappingOptions{ + AddToUsersAs: dataprovider.GroupAddToUsersAsMembership, + }, + }, + { + Name: name2, + Options: dataprovider.AdminGroupMappingOptions{ + AddToUsersAs: dataprovider.GroupAddToUsersAsSecondary, + }, + }, + } + admin, _, err = httpdtest.UpdateAdmin(admin, http.StatusOK) + assert.NoError(t, err) + admin, _, err = httpdtest.GetAdminByUsername(admin.Username, http.StatusOK) + assert.NoError(t, err) + if assert.Len(t, admin.Groups, 3) { + assert.Equal(t, name1, admin.Groups[0].Name) + assert.Equal(t, name3, admin.Groups[1].Name) + assert.Equal(t, name2, admin.Groups[2].Name) + } + + _, err = httpdtest.RemoveUser(user, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveAdmin(admin, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveGroup(group1, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveGroup(group2, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveGroup(group3, http.StatusOK) + assert.NoError(t, err) +} + func TestBasicGroupHandling(t *testing.T) { g := getTestGroup() g.UserSettings.Filters.TLSCerts = []string{"invalid cert"} // ignored for groups @@ -1337,25 +1651,25 @@ func TestGroupSettingsOverride(t *testing.T) { var folderNames []string if assert.Len(t, user.VirtualFolders, 4) { for _, f := range user.VirtualFolders { - if !util.Contains(folderNames, f.Name) { + if !slices.Contains(folderNames, f.Name) { folderNames = append(folderNames, f.Name) } switch f.Name { case folderName1: assert.Equal(t, mappedPath1, f.MappedPath) - assert.Equal(t, 3, f.BaseVirtualFolder.FsConfig.OSConfig.ReadBufferSize) - assert.Equal(t, 5, f.BaseVirtualFolder.FsConfig.OSConfig.WriteBufferSize) - assert.True(t, util.Contains([]string{"/vdir1", "/vdir2"}, f.VirtualPath)) + assert.Equal(t, 3, f.FsConfig.OSConfig.ReadBufferSize) + assert.Equal(t, 5, f.FsConfig.OSConfig.WriteBufferSize) + assert.True(t, slices.Contains([]string{"/vdir1", "/vdir2"}, f.VirtualPath)) case folderName2: assert.Equal(t, mappedPath2, f.MappedPath) assert.Equal(t, "/vdir3", f.VirtualPath) - assert.Equal(t, 0, f.BaseVirtualFolder.FsConfig.OSConfig.ReadBufferSize) - assert.Equal(t, 0, f.BaseVirtualFolder.FsConfig.OSConfig.WriteBufferSize) + assert.Equal(t, 0, f.FsConfig.OSConfig.ReadBufferSize) + assert.Equal(t, 0, f.FsConfig.OSConfig.WriteBufferSize) case folderName3: assert.Equal(t, mappedPath3, f.MappedPath) assert.Equal(t, "/vdir4", f.VirtualPath) - assert.Equal(t, 1, f.BaseVirtualFolder.FsConfig.OSConfig.ReadBufferSize) - assert.Equal(t, 2, f.BaseVirtualFolder.FsConfig.OSConfig.WriteBufferSize) + assert.Equal(t, 1, f.FsConfig.OSConfig.ReadBufferSize) + assert.Equal(t, 2, f.FsConfig.OSConfig.WriteBufferSize) } } } @@ -1475,6 +1789,19 @@ func TestGroupSettingsOverride(t *testing.T) { assert.Contains(t, user.Filters.WebClient, sdk.WebClientInfoChangeDisabled) assert.Contains(t, user.Filters.WebClient, sdk.WebClientMFADisabled) } + // Attempt to create a user with a weak password and group1 as the primary group: this should fail + u = getTestUser() + u.Username = rand.Text() + u.Password = defaultPassword + u.Groups = []sdk.GroupMapping{ + { + Name: group1.Name, + Type: sdk.GroupTypePrimary, + }, + } + _, resp, err = httpdtest.AddUser(u, http.StatusBadRequest) + assert.NoError(t, err) + assert.Contains(t, string(resp), "insecure password") err = os.RemoveAll(user.GetHomeDir()) assert.NoError(t, err) @@ -1766,7 +2093,7 @@ func TestIPListEntriesValidation(t *testing.T) { } func TestBasicActionRulesHandling(t *testing.T) { - actionName := "test action" + actionName := "test_action" a := dataprovider.BaseEventAction{ Name: actionName, Description: "test description", @@ -1826,6 +2153,10 @@ func TestBasicActionRulesHandling(t *testing.T) { }, }, } + dataprovider.EnabledActionCommands = []string{a.Options.CmdConfig.Cmd} + defer func() { + dataprovider.EnabledActionCommands = nil + }() _, _, err = httpdtest.UpdateEventAction(a, http.StatusOK) assert.NoError(t, err) // invalid type @@ -1838,9 +2169,9 @@ func TestBasicActionRulesHandling(t *testing.T) { EmailConfig: dataprovider.EventActionEmailConfig{ Recipients: []string{"email@example.com"}, Bcc: []string{"bcc@example.com"}, - Subject: "Event: {{Event}}", + Subject: "Event: {{.Event}}", Body: "test mail body", - Attachments: []string{"/{{VirtualPath}}"}, + Attachments: []string{"/{{.VirtualPath}}"}, }, } @@ -1878,7 +2209,7 @@ func TestBasicActionRulesHandling(t *testing.T) { Value: "b", }, }, - Body: `{"event":"{{Event}}","name":"{{Name}}"}`, + Body: `{"event":"{{.Event}}","name":"{{.Name}}"}`, }, } action, _, err = httpdtest.UpdateEventAction(a, http.StatusOK) @@ -1902,14 +2233,15 @@ func TestBasicActionRulesHandling(t *testing.T) { assert.Equal(t, defaultPassword, dbAction.Options.HTTPConfig.Password.GetPayload()) r := dataprovider.EventRule{ - Name: "test rule name", + Name: "test_rule_name", Status: 1, Description: "", Trigger: dataprovider.EventTriggerFsEvent, Conditions: dataprovider.EventConditions{ FsEvents: []string{"upload"}, Options: dataprovider.ConditionOptions{ - MinFileSize: 1024 * 1024, + EventStatuses: []int{2, 3}, + MinFileSize: 1024 * 1024, }, }, Actions: []dataprovider.EventAction{ @@ -2100,16 +2432,16 @@ func TestActionRuleRelations(t *testing.T) { action1, _, err = httpdtest.GetEventActionByName(action1.Name, http.StatusOK) assert.NoError(t, err) assert.Len(t, action1.Rules, 1) - assert.True(t, util.Contains(action1.Rules, rule1.Name)) + assert.True(t, slices.Contains(action1.Rules, rule1.Name)) action2, _, err = httpdtest.GetEventActionByName(action2.Name, http.StatusOK) assert.NoError(t, err) assert.Len(t, action2.Rules, 1) - assert.True(t, util.Contains(action2.Rules, rule2.Name)) + assert.True(t, slices.Contains(action2.Rules, rule2.Name)) action3, _, err = httpdtest.GetEventActionByName(action3.Name, http.StatusOK) assert.NoError(t, err) assert.Len(t, action3.Rules, 2) - assert.True(t, util.Contains(action3.Rules, rule1.Name)) - assert.True(t, util.Contains(action3.Rules, rule2.Name)) + assert.True(t, slices.Contains(action3.Rules, rule1.Name)) + assert.True(t, slices.Contains(action3.Rules, rule2.Name)) // referenced actions cannot be removed _, err = httpdtest.RemoveEventAction(action1, http.StatusBadRequest) assert.NoError(t, err) @@ -2137,7 +2469,7 @@ func TestActionRuleRelations(t *testing.T) { action3, _, err = httpdtest.GetEventActionByName(action3.Name, http.StatusOK) assert.NoError(t, err) assert.Len(t, action3.Rules, 1) - assert.True(t, util.Contains(action3.Rules, rule1.Name)) + assert.True(t, slices.Contains(action3.Rules, rule1.Name)) _, err = httpdtest.RemoveEventRule(rule1, http.StatusOK) assert.NoError(t, err) @@ -2163,7 +2495,7 @@ func TestActionRuleRelations(t *testing.T) { } func TestOnDemandEventRules(t *testing.T) { - ruleName := "test on demand rule" + ruleName := "test_on_demand_rule" a := dataprovider.BaseEventAction{ Name: "a", Type: dataprovider.ActionTypeBackup, @@ -2204,7 +2536,7 @@ func TestOnDemandEventRules(t *testing.T) { } func TestIDPLoginEventRule(t *testing.T) { - ruleName := "test IDP login rule" + ruleName := "test_IDP_login_rule" a := dataprovider.BaseEventAction{ Name: "a", Type: dataprovider.ActionTypeIDPAccountCheck, @@ -2359,13 +2691,24 @@ func TestEventActionValidation(t *testing.T) { assert.NoError(t, err) assert.Contains(t, string(resp), "command is required") action.Options.CmdConfig.Cmd = "relative" + dataprovider.EnabledActionCommands = []string{action.Options.CmdConfig.Cmd} + defer func() { + dataprovider.EnabledActionCommands = nil + }() + _, resp, err = httpdtest.AddEventAction(action, http.StatusBadRequest) assert.NoError(t, err) assert.Contains(t, string(resp), "invalid command, it must be an absolute path") action.Options.CmdConfig.Cmd = filepath.Join(os.TempDir(), "cmd") _, resp, err = httpdtest.AddEventAction(action, http.StatusBadRequest) assert.NoError(t, err) + assert.Contains(t, string(resp), "is not allowed") + + dataprovider.EnabledActionCommands = []string{action.Options.CmdConfig.Cmd} + _, resp, err = httpdtest.AddEventAction(action, http.StatusBadRequest) + assert.NoError(t, err) assert.Contains(t, string(resp), "invalid command action timeout") + action.Options.CmdConfig.Timeout = 30 action.Options.CmdConfig.EnvVars = []dataprovider.KeyValue{ { @@ -2380,6 +2723,17 @@ func TestEventActionValidation(t *testing.T) { _, resp, err = httpdtest.AddEventAction(action, http.StatusBadRequest) assert.NoError(t, err) assert.Contains(t, string(resp), "invalid command args") + action.Options.CmdConfig.Args = nil + // restrict commands + if runtime.GOOS == osWindows { + dataprovider.EnabledActionCommands = []string{"C:\\cmd.exe"} + } else { + dataprovider.EnabledActionCommands = []string{"/bin/sh"} + } + _, resp, err = httpdtest.AddEventAction(action, http.StatusBadRequest) + assert.NoError(t, err) + assert.Contains(t, string(resp), "is not allowed") + dataprovider.EnabledActionCommands = nil action.Type = dataprovider.ActionTypeEmail _, resp, err = httpdtest.AddEventAction(action, http.StatusBadRequest) @@ -2454,28 +2808,34 @@ func TestEventActionValidation(t *testing.T) { _, resp, err = httpdtest.AddEventAction(action, http.StatusBadRequest) assert.NoError(t, err) assert.Contains(t, string(resp), "no path to rename specified") - action.Options.FsConfig.Renames = []dataprovider.KeyValue{ + action.Options.FsConfig.Renames = []dataprovider.RenameConfig{ { - Key: "", - Value: "/adir", + KeyValue: dataprovider.KeyValue{ + Key: "", + Value: "/adir", + }, }, } _, resp, err = httpdtest.AddEventAction(action, http.StatusBadRequest) assert.NoError(t, err) assert.Contains(t, string(resp), "invalid paths to rename") - action.Options.FsConfig.Renames = []dataprovider.KeyValue{ + action.Options.FsConfig.Renames = []dataprovider.RenameConfig{ { - Key: "adir", - Value: "/adir", + KeyValue: dataprovider.KeyValue{ + Key: "adir", + Value: "/adir", + }, }, } _, resp, err = httpdtest.AddEventAction(action, http.StatusBadRequest) assert.NoError(t, err) assert.Contains(t, string(resp), "rename source and target cannot be equal") - action.Options.FsConfig.Renames = []dataprovider.KeyValue{ + action.Options.FsConfig.Renames = []dataprovider.RenameConfig{ { - Key: "/", - Value: "/dir", + KeyValue: dataprovider.KeyValue{ + Key: "/", + Value: "/dir", + }, }, } _, resp, err = httpdtest.AddEventAction(action, http.StatusBadRequest) @@ -2697,6 +3057,21 @@ func TestEventRuleValidation(t *testing.T) { _, resp, err = httpdtest.AddEventRule(rule, http.StatusBadRequest) assert.NoError(t, err) assert.Contains(t, string(resp), "sync execution is only supported for upload and pre-* events") + + rule.Conditions.FsEvents = []string{"download"} + rule.Conditions.Options.EventStatuses = []int{3, 2, 8} + rule.Actions = []dataprovider.EventAction{ + { + BaseEventAction: dataprovider.BaseEventAction{ + Name: "action", + }, + Order: 1, + }, + } + _, resp, err = httpdtest.AddEventRule(rule, http.StatusBadRequest) + assert.NoError(t, err) + assert.Contains(t, string(resp), "invalid event_status") + rule.Trigger = dataprovider.EventTriggerProviderEvent rule.Actions = []dataprovider.EventAction{ { @@ -3289,32 +3664,44 @@ func TestLoginRedirectNext(t *testing.T) { checkResponseCode(t, http.StatusOK, rr) assert.Contains(t, rr.Body.String(), fmt.Sprintf("action=%q", redirectURI)) // now login the user and check the redirect - csrfToken, err := getCSRFTokenMock(webClientLoginPath, defaultRemoteAddr) + loginCookie, csrfToken, err := getCSRFTokenMock(webClientLoginPath, defaultRemoteAddr) assert.NoError(t, err) + assert.NotEmpty(t, loginCookie) form := getLoginForm(defaultUsername, defaultPassword, csrfToken) req, err = http.NewRequest(http.MethodPost, redirectURI, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr req.RequestURI = redirectURI + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) checkResponseCode(t, http.StatusFound, rr) assert.Equal(t, uri, rr.Header().Get("Location")) // unsafe URI + loginCookie, csrfToken, err = getCSRFTokenMock(webClientLoginPath, defaultRemoteAddr) + assert.NoError(t, err) + assert.NotEmpty(t, loginCookie) + form = getLoginForm(defaultUsername, defaultPassword, csrfToken) unsafeURI := webClientLoginPath + "?next=" + url.QueryEscape("http://example.net") req, err = http.NewRequest(http.MethodPost, unsafeURI, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr req.RequestURI = unsafeURI + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) checkResponseCode(t, http.StatusFound, rr) assert.Equal(t, webClientFilesPath, rr.Header().Get("Location")) + loginCookie, csrfToken, err = getCSRFTokenMock(webClientLoginPath, defaultRemoteAddr) + assert.NoError(t, err) + assert.NotEmpty(t, loginCookie) + form = getLoginForm(defaultUsername, defaultPassword, csrfToken) unsupportedURI := webClientLoginPath + "?next=" + url.QueryEscape(webClientProfilePath) req, err = http.NewRequest(http.MethodPost, unsupportedURI, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr req.RequestURI = unsupportedURI + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) checkResponseCode(t, http.StatusFound, rr) @@ -3397,7 +3784,7 @@ func TestMustChangePasswordRequirement(t *testing.T) { rr = executeRequest(req) checkResponseCode(t, http.StatusForbidden, rr) - csrfToken, err := getCSRFToken(httpBaseURL + webClientLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webChangeClientPwdPath, webToken) assert.NoError(t, err) form := make(url.Values) form.Set(csrfFormToken, csrfToken) @@ -3682,9 +4069,10 @@ func TestAdminMustChangePasswordRequirement(t *testing.T) { setJWTCookieForReq(req, webToken) rr := executeRequest(req) checkResponseCode(t, http.StatusForbidden, rr) - - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + // The change password page should be accessible, we get the CSRF from it. + csrfToken, err := getCSRFTokenFromInternalPageMock(webChangeAdminPwdPath, webToken) assert.NoError(t, err) + form := make(url.Values) form.Set(csrfFormToken, csrfToken) form.Set("current_password", defaultTokenAuthPass) @@ -4804,9 +5192,6 @@ func TestAddUserInvalidFsConfig(t *testing.T) { u.FsConfig.AzBlobConfig.AccountName = "name" _, _, err = httpdtest.AddUser(u, http.StatusBadRequest) assert.NoError(t, err) - u.FsConfig.AzBlobConfig.Container = "container" - _, _, err = httpdtest.AddUser(u, http.StatusBadRequest) - assert.NoError(t, err) u.FsConfig.AzBlobConfig.AccountKey = kms.NewSecret(sdkkms.SecretStatusRedacted, "key", "", "") u.FsConfig.AzBlobConfig.KeyPrefix = "/amedir/subdir/" _, _, err = httpdtest.AddUser(u, http.StatusBadRequest) @@ -4910,6 +5295,12 @@ func TestUserRedactedPassword(t *testing.T) { assert.Contains(t, err.Error(), "cannot save a user with a redacted secret") } u.FsConfig.S3Config.AccessSecret = kms.NewPlainSecret("secret") + u.FsConfig.S3Config.SSECustomerKey = kms.NewSecret(sdkkms.SecretStatusRedacted, "mysecretkey", "", "") + _, resp, err = httpdtest.AddUser(u, http.StatusBadRequest) + assert.NoError(t, err, string(resp)) + assert.Contains(t, string(resp), "cannot save a user with a redacted secret") + + u.FsConfig.S3Config.SSECustomerKey = kms.NewPlainSecret("key") user, _, err := httpdtest.AddUser(u, http.StatusCreated) assert.NoError(t, err) @@ -4958,6 +5349,13 @@ func TestRetentionAPI(t *testing.T) { user, _, err := httpdtest.AddUser(getTestUser(), http.StatusCreated) assert.NoError(t, err) + t.Cleanup(func() { + _, err = httpdtest.RemoveUser(user, http.StatusOK) + assert.NoError(t, err) + err = os.RemoveAll(user.GetHomeDir()) + assert.NoError(t, err) + }) + checks, _, err := httpdtest.GetRetentionChecks(http.StatusOK) assert.NoError(t, err) assert.Len(t, checks, 0) @@ -4971,21 +5369,19 @@ func TestRetentionAPI(t *testing.T) { folderRetention := []dataprovider.FolderRetention{ { Path: "/", - Retention: 0, + Retention: 24, DeleteEmptyDirs: true, }, } - _, err = httpdtest.StartRetentionCheck(altAdminUsername, folderRetention, http.StatusNotFound) - assert.NoError(t, err) + check := common.RetentionCheck{ + Folders: folderRetention, + } + c := common.RetentionChecks.Add(check, &user) + require.NotNil(t, c) - resp, err := httpdtest.StartRetentionCheck(user.Username, folderRetention, http.StatusBadRequest) - assert.NoError(t, err) - assert.Contains(t, string(resp), "Invalid retention check") - - folderRetention[0].Retention = 24 - _, err = httpdtest.StartRetentionCheck(user.Username, folderRetention, http.StatusAccepted) - assert.NoError(t, err) + err = c.Start() + require.NoError(t, err) assert.Eventually(t, func() bool { return len(common.RetentionChecks.Get("")) == 0 @@ -4996,8 +5392,8 @@ func TestRetentionAPI(t *testing.T) { err = os.Chtimes(localFilePath, time.Now().Add(-48*time.Hour), time.Now().Add(-48*time.Hour)) assert.NoError(t, err) - _, err = httpdtest.StartRetentionCheck(user.Username, folderRetention, http.StatusAccepted) - assert.NoError(t, err) + err = c.Start() + require.NoError(t, err) assert.Eventually(t, func() bool { return len(common.RetentionChecks.Get("")) == 0 @@ -5006,54 +5402,25 @@ func TestRetentionAPI(t *testing.T) { assert.NoFileExists(t, localFilePath) assert.NoDirExists(t, filepath.Dir(localFilePath)) - check := common.RetentionCheck{ - Folders: folderRetention, - } - c := common.RetentionChecks.Add(check, &user) + c = common.RetentionChecks.Add(check, &user) assert.NotNil(t, c) - _, err = httpdtest.StartRetentionCheck(user.Username, folderRetention, http.StatusConflict) + assert.Nil(t, common.RetentionChecks.Add(check, &user)) // a check for this user is already in progress + + checks, _, err = httpdtest.GetRetentionChecks(http.StatusOK) assert.NoError(t, err) + assert.Len(t, checks, 1) err = c.Start() assert.NoError(t, err) - assert.Len(t, common.RetentionChecks.Get(""), 0) - admin := getTestAdmin() - admin.Username = altAdminUsername - admin.Password = altAdminPassword - admin, _, err = httpdtest.AddAdmin(admin, http.StatusCreated) - assert.NoError(t, err) + assert.Eventually(t, func() bool { + return len(common.RetentionChecks.Get("")) == 0 + }, 1000*time.Millisecond, 50*time.Millisecond) - token, err := getJWTAPITokenFromTestServer(altAdminUsername, altAdminPassword) - assert.NoError(t, err) - req, _ := http.NewRequest(http.MethodPost, retentionBasePath+"/"+user.Username+"/check", - bytes.NewBuffer([]byte("invalid json"))) - setBearerForReq(req, token) - rr := executeRequest(req) - checkResponseCode(t, http.StatusBadRequest, rr) - - asJSON, err := json.Marshal(folderRetention) - assert.NoError(t, err) - req, _ = http.NewRequest(http.MethodPost, retentionBasePath+"/"+user.Username+"/check?notifications=Email,", - bytes.NewBuffer(asJSON)) - setBearerForReq(req, token) - rr = executeRequest(req) - checkResponseCode(t, http.StatusBadRequest, rr) - assert.Contains(t, rr.Body.String(), "to notify results via email") - - _, err = httpdtest.RemoveAdmin(admin, http.StatusOK) - assert.NoError(t, err) - req, _ = http.NewRequest(http.MethodPost, retentionBasePath+"/"+user.Username+"/check?notifications=Email", - bytes.NewBuffer(asJSON)) - setBearerForReq(req, token) - rr = executeRequest(req) - checkResponseCode(t, http.StatusNotFound, rr) - - _, err = httpdtest.RemoveUser(user, http.StatusOK) - assert.NoError(t, err) - err = os.RemoveAll(user.GetHomeDir()) + checks, _, err = httpdtest.GetRetentionChecks(http.StatusOK) assert.NoError(t, err) + assert.Len(t, checks, 0) } func TestAddUserInvalidVirtualFolders(t *testing.T) { @@ -5183,6 +5550,13 @@ func TestUserPublicKey(t *testing.T) { _, err = httpdtest.RemoveUser(user, http.StatusOK) assert.NoError(t, err) + // DSA keys are not accepted + u = getTestUser() + u.Password = "" + u.PublicKeys = []string{"ssh-dss AAAAB3NzaC1kc3MAAACBAK+BKLZs1Vd0cWYOquKfp++0ml9hkzB7UDRozT3nhRcyHcuwASsXiVTqsg96oGjBcUUy076CXlsfJEXE2P0dF6tt1wvABPMwKpOn+kIrfJ0j93X2c2KIZNlD4YuNUJjLHu1DvgQHw8NMps6l5D0M5NFCRdD3NYhI5zFVJJ4CzikrAAAAFQCRBagw7gEbs0gd8So7OLMcSVzs/wAAAIBjuo7U9q8npchQ3otgCvj0xIwsQ+Fi9bH0SBceqbCcVzFYY6JXSQ0XmwHs+0AuvRCPIGaBdfcm+w+9YOxREtdEVjcmkYlfJpTaVljjWcWFWTQddbiamZhQ/xLU9CNLK4oYLwIGLZjCcG7nRDdLtLQdBFuzP/faEi3TD2BK114QmAAAAIEAj1n34pH2WKwbSZhzmz/OG0VzqJICFWboiM44LZl2AqcRBvEEycdHlGe2IKaj5lEtLgBKJt9NSFhBIzWh7gcEzSMlkiDecdYSFlDc4snmTiXaoiIehV59nTY6gc8GLWCzuem+WdHxvJ4yOSWF9k+a+Y+/v/35shNLkfokViOlN7k="} + _, resp, err := httpdtest.AddUser(u, http.StatusBadRequest) + assert.NoError(t, err) + assert.Contains(t, string(resp), "DSA key format is insecure and it is not allowed") } func TestUpdateUserEmptyPassword(t *testing.T) { @@ -5629,6 +6003,7 @@ func TestUserS3Config(t *testing.T) { user.FsConfig.S3Config.Bucket = "test" //nolint:goconst user.FsConfig.S3Config.AccessKey = "Server-Access-Key" user.FsConfig.S3Config.AccessSecret = kms.NewPlainSecret("Server-Access-Secret") + user.FsConfig.S3Config.SSECustomerKey = kms.NewPlainSecret("SSE-encryption-key") user.FsConfig.S3Config.RoleARN = "myRoleARN" user.FsConfig.S3Config.Endpoint = "http://127.0.0.1:9000" user.FsConfig.S3Config.UploadPartSize = 8 @@ -5662,6 +6037,10 @@ func TestUserS3Config(t *testing.T) { assert.NotEmpty(t, user.FsConfig.S3Config.AccessSecret.GetPayload()) assert.Empty(t, user.FsConfig.S3Config.AccessSecret.GetAdditionalData()) assert.Empty(t, user.FsConfig.S3Config.AccessSecret.GetKey()) + assert.Equal(t, sdkkms.SecretStatusSecretBox, user.FsConfig.S3Config.SSECustomerKey.GetStatus()) + assert.NotEmpty(t, user.FsConfig.S3Config.SSECustomerKey.GetPayload()) + assert.Empty(t, user.FsConfig.S3Config.SSECustomerKey.GetAdditionalData()) + assert.Empty(t, user.FsConfig.S3Config.SSECustomerKey.GetKey()) assert.Equal(t, 60, user.FsConfig.S3Config.DownloadPartMaxTime) assert.Equal(t, 40, user.FsConfig.S3Config.UploadPartMaxTime) assert.True(t, user.FsConfig.S3Config.SkipTLSVerify) @@ -5686,13 +6065,14 @@ func TestUserS3Config(t *testing.T) { user.ID = 0 user.CreatedAt = 0 user.VirtualFolders = nil + user.FsConfig.S3Config.SSECustomerKey = kms.NewEmptySecret() secret := kms.NewSecret(sdkkms.SecretStatusSecretBox, "Server-Access-Secret", "", "") user.FsConfig.S3Config.AccessSecret = secret _, _, err = httpdtest.AddUser(user, http.StatusCreated) assert.Error(t, err) user.FsConfig.S3Config.AccessSecret.SetStatus(sdkkms.SecretStatusPlain) - user, _, err = httpdtest.AddUser(user, http.StatusCreated) - assert.NoError(t, err) + user, resp, err := httpdtest.AddUser(user, http.StatusCreated) + assert.NoError(t, err, string(resp)) initialSecretPayload := user.FsConfig.S3Config.AccessSecret.GetPayload() assert.Equal(t, sdkkms.SecretStatusSecretBox, user.FsConfig.S3Config.AccessSecret.GetStatus()) assert.NotEmpty(t, initialSecretPayload) @@ -6069,6 +6449,7 @@ func TestUserHiddenFields(t *testing.T) { u1.FsConfig.S3Config.Region = "us-east-1" u1.FsConfig.S3Config.AccessKey = "S3-Access-Key" u1.FsConfig.S3Config.AccessSecret = kms.NewPlainSecret("S3-Access-Secret") + u1.FsConfig.S3Config.SSECustomerKey = kms.NewPlainSecret("SSE-secret-key") user1, _, err := httpdtest.AddUser(u1, http.StatusCreated) assert.NoError(t, err) @@ -6141,6 +6522,10 @@ func TestUserHiddenFields(t *testing.T) { assert.Empty(t, user1.FsConfig.S3Config.AccessSecret.GetAdditionalData()) assert.NotEmpty(t, user1.FsConfig.S3Config.AccessSecret.GetStatus()) assert.NotEmpty(t, user1.FsConfig.S3Config.AccessSecret.GetPayload()) + assert.Empty(t, user1.FsConfig.S3Config.SSECustomerKey.GetKey()) + assert.Empty(t, user1.FsConfig.S3Config.SSECustomerKey.GetAdditionalData()) + assert.NotEmpty(t, user1.FsConfig.S3Config.SSECustomerKey.GetStatus()) + assert.NotEmpty(t, user1.FsConfig.S3Config.SSECustomerKey.GetPayload()) user2, _, err = httpdtest.GetUserByUsername(user2.Username, http.StatusOK) assert.NoError(t, err) @@ -6195,12 +6580,22 @@ func TestUserHiddenFields(t *testing.T) { assert.NotEmpty(t, user1.FsConfig.S3Config.AccessSecret.GetAdditionalData()) assert.NotEmpty(t, user1.FsConfig.S3Config.AccessSecret.GetStatus()) assert.NotEmpty(t, user1.FsConfig.S3Config.AccessSecret.GetPayload()) + assert.NotEmpty(t, user1.FsConfig.S3Config.SSECustomerKey.GetKey()) + assert.NotEmpty(t, user1.FsConfig.S3Config.SSECustomerKey.GetAdditionalData()) + assert.NotEmpty(t, user1.FsConfig.S3Config.SSECustomerKey.GetStatus()) + assert.NotEmpty(t, user1.FsConfig.S3Config.SSECustomerKey.GetPayload()) err = user1.FsConfig.S3Config.AccessSecret.Decrypt() assert.NoError(t, err) + err = user1.FsConfig.S3Config.SSECustomerKey.Decrypt() + assert.NoError(t, err) assert.Equal(t, sdkkms.SecretStatusPlain, user1.FsConfig.S3Config.AccessSecret.GetStatus()) assert.Equal(t, u1.FsConfig.S3Config.AccessSecret.GetPayload(), user1.FsConfig.S3Config.AccessSecret.GetPayload()) assert.Empty(t, user1.FsConfig.S3Config.AccessSecret.GetKey()) assert.Empty(t, user1.FsConfig.S3Config.AccessSecret.GetAdditionalData()) + assert.Equal(t, sdkkms.SecretStatusPlain, user1.FsConfig.S3Config.SSECustomerKey.GetStatus()) + assert.Equal(t, u1.FsConfig.S3Config.SSECustomerKey.GetPayload(), user1.FsConfig.S3Config.SSECustomerKey.GetPayload()) + assert.Empty(t, user1.FsConfig.S3Config.SSECustomerKey.GetKey()) + assert.Empty(t, user1.FsConfig.S3Config.SSECustomerKey.GetAdditionalData()) user2, err = dataprovider.UserExists(user2.Username, "") assert.NoError(t, err) @@ -6637,6 +7032,7 @@ func TestCloseActiveConnection(t *testing.T) { _, err = httpdtest.CloseConnection(c.GetID(), http.StatusOK) assert.NoError(t, err) assert.Len(t, common.Connections.GetStats(""), 0) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func TestCloseConnectionAfterUserUpdateDelete(t *testing.T) { @@ -6669,6 +7065,7 @@ func TestCloseConnectionAfterUserUpdateDelete(t *testing.T) { _, err = httpdtest.RemoveUser(user, http.StatusOK) assert.NoError(t, err) assert.Len(t, common.Connections.GetStats(""), 0) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func TestAdminGenerateRecoveryCodesSaveError(t *testing.T) { @@ -6727,6 +7124,57 @@ func TestAdminGenerateRecoveryCodesSaveError(t *testing.T) { assert.NoError(t, err) } +func TestAdminCredentialsWithSpaces(t *testing.T) { + a := getTestAdmin() + a.Username = xid.New().String() + a.Password = " " + xid.New().String() + " " + admin, _, err := httpdtest.AddAdmin(a, http.StatusCreated) + assert.NoError(t, err) + // For admins the password is always trimmed. + _, err = getJWTAPITokenFromTestServer(a.Username, a.Password) + assert.Error(t, err) + _, err = getJWTAPITokenFromTestServer(a.Username, strings.TrimSpace(a.Password)) + assert.NoError(t, err) + // The password sent from the WebAdmin UI is automatically trimmed + _, err = getJWTWebToken(a.Username, a.Password) + assert.NoError(t, err) + _, err = getJWTWebToken(a.Username, strings.TrimSpace(a.Password)) + assert.NoError(t, err) + + _, err = httpdtest.RemoveAdmin(admin, http.StatusOK) + assert.NoError(t, err) +} + +func TestUserCredentialsWithSpaces(t *testing.T) { + u := getTestUser() + u.Password = " " + xid.New().String() + " " + user, _, err := httpdtest.AddUser(u, http.StatusCreated) + assert.NoError(t, err) + // For users the password is not trimmed + _, err = getJWTAPIUserTokenFromTestServer(u.Username, u.Password) + assert.NoError(t, err) + _, err = getJWTAPIUserTokenFromTestServer(u.Username, strings.TrimSpace(u.Password)) + assert.Error(t, err) + + _, err = getJWTWebClientTokenFromTestServer(u.Username, u.Password) + assert.NoError(t, err) + _, err = getJWTWebClientTokenFromTestServer(u.Username, strings.TrimSpace(u.Password)) + assert.Error(t, err) + + user.Password = u.Password + conn, sftpClient, err := getSftpClient(user) + if assert.NoError(t, err) { + conn.Close() + sftpClient.Close() + } + user.Password = strings.TrimSpace(u.Password) + _, _, err = getSftpClient(user) + assert.Error(t, err) + + _, err = httpdtest.RemoveUser(user, http.StatusOK) + assert.NoError(t, err) +} + func TestNamingRules(t *testing.T) { smtpCfg := smtp.Config{ Host: "127.0.0.1", @@ -6822,10 +7270,10 @@ func TestNamingRules(t *testing.T) { return } - csrfToken, err := getCSRFToken(httpBaseURL + webClientLoginPath) - assert.NoError(t, err) token, err = getJWTWebClientTokenFromTestServer(user.Username, defaultPassword) assert.NoError(t, err) + csrfToken, err := getCSRFTokenFromInternalPageMock(webClientProfilePath, token) + assert.NoError(t, err) form := make(url.Values) form.Set(csrfFormToken, csrfToken) req, err := http.NewRequest(http.MethodPost, webClientProfilePath, bytes.NewBuffer([]byte(form.Encode()))) @@ -6836,6 +7284,8 @@ func TestNamingRules(t *testing.T) { checkResponseCode(t, http.StatusOK, rr) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidUser) // test user reset password. Setting the new password will fail because the username is not valid + loginCookie, csrfToken, err := getCSRFTokenMock(webClientLoginPath, defaultRemoteAddr) + assert.NoError(t, err) form = make(url.Values) form.Set("username", user.Username) form.Set(csrfFormToken, csrfToken) @@ -6843,6 +7293,7 @@ func TestNamingRules(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webClientForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) @@ -6855,6 +7306,7 @@ func TestNamingRules(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webClientResetPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusOK, rr.Code) @@ -6896,7 +7348,7 @@ func TestNamingRules(t *testing.T) { token, err = getJWTWebTokenFromTestServer(admin.Username, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err = getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err = getCSRFTokenFromInternalPageMock(webAdminProfilePath, token) assert.NoError(t, err) form = make(url.Values) form.Set(csrfFormToken, csrfToken) @@ -6927,6 +7379,8 @@ func TestNamingRules(t *testing.T) { checkResponseCode(t, http.StatusBadRequest, rr) assert.Contains(t, rr.Body.String(), "the following characters are allowed") // test admin reset password + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) + assert.NoError(t, err) form = make(url.Values) form.Set("username", admin.Username) form.Set(csrfFormToken, csrfToken) @@ -6934,10 +7388,13 @@ func TestNamingRules(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webAdminForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) assert.GreaterOrEqual(t, len(lastResetCode), 20) + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) + assert.NoError(t, err) form = make(url.Values) form.Set(csrfFormToken, csrfToken) form.Set("code", lastResetCode) @@ -6946,6 +7403,7 @@ func TestNamingRules(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webAdminResetPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusOK, rr.Code) @@ -7097,12 +7555,13 @@ func TestSaveErrors(t *testing.T) { assert.NoError(t, err) assert.Contains(t, string(resp), "the following characters are allowed") - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + loginCookie, csrfToken, err := getCSRFTokenMock(webLoginPath, defaultRemoteAddr) assert.NoError(t, err) form := getLoginForm(a.Username, a.Password, csrfToken) req, err := http.NewRequest(http.MethodPost, webLoginPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr := executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) @@ -7110,6 +7569,8 @@ func TestSaveErrors(t *testing.T) { cookie, err := getCookieFromResponse(rr) assert.NoError(t, err) + csrfToken, err = getCSRFTokenFromInternalPageMock(webAdminTwoFactorRecoveryPath, cookie) + assert.NoError(t, err) form = make(url.Values) form.Set("recovery_code", recCode) form.Set(csrfFormToken, csrfToken) @@ -7122,12 +7583,13 @@ func TestSaveErrors(t *testing.T) { assert.Equal(t, http.StatusInternalServerError, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nError500Message) - csrfToken, err = getCSRFToken(httpBaseURL + webClientLoginPath) + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) assert.NoError(t, err) form = getLoginForm(u.Username, u.Password, csrfToken) req, err = http.NewRequest(http.MethodPost, webClientLoginPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) @@ -7135,6 +7597,8 @@ func TestSaveErrors(t *testing.T) { cookie, err = getCookieFromResponse(rr) assert.NoError(t, err) + csrfToken, err = getCSRFTokenFromInternalPageMock(webClientTwoFactorRecoveryPath, cookie) + assert.NoError(t, err) form = make(url.Values) form.Set("recovery_code", recCode) form.Set(csrfFormToken, csrfToken) @@ -7277,7 +7741,7 @@ func TestProviderErrors(t *testing.T) { rr = executeRequest(req) checkResponseCode(t, http.StatusInternalServerError, rr) // password reset errors - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + loginCookie, csrfToken, err := getCSRFTokenMock(webLoginPath, defaultRemoteAddr) assert.NoError(t, err) form := make(url.Values) form.Set("username", "username") @@ -7285,6 +7749,7 @@ func TestProviderErrors(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webClientForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusOK, rr.Code) @@ -7411,7 +7876,7 @@ func TestProviderErrors(t *testing.T) { backupData = dataprovider.BackupData{ EventActions: []dataprovider.BaseEventAction{ { - Name: "quota reset", + Name: "quota_reset", Type: dataprovider.ActionTypeFolderQuotaReset, }, }, @@ -7426,7 +7891,7 @@ func TestProviderErrors(t *testing.T) { backupData = dataprovider.BackupData{ EventRules: []dataprovider.EventRule{ { - Name: "quota reset", + Name: "quota_reset", Trigger: dataprovider.EventTriggerSchedule, Conditions: dataprovider.EventConditions{ Schedules: []dataprovider.Schedule{ @@ -8220,7 +8685,7 @@ func TestLoaddata(t *testing.T) { } action := dataprovider.BaseEventAction{ ID: 81, - Name: "test restore action", + Name: "test_restore_action", Type: dataprovider.ActionTypeHTTP, Options: dataprovider.BaseEventActionOptions{ HTTPConfig: dataprovider.EventActionHTTPConfig{ @@ -8230,13 +8695,13 @@ func TestLoaddata(t *testing.T) { Timeout: 10, SkipTLSVerify: true, Method: http.MethodPost, - Body: `{"event":"{{Event}}","name":"{{Name}}"}`, + Body: `{"event":"{{.Event}}","name":"{{.Name}}"}`, }, }, } rule := dataprovider.EventRule{ ID: 100, - Name: "test rule restore", + Name: "test_rule_restore", Description: "", Trigger: dataprovider.EventTriggerFsEvent, Conditions: dataprovider.EventConditions{ @@ -8254,7 +8719,7 @@ func TestLoaddata(t *testing.T) { configs := dataprovider.Configs{ SFTPD: &dataprovider.SFTPDConfigs{ HostKeyAlgos: []string{ssh.KeyAlgoRSA, ssh.CertAlgoRSAv01}, - PublicKeyAlgos: []string{ssh.InsecureKeyAlgoDSA}, + PublicKeyAlgos: []string{ssh.InsecureKeyAlgoDSA}, //nolint:staticcheck }, SMTP: &dataprovider.SMTPConfigs{ Host: "mail.example.com", @@ -8321,7 +8786,7 @@ func TestLoaddata(t *testing.T) { assert.NoError(t, err) assert.Equal(t, configs.SMTP, configsGet.SMTP) assert.Equal(t, []string{ssh.KeyAlgoRSA}, configsGet.SFTPD.HostKeyAlgos) - assert.Equal(t, []string{ssh.InsecureKeyAlgoDSA}, configsGet.SFTPD.PublicKeyAlgos) + assert.Equal(t, []string{ssh.InsecureKeyAlgoDSA}, configsGet.SFTPD.PublicKeyAlgos) //nolint:staticcheck assert.Len(t, configsGet.SFTPD.KexAlgorithms, 0) assert.Len(t, configsGet.SFTPD.Ciphers, 0) assert.Len(t, configsGet.SFTPD.MACs, 0) @@ -8476,6 +8941,85 @@ func TestLoaddata(t *testing.T) { assert.NoError(t, err) } +func TestLoaddataConvertActions(t *testing.T) { + a1 := dataprovider.BaseEventAction{ + Name: xid.New().String(), + Type: dataprovider.ActionTypeEmail, + Options: dataprovider.BaseEventActionOptions{ + EmailConfig: dataprovider.EventActionEmailConfig{ + Recipients: []string{"failure@example.com"}, + Subject: `Failed "{{Event}}" from "{{Name}}"`, + Body: "Object name: {{ObjectName}} object type: {{ObjectType}}, IP: {{IP}}", + }, + }, + } + a2 := dataprovider.BaseEventAction{ + Name: xid.New().String(), + Type: dataprovider.ActionTypeFilesystem, + Options: dataprovider.BaseEventActionOptions{ + FsConfig: dataprovider.EventActionFilesystemConfig{ + Type: dataprovider.FilesystemActionRename, + Renames: []dataprovider.RenameConfig{ + { + KeyValue: dataprovider.KeyValue{ + Key: "/{{VirtualDirPath}}/{{ObjectName}}", + Value: "/{{ObjectName}}_renamed", + }, + }, + }, + }, + }, + } + backupData := dataprovider.BackupData{ + EventActions: []dataprovider.BaseEventAction{a1, a2}, + Version: 16, + } + backupContent, err := json.Marshal(backupData) + assert.NoError(t, err) + backupFilePath := filepath.Join(backupsPath, "backup.json") + err = os.WriteFile(backupFilePath, backupContent, os.ModePerm) + assert.NoError(t, err) + _, resp, err := httpdtest.Loaddata(backupFilePath, "1", "2", http.StatusOK) + assert.NoError(t, err, string(resp)) + // Check that actions are migrated. + action1, _, err := httpdtest.GetEventActionByName(a1.Name, http.StatusOK) + assert.NoError(t, err) + action2, _, err := httpdtest.GetEventActionByName(a2.Name, http.StatusOK) + assert.NoError(t, err) + assert.Equal(t, `Failed "{{.Event}}" from "{{.Name}}"`, action1.Options.EmailConfig.Subject) + assert.Equal(t, `Object name: {{.ObjectName}} object type: {{.ObjectType}}, IP: {{.IP}}`, action1.Options.EmailConfig.Body) + assert.Equal(t, `/{{.VirtualDirPath}}/{{.ObjectName}}`, action2.Options.FsConfig.Renames[0].Key) + assert.Equal(t, `/{{.ObjectName}}_renamed`, action2.Options.FsConfig.Renames[0].Value) + // If we restore a backup from the current version actions are not migrated. + backupData = dataprovider.BackupData{ + EventActions: []dataprovider.BaseEventAction{a1, a2}, + Version: dataprovider.DumpVersion, + } + backupContent, err = json.Marshal(backupData) + assert.NoError(t, err) + backupFilePath = filepath.Join(backupsPath, "backup.json") + err = os.WriteFile(backupFilePath, backupContent, os.ModePerm) + assert.NoError(t, err) + _, resp, err = httpdtest.Loaddata(backupFilePath, "1", "2", http.StatusOK) + assert.NoError(t, err, string(resp)) + action1, _, err = httpdtest.GetEventActionByName(a1.Name, http.StatusOK) + assert.NoError(t, err) + action2, _, err = httpdtest.GetEventActionByName(a2.Name, http.StatusOK) + assert.NoError(t, err) + assert.Equal(t, `Failed "{{Event}}" from "{{Name}}"`, action1.Options.EmailConfig.Subject) + assert.Equal(t, `Object name: {{ObjectName}} object type: {{ObjectType}}, IP: {{IP}}`, action1.Options.EmailConfig.Body) + assert.Equal(t, `/{{VirtualDirPath}}/{{ObjectName}}`, action2.Options.FsConfig.Renames[0].Key) + assert.Equal(t, `/{{ObjectName}}_renamed`, action2.Options.FsConfig.Renames[0].Value) + // Cleanup. + _, err = httpdtest.RemoveEventAction(action1, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveEventAction(action2, http.StatusOK) + assert.NoError(t, err) + actions, _, err := httpdtest.GetEventActions(0, 0, http.StatusOK) + assert.NoError(t, err) + assert.Len(t, actions, 0) +} + func TestLoaddataMode(t *testing.T) { err := dataprovider.UpdateConfigs(nil, "", "", "") assert.NoError(t, err) @@ -8522,7 +9066,7 @@ func TestLoaddataMode(t *testing.T) { } action := dataprovider.BaseEventAction{ ID: 81, - Name: "test restore action data mode", + Name: "test_restore_action_data_mode", Description: "action desc", Type: dataprovider.ActionTypeHTTP, Options: dataprovider.BaseEventActionOptions{ @@ -8533,13 +9077,13 @@ func TestLoaddataMode(t *testing.T) { Timeout: 10, SkipTLSVerify: true, Method: http.MethodPost, - Body: `{"event":"{{Event}}","name":"{{Name}}"}`, + Body: `{"event":"{{.Event}}","name":"{{.Name}}"}`, }, }, } rule := dataprovider.EventRule{ ID: 100, - Name: "test rule restore data mode", + Name: "test_rule_restore_data_mode", Description: "rule desc", Trigger: dataprovider.EventTriggerFsEvent, Conditions: dataprovider.EventConditions{ @@ -8668,7 +9212,7 @@ func TestLoaddataMode(t *testing.T) { entry, _, err = httpdtest.UpdateIPListEntry(entry, http.StatusOK) assert.NoError(t, err) - configs.SFTPD.PublicKeyAlgos = append(configs.SFTPD.PublicKeyAlgos, ssh.InsecureKeyAlgoDSA) + configs.SFTPD.PublicKeyAlgos = append(configs.SFTPD.PublicKeyAlgos, ssh.InsecureKeyAlgoDSA) //nolint:staticcheck err = dataprovider.UpdateConfigs(&configs, "", "", "") assert.NoError(t, err) backupData.Configs = &configs @@ -8737,6 +9281,7 @@ func TestLoaddataMode(t *testing.T) { assert.NoError(t, err) // mode 2 will update the user and close the previous connection assert.Len(t, common.Connections.GetStats(""), 0) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) assert.NoError(t, err) assert.Equal(t, oldUploadBandwidth, user.UploadBandwidth) @@ -8879,7 +9424,7 @@ func TestBasicUserHandlingMock(t *testing.T) { assert.Equal(t, user.MaxSessions, updatedUser.MaxSessions) assert.Equal(t, user.UploadBandwidth, updatedUser.UploadBandwidth) assert.Equal(t, 1, len(updatedUser.Permissions["/"])) - assert.True(t, util.Contains(updatedUser.Permissions["/"], dataprovider.PermAny)) + assert.True(t, slices.Contains(updatedUser.Permissions["/"], dataprovider.PermAny)) req, _ = http.NewRequest(http.MethodDelete, userPath+"/"+user.Username, nil) setBearerForReq(req, token) rr = executeRequest(req) @@ -9045,7 +9590,7 @@ func TestEventRuleErrorsMock(t *testing.T) { checkResponseCode(t, http.StatusBadRequest, rr) a := dataprovider.BaseEventAction{ - Name: "action name", + Name: "action_name", Description: "test description", Type: dataprovider.ActionTypeBackup, Options: dataprovider.BaseEventActionOptions{}, @@ -9060,7 +9605,7 @@ func TestEventRuleErrorsMock(t *testing.T) { checkResponseCode(t, http.StatusBadRequest, rr) r := dataprovider.EventRule{ - Name: "test event rule", + Name: "test_event_rule", Trigger: dataprovider.EventTriggerSchedule, Conditions: dataprovider.EventConditions{ Schedules: []dataprovider.Schedule{ @@ -9271,12 +9816,13 @@ func TestAdminTwoFactorLogin(t *testing.T) { rr = executeRequest(req) checkResponseCode(t, http.StatusNotFound, rr) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + loginCookie, csrfToken, err := getCSRFTokenMock(webLoginPath, defaultRemoteAddr) assert.NoError(t, err) form := getLoginForm(altAdminUsername, altAdminPassword, csrfToken) req, err = http.NewRequest(http.MethodPost, webLoginPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) @@ -9331,6 +9877,8 @@ func TestAdminTwoFactorLogin(t *testing.T) { assert.Equal(t, http.StatusOK, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCSRF) + csrfToken, err = getCSRFTokenFromInternalPageMock(webAdminTwoFactorRecoveryPath, cookie) + assert.NoError(t, err) form.Set(csrfFormToken, csrfToken) form.Set("passcode", "invalid_passcode") req, err = http.NewRequest(http.MethodPost, webAdminTwoFactorPath, bytes.NewBuffer([]byte(form.Encode()))) @@ -9369,10 +9917,13 @@ func TestAdminTwoFactorLogin(t *testing.T) { rr = executeRequest(req) assert.Equal(t, http.StatusNotFound, rr.Code) // get a new cookie and login using a recovery code + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) + assert.NoError(t, err) form = getLoginForm(altAdminUsername, altAdminPassword, csrfToken) req, err = http.NewRequest(http.MethodPost, webLoginPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) @@ -9393,6 +9944,8 @@ func TestAdminTwoFactorLogin(t *testing.T) { assert.Equal(t, http.StatusOK, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCSRF) + csrfToken, err = getCSRFTokenFromInternalPageMock(webAdminTwoFactorRecoveryPath, cookie) + assert.NoError(t, err) form.Set(csrfFormToken, csrfToken) form.Set("recovery_code", "") req, err = http.NewRequest(http.MethodPost, webAdminTwoFactorRecoveryPath, bytes.NewBuffer([]byte(form.Encode()))) @@ -9443,16 +9996,21 @@ func TestAdminTwoFactorLogin(t *testing.T) { } assert.True(t, found) // the same recovery code cannot be reused + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) + assert.NoError(t, err) form = getLoginForm(altAdminUsername, altAdminPassword, csrfToken) req, err = http.NewRequest(http.MethodPost, webLoginPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) assert.Equal(t, webAdminTwoFactorPath, rr.Header().Get("Location")) cookie, err = getCookieFromResponse(rr) assert.NoError(t, err) + csrfToken, err = getCSRFTokenFromInternalPageMock(webAdminTwoFactorRecoveryPath, cookie) + assert.NoError(t, err) form = make(url.Values) form.Set("recovery_code", recoveryCode) form.Set(csrfFormToken, csrfToken) @@ -9475,12 +10033,23 @@ func TestAdminTwoFactorLogin(t *testing.T) { assert.Equal(t, http.StatusOK, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCredentials) + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) + assert.NoError(t, err) form = getLoginForm(altAdminUsername, altAdminPassword, csrfToken) req, err = http.NewRequest(http.MethodPost, webLoginPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) + assert.Equal(t, http.StatusOK, rr.Code) + assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCSRF) + + req, err = http.NewRequest(http.MethodPost, webLoginPath, bytes.NewBuffer([]byte(form.Encode()))) + assert.NoError(t, err) + req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) assert.Equal(t, webAdminTwoFactorPath, rr.Header().Get("Location")) cookie, err = getCookieFromResponse(rr) @@ -9508,6 +10077,8 @@ func TestAdminTwoFactorLogin(t *testing.T) { checkResponseCode(t, http.StatusBadRequest, rr) assert.Contains(t, rr.Body.String(), "two-factor authentication is not enabled") + csrfToken, err = getCSRFTokenFromInternalPageMock(webAdminTwoFactorRecoveryPath, cookie) + assert.NoError(t, err) form = make(url.Values) form.Set("recovery_code", recoveryCode) form.Set(csrfFormToken, csrfToken) @@ -9781,7 +10352,7 @@ func TestSMTPConfig(t *testing.T) { tokenHeader := "X-CSRF-TOKEN" webToken, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webConfigsPath, webToken) assert.NoError(t, err) req, err := http.NewRequest(http.MethodPost, smtpTestURL, bytes.NewBuffer([]byte("{"))) assert.NoError(t, err) @@ -9865,7 +10436,7 @@ func TestOAuth2TokenRequest(t *testing.T) { tokenHeader := "X-CSRF-TOKEN" webToken, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webConfigsPath, webToken) assert.NoError(t, err) req, err := http.NewRequest(http.MethodPost, webOAuth2TokenPath, bytes.NewBuffer([]byte("{"))) assert.NoError(t, err) @@ -10006,14 +10577,24 @@ func TestWebUserTwoFactorLogin(t *testing.T) { rr = executeRequest(req) checkResponseCode(t, http.StatusNotFound, rr) - csrfToken, err := getCSRFToken(httpBaseURL + webClientLoginPath) + loginCookie, csrfToken, err := getCSRFTokenMock(webClientLoginPath, defaultRemoteAddr) assert.NoError(t, err) form := getLoginForm(defaultUsername, defaultPassword, csrfToken) + // CSRF verification fails if there is no cookie req, err = http.NewRequest(http.MethodPost, webClientLoginPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) + assert.Equal(t, http.StatusOK, rr.Code) + assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCSRF) + + req, err = http.NewRequest(http.MethodPost, webClientLoginPath, bytes.NewBuffer([]byte(form.Encode()))) + assert.NoError(t, err) + req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) assert.Equal(t, webClientTwoFactorPath, rr.Header().Get("Location")) cookie, err := getCookieFromResponse(rr) @@ -10030,6 +10611,13 @@ func TestWebUserTwoFactorLogin(t *testing.T) { assert.NoError(t, err) rr = executeRequest(req) checkResponseCode(t, http.StatusNotFound, rr) + // invalid IP address + req, err = http.NewRequest(http.MethodGet, webClientTwoFactorPath, nil) + assert.NoError(t, err) + setJWTCookieForReq(req, cookie) + req.RemoteAddr = "6.7.8.9:4567" + rr = executeRequest(req) + checkResponseCode(t, http.StatusNotFound, rr) req, err = http.NewRequest(http.MethodGet, webClientTwoFactorRecoveryPath, nil) assert.NoError(t, err) @@ -10065,6 +10653,8 @@ func TestWebUserTwoFactorLogin(t *testing.T) { assert.Equal(t, http.StatusOK, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCSRF) + csrfToken, err = getCSRFTokenFromInternalPageMock(webClientTwoFactorPath, cookie) + assert.NoError(t, err) form.Set(csrfFormToken, csrfToken) form.Set("passcode", "invalid_user_passcode") req, err = http.NewRequest(http.MethodPost, webClientTwoFactorPath, bytes.NewBuffer([]byte(form.Encode()))) @@ -10104,10 +10694,13 @@ func TestWebUserTwoFactorLogin(t *testing.T) { rr = executeRequest(req) assert.Equal(t, http.StatusNotFound, rr.Code) // get a new cookie and login using a recovery code + loginCookie, csrfToken, err = getCSRFTokenMock(webClientLoginPath, defaultRemoteAddr) + assert.NoError(t, err) form = getLoginForm(defaultUsername, defaultPassword, csrfToken) req, err = http.NewRequest(http.MethodPost, webClientLoginPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) @@ -10127,6 +10720,8 @@ func TestWebUserTwoFactorLogin(t *testing.T) { assert.Equal(t, http.StatusOK, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCSRF) + csrfToken, err = getCSRFTokenFromInternalPageMock(webClientTwoFactorRecoveryPath, cookie) + assert.NoError(t, err) form.Set(csrfFormToken, csrfToken) form.Set("recovery_code", "") req, err = http.NewRequest(http.MethodPost, webClientTwoFactorRecoveryPath, bytes.NewBuffer([]byte(form.Encode()))) @@ -10192,16 +10787,22 @@ func TestWebUserTwoFactorLogin(t *testing.T) { } assert.True(t, found) // the same recovery code cannot be reused + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) + assert.NoError(t, err) form = getLoginForm(defaultUsername, defaultPassword, csrfToken) req, err = http.NewRequest(http.MethodPost, webClientLoginPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) assert.Equal(t, webClientTwoFactorPath, rr.Header().Get("Location")) cookie, err = getCookieFromResponse(rr) assert.NoError(t, err) + + csrfToken, err = getCSRFTokenFromInternalPageMock(webClientTwoFactorRecoveryPath, cookie) + assert.NoError(t, err) form = make(url.Values) form.Set("recovery_code", recoveryCode) form.Set(csrfFormToken, csrfToken) @@ -10224,10 +10825,13 @@ func TestWebUserTwoFactorLogin(t *testing.T) { assert.Equal(t, http.StatusOK, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCredentials) + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) + assert.NoError(t, err) form = getLoginForm(defaultUsername, defaultPassword, csrfToken) req, err = http.NewRequest(http.MethodPost, webClientLoginPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) @@ -10249,11 +10853,12 @@ func TestWebUserTwoFactorLogin(t *testing.T) { checkResponseCode(t, http.StatusBadRequest, rr) assert.Contains(t, rr.Body.String(), "two-factor authentication is not enabled") + csrfToken, err = getCSRFTokenFromInternalPageMock(webClientTwoFactorRecoveryPath, cookie) + assert.NoError(t, err) form = make(url.Values) form.Set("recovery_code", recoveryCode) form.Set("passcode", passcode) form.Set(csrfFormToken, csrfToken) - req, err = http.NewRequest(http.MethodPost, webClientTwoFactorRecoveryPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) setJWTCookieForReq(req, cookie) @@ -10325,7 +10930,7 @@ func TestWebUserTwoFactoryLoginRedirect(t *testing.T) { rr := executeRequest(req) checkResponseCode(t, http.StatusOK, rr) - csrfToken, err := getCSRFToken(httpBaseURL + webClientLoginPath) + loginCookie, csrfToken, err := getCSRFTokenMock(webLoginPath, defaultRemoteAddr) assert.NoError(t, err) form := getLoginForm(defaultUsername, defaultPassword, csrfToken) uri := webClientFilesPath + "?path=%2F" @@ -10335,6 +10940,7 @@ func TestWebUserTwoFactoryLoginRedirect(t *testing.T) { assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr req.RequestURI = loginURI + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) @@ -10342,20 +10948,29 @@ func TestWebUserTwoFactoryLoginRedirect(t *testing.T) { cookie, err := getCookieFromResponse(rr) assert.NoError(t, err) // test unsafe redirects + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) + assert.NoError(t, err) + form = getLoginForm(defaultUsername, defaultPassword, csrfToken) externalURI := webClientLoginPath + "?next=" + url.QueryEscape("https://example.com") req, err = http.NewRequest(http.MethodPost, externalURI, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr req.RequestURI = externalURI + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) assert.Equal(t, webClientTwoFactorPath, rr.Header().Get("Location")) + + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) + assert.NoError(t, err) + form = getLoginForm(defaultUsername, defaultPassword, csrfToken) internalURI := webClientLoginPath + "?next=" + url.QueryEscape(webClientMFAPath) req, err = http.NewRequest(http.MethodPost, internalURI, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr req.RequestURI = internalURI + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) @@ -10369,6 +10984,8 @@ func TestWebUserTwoFactoryLoginRedirect(t *testing.T) { checkResponseCode(t, http.StatusOK, rr) assert.Contains(t, rr.Body.String(), fmt.Sprintf("action=%q", expectedURI)) // login with the passcode + csrfToken, err = getCSRFTokenFromInternalPageMock(expectedURI, cookie) + assert.NoError(t, err) passcode, err := generateTOTPPasscode(key.Secret()) assert.NoError(t, err) form = make(url.Values) @@ -10800,18 +11417,22 @@ func TestMFAInvalidSecret(t *testing.T) { checkResponseCode(t, http.StatusInternalServerError, rr) assert.Contains(t, rr.Body.String(), "Unable to decrypt recovery codes") - csrfToken, err := getCSRFToken(httpBaseURL + webClientLoginPath) + loginCookie, csrfToken, err := getCSRFTokenMock(webLoginPath, defaultRemoteAddr) assert.NoError(t, err) form := getLoginForm(defaultUsername, defaultPassword, csrfToken) req, err = http.NewRequest(http.MethodPost, webClientLoginPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) assert.Equal(t, webClientTwoFactorPath, rr.Header().Get("Location")) cookie, err := getCookieFromResponse(rr) assert.NoError(t, err) + + csrfToken, err = getCSRFTokenFromInternalPageMock(webClientTwoFactorPath, cookie) + assert.NoError(t, err) form = make(url.Values) form.Set(csrfFormToken, csrfToken) form.Set("passcode", "123456") @@ -10823,6 +11444,8 @@ func TestMFAInvalidSecret(t *testing.T) { rr = executeRequest(req) assert.Equal(t, http.StatusInternalServerError, rr.Code) + csrfToken, err = getCSRFTokenFromInternalPageMock(webClientTwoFactorRecoveryPath, cookie) + assert.NoError(t, err) form = make(url.Values) form.Set(csrfFormToken, csrfToken) form.Set("recovery_code", "RC-123456") @@ -10868,18 +11491,22 @@ func TestMFAInvalidSecret(t *testing.T) { err = dataprovider.UpdateAdmin(&admin, "", "", "") assert.NoError(t, err) - csrfToken, err = getCSRFToken(httpBaseURL + webLoginPath) + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) assert.NoError(t, err) form = getLoginForm(altAdminUsername, altAdminPassword, csrfToken) req, err = http.NewRequest(http.MethodPost, webLoginPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) assert.Equal(t, webAdminTwoFactorPath, rr.Header().Get("Location")) cookie, err = getCookieFromResponse(rr) assert.NoError(t, err) + + csrfToken, err = getCSRFTokenFromInternalPageMock(webAdminTwoFactorRecoveryPath, cookie) + assert.NoError(t, err) form = make(url.Values) form.Set(csrfFormToken, csrfToken) form.Set("passcode", "123456") @@ -10891,6 +11518,8 @@ func TestMFAInvalidSecret(t *testing.T) { rr = executeRequest(req) assert.Equal(t, http.StatusInternalServerError, rr.Code) + csrfToken, err = getCSRFTokenFromInternalPageMock(webAdminTwoFactorRecoveryPath, cookie) + assert.NoError(t, err) form = make(url.Values) form.Set(csrfFormToken, csrfToken) form.Set("recovery_code", "RC-123456") @@ -11129,6 +11758,7 @@ func TestWebAPIChangeUserProfileMock(t *testing.T) { checkResponseCode(t, http.StatusBadRequest, rr) email := "userapi@example.com" + additionalEmails := []string{"userapi1@example.com"} description := "user API description" profileReq := make(map[string]any) profileReq["allow_api_key_auth"] = true @@ -11136,6 +11766,7 @@ func TestWebAPIChangeUserProfileMock(t *testing.T) { profileReq["description"] = description profileReq["public_keys"] = []string{testPubKey, testPubKey1} profileReq["tls_certs"] = []string{httpsCert} + profileReq["additional_emails"] = additionalEmails asJSON, err := json.Marshal(profileReq) assert.NoError(t, err) req, err = http.NewRequest(http.MethodPut, userProfilePath, bytes.NewBuffer(asJSON)) @@ -11153,6 +11784,7 @@ func TestWebAPIChangeUserProfileMock(t *testing.T) { err = json.Unmarshal(rr.Body.Bytes(), &profileReq) assert.NoError(t, err) assert.Equal(t, email, profileReq["email"].(string)) + assert.Len(t, profileReq["additional_emails"].([]interface{}), 1) assert.Equal(t, description, profileReq["description"].(string)) assert.True(t, profileReq["allow_api_key_auth"].(bool)) val, ok := profileReq["public_keys"].([]any) @@ -11174,6 +11806,17 @@ func TestWebAPIChangeUserProfileMock(t *testing.T) { rr = executeRequest(req) checkResponseCode(t, http.StatusBadRequest, rr) assert.Contains(t, rr.Body.String(), "Validation error: email") + // set an invalid additional email + profileReq = make(map[string]any) + profileReq["additional_emails"] = []string{"not an email"} + asJSON, err = json.Marshal(profileReq) + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPut, userProfilePath, bytes.NewBuffer(asJSON)) + assert.NoError(t, err) + setBearerForReq(req, token) + rr = executeRequest(req) + checkResponseCode(t, http.StatusBadRequest, rr) + assert.Contains(t, rr.Body.String(), "Validation error: email") // set an invalid public key profileReq = make(map[string]any) profileReq["public_keys"] = []string{"not a public key"} @@ -11372,11 +12015,17 @@ func TestWebAPIChangeUserPwdMock(t *testing.T) { assert.NoError(t, err) token, err := getJWTAPIUserTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) - // invalid json - req, err := http.NewRequest(http.MethodPut, userPwdPath, bytes.NewBuffer([]byte("{"))) + + req, err := http.NewRequest(http.MethodGet, userProfilePath, nil) assert.NoError(t, err) setBearerForReq(req, token) rr := executeRequest(req) + checkResponseCode(t, http.StatusOK, rr) + // invalid json + req, err = http.NewRequest(http.MethodPut, userPwdPath, bytes.NewBuffer([]byte("{"))) + assert.NoError(t, err) + setBearerForReq(req, token) + rr = executeRequest(req) checkResponseCode(t, http.StatusBadRequest, rr) pwd := make(map[string]string) @@ -11399,6 +12048,13 @@ func TestWebAPIChangeUserPwdMock(t *testing.T) { setBearerForReq(req, token) rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) + + req, err = http.NewRequest(http.MethodGet, userProfilePath, nil) + assert.NoError(t, err) + setBearerForReq(req, token) + rr = executeRequest(req) + checkResponseCode(t, http.StatusUnauthorized, rr) + _, err = getJWTAPIUserTokenFromTestServer(defaultUsername, defaultPassword) assert.Error(t, err) token, err = getJWTAPIUserTokenFromTestServer(defaultUsername, altAdminPassword) @@ -11548,6 +12204,12 @@ func TestChangeAdminPwdMock(t *testing.T) { setBearerForReq(req, altToken) rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) + // try using the old token + req, err = http.NewRequest(http.MethodGet, versionPath, nil) + assert.NoError(t, err) + setBearerForReq(req, altToken) + rr = executeRequest(req) + checkResponseCode(t, http.StatusUnauthorized, rr) _, err = getJWTAPITokenFromTestServer(altAdminUsername, altAdminPassword) assert.Error(t, err) @@ -11577,7 +12239,7 @@ func TestUpdateAdminMock(t *testing.T) { assert.Error(t, err) admin := getTestAdmin() admin.Username = altAdminUsername - admin.Permissions = []string{dataprovider.PermAdminManageAdmins} + admin.Permissions = []string{dataprovider.PermAdminAny} asJSON, err := json.Marshal(admin) assert.NoError(t, err) req, _ := http.NewRequest(http.MethodPost, adminPath, bytes.NewBuffer(asJSON)) @@ -11619,7 +12281,7 @@ func TestUpdateAdminMock(t *testing.T) { setBearerForReq(req, token) rr = executeRequest(req) checkResponseCode(t, http.StatusBadRequest, rr) - assert.Contains(t, rr.Body.String(), "you cannot remove these permissions to yourself") + assert.Contains(t, rr.Body.String(), "you cannot change your permissions") admin.Permissions = []string{dataprovider.PermAdminAny} admin.Role = "missing role" asJSON, err = json.Marshal(admin) @@ -11634,7 +12296,7 @@ func TestUpdateAdminMock(t *testing.T) { altToken, err := getJWTAPITokenFromTestServer(altAdminUsername, defaultTokenAuthPass) assert.NoError(t, err) admin.Password = "" // it must remain unchanged - admin.Permissions = []string{dataprovider.PermAdminManageAdmins, dataprovider.PermAdminCloseConnections} + admin.Permissions = []string{dataprovider.PermAdminAny} asJSON, err = json.Marshal(admin) assert.NoError(t, err) req, _ = http.NewRequest(http.MethodPut, path.Join(adminPath, altAdminUsername), bytes.NewBuffer(asJSON)) @@ -12004,7 +12666,7 @@ func TestUserPermissionsMock(t *testing.T) { err = render.DecodeJSON(rr.Body, &updatedUser) assert.NoError(t, err) if val, ok := updatedUser.Permissions["/otherdir"]; ok { - assert.True(t, util.Contains(val, dataprovider.PermListItems)) + assert.True(t, slices.Contains(val, dataprovider.PermListItems)) assert.Equal(t, 1, len(val)) } else { assert.Fail(t, "expected dir not found in permissions") @@ -12403,8 +13065,7 @@ func TestStartQuotaScanNonExistentFolderMock(t *testing.T) { token, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) folder := vfs.BaseVirtualFolder{ - MappedPath: os.TempDir(), - Name: "afolder", + Name: "afolder", } req, _ := http.NewRequest(http.MethodPost, path.Join(quotasBasePath, "folders", folder.Name, "scan"), nil) setBearerForReq(req, token) @@ -12725,8 +13386,6 @@ func TestWebClientLoginMock(t *testing.T) { assert.NoError(t, err) webToken, err := getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webClientLoginPath) - assert.NoError(t, err) // a web token is not valid for API or WebAdmin usage req, _ := http.NewRequest(http.MethodGet, serverStatusPath, nil) setBearerForReq(req, webToken) @@ -12788,6 +13447,8 @@ func TestWebClientLoginMock(t *testing.T) { assert.NoError(t, err) apiUserToken, err := getJWTAPIUserTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) + csrfToken, err := getCSRFTokenFromInternalPageMock(webClientProfilePath, webToken) + assert.NoError(t, err) _, err = httpdtest.RemoveUser(user, http.StatusOK) assert.NoError(t, err) err = os.RemoveAll(user.GetHomeDir()) @@ -12907,6 +13568,7 @@ func TestWebClientMaxConnections(t *testing.T) { err = os.RemoveAll(user.GetHomeDir()) assert.NoError(t, err) assert.Len(t, common.Connections.GetStats(""), 0) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) common.Config.MaxTotalConnections = oldValue } @@ -13002,17 +13664,19 @@ func TestDefender(t *testing.T) { checkResponseCode(t, http.StatusForbidden, rr) assert.Contains(t, rr.Body.String(), "your IP address is blocked") // requests for static files should be always allowed - req, err = http.NewRequest(http.MethodGet, "/static/favicon.ico", nil) + req, err = http.NewRequest(http.MethodGet, "/static/favicon.png", nil) assert.NoError(t, err) req.RemoteAddr = remoteAddr rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) + assert.Empty(t, rr.Header().Get("Cache-Control")) req, err = http.NewRequest(http.MethodGet, "/.well-known/acme-challenge/foo", nil) assert.NoError(t, err) req.RemoteAddr = remoteAddr rr = executeRequest(req) checkResponseCode(t, http.StatusNotFound, rr) + assert.Equal(t, "no-cache, no-store, max-age=0, must-revalidate, private", rr.Header().Get("Cache-Control")) _, err = httpdtest.RemoveUser(user, http.StatusOK) assert.NoError(t, err) @@ -13106,7 +13770,7 @@ func TestMaxSessions(t *testing.T) { checkResponseCode(t, http.StatusTooManyRequests, rr) assert.Contains(t, rr.Body.String(), "too many open sessions") // web client requests - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webClientProfilePath, webToken) assert.NoError(t, err) form := make(url.Values) form.Set(csrfFormToken, csrfToken) @@ -13158,6 +13822,8 @@ func TestMaxSessions(t *testing.T) { err = smtpCfg.Initialize(configDir, true) assert.NoError(t, err) + loginCookie, csrfToken, err := getCSRFTokenMock(webClientLoginPath, defaultRemoteAddr) + assert.NoError(t, err) form = make(url.Values) form.Set(csrfFormToken, csrfToken) form.Set("username", user.Username) @@ -13165,10 +13831,14 @@ func TestMaxSessions(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webClientForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) assert.GreaterOrEqual(t, len(lastResetCode), 20) + + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) + assert.NoError(t, err) form = make(url.Values) form.Set(csrfFormToken, csrfToken) form.Set("password", defaultPassword) @@ -13177,6 +13847,7 @@ func TestMaxSessions(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webClientResetPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusOK, rr.Code) @@ -13192,6 +13863,129 @@ func TestMaxSessions(t *testing.T) { err = os.RemoveAll(user.GetHomeDir()) assert.NoError(t, err) assert.Len(t, common.Connections.GetStats(""), 0) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) +} + +func TestMaxTransfers(t *testing.T) { + oldValue := common.Config.MaxPerHostConnections + common.Config.MaxPerHostConnections = 2 + + assert.Eventually(t, func() bool { + return common.Connections.GetClientConnections() == 0 + }, 1000*time.Millisecond, 50*time.Millisecond) + user, _, err := httpdtest.AddUser(getTestUser(), http.StatusCreated) + assert.NoError(t, err) + + webToken, err := getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword) + assert.NoError(t, err) + webAPIToken, err := getJWTAPIUserTokenFromTestServer(defaultUsername, defaultPassword) + assert.NoError(t, err) + + share := dataprovider.Share{ + Name: "test share", + Scope: dataprovider.ShareScopeReadWrite, + Paths: []string{"/"}, + Password: defaultPassword, + } + asJSON, err := json.Marshal(share) + assert.NoError(t, err) + req, err := http.NewRequest(http.MethodPost, userSharesPath, bytes.NewBuffer(asJSON)) + assert.NoError(t, err) + setBearerForReq(req, webAPIToken) + rr := executeRequest(req) + checkResponseCode(t, http.StatusCreated, rr) + objectID := rr.Header().Get("X-Object-ID") + assert.NotEmpty(t, objectID) + + fileName := "testfile.txt" + req, err = http.NewRequest(http.MethodPost, userUploadFilePath+"?path="+fileName, bytes.NewBuffer([]byte(" "))) + assert.NoError(t, err) + setBearerForReq(req, webAPIToken) + rr = executeRequest(req) + checkResponseCode(t, http.StatusCreated, rr) + + conn, sftpClient, err := getSftpClient(user) + assert.NoError(t, err) + defer conn.Close() + defer sftpClient.Close() + + f1, err := sftpClient.Create("file1") + assert.NoError(t, err) + f2, err := sftpClient.Create("file2") + assert.NoError(t, err) + _, err = f1.Write([]byte(" ")) + assert.NoError(t, err) + _, err = f2.Write([]byte(" ")) + assert.NoError(t, err) + + body := new(bytes.Buffer) + writer := multipart.NewWriter(body) + part, err := writer.CreateFormFile("filenames", "filepre") + assert.NoError(t, err) + _, err = part.Write([]byte("file content")) + assert.NoError(t, err) + err = writer.Close() + assert.NoError(t, err) + reader := bytes.NewReader(body.Bytes()) + _, err = reader.Seek(0, io.SeekStart) + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, userFilesPath, reader) + assert.NoError(t, err) + req.Header.Add("Content-Type", writer.FormDataContentType()) + setBearerForReq(req, webAPIToken) + rr = executeRequest(req) + checkResponseCode(t, http.StatusConflict, rr) + + req, err = http.NewRequest(http.MethodGet, webClientFilesPath+"?path="+fileName, nil) + assert.NoError(t, err) + setJWTCookieForReq(req, webToken) + rr = executeRequest(req) + checkResponseCode(t, http.StatusOK, rr) + assert.Contains(t, rr.Body.String(), util.I18nError403Message) + + req, err = http.NewRequest(http.MethodPost, userUploadFilePath+"?path="+fileName, bytes.NewBuffer([]byte(" "))) + assert.NoError(t, err) + setBearerForReq(req, webAPIToken) + rr = executeRequest(req) + checkResponseCode(t, http.StatusForbidden, rr) + + body = new(bytes.Buffer) + writer = multipart.NewWriter(body) + part1, err := writer.CreateFormFile("filenames", "file11.txt") + assert.NoError(t, err) + _, err = part1.Write([]byte("file11 content")) + assert.NoError(t, err) + part2, err := writer.CreateFormFile("filenames", "file22.txt") + assert.NoError(t, err) + _, err = part2.Write([]byte("file22 content")) + assert.NoError(t, err) + err = writer.Close() + assert.NoError(t, err) + reader = bytes.NewReader(body.Bytes()) + req, err = http.NewRequest(http.MethodPost, sharesPath+"/"+objectID, reader) + assert.NoError(t, err) + req.Header.Add("Content-Type", writer.FormDataContentType()) + req.SetBasicAuth(defaultUsername, defaultPassword) + rr = executeRequest(req) + checkResponseCode(t, http.StatusConflict, rr) + + err = f1.Close() + assert.NoError(t, err) + err = f2.Close() + assert.NoError(t, err) + + _, err = httpdtest.RemoveUser(user, http.StatusOK) + assert.NoError(t, err) + err = os.RemoveAll(user.GetHomeDir()) + assert.NoError(t, err) + assert.Eventually(t, func() bool { + return len(common.Connections.GetStats("")) == 0 + }, 1000*time.Millisecond, 50*time.Millisecond) + assert.Eventually(t, func() bool { + return common.Connections.GetTotalTransfers() == 0 + }, 1000*time.Millisecond, 50*time.Millisecond) + + common.Config.MaxPerHostConnections = oldValue } func TestWebConfigsMock(t *testing.T) { @@ -13203,8 +13997,6 @@ func TestWebConfigsMock(t *testing.T) { assert.NoError(t, err) webToken, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webClientLoginPath) - assert.NoError(t, err) req, err := http.NewRequest(http.MethodGet, webConfigsPath, nil) assert.NoError(t, err) @@ -13213,13 +14005,17 @@ func TestWebConfigsMock(t *testing.T) { checkResponseCode(t, http.StatusOK, rr) form := make(url.Values) - req, err = http.NewRequest(http.MethodPost, webConfigsPath, bytes.NewBuffer([]byte(form.Encode()))) + b, contentType, err := getMultipartFormData(form, "", "") + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) assert.NoError(t, err) setJWTCookieForReq(req, webToken) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Content-Type", contentType) rr = executeRequest(req) checkResponseCode(t, http.StatusForbidden, rr) // parse form error + csrfToken, err := getCSRFTokenFromInternalPageMock(webConfigsPath, webToken) + assert.NoError(t, err) form.Set(csrfFormToken, csrfToken) req, err = http.NewRequest(http.MethodPost, webConfigsPath+"?p=p%C3%AO%GH", bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) @@ -13229,25 +14025,29 @@ func TestWebConfigsMock(t *testing.T) { checkResponseCode(t, http.StatusBadRequest, rr) // save SFTP configs form.Set("sftp_host_key_algos", ssh.KeyAlgoRSA) - form.Add("sftp_host_key_algos", ssh.InsecureCertAlgoDSAv01) - form.Set("sftp_pub_key_algos", ssh.InsecureKeyAlgoDSA) + form.Add("sftp_host_key_algos", ssh.InsecureCertAlgoDSAv01) //nolint:staticcheck + form.Set("sftp_pub_key_algos", ssh.InsecureKeyAlgoDSA) //nolint:staticcheck form.Set("form_action", "sftp_submit") - req, err = http.NewRequest(http.MethodPost, webConfigsPath, bytes.NewBuffer([]byte(form.Encode()))) + b, contentType, err = getMultipartFormData(form, "", "") + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) assert.NoError(t, err) setJWTCookieForReq(req, webToken) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Content-Type", contentType) rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) assert.Contains(t, rr.Body.String(), util.I18nError500Message) // invalid algo form.Set("sftp_host_key_algos", ssh.KeyAlgoRSA) form.Add("sftp_host_key_algos", ssh.CertAlgoRSAv01) - form.Set("sftp_pub_key_algos", ssh.InsecureKeyAlgoDSA) + form.Set("sftp_pub_key_algos", ssh.InsecureKeyAlgoDSA) //nolint:staticcheck form.Set("sftp_kex_algos", "diffie-hellman-group18-sha512") form.Add("sftp_kex_algos", ssh.KeyExchangeDH16SHA512) - req, err = http.NewRequest(http.MethodPost, webConfigsPath, bytes.NewBuffer([]byte(form.Encode()))) + b, contentType, err = getMultipartFormData(form, "", "") + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) assert.NoError(t, err) setJWTCookieForReq(req, webToken) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Content-Type", contentType) rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) assert.Contains(t, rr.Body.String(), util.I18nConfigsOK) @@ -13257,15 +14057,17 @@ func TestWebConfigsMock(t *testing.T) { assert.Len(t, configs.SFTPD.HostKeyAlgos, 1) assert.Contains(t, configs.SFTPD.HostKeyAlgos, ssh.KeyAlgoRSA) assert.Len(t, configs.SFTPD.PublicKeyAlgos, 1) - assert.Contains(t, configs.SFTPD.PublicKeyAlgos, ssh.InsecureKeyAlgoDSA) + assert.Contains(t, configs.SFTPD.PublicKeyAlgos, ssh.InsecureKeyAlgoDSA) //nolint:staticcheck assert.Len(t, configs.SFTPD.KexAlgorithms, 1) assert.Contains(t, configs.SFTPD.KexAlgorithms, ssh.KeyExchangeDH16SHA512) // invalid form action form.Set("form_action", "") - req, err = http.NewRequest(http.MethodPost, webConfigsPath, bytes.NewBuffer([]byte(form.Encode()))) + b, contentType, err = getMultipartFormData(form, "", "") + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) assert.NoError(t, err) setJWTCookieForReq(req, webToken) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Content-Type", contentType) rr = executeRequest(req) checkResponseCode(t, http.StatusBadRequest, rr) assert.Contains(t, rr.Body.String(), util.I18nError400Message) @@ -13277,10 +14079,12 @@ func TestWebConfigsMock(t *testing.T) { form.Set("smtp_password", defaultPassword) form.Set("smtp_domain", "localdomain") form.Set("smtp_auth", "100") - req, err = http.NewRequest(http.MethodPost, webConfigsPath, bytes.NewBuffer([]byte(form.Encode()))) + b, contentType, err = getMultipartFormData(form, "", "") + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) assert.NoError(t, err) setJWTCookieForReq(req, webToken) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Content-Type", contentType) rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) assert.Contains(t, rr.Body.String(), util.I18nError500Message) // invalid smtp_auth @@ -13291,10 +14095,12 @@ func TestWebConfigsMock(t *testing.T) { form.Set("smtp_debug", "checked") form.Set("smtp_oauth2_provider", "1") form.Set("smtp_oauth2_client_id", "123") - req, err = http.NewRequest(http.MethodPost, webConfigsPath, bytes.NewBuffer([]byte(form.Encode()))) + b, contentType, err = getMultipartFormData(form, "", "") + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) assert.NoError(t, err) setJWTCookieForReq(req, webToken) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Content-Type", contentType) rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) assert.Contains(t, rr.Body.String(), util.I18nConfigsOK) @@ -13304,7 +14110,7 @@ func TestWebConfigsMock(t *testing.T) { assert.Len(t, configs.SFTPD.HostKeyAlgos, 1) assert.Contains(t, configs.SFTPD.HostKeyAlgos, ssh.KeyAlgoRSA) assert.Len(t, configs.SFTPD.PublicKeyAlgos, 1) - assert.Contains(t, configs.SFTPD.PublicKeyAlgos, ssh.InsecureKeyAlgoDSA) + assert.Contains(t, configs.SFTPD.PublicKeyAlgos, ssh.InsecureKeyAlgoDSA) //nolint:staticcheck assert.Equal(t, "mail.example.net", configs.SMTP.Host) assert.Equal(t, 587, configs.SMTP.Port) assert.Equal(t, "Example ", configs.SMTP.From) @@ -13321,10 +14127,12 @@ func TestWebConfigsMock(t *testing.T) { form.Set("smtp_password", redactedSecret) form.Set("smtp_auth", "") configs.SMTP.AuthType = 0 // empty will be converted to 0 - req, err = http.NewRequest(http.MethodPost, webConfigsPath, bytes.NewBuffer([]byte(form.Encode()))) + b, contentType, err = getMultipartFormData(form, "", "") + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) assert.NoError(t, err) setJWTCookieForReq(req, webToken) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Content-Type", contentType) rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) assert.Contains(t, rr.Body.String(), util.I18nConfigsOK) @@ -13340,10 +14148,12 @@ func TestWebConfigsMock(t *testing.T) { updatedConfigs.SMTP.Password = kms.NewSecret(sdkkms.SecretStatusSecretBox, encryptedPayload, secretKey, "") err = dataprovider.UpdateConfigs(&updatedConfigs, "", "", "") assert.NoError(t, err) - req, err = http.NewRequest(http.MethodPost, webConfigsPath, bytes.NewBuffer([]byte(form.Encode()))) + b, contentType, err = getMultipartFormData(form, "", "") + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) assert.NoError(t, err) setJWTCookieForReq(req, webToken) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Content-Type", contentType) rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) assert.Contains(t, rr.Body.String(), util.I18nConfigsOK) @@ -13353,19 +14163,23 @@ func TestWebConfigsMock(t *testing.T) { form.Add("acme_protocols", "2") form.Add("acme_protocols", "3") form.Set("acme_domain", "example.com") + b, contentType, err = getMultipartFormData(form, "", "") + assert.NoError(t, err) // no email set, validation will fail - req, err = http.NewRequest(http.MethodPost, webConfigsPath, bytes.NewBuffer([]byte(form.Encode()))) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) assert.NoError(t, err) setJWTCookieForReq(req, webToken) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Content-Type", contentType) rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidEmail) form.Set("acme_domain", "") - req, err = http.NewRequest(http.MethodPost, webConfigsPath, bytes.NewBuffer([]byte(form.Encode()))) + b, contentType, err = getMultipartFormData(form, "", "") + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) assert.NoError(t, err) setJWTCookieForReq(req, webToken) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Content-Type", contentType) rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) assert.Contains(t, rr.Body.String(), util.I18nConfigsOK) @@ -13375,7 +14189,7 @@ func TestWebConfigsMock(t *testing.T) { assert.Len(t, configs.SFTPD.HostKeyAlgos, 1) assert.Contains(t, configs.SFTPD.HostKeyAlgos, ssh.KeyAlgoRSA) assert.Len(t, configs.SFTPD.PublicKeyAlgos, 1) - assert.Contains(t, configs.SFTPD.PublicKeyAlgos, ssh.InsecureKeyAlgoDSA) + assert.Contains(t, configs.SFTPD.PublicKeyAlgos, ssh.InsecureKeyAlgoDSA) //nolint:staticcheck assert.Equal(t, 80, configs.ACME.HTTP01Challenge.Port) assert.Equal(t, 7, configs.ACME.Protocols) assert.Empty(t, configs.ACME.Domain) @@ -13396,10 +14210,12 @@ func TestWebConfigsMock(t *testing.T) { form.Add("acme_protocols", "1000") form.Set("acme_domain", domain) form.Set("acme_email", "email@example.com") - req, err = http.NewRequest(http.MethodPost, webConfigsPath, bytes.NewBuffer([]byte(form.Encode()))) + b, contentType, err = getMultipartFormData(form, "", "") + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) assert.NoError(t, err) setJWTCookieForReq(req, webToken) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Content-Type", contentType) rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) assert.Contains(t, rr.Body.String(), util.I18nConfigsOK) @@ -13423,6 +14239,201 @@ func TestWebConfigsMock(t *testing.T) { assert.NoError(t, err) } +func TestBrandingConfigMock(t *testing.T) { + err := dataprovider.UpdateConfigs(nil, "", "", "") + assert.NoError(t, err) + + webClientLogoPath := "/static/branding/webclient/logo.png" + webClientFaviconPath := "/static/branding/webclient/favicon.png" + webAdminLogoPath := "/static/branding/webadmin/logo.png" + webAdminFaviconPath := "/static/branding/webadmin/favicon.png" + // no custom log or favicon was set + for _, p := range []string{webClientLogoPath, webClientFaviconPath, webAdminLogoPath, webAdminFaviconPath} { + req, err := http.NewRequest(http.MethodGet, p, nil) + assert.NoError(t, err) + rr := executeRequest(req) + checkResponseCode(t, http.StatusNotFound, rr) + } + + webToken, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) + assert.NoError(t, err) + csrfToken, err := getCSRFTokenFromInternalPageMock(webConfigsPath, webToken) + assert.NoError(t, err) + form := make(url.Values) + form.Set(csrfFormToken, csrfToken) + form.Set("form_action", "branding_submit") + form.Set("branding_webadmin_name", "Custom WebAdmin") + form.Set("branding_webadmin_short_name", "WebAdmin") + form.Set("branding_webadmin_disclaimer_name", "Admin disclaimer") + form.Set("branding_webadmin_disclaimer_url", "invalid, not a URL") + form.Set("branding_webclient_name", "Custom WebClient") + form.Set("branding_webclient_short_name", "WebClient") + form.Set("branding_webclient_disclaimer_name", "Client disclaimer") + form.Set("branding_webclient_disclaimer_url", "https://example.com") + b, contentType, err := getMultipartFormData(form, "", "") + assert.NoError(t, err) + req, err := http.NewRequest(http.MethodPost, webConfigsPath, &b) + assert.NoError(t, err) + setJWTCookieForReq(req, webToken) + req.Header.Set("Content-Type", contentType) + rr := executeRequest(req) + checkResponseCode(t, http.StatusOK, rr) + assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidDisclaimerURL) + + form.Set("branding_webadmin_disclaimer_url", "https://example.net") + tmpFile := filepath.Join(os.TempDir(), util.GenerateUniqueID()+".png") + err = createTestPNG(tmpFile, 512, 512, color.RGBA{100, 200, 200, 0xff}) + assert.NoError(t, err) + + b, contentType, err = getMultipartFormData(form, "branding_webadmin_logo", tmpFile) + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) + assert.NoError(t, err) + setJWTCookieForReq(req, webToken) + req.Header.Set("Content-Type", contentType) + rr = executeRequest(req) + checkResponseCode(t, http.StatusOK, rr) + assert.Contains(t, rr.Body.String(), util.I18nConfigsOK) + // check + configs, err := dataprovider.GetConfigs() + assert.NoError(t, err) + assert.Equal(t, "Custom WebAdmin", configs.Branding.WebAdmin.Name) + assert.Equal(t, "WebAdmin", configs.Branding.WebAdmin.ShortName) + assert.Equal(t, "Admin disclaimer", configs.Branding.WebAdmin.DisclaimerName) + assert.Equal(t, "https://example.net", configs.Branding.WebAdmin.DisclaimerURL) + assert.Equal(t, "Custom WebClient", configs.Branding.WebClient.Name) + assert.Equal(t, "WebClient", configs.Branding.WebClient.ShortName) + assert.Equal(t, "Client disclaimer", configs.Branding.WebClient.DisclaimerName) + assert.Equal(t, "https://example.com", configs.Branding.WebClient.DisclaimerURL) + assert.Greater(t, len(configs.Branding.WebAdmin.Logo), 0) + assert.Len(t, configs.Branding.WebAdmin.Favicon, 0) + assert.Len(t, configs.Branding.WebClient.Logo, 0) + assert.Len(t, configs.Branding.WebClient.Favicon, 0) + + err = createTestPNG(tmpFile, 256, 256, color.RGBA{120, 220, 220, 0xff}) + assert.NoError(t, err) + form.Set("branding_webadmin_logo_remove", "0") // 0 preserves WebAdmin logo + b, contentType, err = getMultipartFormData(form, "branding_webadmin_favicon", tmpFile) + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) + assert.NoError(t, err) + setJWTCookieForReq(req, webToken) + req.Header.Set("Content-Type", contentType) + rr = executeRequest(req) + checkResponseCode(t, http.StatusOK, rr) + assert.Contains(t, rr.Body.String(), util.I18nConfigsOK) + configs, err = dataprovider.GetConfigs() + assert.NoError(t, err) + assert.Equal(t, "Custom WebAdmin", configs.Branding.WebAdmin.Name) + assert.Equal(t, "WebAdmin", configs.Branding.WebAdmin.ShortName) + assert.Equal(t, "Admin disclaimer", configs.Branding.WebAdmin.DisclaimerName) + assert.Equal(t, "https://example.net", configs.Branding.WebAdmin.DisclaimerURL) + assert.Equal(t, "Custom WebClient", configs.Branding.WebClient.Name) + assert.Equal(t, "WebClient", configs.Branding.WebClient.ShortName) + assert.Equal(t, "Client disclaimer", configs.Branding.WebClient.DisclaimerName) + assert.Equal(t, "https://example.com", configs.Branding.WebClient.DisclaimerURL) + assert.Greater(t, len(configs.Branding.WebAdmin.Logo), 0) + assert.Greater(t, len(configs.Branding.WebAdmin.Favicon), 0) + assert.Len(t, configs.Branding.WebClient.Logo, 0) + assert.Len(t, configs.Branding.WebClient.Favicon, 0) + + err = createTestPNG(tmpFile, 256, 256, color.RGBA{80, 90, 110, 0xff}) + assert.NoError(t, err) + b, contentType, err = getMultipartFormData(form, "branding_webclient_logo", tmpFile) + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) + assert.NoError(t, err) + setJWTCookieForReq(req, webToken) + req.Header.Set("Content-Type", contentType) + rr = executeRequest(req) + checkResponseCode(t, http.StatusOK, rr) + assert.Contains(t, rr.Body.String(), util.I18nConfigsOK) + configs, err = dataprovider.GetConfigs() + assert.NoError(t, err) + assert.Greater(t, len(configs.Branding.WebClient.Logo), 0) + + err = createTestPNG(tmpFile, 256, 256, color.RGBA{120, 50, 120, 0xff}) + assert.NoError(t, err) + b, contentType, err = getMultipartFormData(form, "branding_webclient_favicon", tmpFile) + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) + assert.NoError(t, err) + setJWTCookieForReq(req, webToken) + req.Header.Set("Content-Type", contentType) + rr = executeRequest(req) + checkResponseCode(t, http.StatusOK, rr) + assert.Contains(t, rr.Body.String(), util.I18nConfigsOK) + configs, err = dataprovider.GetConfigs() + assert.NoError(t, err) + assert.Greater(t, len(configs.Branding.WebClient.Favicon), 0) + + for _, p := range []string{webClientLogoPath, webClientFaviconPath, webAdminLogoPath, webAdminFaviconPath} { + req, err := http.NewRequest(http.MethodGet, p, nil) + assert.NoError(t, err) + rr := executeRequest(req) + checkResponseCode(t, http.StatusOK, rr) + } + // remove images + form.Set("branding_webadmin_logo_remove", "1") + form.Set("branding_webclient_logo_remove", "1") + form.Set("branding_webadmin_favicon_remove", "1") + form.Set("branding_webclient_favicon_remove", "1") + b, contentType, err = getMultipartFormData(form, "", "") + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) + assert.NoError(t, err) + setJWTCookieForReq(req, webToken) + req.Header.Set("Content-Type", contentType) + rr = executeRequest(req) + checkResponseCode(t, http.StatusOK, rr) + assert.Contains(t, rr.Body.String(), util.I18nConfigsOK) + configs, err = dataprovider.GetConfigs() + assert.NoError(t, err) + assert.Len(t, configs.Branding.WebAdmin.Logo, 0) + assert.Len(t, configs.Branding.WebAdmin.Favicon, 0) + assert.Len(t, configs.Branding.WebClient.Logo, 0) + assert.Len(t, configs.Branding.WebClient.Favicon, 0) + for _, p := range []string{webClientLogoPath, webClientFaviconPath, webAdminLogoPath, webAdminFaviconPath} { + req, err := http.NewRequest(http.MethodGet, p, nil) + assert.NoError(t, err) + rr := executeRequest(req) + checkResponseCode(t, http.StatusNotFound, rr) + } + form.Del("branding_webadmin_logo_remove") + form.Del("branding_webclient_logo_remove") + form.Del("branding_webadmin_favicon_remove") + form.Del("branding_webclient_favicon_remove") + // image too large + err = createTestPNG(tmpFile, 768, 512, color.RGBA{120, 50, 120, 0xff}) + assert.NoError(t, err) + b, contentType, err = getMultipartFormData(form, "branding_webclient_logo", tmpFile) + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) + assert.NoError(t, err) + setJWTCookieForReq(req, webToken) + req.Header.Set("Content-Type", contentType) + rr = executeRequest(req) + checkResponseCode(t, http.StatusOK, rr) + assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidPNGSize) + // not a png image + err = createTestFile(tmpFile, 128) + assert.NoError(t, err) + b, contentType, err = getMultipartFormData(form, "branding_webclient_logo", tmpFile) + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webConfigsPath, &b) + assert.NoError(t, err) + setJWTCookieForReq(req, webToken) + req.Header.Set("Content-Type", contentType) + rr = executeRequest(req) + checkResponseCode(t, http.StatusOK, rr) + assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidPNG) + + err = os.Remove(tmpFile) + assert.NoError(t, err) + err = dataprovider.UpdateConfigs(nil, "", "", "") + assert.NoError(t, err) +} + func TestSFTPLoopError(t *testing.T) { user1 := getTestUser() user2 := getTestUser() @@ -13464,7 +14475,7 @@ func TestSFTPLoopError(t *testing.T) { err = smtpCfg.Initialize(configDir, true) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + loginCookie, csrfToken, err := getCSRFTokenMock(webLoginPath, defaultRemoteAddr) assert.NoError(t, err) form := make(url.Values) form.Set(csrfFormToken, csrfToken) @@ -13473,10 +14484,14 @@ func TestSFTPLoopError(t *testing.T) { req, err := http.NewRequest(http.MethodPost, webClientForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr := executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) assert.GreaterOrEqual(t, len(lastResetCode), 20) + + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) + assert.NoError(t, err) form = make(url.Values) form.Set(csrfFormToken, csrfToken) form.Set("password", defaultPassword) @@ -13485,6 +14500,7 @@ func TestSFTPLoopError(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webClientResetPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusOK, rr.Code) @@ -13544,8 +14560,6 @@ func TestWebClientChangePwd(t *testing.T) { assert.NoError(t, err) webToken, err := getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webClientLoginPath) - assert.NoError(t, err) req, err := http.NewRequest(http.MethodGet, webChangeClientPwdPath, nil) assert.NoError(t, err) @@ -13568,6 +14582,8 @@ func TestWebClientChangePwd(t *testing.T) { checkResponseCode(t, http.StatusForbidden, rr) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCSRF) + csrfToken, err := getCSRFTokenFromInternalPageMock(webChangeClientPwdPath, webToken) + assert.NoError(t, err) form.Set(csrfFormToken, csrfToken) req, _ = http.NewRequest(http.MethodPost, webChangeClientPwdPath, bytes.NewBuffer([]byte(form.Encode()))) req.RemoteAddr = defaultRemoteAddr @@ -13599,6 +14615,13 @@ func TestWebClientChangePwd(t *testing.T) { checkResponseCode(t, http.StatusFound, rr) assert.Equal(t, webClientLoginPath, rr.Header().Get("Location")) + req, err = http.NewRequest(http.MethodGet, webClientPingPath, nil) + assert.NoError(t, err) + req.RemoteAddr = defaultRemoteAddr + setJWTCookieForReq(req, webToken) + rr = executeRequest(req) + checkResponseCode(t, http.StatusFound, rr) + _, err = getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword) assert.Error(t, err) _, err = getJWTWebClientTokenFromTestServer(defaultUsername+"1", defaultPassword+"1") @@ -13615,6 +14638,9 @@ func TestWebClientChangePwd(t *testing.T) { webToken, err = getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword+"1") assert.NoError(t, err) + csrfToken, err = getCSRFTokenFromInternalPageMock(webClientProfilePath, webToken) + assert.NoError(t, err) + form.Set(csrfFormToken, csrfToken) form.Set("current_password", defaultPassword+"1") form.Set("new_password1", defaultPassword) form.Set("new_password2", defaultPassword) @@ -14043,6 +15069,47 @@ func TestShareUsage(t *testing.T) { executeRequest(req) } +func TestSharePasswordPolicy(t *testing.T) { + g := getTestGroup() + g.UserSettings.Filters.PasswordStrength = 70 + group, _, err := httpdtest.AddGroup(g, http.StatusCreated) + assert.NoError(t, err) + + u := getTestUser() + u.Groups = []sdk.GroupMapping{ + { + Name: g.Name, + Type: sdk.GroupTypePrimary, + }, + } + u.Password = rand.Text() + user, _, err := httpdtest.AddUser(u, http.StatusCreated) + assert.NoError(t, err) + + webAPIToken, err := getJWTAPIUserTokenFromTestServer(defaultUsername, u.Password) + assert.NoError(t, err) + + share := dataprovider.Share{ + Name: util.GenerateUniqueID(), + Scope: dataprovider.ShareScopeRead, + Paths: []string{"/"}, + Password: defaultPassword, + } + asJSON, err := json.Marshal(share) + assert.NoError(t, err) + req, err := http.NewRequest(http.MethodPost, userSharesPath, bytes.NewBuffer(asJSON)) + assert.NoError(t, err) + setBearerForReq(req, webAPIToken) + rr := executeRequest(req) + checkResponseCode(t, http.StatusBadRequest, rr) + assert.Contains(t, rr.Body.String(), "insecure password") + + _, err = httpdtest.RemoveUser(user, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveGroup(group, http.StatusOK) + assert.NoError(t, err) +} + func TestShareMaxExpiration(t *testing.T) { u := getTestUser() u.Filters.MaxSharesExpiration = 5 @@ -14059,8 +15126,6 @@ func TestShareMaxExpiration(t *testing.T) { assert.NoError(t, err) webClientToken, err := getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webClientLoginPath) - assert.NoError(t, err) s := dataprovider.Share{ Name: "test share", @@ -14114,6 +15179,9 @@ func TestShareMaxExpiration(t *testing.T) { rr = executeRequest(req) checkResponseCode(t, http.StatusBadRequest, rr) assert.Contains(t, rr.Body.String(), "share must expire before") + + csrfToken, err := getCSRFTokenFromInternalPageMock(webClientSharePath, webClientToken) + assert.NoError(t, err) form := make(url.Values) form.Set("name", s.Name) form.Set("scope", strconv.Itoa(int(s.Scope))) @@ -14226,12 +15294,13 @@ func TestWebClientShareCredentials(t *testing.T) { checkResponseCode(t, http.StatusOK, rr) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCSRF) // set the CSRF token - csrfToken, err := getCSRFToken(httpBaseURL + webClientLoginPath) + loginCookie, csrfToken, err := getCSRFTokenMock(loginURI, defaultRemoteAddr) assert.NoError(t, err) form.Set(csrfFormToken, csrfToken) req, err = http.NewRequest(http.MethodPost, loginURI, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) @@ -14274,31 +15343,67 @@ func TestWebClientShareCredentials(t *testing.T) { req.RemoteAddr = "1.2.3.4:1234" rr = executeRequest(req) checkResponseCode(t, http.StatusFound, rr) + // logout to a different share, the cookie is not valid. + req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, shareWriteID, "logout"), nil) + assert.NoError(t, err) + req.RequestURI = uri + setJWTCookieForReq(req, cookie) + rr = executeRequest(req) + checkResponseCode(t, http.StatusForbidden, rr) + assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidToken) + // logout + req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, shareReadID, "logout"), nil) + assert.NoError(t, err) + req.RequestURI = uri + setJWTCookieForReq(req, cookie) + rr = executeRequest(req) + checkResponseCode(t, http.StatusFound, rr) + // the cookie is no longer valid + req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, shareReadID, "download?b=c"), nil) + assert.NoError(t, err) + req.RequestURI = uri + setJWTCookieForReq(req, cookie) + rr = executeRequest(req) + checkResponseCode(t, http.StatusFound, rr) + assert.Contains(t, rr.Header().Get("Location"), "/login") + // try to login with invalid credentials + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) + assert.NoError(t, err) + form.Set(csrfFormToken, csrfToken) form.Set("share_password", "") req, err = http.NewRequest(http.MethodPost, loginURI, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCredentials) // login with the next param set + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) + assert.NoError(t, err) + form.Set(csrfFormToken, csrfToken) form.Set("share_password", defaultPassword) nextURI := path.Join(webClientPubSharesPath, shareReadID, "browse") loginURI = path.Join(webClientPubSharesPath, shareReadID, fmt.Sprintf("login?next=%s", url.QueryEscape(nextURI))) req, err = http.NewRequest(http.MethodPost, loginURI, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) checkResponseCode(t, http.StatusFound, rr) assert.Equal(t, nextURI, rr.Header().Get("Location")) // try to login to a missing share + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) + assert.NoError(t, err) + form.Set(csrfFormToken, csrfToken) loginURI = path.Join(webClientPubSharesPath, "missing", "login") req, err = http.NewRequest(http.MethodPost, loginURI, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) @@ -14441,7 +15546,7 @@ func TestShareMaxSessions(t *testing.T) { assert.Contains(t, rr.Body.String(), "too many open sessions") share = dataprovider.Share{ - Name: "test share max sessions read/write", + Name: "test share max sessions read&write", Scope: dataprovider.ShareScopeReadWrite, Paths: []string{"/"}, } @@ -14467,6 +15572,7 @@ func TestShareMaxSessions(t *testing.T) { err = os.RemoveAll(user.GetHomeDir()) assert.NoError(t, err) assert.Len(t, common.Connections.GetStats(""), 0) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func TestShareUploadSingle(t *testing.T) { @@ -15937,7 +17043,7 @@ func TestWebClientExistenceCheck(t *testing.T) { webToken, err := getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webClientProfilePath, webToken) assert.NoError(t, err) req, err := http.NewRequest(http.MethodPost, webClientExistPath, nil) @@ -16296,7 +17402,7 @@ func TestWebGetFiles(t *testing.T) { assert.NoError(t, err) assert.Len(t, dirEntries, 1) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webClientProfilePath, webToken) assert.NoError(t, err) form := make(url.Values) form.Set("files", fmt.Sprintf(`["%s","%s","%s"]`, testFileName, testDir, testFileName+extensions[2])) @@ -16600,7 +17706,8 @@ func TestRenameDifferentResource(t *testing.T) { assert.NoError(t, err) webToken, err := getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webClientLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webClientProfilePath, webToken) + assert.NoError(t, err) getStatusResponse := func(taskID string) int { req, _ := http.NewRequest(http.MethodGet, webClientTasksPath+"/"+url.PathEscape(taskID), nil) @@ -17354,7 +18461,7 @@ func TestWebClientTasksAPI(t *testing.T) { webToken, err := getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webClientLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webClientProfilePath, webToken) assert.NoError(t, err) webToken1, err := getJWTWebClientTokenFromTestServer(user1.Username, defaultPassword) assert.NoError(t, err) @@ -18052,7 +19159,7 @@ func TestWebAPIVFolder(t *testing.T) { folder, _, err := httpdtest.GetFolderByName(folderName, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, int64(len(fileContents)), folder.UsedQuotaSize) + assert.Equal(t, int64(0), folder.UsedQuotaSize) _, err = reader.Seek(0, io.SeekStart) assert.NoError(t, err) @@ -18069,7 +19176,7 @@ func TestWebAPIVFolder(t *testing.T) { folder, _, err = httpdtest.GetFolderByName(folderName, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, int64(len(fileContents)), folder.UsedQuotaSize) + assert.Equal(t, int64(0), folder.UsedQuotaSize) _, err = httpdtest.RemoveUser(user, http.StatusOK) assert.NoError(t, err) @@ -18411,7 +19518,7 @@ func TestCompressionErrorMock(t *testing.T) { webToken, err := getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webClientProfilePath, webToken) assert.NoError(t, err) form := make(url.Values) @@ -18600,6 +19707,7 @@ func TestClientUserClose(t *testing.T) { wg.Wait() assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 100*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) _, err = httpdtest.RemoveUser(user, http.StatusOK) assert.NoError(t, err) @@ -18661,12 +19769,13 @@ func TestWebAdminSetupMock(t *testing.T) { checkResponseCode(t, http.StatusFound, rr) assert.Equal(t, webAdminSetupPath, rr.Header().Get("Location")) - csrfToken, err := getCSRFToken(httpBaseURL + webAdminSetupPath) + loginCookie, csrfToken, err := getCSRFTokenMock(webAdminSetupPath, defaultRemoteAddr) assert.NoError(t, err) form := make(url.Values) req, err = http.NewRequest(http.MethodPost, webAdminSetupPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) checkResponseCode(t, http.StatusForbidden, rr) @@ -18674,6 +19783,7 @@ func TestWebAdminSetupMock(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webAdminSetupPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) @@ -18682,6 +19792,7 @@ func TestWebAdminSetupMock(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webAdminSetupPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) @@ -18690,6 +19801,7 @@ func TestWebAdminSetupMock(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webAdminSetupPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) @@ -18708,6 +19820,7 @@ func TestWebAdminSetupMock(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webAdminSetupPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) @@ -18721,6 +19834,7 @@ func TestWebAdminSetupMock(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webAdminSetupPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) checkResponseCode(t, http.StatusFound, rr) @@ -18850,6 +19964,12 @@ func TestWebAdminLoginMock(t *testing.T) { cookie := rr.Header().Get("Cookie") assert.Empty(t, cookie) + req, _ = http.NewRequest(http.MethodGet, webStatusPath, nil) + req.RemoteAddr = defaultRemoteAddr + setJWTCookieForReq(req, webToken) + rr = executeRequest(req) + checkResponseCode(t, http.StatusFound, rr) + req, _ = http.NewRequest(http.MethodGet, logoutPath, nil) setBearerForReq(req, apiToken) rr = executeRequest(req) @@ -18866,12 +19986,13 @@ func TestWebAdminLoginMock(t *testing.T) { rr = executeRequest(req) checkResponseCode(t, http.StatusFound, rr) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + loginCookie, csrfToken, err := getCSRFTokenMock(webLoginPath, defaultRemoteAddr) assert.NoError(t, err) // now try using wrong password form := getLoginForm(defaultTokenAuthUser, "wrong pwd", csrfToken) req, _ = http.NewRequest(http.MethodPost, webLoginPath, bytes.NewBuffer([]byte(form.Encode()))) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) @@ -18880,6 +20001,7 @@ func TestWebAdminLoginMock(t *testing.T) { form = getLoginForm("wrong username", defaultTokenAuthPass, csrfToken) req, _ = http.NewRequest(http.MethodPost, webLoginPath, bytes.NewBuffer([]byte(form.Encode()))) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) @@ -18894,10 +20016,12 @@ func TestWebAdminLoginMock(t *testing.T) { assert.NoError(t, err) rAddr := "127.1.1.1:1234" - csrfToken, err = getCSRFTokenMock(webLoginPath, rAddr) + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, rAddr) assert.NoError(t, err) + assert.NotEmpty(t, loginCookie) form = getLoginForm(altAdminUsername, altAdminPassword, csrfToken) req, _ = http.NewRequest(http.MethodPost, webLoginPath, bytes.NewBuffer([]byte(form.Encode()))) + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.RemoteAddr = rAddr rr = executeRequest(req) @@ -18905,20 +20029,24 @@ func TestWebAdminLoginMock(t *testing.T) { assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCredentials) rAddr = "10.9.9.9:1234" - csrfToken, err = getCSRFTokenMock(webLoginPath, rAddr) + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, rAddr) assert.NoError(t, err) + assert.NotEmpty(t, loginCookie) form = getLoginForm(altAdminUsername, altAdminPassword, csrfToken) req, _ = http.NewRequest(http.MethodPost, webLoginPath, bytes.NewBuffer([]byte(form.Encode()))) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.RemoteAddr = rAddr + setLoginCookie(req, loginCookie) rr = executeRequest(req) checkResponseCode(t, http.StatusFound, rr) rAddr = "127.0.1.1:4567" - csrfToken, err = getCSRFTokenMock(webLoginPath, rAddr) + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, rAddr) assert.NoError(t, err) + assert.NotEmpty(t, loginCookie) form = getLoginForm(altAdminUsername, altAdminPassword, csrfToken) req, _ = http.NewRequest(http.MethodPost, webLoginPath, bytes.NewBuffer([]byte(form.Encode()))) + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.RemoteAddr = rAddr req.Header.Set("X-Forwarded-For", "10.9.9.9") @@ -18967,10 +20095,10 @@ func TestWebUserShare(t *testing.T) { user, _, err := httpdtest.AddUser(getTestUser(), http.StatusCreated) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webClientLoginPath) - assert.NoError(t, err) token, err := getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) + csrfToken, err := getCSRFTokenFromInternalPageMock(webClientProfilePath, token) + assert.NoError(t, err) userAPItoken, err := getJWTAPIUserTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) @@ -19208,10 +20336,10 @@ func TestWebUserShareNoPasswordDisabled(t *testing.T) { user.Filters.DefaultSharesExpiration = 30 user, _, err = httpdtest.UpdateUser(u, http.StatusOK, "") assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webClientLoginPath) - assert.NoError(t, err) token, err := getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) + csrfToken, err := getCSRFTokenFromInternalPageMock(webClientSharePath, token) + assert.NoError(t, err) userAPItoken, err := getJWTAPIUserTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) @@ -19292,14 +20420,75 @@ func TestWebUserShareNoPasswordDisabled(t *testing.T) { assert.NoError(t, err) } +func TestInvalidCSRF(t *testing.T) { + user, _, err := httpdtest.AddUser(getTestUser(), http.StatusCreated) + assert.NoError(t, err) + + for _, loginURL := range []string{webClientLoginPath, webLoginPath} { + // try using an invalid CSRF token + loginCookie1, csrfToken1, err := getCSRFTokenMock(loginURL, defaultRemoteAddr) + assert.NoError(t, err) + assert.NotEmpty(t, loginCookie1) + assert.NotEmpty(t, csrfToken1) + loginCookie2, csrfToken2, err := getCSRFTokenMock(loginURL, defaultRemoteAddr) + assert.NoError(t, err) + assert.NotEmpty(t, loginCookie2) + assert.NotEmpty(t, csrfToken2) + rAddr := "1.2.3.4" + loginCookie3, csrfToken3, err := getCSRFTokenMock(loginURL, rAddr) + assert.NoError(t, err) + assert.NotEmpty(t, loginCookie3) + assert.NotEmpty(t, csrfToken3) + + form := getLoginForm(defaultUsername, defaultPassword, csrfToken1) + req, err := http.NewRequest(http.MethodPost, loginURL, bytes.NewBuffer([]byte(form.Encode()))) + assert.NoError(t, err) + req.RemoteAddr = defaultRemoteAddr + req.RequestURI = loginURL + setLoginCookie(req, loginCookie2) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + rr := executeRequest(req) + checkResponseCode(t, http.StatusOK, rr) + assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCSRF) + + // use a CSRF token as login cookie (invalid audience) + form = getLoginForm(defaultUsername, defaultPassword, csrfToken1) + req, err = http.NewRequest(http.MethodPost, loginURL, bytes.NewBuffer([]byte(form.Encode()))) + assert.NoError(t, err) + req.RemoteAddr = defaultRemoteAddr + req.RequestURI = loginURL + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", csrfToken1)) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + rr = executeRequest(req) + checkResponseCode(t, http.StatusOK, rr) + assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCSRF) + // invalid IP + form = getLoginForm(defaultUsername, defaultPassword, csrfToken3) + req, err = http.NewRequest(http.MethodPost, loginURL, bytes.NewBuffer([]byte(form.Encode()))) + assert.NoError(t, err) + req.RemoteAddr = defaultRemoteAddr + req.RequestURI = loginURL + setLoginCookie(req, loginCookie3) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + rr = executeRequest(req) + checkResponseCode(t, http.StatusOK, rr) + assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCSRF) + } + + err = os.RemoveAll(user.GetHomeDir()) + assert.NoError(t, err) + _, err = httpdtest.RemoveUser(user, http.StatusOK) + assert.NoError(t, err) +} + func TestWebUserProfile(t *testing.T) { user, _, err := httpdtest.AddUser(getTestUser(), http.StatusCreated) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webClientLoginPath) - assert.NoError(t, err) token, err := getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) + csrfToken, err := getCSRFTokenFromInternalPageMock(webClientProfilePath, token) + assert.NoError(t, err) email := "user@user.com" description := "User" @@ -19311,6 +20500,7 @@ func TestWebUserProfile(t *testing.T) { form.Set("public_keys[0][public_key]", testPubKey) form.Set("public_keys[1][public_key]", testPubKey1) form.Set("tls_certs[0][tls_cert]", httpsCert) + form.Set("additional_emails[0][additional_email]", "email1@user.com") // no csrf token req, err := http.NewRequest(http.MethodPost, webClientProfilePath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) @@ -19337,6 +20527,9 @@ func TestWebUserProfile(t *testing.T) { assert.Len(t, user.Filters.TLSCerts, 1) assert.Equal(t, email, user.Email) assert.Equal(t, description, user.Description) + if assert.Len(t, user.Filters.AdditionalEmails, 1) { + assert.Equal(t, "email1@user.com", user.Filters.AdditionalEmails[0]) + } // set an invalid email form.Set("email", "not an email") @@ -19375,6 +20568,8 @@ func TestWebUserProfile(t *testing.T) { assert.NoError(t, err) token, err = getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) + csrfToken, err = getCSRFTokenFromInternalPageMock(webClientProfilePath, token) + assert.NoError(t, err) form.Set("allow_api_key_auth", "0") form.Set(csrfFormToken, csrfToken) @@ -19399,9 +20594,12 @@ func TestWebUserProfile(t *testing.T) { assert.NoError(t, err) token, err = getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) + csrfToken, err = getCSRFTokenFromInternalPageMock(webClientProfilePath, token) + assert.NoError(t, err) form.Set("public_keys[0][public_key]", testPubKey) form.Set("public_keys[1][public_key]", testPubKey1) form.Set("tls_certs[0][tls_cert]", "") + form.Set(csrfFormToken, csrfToken) req, _ = http.NewRequest(http.MethodPost, webClientProfilePath, bytes.NewBuffer([]byte(form.Encode()))) req.RemoteAddr = defaultRemoteAddr req.Header.Set("Content-Type", "application/x-www-form-urlencoded") @@ -19422,8 +20620,11 @@ func TestWebUserProfile(t *testing.T) { assert.NoError(t, err) token, err = getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) + csrfToken, err = getCSRFTokenFromInternalPageMock(webClientProfilePath, token) + assert.NoError(t, err) form.Set("email", "newemail@user.com") form.Set("description", "new description") + form.Set(csrfFormToken, csrfToken) req, _ = http.NewRequest(http.MethodPost, webClientProfilePath, bytes.NewBuffer([]byte(form.Encode()))) req.RemoteAddr = defaultRemoteAddr req.Header.Set("Content-Type", "application/x-www-form-urlencoded") @@ -19445,6 +20646,9 @@ func TestWebUserProfile(t *testing.T) { assert.NoError(t, err) token, err = getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword) assert.NoError(t, err) + csrfToken, err = getCSRFTokenFromInternalPageMock(webChangeClientPwdPath, token) + assert.NoError(t, err) + form.Set(csrfFormToken, csrfToken) req, _ = http.NewRequest(http.MethodPost, webClientProfilePath, bytes.NewBuffer([]byte(form.Encode()))) req.RemoteAddr = defaultRemoteAddr req.Header.Set("Content-Type", "application/x-www-form-urlencoded") @@ -19475,7 +20679,7 @@ func TestWebAdminProfile(t *testing.T) { assert.NoError(t, err) token, err := getJWTWebTokenFromTestServer(admin.Username, altAdminPassword) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webAdminProfilePath, token) assert.NoError(t, err) req, err := http.NewRequest(http.MethodGet, webAdminProfilePath, nil) assert.NoError(t, err) @@ -19552,7 +20756,7 @@ func TestWebAdminPwdChange(t *testing.T) { token, err := getJWTWebTokenFromTestServer(admin.Username, altAdminPassword) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webChangeAdminPwdPath, token) assert.NoError(t, err) req, err := http.NewRequest(http.MethodGet, webChangeAdminPwdPath, nil) assert.NoError(t, err) @@ -20021,7 +21225,7 @@ func TestBasicWebUsersMock(t *testing.T) { setJWTCookieForReq(req, webToken) rr = executeRequest(req) checkResponseCode(t, http.StatusNotFound, rr) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webUserPath, webToken) assert.NoError(t, err) form := make(url.Values) form.Set("username", user.Username) @@ -20083,7 +21287,7 @@ func TestWebAdminBasicMock(t *testing.T) { admin := getTestAdmin() admin.Username = altAdminUsername admin.Password = altAdminPassword - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webAdminPath, token) assert.NoError(t, err) form := make(url.Values) form.Set("username", admin.Username) @@ -20127,13 +21331,6 @@ func TestWebAdminBasicMock(t *testing.T) { assert.Contains(t, rr.Body.String(), util.I18nError500Message) form.Set("default_users_expiration", "10") - req, _ = http.NewRequest(http.MethodPost, webAdminPath, bytes.NewBuffer([]byte(form.Encode()))) - req.RemoteAddr = defaultRemoteAddr - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - setJWTCookieForReq(req, token) - rr = executeRequest(req) - checkResponseCode(t, http.StatusOK, rr) - form.Set("password", admin.Password) req, _ = http.NewRequest(http.MethodPost, webAdminPath, bytes.NewBuffer([]byte(form.Encode()))) req.RemoteAddr = defaultRemoteAddr @@ -20163,6 +21360,17 @@ func TestWebAdminBasicMock(t *testing.T) { checkResponseCode(t, http.StatusForbidden, rr) assert.Contains(t, rr.Body.String(), "Invalid token") + req, err = http.NewRequest(http.MethodPost, webAdminTOTPSavePath, bytes.NewBuffer(asJSON)) + assert.NoError(t, err) + setJWTCookieForReq(req, altToken) + setCSRFHeaderForReq(req, csrfToken) // invalid CSRF token + req.RemoteAddr = defaultRemoteAddr + rr = executeRequest(req) + checkResponseCode(t, http.StatusForbidden, rr) + assert.Contains(t, rr.Body.String(), "the token is not valid") + + csrfToken, err = getCSRFTokenFromInternalPageMock(webAdminPath, altToken) + assert.NoError(t, err) req, err = http.NewRequest(http.MethodPost, webAdminTOTPSavePath, bytes.NewBuffer(asJSON)) assert.NoError(t, err) setJWTCookieForReq(req, altToken) @@ -20239,7 +21447,7 @@ func TestWebAdminBasicMock(t *testing.T) { rr = executeRequest(req) checkResponseCode(t, http.StatusSeeOther, rr) - form.Set(csrfFormToken, "invalid csrf") + form.Set(csrfFormToken, csrfToken) // associated to altToken req, _ = http.NewRequest(http.MethodPost, path.Join(webAdminPath, altAdminUsername), bytes.NewBuffer([]byte(form.Encode()))) req.RemoteAddr = defaultRemoteAddr req.Header.Set("Content-Type", "application/x-www-form-urlencoded") @@ -20248,6 +21456,8 @@ func TestWebAdminBasicMock(t *testing.T) { checkResponseCode(t, http.StatusForbidden, rr) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCSRF) + csrfToken, err = getCSRFTokenFromInternalPageMock(webAdminPath, token) + assert.NoError(t, err) form.Set(csrfFormToken, csrfToken) form.Set("email", "not-an-email") req, _ = http.NewRequest(http.MethodPost, path.Join(webAdminPath, altAdminUsername), bytes.NewBuffer([]byte(form.Encode()))) @@ -20357,7 +21567,7 @@ func TestWebAdminGroupsMock(t *testing.T) { admin := getTestAdmin() admin.Username = altAdminUsername admin.Password = altAdminPassword - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webAdminPath, token) assert.NoError(t, err) form := make(url.Values) form.Set(csrfFormToken, csrfToken) @@ -20495,7 +21705,7 @@ func TestAdminUpdateSelfMock(t *testing.T) { assert.NoError(t, err) token, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webAdminPath, token) assert.NoError(t, err) form := make(url.Values) form.Set("username", admin.Username) @@ -20553,9 +21763,8 @@ func TestWebMaintenanceMock(t *testing.T) { setJWTCookieForReq(req, token) rr := executeRequest(req) checkResponseCode(t, http.StatusOK, rr) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webMaintenancePath, token) assert.NoError(t, err) - form := make(url.Values) form.Set("mode", "a") b, contentType, _ := getMultipartFormData(form, "", "") @@ -20674,7 +21883,7 @@ func TestWebUserAddMock(t *testing.T) { assert.NoError(t, err) apiToken, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webUserPath, webToken) assert.NoError(t, err) group1 := getTestGroup() group1.Name += "_1" @@ -20697,6 +21906,7 @@ func TestWebUserAddMock(t *testing.T) { user.AdditionalInfo = "info" user.Description = "user dsc" user.Email = "test@test.com" + user.Filters.AdditionalEmails = []string{"example1@test.com", "example2@test.com"} mappedDir := filepath.Join(os.TempDir(), "mapped") folderName := filepath.Base(mappedDir) f := vfs.BaseVirtualFolder{ @@ -20714,6 +21924,8 @@ func TestWebUserAddMock(t *testing.T) { form.Set(csrfFormToken, csrfToken) form.Set("username", user.Username) form.Set("email", user.Email) + form.Set("additional_emails[0][additional_email]", user.Filters.AdditionalEmails[0]) + form.Set("additional_emails[1][additional_email]", user.Filters.AdditionalEmails[1]) form.Set("home_dir", user.HomeDir) form.Set("osfs_read_buffer_size", "2") form.Set("osfs_write_buffer_size", "3") @@ -21040,6 +22252,7 @@ func TestWebUserAddMock(t *testing.T) { assert.True(t, newUser.Filters.DisableFsChecks) assert.False(t, newUser.Filters.AllowAPIKeyAuth) assert.Equal(t, user.Email, newUser.Email) + assert.Equal(t, len(user.Filters.AdditionalEmails), len(newUser.Filters.AdditionalEmails)) assert.Equal(t, "/start/dir", newUser.Filters.StartDirectory) assert.Equal(t, 0, newUser.Filters.FTPSecurity) assert.Equal(t, 10, newUser.Filters.DefaultSharesExpiration) @@ -21048,10 +22261,10 @@ func TestWebUserAddMock(t *testing.T) { assert.Equal(t, 60, newUser.Filters.PasswordStrength) assert.Greater(t, newUser.LastPasswordChange, int64(0)) assert.True(t, newUser.Filters.RequirePasswordChange) - assert.True(t, util.Contains(newUser.PublicKeys, testPubKey)) + assert.True(t, slices.Contains(newUser.PublicKeys, testPubKey)) if val, ok := newUser.Permissions["/subdir"]; ok { - assert.True(t, util.Contains(val, dataprovider.PermListItems)) - assert.True(t, util.Contains(val, dataprovider.PermDownload)) + assert.True(t, slices.Contains(val, dataprovider.PermListItems)) + assert.True(t, slices.Contains(val, dataprovider.PermDownload)) } else { assert.Fail(t, "user permissions must contain /somedir", "actual: %v", newUser.Permissions) } @@ -21070,20 +22283,20 @@ func TestWebUserAddMock(t *testing.T) { case "/dir1": assert.Len(t, filter.DeniedPatterns, 1) assert.Len(t, filter.AllowedPatterns, 1) - assert.True(t, util.Contains(filter.AllowedPatterns, "*.png")) - assert.True(t, util.Contains(filter.DeniedPatterns, "*.zip")) + assert.True(t, slices.Contains(filter.AllowedPatterns, "*.png")) + assert.True(t, slices.Contains(filter.DeniedPatterns, "*.zip")) assert.Equal(t, sdk.DenyPolicyDefault, filter.DenyPolicy) case "/dir2": assert.Len(t, filter.DeniedPatterns, 1) assert.Len(t, filter.AllowedPatterns, 2) - assert.True(t, util.Contains(filter.AllowedPatterns, "*.jpg")) - assert.True(t, util.Contains(filter.AllowedPatterns, "*.png")) - assert.True(t, util.Contains(filter.DeniedPatterns, "*.mkv")) + assert.True(t, slices.Contains(filter.AllowedPatterns, "*.jpg")) + assert.True(t, slices.Contains(filter.AllowedPatterns, "*.png")) + assert.True(t, slices.Contains(filter.DeniedPatterns, "*.mkv")) assert.Equal(t, sdk.DenyPolicyHide, filter.DenyPolicy) case "/dir3": assert.Len(t, filter.DeniedPatterns, 1) assert.Len(t, filter.AllowedPatterns, 0) - assert.True(t, util.Contains(filter.DeniedPatterns, "*.rar")) + assert.True(t, slices.Contains(filter.DeniedPatterns, "*.rar")) assert.Equal(t, sdk.DenyPolicyDefault, filter.DenyPolicy) } } @@ -21129,8 +22342,6 @@ func TestWebUserUpdateMock(t *testing.T) { assert.NoError(t, err) apiToken, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) - assert.NoError(t, err) user := getTestUser() user.Filters.BandwidthLimits = []sdk.BandwidthLimit{ { @@ -21169,6 +22380,8 @@ func TestWebUserUpdateMock(t *testing.T) { checkResponseCode(t, http.StatusForbidden, rr) assert.Contains(t, rr.Body.String(), "Invalid token") + csrfToken, err := getCSRFTokenFromInternalPageMock(webClientProfilePath, userToken) + assert.NoError(t, err) req, err = http.NewRequest(http.MethodPost, webClientTOTPSavePath, bytes.NewBuffer(asJSON)) assert.NoError(t, err) setJWTCookieForReq(req, userToken) @@ -21253,6 +22466,8 @@ func TestWebUserUpdateMock(t *testing.T) { checkResponseCode(t, http.StatusForbidden, rr) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCSRF) + csrfToken, err = getCSRFTokenFromInternalPageMock(webUserPath, webToken) + assert.NoError(t, err) form.Set(csrfFormToken, csrfToken) b, contentType, _ = getMultipartFormData(form, "", "") req, _ = http.NewRequest(http.MethodPost, path.Join(webUserPath, user.Username), &b) @@ -21322,16 +22537,16 @@ func TestWebUserUpdateMock(t *testing.T) { assert.Equal(t, 40, updateUser.Filters.PasswordStrength) assert.True(t, updateUser.Filters.RequirePasswordChange) if val, ok := updateUser.Permissions["/otherdir"]; ok { - assert.True(t, util.Contains(val, dataprovider.PermListItems)) - assert.True(t, util.Contains(val, dataprovider.PermUpload)) + assert.True(t, slices.Contains(val, dataprovider.PermListItems)) + assert.True(t, slices.Contains(val, dataprovider.PermUpload)) } else { assert.Fail(t, "user permissions must contains /otherdir", "actual: %v", updateUser.Permissions) } - assert.True(t, util.Contains(updateUser.Filters.AllowedIP, "192.168.1.3/32")) - assert.True(t, util.Contains(updateUser.Filters.DeniedIP, "10.0.0.2/32")) - assert.True(t, util.Contains(updateUser.Filters.DeniedLoginMethods, dataprovider.SSHLoginMethodKeyboardInteractive)) - assert.True(t, util.Contains(updateUser.Filters.DeniedProtocols, common.ProtocolFTP)) - assert.True(t, util.Contains(updateUser.Filters.FilePatterns[0].DeniedPatterns, "*.zip")) + assert.True(t, slices.Contains(updateUser.Filters.AllowedIP, "192.168.1.3/32")) + assert.True(t, slices.Contains(updateUser.Filters.DeniedIP, "10.0.0.2/32")) + assert.True(t, slices.Contains(updateUser.Filters.DeniedLoginMethods, dataprovider.SSHLoginMethodKeyboardInteractive)) + assert.True(t, slices.Contains(updateUser.Filters.DeniedProtocols, common.ProtocolFTP)) + assert.True(t, slices.Contains(updateUser.Filters.FilePatterns[0].DeniedPatterns, "*.zip")) assert.Len(t, updateUser.Filters.BandwidthLimits, 0) assert.Len(t, updateUser.Filters.TLSCerts, 1) req, err = http.NewRequest(http.MethodDelete, path.Join(userPath, user.Username), nil) @@ -21402,112 +22617,10 @@ func TestRenderUserTemplateMock(t *testing.T) { assert.NoError(t, err) } -func TestUserTemplateWithFoldersMock(t *testing.T) { - folder := vfs.BaseVirtualFolder{ - Name: "vfolder", - MappedPath: filepath.Join(os.TempDir(), "mapped"), - Description: "vfolder desc with spéciàl ch@rs", - } - - token, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) - assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) - assert.NoError(t, err) - user := getTestUser() - form := make(url.Values) - form.Set("username", user.Username) - form.Set("home_dir", filepath.Join(os.TempDir(), "%username%")) - form.Set("uid", strconv.FormatInt(int64(user.UID), 10)) - form.Set("gid", strconv.FormatInt(int64(user.GID), 10)) - form.Set("max_sessions", strconv.FormatInt(int64(user.MaxSessions), 10)) - form.Set("quota_size", strconv.FormatInt(user.QuotaSize, 10)) - form.Set("quota_files", strconv.FormatInt(int64(user.QuotaFiles), 10)) - form.Set("upload_bandwidth", "0") - form.Set("download_bandwidth", "0") - form.Set("upload_data_transfer", "0") - form.Set("download_data_transfer", "0") - form.Set("total_data_transfer", "0") - form.Set("permissions", "*") - form.Set("status", strconv.Itoa(user.Status)) - form.Set("expiration_date", "2020-01-01 00:00:00") - form.Set("fs_provider", "0") - form.Set("max_upload_file_size", "0") - form.Set("default_shares_expiration", "0") - form.Set("max_shares_expiration", "0") - form.Set("password_expiration", "0") - form.Set("password_strength", "0") - form.Set("ftp_security", "1") - form.Set("external_auth_cache_time", "0") - form.Set("description", "desc %username% %password%") - form.Set("start_directory", "/base/%username%") - form.Set("vfolder_path", "/vdir%username%") - form.Set("vfolder_name", folder.Name) - form.Set("vfolder_quota_size", "-1") - form.Set("vfolder_quota_files", "-1") - form.Add("tpl_username", "auser1") - form.Add("tpl_password", "password1") - form.Add("tpl_public_keys", " ") - form.Add("tpl_username", "auser2") - form.Add("tpl_password", "password2") - form.Add("tpl_public_keys", testPubKey) - form.Add("tpl_username", "auser1") - form.Add("tpl_password", "password") - form.Add("tpl_public_keys", "") - form.Set("form_action", "export_from_template") - b, contentType, _ := getMultipartFormData(form, "", "") - req, _ := http.NewRequest(http.MethodPost, webTemplateUser, &b) - setJWTCookieForReq(req, token) - req.Header.Set("Content-Type", contentType) - rr := executeRequest(req) - checkResponseCode(t, http.StatusForbidden, rr) - require.Contains(t, rr.Body.String(), util.I18nErrorInvalidCSRF) - - folder, resp, err := httpdtest.AddFolder(folder, http.StatusCreated) - assert.NoError(t, err, string(resp)) - - form.Set(csrfFormToken, csrfToken) - b, contentType, _ = getMultipartFormData(form, "", "") - req, _ = http.NewRequest(http.MethodPost, webTemplateUser, &b) - setJWTCookieForReq(req, token) - req.Header.Set("Content-Type", contentType) - rr = executeRequest(req) - checkResponseCode(t, http.StatusOK, rr) - - var dump dataprovider.BackupData - err = json.Unmarshal(rr.Body.Bytes(), &dump) - assert.NoError(t, err) - assert.Len(t, dump.Users, 2) - assert.Len(t, dump.Folders, 1) - user1 := dump.Users[0] - user2 := dump.Users[1] - folder1 := dump.Folders[0] - assert.Equal(t, "auser1", user1.Username) - assert.Equal(t, "auser2", user2.Username) - assert.Equal(t, "desc auser1 password1", user1.Description) - assert.Equal(t, "desc auser2 password2", user2.Description) - assert.Equal(t, filepath.Join(os.TempDir(), user1.Username), user1.HomeDir) - assert.Equal(t, filepath.Join(os.TempDir(), user2.Username), user2.HomeDir) - assert.Equal(t, path.Join("/base", user1.Username), user1.Filters.StartDirectory) - assert.Equal(t, path.Join("/base", user2.Username), user2.Filters.StartDirectory) - assert.Equal(t, 0, user2.Filters.DefaultSharesExpiration) - assert.Equal(t, folder.Name, folder1.Name) - assert.Len(t, user1.PublicKeys, 0) - assert.Len(t, user2.PublicKeys, 1) - assert.Len(t, user1.VirtualFolders, 1) - assert.Len(t, user2.VirtualFolders, 1) - assert.Equal(t, "/vdirauser1", user1.VirtualFolders[0].VirtualPath) - assert.Equal(t, "/vdirauser2", user2.VirtualFolders[0].VirtualPath) - assert.Equal(t, 1, user1.Filters.FTPSecurity) - assert.Equal(t, 1, user2.Filters.FTPSecurity) - - _, err = httpdtest.RemoveFolder(folder, http.StatusOK) - assert.NoError(t, err) -} - func TestUserSaveFromTemplateMock(t *testing.T) { token, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webTemplateFolder, token) assert.NoError(t, err) user1 := "u1" user2 := "u2" @@ -21539,18 +22652,48 @@ func TestUserSaveFromTemplateMock(t *testing.T) { form.Add("template_users[0][tpl_public_keys]", " ") form.Add("template_users[1][tpl_username]", user2) form.Add("template_users[1][tpl_public_keys]", testPubKey) - form.Set(csrfFormToken, csrfToken) b, contentType, _ := getMultipartFormData(form, "", "") req, _ := http.NewRequest(http.MethodPost, webTemplateUser, &b) setJWTCookieForReq(req, token) req.Header.Set("Content-Type", contentType) rr := executeRequest(req) + checkResponseCode(t, http.StatusForbidden, rr) + assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCSRF) + + form.Set(csrfFormToken, csrfToken) + b, contentType, _ = getMultipartFormData(form, "", "") + req, _ = http.NewRequest(http.MethodPost, webTemplateUser, &b) + setJWTCookieForReq(req, token) + req.Header.Set("Content-Type", contentType) + rr = executeRequest(req) checkResponseCode(t, http.StatusSeeOther, rr) u1, _, err := httpdtest.GetUserByUsername(user1, http.StatusOK) assert.NoError(t, err) + assert.False(t, u1.Filters.RequirePasswordChange) u2, _, err := httpdtest.GetUserByUsername(user2, http.StatusOK) assert.NoError(t, err) + assert.False(t, u2.Filters.RequirePasswordChange) + + _, err = httpdtest.RemoveUser(u1, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveUser(u2, http.StatusOK) + assert.NoError(t, err) + + form.Add("tpl_require_password_change", "checked") + b, contentType, _ = getMultipartFormData(form, "", "") + req, _ = http.NewRequest(http.MethodPost, webTemplateUser, &b) + setJWTCookieForReq(req, token) + req.Header.Set("Content-Type", contentType) + rr = executeRequest(req) + checkResponseCode(t, http.StatusSeeOther, rr) + + u1, _, err = httpdtest.GetUserByUsername(user1, http.StatusOK) + assert.NoError(t, err) + assert.True(t, u1.Filters.RequirePasswordChange) + u2, _, err = httpdtest.GetUserByUsername(user2, http.StatusOK) + assert.NoError(t, err) + assert.True(t, u2.Filters.RequirePasswordChange) _, err = httpdtest.RemoveUser(u1, http.StatusOK) assert.NoError(t, err) @@ -21577,9 +22720,11 @@ func TestUserSaveFromTemplateMock(t *testing.T) { assert.NoError(t, err) } -func TestUserTemplateMock(t *testing.T) { +func TestUserTemplateErrors(t *testing.T) { token, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) + csrfToken, err := getCSRFTokenFromInternalPageMock(webTemplateFolder, token) + assert.NoError(t, err) user := getTestUser() user.FsConfig.Provider = sdk.S3FilesystemProvider user.FsConfig.S3Config.Bucket = "test" @@ -21590,8 +22735,6 @@ func TestUserTemplateMock(t *testing.T) { user.FsConfig.S3Config.UploadConcurrency = 4 user.FsConfig.S3Config.DownloadPartSize = 6 user.FsConfig.S3Config.DownloadConcurrency = 3 - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) - assert.NoError(t, err) form := make(url.Values) form.Set(csrfFormToken, csrfToken) form.Set("username", user.Username) @@ -21617,6 +22760,7 @@ func TestUserTemplateMock(t *testing.T) { form.Set("s3_region", user.FsConfig.S3Config.Region) form.Set("s3_access_key", "%username%") form.Set("s3_access_secret", "%password%") + form.Set("s3_sse_customer_key", "%password%") form.Set("s3_key_prefix", "base/%username%") form.Set("max_upload_file_size", "0") form.Set("default_shares_expiration", "0") @@ -21641,13 +22785,14 @@ func TestUserTemplateMock(t *testing.T) { form.Set("s3_upload_concurrency", strconv.Itoa(user.FsConfig.S3Config.UploadConcurrency)) form.Set("s3_download_part_size", strconv.FormatInt(user.FsConfig.S3Config.DownloadPartSize, 10)) form.Set("s3_download_concurrency", strconv.Itoa(user.FsConfig.S3Config.DownloadConcurrency)) - + // no user defined b, contentType, _ = getMultipartFormData(form, "", "") req, _ = http.NewRequest(http.MethodPost, webTemplateUser, &b) setJWTCookieForReq(req, token) req.Header.Set("Content-Type", contentType) rr = executeRequest(req) checkResponseCode(t, http.StatusBadRequest, rr) + assert.Contains(t, rr.Body.String(), util.I18nErrorUserTemplate) form.Set("template_users[0][tpl_username]", "user1") form.Set("template_users[0][tpl_password]", "password1") @@ -21670,73 +22815,141 @@ func TestUserTemplateMock(t *testing.T) { rr = executeRequest(req) checkResponseCode(t, http.StatusBadRequest, rr) require.Contains(t, rr.Body.String(), util.I18nErrorUserTemplate) +} + +func TestUserTemplateRoleAndPermissions(t *testing.T) { + r1 := getTestRole() + r2 := getTestRole() + r2.Name += "_mod" + role1, resp, err := httpdtest.AddRole(r1, http.StatusCreated) + assert.NoError(t, err, string(resp)) + role2, resp, err := httpdtest.AddRole(r2, http.StatusCreated) + assert.NoError(t, err, string(resp)) + admin := getTestAdmin() + admin.Username = altAdminUsername + admin.Password = altAdminPassword + admin.Role = role1.Name + admin.Permissions = []string{dataprovider.PermAdminManageFolders, dataprovider.PermAdminChangeUsers, + dataprovider.PermAdminViewUsers} + admin, _, err = httpdtest.AddAdmin(admin, http.StatusCreated) + assert.NoError(t, err) + + token, err := getJWTWebTokenFromTestServer(altAdminUsername, altAdminPassword) + assert.NoError(t, err) + + req, _ := http.NewRequest(http.MethodGet, webTemplateUser, nil) + setJWTCookieForReq(req, token) + rr := executeRequest(req) + checkResponseCode(t, http.StatusForbidden, rr) + + csrfToken, err := getCSRFTokenFromInternalPageMock(webTemplateFolder, token) + assert.NoError(t, err) + user1 := "u1" + user2 := "u2" + form := make(url.Values) + form.Set("username", "") + form.Set("role", role2.Name) + form.Set("home_dir", filepath.Join(os.TempDir(), "%username%")) + form.Set("upload_bandwidth", "0") + form.Set("download_bandwidth", "0") + form.Set("upload_data_transfer", "0") + form.Set("download_data_transfer", "0") + form.Set("total_data_transfer", "0") + form.Set("uid", "0") + form.Set("gid", "0") + form.Set("max_sessions", "0") + form.Set("quota_size", "0") + form.Set("quota_files", "0") + form.Set("permissions", "*") + form.Set("status", "1") + form.Set("expiration_date", "") + form.Set("fs_provider", "0") + form.Set("max_upload_file_size", "0") + form.Set("default_shares_expiration", "0") + form.Set("max_shares_expiration", "0") + form.Set("password_expiration", "0") + form.Set("password_strength", "0") + form.Set("external_auth_cache_time", "0") + form.Add("template_users[0][tpl_username]", user1) + form.Add("template_users[0][tpl_password]", "password1") + form.Add("template_users[0][tpl_public_keys]", " ") + form.Add("template_users[1][tpl_username]", user2) + form.Add("template_users[1][tpl_public_keys]", testPubKey) + form.Set(csrfFormToken, csrfToken) + b, contentType, _ := getMultipartFormData(form, "", "") + req, _ = http.NewRequest(http.MethodPost, webTemplateUser, &b) + setJWTCookieForReq(req, token) + req.Header.Set("Content-Type", contentType) + rr = executeRequest(req) + checkResponseCode(t, http.StatusForbidden, rr) + // Add the required permissions + admin.Permissions = append(admin.Permissions, dataprovider.PermAdminAddUsers) + _, _, err = httpdtest.UpdateAdmin(admin, http.StatusOK) + assert.NoError(t, err) + + token, err = getJWTWebTokenFromTestServer(altAdminUsername, altAdminPassword) + assert.NoError(t, err) + + req, _ = http.NewRequest(http.MethodGet, webTemplateUser, nil) + setJWTCookieForReq(req, token) + rr = executeRequest(req) + checkResponseCode(t, http.StatusOK, rr) + + csrfToken, err = getCSRFTokenFromInternalPageMock(webTemplateUser, token) + assert.NoError(t, err) + form.Set(csrfFormToken, csrfToken) - form.Set("template_users[0][tpl_username]", "user1") - form.Set("template_users[0][tpl_password]", "password1") - form.Set("template_users[0][tpl_public_keys]", " ") - form.Set("template_users[1][tpl_username]", "user2") - form.Set("template_users[1][tpl_password]", "password2") - form.Set("template_users[1][tpl_public_keys]", testPubKey) - form.Set("template_users[2][tpl_username]", "") - form.Set("template_users[2][tpl_password]", "password3") - form.Set("template_users[2][tpl_public_keys]", testPubKey) b, contentType, _ = getMultipartFormData(form, "", "") req, _ = http.NewRequest(http.MethodPost, webTemplateUser, &b) setJWTCookieForReq(req, token) req.Header.Set("Content-Type", contentType) rr = executeRequest(req) - checkResponseCode(t, http.StatusOK, rr) + checkResponseCode(t, http.StatusSeeOther, rr) - var dump dataprovider.BackupData - err = json.Unmarshal(rr.Body.Bytes(), &dump) - require.NoError(t, err) - require.Len(t, dump.Users, 2) - require.Len(t, dump.Admins, 0) - require.Len(t, dump.Folders, 0) + u1, _, err := httpdtest.GetUserByUsername(user1, http.StatusOK) + assert.NoError(t, err) + assert.Equal(t, admin.Role, u1.Role) + u2, _, err := httpdtest.GetUserByUsername(user2, http.StatusOK) + assert.NoError(t, err) + assert.Equal(t, admin.Role, u2.Role) - var user1, user2 dataprovider.User - for _, u := range dump.Users { - switch u.Username { - case "user1": - user1 = u - default: - user2 = u - } - } - require.Equal(t, "user1", user1.Username) - require.Equal(t, sdk.S3FilesystemProvider, user1.FsConfig.Provider) - require.Equal(t, "user2", user2.Username) - require.Equal(t, sdk.S3FilesystemProvider, user2.FsConfig.Provider) - require.Len(t, user1.PublicKeys, 0) - require.Len(t, user2.PublicKeys, 1) - require.Equal(t, filepath.Join(os.TempDir(), user1.Username), user1.HomeDir) - require.Equal(t, filepath.Join(os.TempDir(), user2.Username), user2.HomeDir) - require.Equal(t, user1.Username, user1.FsConfig.S3Config.AccessKey) - require.Equal(t, user2.Username, user2.FsConfig.S3Config.AccessKey) - require.Equal(t, path.Join("base", user1.Username)+"/", user1.FsConfig.S3Config.KeyPrefix) - require.Equal(t, path.Join("base", user2.Username)+"/", user2.FsConfig.S3Config.KeyPrefix) - require.True(t, user1.FsConfig.S3Config.AccessSecret.IsEncrypted()) - err = user1.FsConfig.S3Config.AccessSecret.Decrypt() - require.NoError(t, err) - require.Equal(t, "password1", user1.FsConfig.S3Config.AccessSecret.GetPayload()) - require.True(t, user2.FsConfig.S3Config.AccessSecret.IsEncrypted()) - err = user2.FsConfig.S3Config.AccessSecret.Decrypt() - require.NoError(t, err) - require.Equal(t, "password2", user2.FsConfig.S3Config.AccessSecret.GetPayload()) - require.True(t, user1.Filters.Hooks.ExternalAuthDisabled) - require.True(t, user1.Filters.Hooks.CheckPasswordDisabled) - require.False(t, user1.Filters.Hooks.PreLoginDisabled) - require.True(t, user2.Filters.Hooks.ExternalAuthDisabled) - require.True(t, user2.Filters.Hooks.CheckPasswordDisabled) - require.False(t, user2.Filters.Hooks.PreLoginDisabled) - require.True(t, user1.Filters.DisableFsChecks) - require.True(t, user2.Filters.DisableFsChecks) + _, err = httpdtest.RemoveUser(u1, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveUser(u2, http.StatusOK) + assert.NoError(t, err) + // Set an empty role + form.Set("role", "") + b, contentType, _ = getMultipartFormData(form, "", "") + req, _ = http.NewRequest(http.MethodPost, webTemplateUser, &b) + setJWTCookieForReq(req, token) + req.Header.Set("Content-Type", contentType) + rr = executeRequest(req) + checkResponseCode(t, http.StatusSeeOther, rr) + + u1, _, err = httpdtest.GetUserByUsername(user1, http.StatusOK) + assert.NoError(t, err) + assert.Equal(t, admin.Role, u1.Role) + u2, _, err = httpdtest.GetUserByUsername(user2, http.StatusOK) + assert.NoError(t, err) + assert.Equal(t, admin.Role, u2.Role) + + _, err = httpdtest.RemoveUser(u1, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveUser(u2, http.StatusOK) + assert.NoError(t, err) + + _, err = httpdtest.RemoveAdmin(admin, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveRole(role1, http.StatusOK) + assert.NoError(t, err) + _, err = httpdtest.RemoveRole(role2, http.StatusOK) + assert.NoError(t, err) } func TestUserPlaceholders(t *testing.T) { token, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webUserPath, token) assert.NoError(t, err) u := getTestUser() u.HomeDir = filepath.Join(os.TempDir(), "%username%_%password%") @@ -21809,7 +23022,7 @@ func TestUserPlaceholders(t *testing.T) { func TestFolderPlaceholders(t *testing.T) { token, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webFolderPath, token) assert.NoError(t, err) folderName := "folderName" form := make(url.Values) @@ -21853,7 +23066,7 @@ func TestFolderSaveFromTemplateMock(t *testing.T) { folder2 := "f2" token, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webTemplateFolder, token) assert.NoError(t, err) form := make(url.Values) form.Set("name", "name") @@ -21899,12 +23112,12 @@ func TestFolderSaveFromTemplateMock(t *testing.T) { assert.NoError(t, err) } -func TestFolderTemplateMock(t *testing.T) { +func TestFolderTemplateErrors(t *testing.T) { folderName := "vfolder-template" mappedPath := filepath.Join(os.TempDir(), "%name%mapped%name%path") token, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webTemplateFolder, token) assert.NoError(t, err) form := make(url.Values) form.Set("name", folderName) @@ -21915,7 +23128,6 @@ func TestFolderTemplateMock(t *testing.T) { form.Set("template_folders[2][tpl_foldername]", "folder3") form.Set("template_folders[3][tpl_foldername]", "folder1 ") form.Add("template_folders[3][tpl_foldername]", " ") - form.Set("form_action", "export_from_template") b, contentType, _ := getMultipartFormData(form, "", "") req, _ := http.NewRequest(http.MethodPost, webTemplateFolder, &b) setJWTCookieForReq(req, token) @@ -21933,41 +23145,12 @@ func TestFolderTemplateMock(t *testing.T) { checkResponseCode(t, http.StatusBadRequest, rr) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidForm) - folder1 := "folder1" - folder2 := "folder2" - folder3 := "folder3" - b, contentType, _ = getMultipartFormData(form, "", "") - req, _ = http.NewRequest(http.MethodPost, webTemplateFolder, &b) - setJWTCookieForReq(req, token) - req.Header.Set("Content-Type", contentType) - rr = executeRequest(req) - checkResponseCode(t, http.StatusOK, rr) - - var dump dataprovider.BackupData - err = json.Unmarshal(rr.Body.Bytes(), &dump) - require.NoError(t, err) - require.Len(t, dump.Users, 0) - require.Len(t, dump.Admins, 0) - require.Len(t, dump.Folders, 3) - for _, folder := range dump.Folders { - switch folder.Name { - case folder1: - require.Equal(t, "desc folder folder1", folder.Description) - require.True(t, strings.HasSuffix(folder.MappedPath, "folder1mappedfolder1path")) - case folder2: - require.Equal(t, "desc folder folder2", folder.Description) - require.True(t, strings.HasSuffix(folder.MappedPath, "folder2mappedfolder2path")) - default: - require.Equal(t, "desc folder folder3", folder.Description) - require.True(t, strings.HasSuffix(folder.MappedPath, "folder3mappedfolder3path")) - } - } - form.Set("fs_provider", "1") form.Set("s3_bucket", "bucket") form.Set("s3_region", "us-east-1") form.Set("s3_access_key", "%name%") form.Set("s3_access_secret", "pwd%name%") + form.Set("s3_sse_customer_key", "key%name%") form.Set("s3_key_prefix", "base/%name%") b, contentType, _ = getMultipartFormData(form, "", "") @@ -21984,43 +23167,6 @@ func TestFolderTemplateMock(t *testing.T) { form.Set("s3_upload_part_max_time", "0") form.Set("s3_download_part_size", "6") form.Set("s3_download_concurrency", "2") - b, contentType, _ = getMultipartFormData(form, "", "") - req, _ = http.NewRequest(http.MethodPost, webTemplateFolder, &b) - setJWTCookieForReq(req, token) - req.Header.Set("Content-Type", contentType) - rr = executeRequest(req) - checkResponseCode(t, http.StatusOK, rr) - - dump = dataprovider.BackupData{ - Version: dataprovider.DumpVersion, - } - err = json.Unmarshal(rr.Body.Bytes(), &dump) - require.NoError(t, err) - require.Len(t, dump.Users, 0) - require.Len(t, dump.Admins, 0) - require.Len(t, dump.Folders, 3) - for _, folder := range dump.Folders { - switch folder.Name { - case folder1: - require.Equal(t, folder1, folder.FsConfig.S3Config.AccessKey) - err = folder.FsConfig.S3Config.AccessSecret.Decrypt() - require.NoError(t, err) - require.Equal(t, fmt.Sprintf("pwd%s", folder1), folder.FsConfig.S3Config.AccessSecret.GetPayload()) - require.Equal(t, path.Join("base", folder1)+"/", folder.FsConfig.S3Config.KeyPrefix) - case folder2: - require.Equal(t, folder2, folder.FsConfig.S3Config.AccessKey) - err = folder.FsConfig.S3Config.AccessSecret.Decrypt() - require.NoError(t, err) - require.Equal(t, "pwd"+folder2, folder.FsConfig.S3Config.AccessSecret.GetPayload()) - require.Equal(t, "base/"+folder2+"/", folder.FsConfig.S3Config.KeyPrefix) - default: - require.Equal(t, folder3, folder.FsConfig.S3Config.AccessKey) - err = folder.FsConfig.S3Config.AccessSecret.Decrypt() - require.NoError(t, err) - require.Equal(t, "pwd"+folder3, folder.FsConfig.S3Config.AccessSecret.GetPayload()) - require.Equal(t, "base/"+folder3+"/", folder.FsConfig.S3Config.KeyPrefix) - } - } form.Set("template_folders[0][tpl_foldername]", " ") form.Set("template_folders[1][tpl_foldername]", "") @@ -22045,12 +23191,67 @@ func TestFolderTemplateMock(t *testing.T) { assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidHomeDir) } +func TestFolderTemplatePermission(t *testing.T) { + admin := getTestAdmin() + admin.Username = altAdminUsername + admin.Password = altAdminPassword + admin.Permissions = []string{dataprovider.PermAdminChangeUsers, dataprovider.PermAdminAddUsers, dataprovider.PermAdminViewUsers} + admin, _, err := httpdtest.AddAdmin(admin, http.StatusCreated) + assert.NoError(t, err) + // no permission to view or add folders from templates + token, err := getJWTWebTokenFromTestServer(altAdminUsername, altAdminPassword) + assert.NoError(t, err) + csrfToken, err := getCSRFTokenFromInternalPageMock(webTemplateUser, token) + assert.NoError(t, err) + + req, err := http.NewRequest(http.MethodGet, webTemplateFolder, nil) + assert.NoError(t, err) + req.RequestURI = webTemplateFolder + setJWTCookieForReq(req, token) + rr := executeRequest(req) + checkResponseCode(t, http.StatusForbidden, rr) + + form := make(url.Values) + form.Set("name", "name") + form.Set("mapped_path", filepath.Join(os.TempDir(), "%name%")) + form.Set("description", "desc folder %name%") + form.Set("template_folders[0][tpl_foldername]", "folder1") + form.Set("template_folders[1][tpl_foldername]", "folder2") + form.Set(csrfFormToken, csrfToken) + b, contentType, _ := getMultipartFormData(form, "", "") + req, err = http.NewRequest(http.MethodPost, webTemplateFolder, &b) + assert.NoError(t, err) + setJWTCookieForReq(req, token) + req.Header.Set("Content-Type", contentType) + rr = executeRequest(req) + checkResponseCode(t, http.StatusForbidden, rr) + + admin.Permissions = append(admin.Permissions, dataprovider.PermAdminManageFolders) + _, _, err = httpdtest.UpdateAdmin(admin, http.StatusOK) + assert.NoError(t, err) + + token, err = getJWTWebTokenFromTestServer(altAdminUsername, altAdminPassword) + assert.NoError(t, err) + _, err = getCSRFTokenFromInternalPageMock(webTemplateUser, token) + assert.NoError(t, err) + + req, err = http.NewRequest(http.MethodGet, webTemplateFolder, nil) + assert.NoError(t, err) + req.RequestURI = webTemplateFolder + setJWTCookieForReq(req, token) + rr = executeRequest(req) + checkResponseCode(t, http.StatusOK, rr) + + _, err = httpdtest.RemoveAdmin(admin, http.StatusOK) + assert.NoError(t, err) +} + func TestWebUserS3Mock(t *testing.T) { webToken, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) apiToken, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webUserPath, webToken) assert.NoError(t, err) user := getTestUser() userAsJSON := getUserAsJSON(t, user) @@ -22067,6 +23268,7 @@ func TestWebUserS3Mock(t *testing.T) { user.FsConfig.S3Config.Region = "eu-west-1" user.FsConfig.S3Config.AccessKey = "access-key" user.FsConfig.S3Config.AccessSecret = kms.NewPlainSecret("access-secret") + user.FsConfig.S3Config.SSECustomerKey = kms.NewPlainSecret("enc-key") user.FsConfig.S3Config.RoleARN = "arn:aws:iam::123456789012:user/Development/product_1234/*" user.FsConfig.S3Config.Endpoint = "http://127.0.0.1:9000/path?a=b" user.FsConfig.S3Config.StorageClass = "Standard" @@ -22107,6 +23309,7 @@ func TestWebUserS3Mock(t *testing.T) { form.Set("s3_region", user.FsConfig.S3Config.Region) form.Set("s3_access_key", user.FsConfig.S3Config.AccessKey) form.Set("s3_access_secret", user.FsConfig.S3Config.AccessSecret.GetPayload()) + form.Set("s3_sse_customer_key", user.FsConfig.S3Config.SSECustomerKey.GetPayload()) form.Set("s3_role_arn", user.FsConfig.S3Config.RoleARN) form.Set("s3_storage_class", user.FsConfig.S3Config.StorageClass) form.Set("s3_acl", user.FsConfig.S3Config.ACL) @@ -22231,6 +23434,10 @@ func TestWebUserS3Mock(t *testing.T) { assert.NotEmpty(t, updateUser.FsConfig.S3Config.AccessSecret.GetPayload()) assert.Empty(t, updateUser.FsConfig.S3Config.AccessSecret.GetKey()) assert.Empty(t, updateUser.FsConfig.S3Config.AccessSecret.GetAdditionalData()) + assert.Equal(t, sdkkms.SecretStatusSecretBox, updateUser.FsConfig.S3Config.SSECustomerKey.GetStatus()) + assert.NotEmpty(t, updateUser.FsConfig.S3Config.SSECustomerKey.GetPayload()) + assert.Empty(t, updateUser.FsConfig.S3Config.SSECustomerKey.GetKey()) + assert.Empty(t, updateUser.FsConfig.S3Config.SSECustomerKey.GetAdditionalData()) assert.Equal(t, user.Description, updateUser.Description) assert.True(t, updateUser.Filters.Hooks.PreLoginDisabled) assert.False(t, updateUser.Filters.Hooks.ExternalAuthDisabled) @@ -22240,6 +23447,7 @@ func TestWebUserS3Mock(t *testing.T) { assert.Equal(t, 1, updateUser.Filters.FTPSecurity) // now check that a redacted password is not saved form.Set("s3_access_secret", redactedSecret) + form.Set("s3_sse_customer_key", redactedSecret) b, contentType, _ = getMultipartFormData(form, "", "") req, _ = http.NewRequest(http.MethodPost, path.Join(webUserPath, user.Username), &b) setJWTCookieForReq(req, webToken) @@ -22258,10 +23466,15 @@ func TestWebUserS3Mock(t *testing.T) { assert.Equal(t, updateUser.FsConfig.S3Config.AccessSecret.GetPayload(), lastUpdatedUser.FsConfig.S3Config.AccessSecret.GetPayload()) assert.Empty(t, lastUpdatedUser.FsConfig.S3Config.AccessSecret.GetKey()) assert.Empty(t, lastUpdatedUser.FsConfig.S3Config.AccessSecret.GetAdditionalData()) + assert.Equal(t, sdkkms.SecretStatusSecretBox, lastUpdatedUser.FsConfig.S3Config.SSECustomerKey.GetStatus()) + assert.Equal(t, updateUser.FsConfig.S3Config.SSECustomerKey.GetPayload(), lastUpdatedUser.FsConfig.S3Config.SSECustomerKey.GetPayload()) + assert.Empty(t, lastUpdatedUser.FsConfig.S3Config.SSECustomerKey.GetKey()) + assert.Empty(t, lastUpdatedUser.FsConfig.S3Config.SSECustomerKey.GetAdditionalData()) assert.Equal(t, lastPwdChange, lastUpdatedUser.LastPasswordChange) // now clear credentials form.Set("s3_access_key", "") form.Set("s3_access_secret", "") + form.Set("s3_sse_customer_key", "") b, contentType, _ = getMultipartFormData(form, "", "") req, _ = http.NewRequest(http.MethodPost, path.Join(webUserPath, user.Username), &b) setJWTCookieForReq(req, webToken) @@ -22276,6 +23489,7 @@ func TestWebUserS3Mock(t *testing.T) { err = render.DecodeJSON(rr.Body, &userGet) assert.NoError(t, err) assert.Nil(t, userGet.FsConfig.S3Config.AccessSecret) + assert.Nil(t, userGet.FsConfig.S3Config.SSECustomerKey) req, _ = http.NewRequest(http.MethodDelete, path.Join(userPath, user.Username), nil) setBearerForReq(req, apiToken) @@ -22288,7 +23502,7 @@ func TestWebUserGCSMock(t *testing.T) { assert.NoError(t, err) apiToken, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webUserPath, webToken) assert.NoError(t, err) user := getTestUser() userAsJSON := getUserAsJSON(t, user) @@ -22416,7 +23630,7 @@ func TestWebUserHTTPFsMock(t *testing.T) { assert.NoError(t, err) apiToken, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webUserPath, webToken) assert.NoError(t, err) user := getTestUser() userAsJSON := getUserAsJSON(t, user) @@ -22543,7 +23757,7 @@ func TestWebUserAzureBlobMock(t *testing.T) { assert.NoError(t, err) apiToken, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webUserPath, webToken) assert.NoError(t, err) user := getTestUser() userAsJSON := getUserAsJSON(t, user) @@ -22740,7 +23954,7 @@ func TestWebUserCryptMock(t *testing.T) { assert.NoError(t, err) apiToken, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webUserPath, webToken) assert.NoError(t, err) user := getTestUser() userAsJSON := getUserAsJSON(t, user) @@ -22847,7 +24061,7 @@ func TestWebUserSFTPFsMock(t *testing.T) { assert.NoError(t, err) apiToken, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webUserPath, webToken) assert.NoError(t, err) user := getTestUser() userAsJSON := getUserAsJSON(t, user) @@ -23003,7 +24217,7 @@ func TestWebUserRole(t *testing.T) { assert.NoError(t, err) webToken, err := getJWTWebTokenFromTestServer(altAdminUsername, altAdminPassword) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webUserPath, webToken) assert.NoError(t, err) user := getTestUser() form := make(url.Values) @@ -23066,10 +24280,9 @@ func TestWebEventAction(t *testing.T) { assert.NoError(t, err) apiToken, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webAdminEventActionPath, webToken) assert.NoError(t, err) action := dataprovider.BaseEventAction{ - ID: 81, Name: "web_action_http", Description: "http web action", Type: dataprovider.ActionTypeHTTP, @@ -23093,7 +24306,7 @@ func TestWebEventAction(t *testing.T) { Value: "value1", }, }, - Body: `{"event":"{{Event}}","name":"{{Name}}"}`, + Body: `{"event":"{{.Event}}","name":"{{.Name}}"}`, }, }, } @@ -23212,12 +24425,12 @@ func TestWebEventAction(t *testing.T) { form.Del("http_headers[0][http_header_key]") form.Del("http_headers[0][http_header_val]") form.Set("multipart_body[0][http_part_name]", "part1") - form.Set("multipart_body[0][http_part_file]", "{{VirtualPath}}") + form.Set("multipart_body[0][http_part_file]", "{{.VirtualPath}}") form.Set("multipart_body[0][http_part_body]", "") form.Set("multipart_body[0][http_part_headers]", "X-MyHeader: a:b,c") form.Set("multipart_body[12][http_part_name]", "part2") form.Set("multipart_body[12][http_part_headers]", "Content-Type:application/json \r\n") - form.Set("multipart_body[12][http_part_body]", "{{ObjectData}}") + form.Set("multipart_body[12][http_part_body]", "{{.ObjectData}}") req, err = http.NewRequest(http.MethodPost, path.Join(webAdminEventActionPath, action.Name), bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) @@ -23234,12 +24447,12 @@ func TestWebEventAction(t *testing.T) { assert.Equal(t, 0, dbAction.Options.HTTPConfig.Timeout) if assert.Len(t, dbAction.Options.HTTPConfig.Parts, 2) { assert.Equal(t, "part1", dbAction.Options.HTTPConfig.Parts[0].Name) - assert.Equal(t, "/{{VirtualPath}}", dbAction.Options.HTTPConfig.Parts[0].Filepath) + assert.Equal(t, "/{{.VirtualPath}}", dbAction.Options.HTTPConfig.Parts[0].Filepath) assert.Empty(t, dbAction.Options.HTTPConfig.Parts[0].Body) assert.Equal(t, "X-MyHeader", dbAction.Options.HTTPConfig.Parts[0].Headers[0].Key) assert.Equal(t, "a:b,c", dbAction.Options.HTTPConfig.Parts[0].Headers[0].Value) assert.Equal(t, "part2", dbAction.Options.HTTPConfig.Parts[1].Name) - assert.Equal(t, "{{ObjectData}}", dbAction.Options.HTTPConfig.Parts[1].Body) + assert.Equal(t, "{{.ObjectData}}", dbAction.Options.HTTPConfig.Parts[1].Body) assert.Empty(t, dbAction.Options.HTTPConfig.Parts[1].Filepath) assert.Equal(t, "Content-Type", dbAction.Options.HTTPConfig.Parts[1].Headers[0].Key) assert.Equal(t, "application/json", dbAction.Options.HTTPConfig.Parts[1].Headers[0].Value) @@ -23257,6 +24470,10 @@ func TestWebEventAction(t *testing.T) { }, }, } + dataprovider.EnabledActionCommands = []string{action.Options.CmdConfig.Cmd} + defer func() { + dataprovider.EnabledActionCommands = nil + }() form.Set("type", fmt.Sprintf("%d", action.Type)) req, err = http.NewRequest(http.MethodPost, path.Join(webAdminEventActionPath, action.Name), bytes.NewBuffer([]byte(form.Encode()))) @@ -23468,16 +24685,19 @@ func TestWebEventAction(t *testing.T) { action.Options.FsConfig = dataprovider.EventActionFilesystemConfig{ Type: dataprovider.FilesystemActionRename, - Renames: []dataprovider.KeyValue{ + Renames: []dataprovider.RenameConfig{ { - Key: "/src", - Value: "/target", + KeyValue: dataprovider.KeyValue{ + Key: "/src", + Value: "/target", + }, }, }, } form.Set("fs_action_type", fmt.Sprintf("%d", action.Options.FsConfig.Type)) form.Set("fs_rename[0][fs_rename_source]", action.Options.FsConfig.Renames[0].Key) form.Set("fs_rename[0][fs_rename_target]", action.Options.FsConfig.Renames[0].Value) + form.Set("fs_rename[0][fs_rename_options][]", "1") req, err = http.NewRequest(http.MethodPost, path.Join(webAdminEventActionPath, action.Name), bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) @@ -23489,7 +24709,9 @@ func TestWebEventAction(t *testing.T) { actionGet, _, err = httpdtest.GetEventActionByName(action.Name, http.StatusOK) assert.NoError(t, err) assert.Equal(t, action.Type, actionGet.Type) - assert.Len(t, actionGet.Options.FsConfig.Renames, 1) + if assert.Len(t, actionGet.Options.FsConfig.Renames, 1) { + assert.True(t, actionGet.Options.FsConfig.Renames[0].UpdateModTime) + } action.Options.FsConfig = dataprovider.EventActionFilesystemConfig{ Type: dataprovider.FilesystemActionCopy, @@ -23611,7 +24833,7 @@ func TestWebEventAction(t *testing.T) { func TestWebEventRule(t *testing.T) { webToken, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webAdminEventRulePath, webToken) assert.NoError(t, err) a := dataprovider.BaseEventAction{ Name: "web_action", @@ -23929,7 +25151,7 @@ func TestWebEventRule(t *testing.T) { func TestWebIPListEntries(t *testing.T) { webToken, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webUserPath, webToken) assert.NoError(t, err) req, err := http.NewRequest(http.MethodGet, webIPListPath+"/mode", nil) @@ -24002,7 +25224,8 @@ func TestWebIPListEntries(t *testing.T) { form.Set("protocols", "a") form.Add("protocols", "1") form.Add("protocols", "4") - req, err = http.NewRequest(http.MethodPost, webIPListPath+"/2", bytes.NewBuffer([]byte(form.Encode()))) + req, err = http.NewRequest(http.MethodPost, webIPListPath+"/"+strconv.Itoa(int(entry.Type)), + bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") setJWTCookieForReq(req, webToken) @@ -24115,7 +25338,7 @@ func TestWebIPListEntries(t *testing.T) { func TestWebRole(t *testing.T) { webToken, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webAdminRolePath, webToken) assert.NoError(t, err) role := getTestRole() form := make(url.Values) @@ -24221,84 +25444,12 @@ func TestWebRole(t *testing.T) { assert.NoError(t, err) } -func TestNameParamSingleSlash(t *testing.T) { - err := dataprovider.Close() - assert.NoError(t, err) - err = config.LoadConfig(configDir, "") - assert.NoError(t, err) - providerConf := config.GetProviderConf() - providerConf.NamingRules = 5 - err = dataprovider.Initialize(providerConf, configDir, true) - assert.NoError(t, err) - - webToken, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) - assert.NoError(t, err) - apiToken, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) - assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) - assert.NoError(t, err) - group := getTestGroup() - group.Name = "/" - form := make(url.Values) - form.Set("name", group.Name) - form.Set("description", group.Description) - form.Set("max_sessions", "0") - form.Set("quota_files", "0") - form.Set("quota_size", "0") - form.Set("upload_bandwidth", "0") - form.Set("download_bandwidth", "0") - form.Set("upload_data_transfer", "0") - form.Set("download_data_transfer", "0") - form.Set("total_data_transfer", "0") - form.Set("max_upload_file_size", "0") - form.Set("default_shares_expiration", "0") - form.Set("max_shares_expiration", "0") - form.Set("password_expiration", "0") - form.Set("password_strength", "0") - form.Set("expires_in", "0") - form.Set("external_auth_cache_time", "0") - form.Set(csrfFormToken, csrfToken) - b, contentType, err := getMultipartFormData(form, "", "") - assert.NoError(t, err) - req, err := http.NewRequest(http.MethodPost, webGroupPath, &b) - assert.NoError(t, err) - req.Header.Set("Content-Type", contentType) - setJWTCookieForReq(req, webToken) - rr := executeRequest(req) - checkResponseCode(t, http.StatusSeeOther, rr) - - groupGet, _, err := httpdtest.GetGroupByName(group.Name, http.StatusOK) - assert.NoError(t, err) - assert.Equal(t, "/", groupGet.Name) - // check strip slash - req, err = http.NewRequest(http.MethodGet, webGroupsPath+"/", nil) - assert.NoError(t, err) - setJWTCookieForReq(req, webToken) - rr = executeRequest(req) - checkResponseCode(t, http.StatusOK, rr) - // cleanup - req, err = http.NewRequest(http.MethodDelete, groupPath+"/"+url.PathEscape(group.Name), nil) - assert.NoError(t, err) - setBearerForReq(req, apiToken) - rr = executeRequest(req) - checkResponseCode(t, http.StatusOK, rr) - - err = dataprovider.Close() - assert.NoError(t, err) - err = config.LoadConfig(configDir, "") - assert.NoError(t, err) - providerConf = config.GetProviderConf() - providerConf.BackupsPath = backupsPath - err = dataprovider.Initialize(providerConf, configDir, true) - assert.NoError(t, err) -} - func TestAddWebGroup(t *testing.T) { webToken, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) apiToken, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webGroupPath, webToken) assert.NoError(t, err) group := getTestGroup() group.UserSettings = dataprovider.GroupUserSettings{ @@ -24484,7 +25635,7 @@ func TestAddWebFoldersMock(t *testing.T) { assert.NoError(t, err) apiToken, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webFolderPath, webToken) assert.NoError(t, err) mappedPath := filepath.Clean(os.TempDir()) folderName := filepath.Base(mappedPath) @@ -24562,7 +25713,7 @@ func TestHTTPFsWebFolderMock(t *testing.T) { assert.NoError(t, err) apiToken, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webFolderPath, webToken) assert.NoError(t, err) mappedPath := filepath.Clean(os.TempDir()) folderName := filepath.Base(mappedPath) @@ -24657,7 +25808,7 @@ func TestS3WebFolderMock(t *testing.T) { assert.NoError(t, err) apiToken, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webFolderPath, webToken) assert.NoError(t, err) mappedPath := filepath.Clean(os.TempDir()) folderName := filepath.Base(mappedPath) @@ -24666,6 +25817,7 @@ func TestS3WebFolderMock(t *testing.T) { S3Region := "eu-west-1" S3AccessKey := "access-key" S3AccessSecret := kms.NewPlainSecret("folder-access-secret") + S3SSEKey := kms.NewPlainSecret("folder-sse-key") S3SessionToken := "fake session token" S3RoleARN := "arn:aws:iam::123456789012:user/Development/product_1234/*" S3Endpoint := "http://127.0.0.1:9000/path?b=c" @@ -24687,6 +25839,7 @@ func TestS3WebFolderMock(t *testing.T) { form.Set("s3_region", S3Region) form.Set("s3_access_key", S3AccessKey) form.Set("s3_access_secret", S3AccessSecret.GetPayload()) + form.Set("s3_sse_customer_key", S3SSEKey.GetPayload()) form.Set("s3_session_token", S3SessionToken) form.Set("s3_role_arn", S3RoleARN) form.Set("s3_storage_class", S3StorageClass) @@ -24734,6 +25887,7 @@ func TestS3WebFolderMock(t *testing.T) { assert.Equal(t, S3Region, folder.FsConfig.S3Config.Region) assert.Equal(t, S3AccessKey, folder.FsConfig.S3Config.AccessKey) assert.NotEmpty(t, folder.FsConfig.S3Config.AccessSecret.GetPayload()) + assert.NotEmpty(t, folder.FsConfig.S3Config.SSECustomerKey.GetPayload()) assert.Equal(t, S3Endpoint, folder.FsConfig.S3Config.Endpoint) assert.Equal(t, S3StorageClass, folder.FsConfig.S3Config.StorageClass) assert.Equal(t, S3ACL, folder.FsConfig.S3Config.ACL) @@ -24784,6 +25938,7 @@ func TestS3WebFolderMock(t *testing.T) { assert.Equal(t, S3AccessKey, folder.FsConfig.S3Config.AccessKey) assert.Equal(t, S3RoleARN, folder.FsConfig.S3Config.RoleARN) assert.NotEmpty(t, folder.FsConfig.S3Config.AccessSecret.GetPayload()) + assert.NotEmpty(t, folder.FsConfig.S3Config.SSECustomerKey.GetPayload()) assert.Equal(t, S3Endpoint, folder.FsConfig.S3Config.Endpoint) assert.Equal(t, S3StorageClass, folder.FsConfig.S3Config.StorageClass) assert.Equal(t, S3KeyPrefix, folder.FsConfig.S3Config.KeyPrefix) @@ -24802,7 +25957,7 @@ func TestUpdateWebGroupMock(t *testing.T) { assert.NoError(t, err) apiToken, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webGroupPath, webToken) assert.NoError(t, err) group, _, err := httpdtest.AddGroup(getTestGroup(), http.StatusCreated) assert.NoError(t, err) @@ -24907,7 +26062,7 @@ func TestUpdateWebFolderMock(t *testing.T) { assert.NoError(t, err) apiToken, err := getJWTAPITokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webFolderPath, webToken) assert.NoError(t, err) folderName := "vfolderupdate" folderDesc := "updated desc" @@ -25124,7 +26279,7 @@ func TestAdminForgotPassword(t *testing.T) { rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + loginCookie, csrfToken, err := getCSRFTokenMock(webLoginPath, defaultRemoteAddr) assert.NoError(t, err) form := make(url.Values) @@ -25133,6 +26288,7 @@ func TestAdminForgotPassword(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webAdminForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusForbidden, rr.Code) @@ -25141,6 +26297,7 @@ func TestAdminForgotPassword(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webAdminForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusOK, rr.Code) @@ -25148,9 +26305,28 @@ func TestAdminForgotPassword(t *testing.T) { lastResetCode = "" form.Set("username", altAdminUsername) + // disable the admin + admin.Status = 0 + admin, _, err = httpdtest.UpdateAdmin(admin, http.StatusOK) + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webAdminForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + rr = executeRequest(req) + assert.Equal(t, http.StatusFound, rr.Code) + assert.Len(t, lastResetCode, 0) + + admin.Status = 1 + admin, _, err = httpdtest.UpdateAdmin(admin, http.StatusOK) + assert.NoError(t, err) + + req, err = http.NewRequest(http.MethodPost, webAdminForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) + assert.NoError(t, err) + req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) @@ -25160,6 +26336,7 @@ func TestAdminForgotPassword(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webAdminResetPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusForbidden, rr.Code) @@ -25168,6 +26345,7 @@ func TestAdminForgotPassword(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webAdminResetPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusOK, rr.Code) @@ -25178,23 +26356,45 @@ func TestAdminForgotPassword(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webAdminResetPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusOK, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorChangePwdGeneric) - // ok + // disable the admin + admin.Status = 0 + admin, _, err = httpdtest.UpdateAdmin(admin, http.StatusOK) + assert.NoError(t, err) form.Set("code", lastResetCode) req, err = http.NewRequest(http.MethodPost, webAdminResetPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + rr = executeRequest(req) + assert.Equal(t, http.StatusOK, rr.Code) + assert.Contains(t, rr.Body.String(), util.I18nErrorChangePwdGeneric) + + admin.Status = 1 + admin, _, err = httpdtest.UpdateAdmin(admin, http.StatusOK) + assert.NoError(t, err) + // ok + req, err = http.NewRequest(http.MethodPost, webAdminResetPwdPath, bytes.NewBuffer([]byte(form.Encode()))) + assert.NoError(t, err) + req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) + assert.NoError(t, err) + form.Set(csrfFormToken, csrfToken) form.Set("username", altAdminUsername) req, err = http.NewRequest(http.MethodPost, webAdminForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) @@ -25216,6 +26416,7 @@ func TestAdminForgotPassword(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webAdminForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusOK, rr.Code) @@ -25230,6 +26431,7 @@ func TestAdminForgotPassword(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webAdminForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusOK, rr.Code) @@ -25284,22 +26486,25 @@ func TestUserForgotPassword(t *testing.T) { rr = executeRequest(req) checkResponseCode(t, http.StatusOK, rr) + loginCookie, csrfToken, err := getCSRFTokenMock(webClientLoginPath, defaultRemoteAddr) + assert.NoError(t, err) + form := make(url.Values) form.Set("username", "") // no csrf token req, err = http.NewRequest(http.MethodPost, webClientForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusForbidden, rr.Code) // empty username - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) - assert.NoError(t, err) form.Set(csrfFormToken, csrfToken) req, err = http.NewRequest(http.MethodPost, webClientForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusOK, rr.Code) @@ -25309,23 +26514,38 @@ func TestUserForgotPassword(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webClientForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusOK, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorPwdResetForbidded) + user.ExpirationDate = util.GetTimeAsMsSinceEpoch(time.Now().Add(-1 * time.Hour)) user.Filters.WebClient = []string{sdk.WebClientAPIKeyAuthChangeDisabled} user, _, err = httpdtest.UpdateUser(user, http.StatusOK, "") assert.NoError(t, err) - + // user is expired lastResetCode = "" req, err = http.NewRequest(http.MethodPost, webClientForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + rr = executeRequest(req) + assert.Equal(t, http.StatusFound, rr.Code) + assert.Len(t, lastResetCode, 0) + + user.ExpirationDate = util.GetTimeAsMsSinceEpoch(time.Now().Add(24 * time.Hour)) + user, _, err = httpdtest.UpdateUser(user, http.StatusOK, "") + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webClientForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) + assert.NoError(t, err) + req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) assert.GreaterOrEqual(t, len(lastResetCode), 20) - // no csrf token + // no login token form = make(url.Values) req, err = http.NewRequest(http.MethodPost, webClientResetPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) @@ -25340,6 +26560,7 @@ func TestUserForgotPassword(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webClientResetPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusOK, rr.Code) @@ -25350,6 +26571,7 @@ func TestUserForgotPassword(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webClientResetPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusOK, rr.Code) @@ -25360,19 +26582,38 @@ func TestUserForgotPassword(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webClientResetPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + rr = executeRequest(req) + assert.Equal(t, http.StatusOK, rr.Code) + assert.Contains(t, rr.Body.String(), util.I18nErrorChangePwdGeneric) + // Invalid login condition + form.Set("code", lastResetCode) + user.Filters.DeniedProtocols = []string{common.ProtocolHTTP} + user, _, err = httpdtest.UpdateUser(user, http.StatusOK, "") + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webClientResetPwdPath, bytes.NewBuffer([]byte(form.Encode()))) + assert.NoError(t, err) + req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusOK, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorChangePwdGeneric) // ok - form.Set("code", lastResetCode) + user.Filters.DeniedProtocols = []string{common.ProtocolFTP} + user, _, err = httpdtest.UpdateUser(user, http.StatusOK, "") + assert.NoError(t, err) req, err = http.NewRequest(http.MethodPost, webClientResetPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) + loginCookie, csrfToken, err = getCSRFTokenMock(webLoginPath, defaultRemoteAddr) + assert.NoError(t, err) form = make(url.Values) form.Set(csrfFormToken, csrfToken) form.Set("username", user.Username) @@ -25380,6 +26621,7 @@ func TestUserForgotPassword(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webClientForgotPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusFound, rr.Code) @@ -25412,6 +26654,7 @@ func TestUserForgotPassword(t *testing.T) { req, err = http.NewRequest(http.MethodPost, webClientResetPwdPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = executeRequest(req) assert.Equal(t, http.StatusOK, rr.Code) @@ -25608,7 +26851,7 @@ func TestAPIForgotPassword(t *testing.T) { func TestProviderClosedMock(t *testing.T) { token, err := getJWTWebTokenFromTestServer(defaultTokenAuthUser, defaultTokenAuthPass) assert.NoError(t, err) - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webConfigsPath, token) assert.NoError(t, err) // create a role admin role, resp, err := httpdtest.AddRole(getTestRole(), http.StatusCreated) @@ -25817,7 +27060,7 @@ func TestWebConnectionsMock(t *testing.T) { checkResponseCode(t, http.StatusForbidden, rr) assert.Contains(t, rr.Body.String(), "Invalid token") - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + csrfToken, err := getCSRFTokenFromInternalPageMock(webUserPath, token) assert.NoError(t, err) req, _ = http.NewRequest(http.MethodDelete, path.Join(webConnectionsPath, "id"), nil) setJWTCookieForReq(req, token) @@ -25855,7 +27098,7 @@ func TestGetWebStatusMock(t *testing.T) { } func TestStaticFilesMock(t *testing.T) { - req, err := http.NewRequest(http.MethodGet, "/static/favicon.ico", nil) + req, err := http.NewRequest(http.MethodGet, "/static/favicon.png", nil) assert.NoError(t, err) rr := executeRequest(req) checkResponseCode(t, http.StatusOK, rr) @@ -25948,12 +27191,63 @@ func TestSecondFactorRequirements(t *testing.T) { assert.False(t, user.MustSetSecondFactorForProtocol(common.ProtocolSSH)) } +func TestIsNameValid(t *testing.T) { + tests := []struct { + name string + input string + expected bool + }{ + {"simple name", "user", true}, + {"alphanumeric", "User123", true}, + {"unicode allowed", "你好", true}, + {"emoji allowed", "user😊", true}, + {"name with dot", "file.txt", true}, + {"name with multiple dots", "archive.tar.gz", true}, + {"control char", "abc\u0001", false}, + {"newline", "abc\n", false}, + {"tab", "abc\t", false}, + {"slash", "user/name", false}, + {"backslash", "user\\name", false}, + {"colon", "user:name", false}, + {"single dot", ".", false}, + {"double dot", "..", false}, + {"dot with suffix allowed", ".hidden", true}, + {"name ending with dot", "file.", false}, + {"name ending with space", "file ", false}, + {"CON", "CON", false}, + {"con lowercase", "con", false}, + {"con with extension", "con.txt", false}, + {"LPT1", "LPT1", false}, + {"lpt1 lowercase", "lpt1", false}, + {"COM5 uppercase", "COM5", false}, + {"com9 with extension", "com9.log", false}, + {"NUL", "NUL", false}, + {"Valid because suffix changes base", "con123", true}, + {"base name split", "aux.pdf", false}, + {"valid long name", "auxiliary", true}, + {"space only", " ", false}, + {"dot inside", "ab.cd.ef", true}, + {"unicode that ends with dot", "你好.", false}, + {"unicode that ends with space", "你好 ", false}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := util.IsNameValid(tt.input) + if result != tt.expected { + t.Errorf("IsNameValid(%q) = %v, expected %v", tt.input, result, tt.expected) + } + }) + } +} + func startOIDCMockServer() { go func() { http.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) { fmt.Fprintf(w, "OK\n") }) http.HandleFunc("/auth/realms/sftpgo/.well-known/openid-configuration", func(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "application/json") fmt.Fprintf(w, `{"issuer":"http://127.0.0.1:11111/auth/realms/sftpgo","authorization_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/auth","token_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/token","introspection_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/token/introspect","userinfo_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/userinfo","end_session_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/logout","frontchannel_logout_session_supported":true,"frontchannel_logout_supported":true,"jwks_uri":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/certs","check_session_iframe":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/login-status-iframe.html","grant_types_supported":["authorization_code","implicit","refresh_token","password","client_credentials","urn:ietf:params:oauth:grant-type:device_code","urn:openid:params:grant-type:ciba"],"response_types_supported":["code","none","id_token","token","id_token token","code id_token","code token","code id_token token"],"subject_types_supported":["public","pairwise"],"id_token_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"id_token_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"id_token_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"userinfo_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512","none"],"request_object_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512","none"],"request_object_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"request_object_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"response_modes_supported":["query","fragment","form_post","query.jwt","fragment.jwt","form_post.jwt","jwt"],"registration_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/clients-registrations/openid-connect","token_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],"token_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"introspection_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],"introspection_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"authorization_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"authorization_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"authorization_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"claims_supported":["aud","sub","iss","auth_time","name","given_name","family_name","preferred_username","email","acr"],"claim_types_supported":["normal"],"claims_parameter_supported":true,"scopes_supported":["openid","phone","email","web-origins","offline_access","microprofile-jwt","profile","address","roles"],"request_parameter_supported":true,"request_uri_parameter_supported":true,"require_request_uri_registration":true,"code_challenge_methods_supported":["plain","S256"],"tls_client_certificate_bound_access_tokens":true,"revocation_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/revoke","revocation_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],"revocation_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"backchannel_logout_supported":true,"backchannel_logout_session_supported":true,"device_authorization_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/auth/device","backchannel_token_delivery_modes_supported":["poll","ping"],"backchannel_authentication_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/ext/ciba/auth","backchannel_authentication_request_signing_alg_values_supported":["PS384","ES384","RS384","ES256","RS256","ES512","PS256","PS512","RS512"],"require_pushed_authorization_requests":false,"pushed_authorization_request_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/ext/par/request","mtls_endpoint_aliases":{"token_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/token","revocation_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/revoke","introspection_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/token/introspect","device_authorization_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/auth/device","registration_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/clients-registrations/openid-connect","userinfo_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/userinfo","pushed_authorization_request_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/ext/par/request","backchannel_authentication_endpoint":"http://127.0.0.1:11111/auth/realms/sftpgo/protocol/openid-connect/ext/ciba/auth"}}`) }) http.HandleFunc("/404", func(w http.ResponseWriter, _ *http.Request) { @@ -26092,29 +27386,53 @@ func getUserAsJSON(t *testing.T, user dataprovider.User) []byte { return json } -func getCSRFTokenMock(loginURLPath, remoteAddr string) (string, error) { - req, err := http.NewRequest(http.MethodGet, loginURLPath, nil) +func getCSRFTokenFromInternalPageMock(urlPath, token string) (string, error) { + req, err := http.NewRequest(http.MethodGet, urlPath, nil) if err != nil { return "", err } + req.RequestURI = urlPath + setJWTCookieForReq(req, token) + rr := executeRequest(req) + if rr.Code != http.StatusOK { + return "", fmt.Errorf("unexpected status code: %d", rr.Code) + } + return getCSRFTokenFromBody(rr.Body) +} + +func getCSRFTokenMock(loginURLPath, remoteAddr string) (string, string, error) { + req, err := http.NewRequest(http.MethodGet, loginURLPath, nil) + if err != nil { + return "", "", err + } req.RemoteAddr = remoteAddr rr := executeRequest(req) - return getCSRFTokenFromBody(bytes.NewBuffer(rr.Body.Bytes())) + cookie := rr.Header().Get("Set-Cookie") + if cookie == "" { + return "", "", errors.New("unable to get login cookie") + } + token, err := getCSRFTokenFromBody(bytes.NewBuffer(rr.Body.Bytes())) + return cookie, token, err } -func getCSRFToken(url string) (string, error) { +func getCSRFToken(url string) (string, string, error) { req, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { - return "", err + return "", "", err } resp, err := httpclient.GetHTTPClient().Do(req) if err != nil { - return "", err + return "", "", err + } + cookie := resp.Header.Get("Set-Cookie") + if cookie == "" { + return "", "", errors.New("no login cookie") } defer resp.Body.Close() - return getCSRFTokenFromBody(resp.Body) + token, err := getCSRFTokenFromBody(resp.Body) + return cookie, token, err } func getCSRFTokenFromBody(body io.Reader) (string, error) { @@ -26150,6 +27468,10 @@ func getCSRFTokenFromBody(body io.Reader) (string, error) { f(doc) + if csrfToken == "" { + return "", errors.New("CSRF token not found") + } + return csrfToken, nil } @@ -26176,6 +27498,10 @@ func setAPIKeyForReq(req *http.Request, apiKey, username string) { req.Header.Set("X-SFTPGO-API-KEY", apiKey) } +func setLoginCookie(req *http.Request, cookie string) { + req.Header.Set("Cookie", cookie) +} + func setJWTCookieForReq(req *http.Request, jwtToken string) { req.RemoteAddr = defaultRemoteAddr req.Header.Set("Cookie", fmt.Sprintf("jwt=%v", jwtToken)) @@ -26219,13 +27545,14 @@ func getJWTAPIUserTokenFromTestServer(username, password string) (string, error) } func getJWTWebToken(username, password string) (string, error) { - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + loginCookie, csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) if err != nil { return "", err } form := getLoginForm(username, password, csrfToken) req, _ := http.NewRequest(http.MethodPost, httpBaseURL+webLoginPath, bytes.NewBuffer([]byte(form.Encode()))) + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") client := &http.Client{ Timeout: 10 * time.Second, @@ -26258,13 +27585,14 @@ func getCookieFromResponse(rr *httptest.ResponseRecorder) (string, error) { } func getJWTWebClientTokenFromTestServerWithAddr(username, password, remoteAddr string) (string, error) { - csrfToken, err := getCSRFTokenMock(webClientLoginPath, remoteAddr) + loginCookie, csrfToken, err := getCSRFTokenMock(webClientLoginPath, remoteAddr) if err != nil { return "", err } form := getLoginForm(username, password, csrfToken) req, _ := http.NewRequest(http.MethodPost, webClientLoginPath, bytes.NewBuffer([]byte(form.Encode()))) req.RemoteAddr = remoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr := executeRequest(req) if rr.Code != http.StatusFound { @@ -26274,13 +27602,14 @@ func getJWTWebClientTokenFromTestServerWithAddr(username, password, remoteAddr s } func getJWTWebClientTokenFromTestServer(username, password string) (string, error) { - csrfToken, err := getCSRFToken(httpBaseURL + webClientLoginPath) + loginCookie, csrfToken, err := getCSRFTokenMock(webClientLoginPath, defaultRemoteAddr) if err != nil { return "", err } form := getLoginForm(username, password, csrfToken) req, _ := http.NewRequest(http.MethodPost, webClientLoginPath, bytes.NewBuffer([]byte(form.Encode()))) req.RemoteAddr = defaultRemoteAddr + req.Header.Set("Cookie", loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr := executeRequest(req) if rr.Code != http.StatusFound { @@ -26290,13 +27619,14 @@ func getJWTWebClientTokenFromTestServer(username, password string) (string, erro } func getJWTWebTokenFromTestServer(username, password string) (string, error) { - csrfToken, err := getCSRFToken(httpBaseURL + webLoginPath) + loginCookie, csrfToken, err := getCSRFTokenMock(webLoginPath, defaultRemoteAddr) if err != nil { return "", err } form := getLoginForm(username, password, csrfToken) req, _ := http.NewRequest(http.MethodPost, webLoginPath, bytes.NewBuffer([]byte(form.Encode()))) req.RemoteAddr = defaultRemoteAddr + setLoginCookie(req, loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr := executeRequest(req) if rr.Code != http.StatusFound { @@ -26315,6 +27645,30 @@ func checkResponseCode(t *testing.T, expected int, rr *httptest.ResponseRecorder assert.Equal(t, expected, rr.Code, rr.Body.String()) } +func getSftpClient(user dataprovider.User) (*ssh.Client, *sftp.Client, error) { + var sftpClient *sftp.Client + config := &ssh.ClientConfig{ + User: user.Username, + HostKeyCallback: ssh.InsecureIgnoreHostKey(), + Timeout: 5 * time.Second, + } + if user.Password != "" { + config.Auth = []ssh.AuthMethod{ssh.Password(user.Password)} + } else { + config.Auth = []ssh.AuthMethod{ssh.Password(defaultPassword)} + } + + conn, err := ssh.Dial("tcp", sftpServerAddr, config) + if err != nil { + return conn, sftpClient, err + } + sftpClient, err = sftp.NewClient(conn) + if err != nil { + conn.Close() + } + return conn, sftpClient, err +} + func createTestFile(path string, size int64) error { baseDir := filepath.Dir(path) if _, err := os.Stat(baseDir); errors.Is(err, fs.ErrNotExist) { @@ -26388,6 +27742,23 @@ func isDbDefenderSupported() bool { } } +func createTestPNG(name string, width, height int, imgColor color.Color) error { + upLeft := image.Point{0, 0} + lowRight := image.Point{width, height} + img := image.NewRGBA(image.Rectangle{upLeft, lowRight}) + for x := 0; x < width; x++ { + for y := 0; y < height; y++ { + img.Set(x, y, imgColor) + } + } + f, err := os.Create(name) + if err != nil { + return err + } + defer f.Close() + return png.Encode(f, img) +} + func BenchmarkSecretDecryption(b *testing.B) { s := kms.NewPlainSecret("test data") s.SetAdditionalData("username") diff --git a/internal/httpd/internal_test.go b/internal/httpd/internal_test.go index 4bc2399f..987f0263 100644 --- a/internal/httpd/internal_test.go +++ b/internal/httpd/internal_test.go @@ -38,20 +38,21 @@ import ( "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" - "github.com/go-chi/jwtauth/v5" + "github.com/go-jose/go-jose/v4" + josejwt "github.com/go-jose/go-jose/v4/jwt" "github.com/klauspost/compress/zip" - "github.com/lestrrat-go/jwx/v2/jwa" - "github.com/lestrrat-go/jwx/v2/jwt" "github.com/rs/xid" "github.com/sftpgo/sdk" sdkkms "github.com/sftpgo/sdk/kms" "github.com/sftpgo/sdk/plugin/notifier" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "golang.org/x/net/html" "github.com/drakkan/sftpgo/v2/internal/acme" "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/kms" "github.com/drakkan/sftpgo/v2/internal/plugin" "github.com/drakkan/sftpgo/v2/internal/util" @@ -285,6 +286,7 @@ RKjnkiEZeG4+G91Xu7+HmcBLwV86k5I+tXK9O1Okomr6Zry8oqVcxU5TB6VRS+rA ubwF00Drdvk2+kDZfxIM137nBiy7wgCJi2Ksm5ihN3dUF6Q0oNPl -----END RSA PRIVATE KEY-----` defaultAdminUsername = "admin" + defaultAdminPass = "password" defeaultUsername = "test_user" ) @@ -305,6 +307,16 @@ func (r *failingWriter) Header() http.Header { return make(http.Header) } +type failingJoseSigner struct{} + +func (s *failingJoseSigner) Sign(payload []byte) (*jose.JSONWebSignature, error) { + return nil, errors.New("sign test error") +} + +func (s *failingJoseSigner) Options() jose.SignerOptions { + return jose.SignerOptions{} +} + func TestShouldBind(t *testing.T) { c := Conf{ Bindings: []Binding{ @@ -330,9 +342,8 @@ func TestBrandingValidation(t *testing.T) { b := Binding{ Branding: Branding{ WebAdmin: UIBranding{ - LogoPath: "path1", - LoginImagePath: "login1.png", - DefaultCSS: []string{"my.css"}, + LogoPath: "path1", + DefaultCSS: []string{"my.css"}, }, WebClient: UIBranding{ FaviconPath: "favicon1.ico", @@ -342,14 +353,12 @@ func TestBrandingValidation(t *testing.T) { }, } b.checkBranding() - assert.Equal(t, "/favicon.ico", b.Branding.WebAdmin.FaviconPath) + assert.Equal(t, "/favicon.png", b.Branding.WebAdmin.FaviconPath) assert.Equal(t, "/path1", b.Branding.WebAdmin.LogoPath) - assert.Equal(t, "/login1.png", b.Branding.WebAdmin.LoginImagePath) assert.Equal(t, []string{"/my.css"}, b.Branding.WebAdmin.DefaultCSS) assert.Len(t, b.Branding.WebAdmin.ExtraCSS, 0) assert.Equal(t, "/favicon1.ico", b.Branding.WebClient.FaviconPath) assert.Equal(t, path.Join(webStaticFilesPath, "/path2"), b.Branding.WebClient.DisclaimerPath) - assert.Equal(t, "/img/login_image.png", b.Branding.WebClient.LoginImagePath) if assert.Len(t, b.Branding.WebClient.ExtraCSS, 1) { assert.Equal(t, "/1.css", b.Branding.WebClient.ExtraCSS[0]) } @@ -415,9 +424,80 @@ func TestGCSWebInvalidFormFile(t *testing.T) { assert.EqualError(t, err, http.ErrNotMultipart.Error()) } +func TestBrandingInvalidFormFile(t *testing.T) { + form := make(url.Values) + req, _ := http.NewRequest(http.MethodPost, webConfigsPath, strings.NewReader(form.Encode())) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + err := req.ParseForm() + assert.NoError(t, err) + _, err = getBrandingConfigFromPostFields(req, &dataprovider.BrandingConfigs{}) + assert.EqualError(t, err, http.ErrNotMultipart.Error()) +} + +func TestTokenDuration(t *testing.T) { + assert.Equal(t, shareTokenDuration, getTokenDuration(tokenAudienceWebShare)) + assert.Equal(t, apiTokenDuration, getTokenDuration(tokenAudienceAPI)) + assert.Equal(t, apiTokenDuration, getTokenDuration(tokenAudienceAPIUser)) + assert.Equal(t, cookieTokenDuration, getTokenDuration(tokenAudienceWebAdmin)) + assert.Equal(t, csrfTokenDuration, getTokenDuration(tokenAudienceCSRF)) + assert.Equal(t, 20*time.Minute, getTokenDuration("")) + + updateTokensDuration(30, 660, 360) + assert.Equal(t, 30*time.Minute, apiTokenDuration) + assert.Equal(t, 11*time.Hour, cookieTokenDuration) + assert.Equal(t, 11*time.Hour, csrfTokenDuration) + assert.Equal(t, 6*time.Hour, shareTokenDuration) + assert.Equal(t, 11*time.Hour, getMaxCookieDuration()) + + csrfTokenDuration = 1 * time.Hour + assert.Equal(t, 11*time.Hour, getMaxCookieDuration()) +} + +func TestVerifyCSRFToken(t *testing.T) { + server := httpdServer{} + err := server.initializeRouter() + require.NoError(t, err) + req, err := http.NewRequest(http.MethodPost, webAdminEventActionPath, nil) + require.NoError(t, err) + req = req.WithContext(jwt.NewContext(req.Context(), &jwt.Claims{}, fs.ErrPermission)) + + rr := httptest.NewRecorder() + tokenString := createCSRFToken(rr, req, server.csrfTokenAuth, "", webBaseAdminPath) + assert.NotEmpty(t, tokenString) + + claims, err := jwt.VerifyToken(server.csrfTokenAuth, tokenString) + require.NoError(t, err) + assert.Empty(t, claims.Ref) + + req.Form = url.Values{} + req.Form.Set(csrfFormToken, tokenString) + err = verifyCSRFToken(req, server.csrfTokenAuth) + assert.ErrorIs(t, err, fs.ErrPermission) + + req, err = http.NewRequest(http.MethodPost, webAdminEventActionPath, nil) + require.NoError(t, err) + req = req.WithContext(jwt.NewContext(req.Context(), &jwt.Claims{Claims: josejwt.Claims{ID: xid.New().String()}}, nil)) + req.Form = url.Values{} + req.Form.Set(csrfFormToken, tokenString) + err = verifyCSRFToken(req, server.csrfTokenAuth) + assert.ErrorContains(t, err, "unexpected form token") + + claims = jwt.NewClaims(tokenAudienceCSRF, "", getTokenDuration(tokenAudienceCSRF)) + tokenString, err = josejwt.Signed(server.csrfTokenAuth.Signer()).Claims(claims).Serialize() + assert.NoError(t, err) + req, err = http.NewRequest(http.MethodPost, webAdminEventActionPath, nil) + require.NoError(t, err) + req = req.WithContext(jwt.NewContext(req.Context(), &jwt.Claims{Claims: josejwt.Claims{ID: xid.New().String()}}, nil)) + req.Form = url.Values{} + req.Form.Set(csrfFormToken, tokenString) + err = verifyCSRFToken(req, server.csrfTokenAuth) + assert.ErrorContains(t, err, "the form token is not valid") +} + func TestInvalidToken(t *testing.T) { server := httpdServer{} - server.initializeRouter() + err := server.initializeRouter() + require.NoError(t, err) admin := dataprovider.Admin{ Username: "admin", } @@ -428,7 +508,7 @@ func TestInvalidToken(t *testing.T) { rctx := chi.NewRouteContext() rctx.URLParams.Add("username", admin.Username) req = req.WithContext(context.WithValue(req.Context(), chi.RouteCtxKey, rctx)) - req = req.WithContext(context.WithValue(req.Context(), jwtauth.ErrorCtxKey, errFake)) + req = req.WithContext(context.WithValue(req.Context(), jwt.ErrorCtxKey, errFake)) rr := httptest.NewRecorder() updateAdmin(rr, req) assert.Equal(t, http.StatusBadRequest, rr.Code) @@ -444,7 +524,7 @@ func TestInvalidToken(t *testing.T) { assert.NoError(t, err) req, _ = http.NewRequest(http.MethodPut, "", bytes.NewBuffer(asJSON)) req = req.WithContext(context.WithValue(req.Context(), chi.RouteCtxKey, rctx)) - req = req.WithContext(context.WithValue(req.Context(), jwtauth.ErrorCtxKey, errFake)) + req = req.WithContext(context.WithValue(req.Context(), jwt.ErrorCtxKey, errFake)) rr = httptest.NewRecorder() changeAdminPassword(rr, req) assert.Equal(t, http.StatusInternalServerError, rr.Code) @@ -909,78 +989,218 @@ func TestInvalidToken(t *testing.T) { assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidToken) } +func TestTokenSignatureValidation(t *testing.T) { + tokenValidationMode = 0 + server := httpdServer{ + binding: Binding{ + Address: "", + Port: 8080, + EnableWebAdmin: true, + EnableWebClient: true, + EnableRESTAPI: true, + }, + enableWebAdmin: true, + enableWebClient: true, + enableRESTAPI: true, + } + err := server.initializeRouter() + require.NoError(t, err) + testServer := httptest.NewServer(server.router) + defer testServer.Close() + + rr := httptest.NewRecorder() + req, err := http.NewRequest(http.MethodGet, tokenPath, nil) + require.NoError(t, err) + req.SetBasicAuth(defaultAdminUsername, defaultAdminPass) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code) + var resp map[string]any + err = json.Unmarshal(rr.Body.Bytes(), &resp) + assert.NoError(t, err) + accessToken := resp["access_token"] + require.NotEmpty(t, accessToken) + + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodGet, versionPath, nil) + require.NoError(t, err) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", accessToken)) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code) + // change the token validation mode + tokenValidationMode = 2 + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodGet, versionPath, nil) + require.NoError(t, err) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", accessToken)) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code) + // Now update the admin + admin, err := dataprovider.AdminExists(defaultAdminUsername) + assert.NoError(t, err) + err = dataprovider.UpdateAdmin(&admin, "", "", "") + assert.NoError(t, err) + // token validation mode is 0, the old token is still valid + tokenValidationMode = 0 + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodGet, versionPath, nil) + require.NoError(t, err) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", accessToken)) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code) + // change the token validation mode + tokenValidationMode = 2 + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodGet, versionPath, nil) + require.NoError(t, err) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", accessToken)) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusUnauthorized, rr.Code) + // the token is invalidated, changing the validation mode has no effect + tokenValidationMode = 0 + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodGet, versionPath, nil) + require.NoError(t, err) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", accessToken)) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusUnauthorized, rr.Code) + + userPwd := "pwd" + user := dataprovider.User{ + BaseUser: sdk.BaseUser{ + Username: defeaultUsername, + Password: userPwd, + HomeDir: filepath.Join(os.TempDir(), defeaultUsername), + Status: 1, + }, + } + user.Permissions = make(map[string][]string) + user.Permissions["/"] = []string{dataprovider.PermAny} + err = dataprovider.AddUser(&user, "", "", "") + assert.NoError(t, err) + + defer func() { + dataprovider.DeleteUser(defeaultUsername, "", "", "") //nolint:errcheck + }() + + tokenValidationMode = 2 + req, err = http.NewRequest(http.MethodGet, webClientLoginPath, nil) + require.NoError(t, err) + rr = httptest.NewRecorder() + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code) + loginCookie := strings.Split(rr.Header().Get("Set-Cookie"), ";")[0] + assert.NotEmpty(t, loginCookie) + csrfToken, err := getCSRFTokenFromBody(rr.Body) + assert.NoError(t, err) + assert.NotEmpty(t, csrfToken) + // Now login + form := make(url.Values) + form.Set(csrfFormToken, csrfToken) + form.Set("username", defeaultUsername) + form.Set("password", userPwd) + req, err = http.NewRequest(http.MethodPost, webClientLoginPath, bytes.NewBuffer([]byte(form.Encode()))) + assert.NoError(t, err) + req.Header.Set("Cookie", loginCookie) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + rr = httptest.NewRecorder() + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusFound, rr.Code) + userCookie := strings.Split(rr.Header().Get("Set-Cookie"), ";")[0] + assert.NotEmpty(t, userCookie) + // Test a WebClient page and a JSON API + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodGet, webClientFilesPath, nil) + require.NoError(t, err) + req.Header.Set("Cookie", userCookie) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code) + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodGet, webClientProfilePath, nil) + require.NoError(t, err) + req.Header.Set("Cookie", userCookie) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code) + csrfToken, err = getCSRFTokenFromBody(rr.Body) + assert.NoError(t, err) + assert.NotEmpty(t, csrfToken) + + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodGet, webClientFilePath+"?path=missing.txt", nil) + require.NoError(t, err) + req.Header.Set("Cookie", userCookie) + req.Header.Set(csrfHeaderToken, csrfToken) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusNotFound, rr.Code) + + tokenValidationMode = 0 + err = dataprovider.DeleteUser(defeaultUsername, "", "", "") + assert.NoError(t, err) + + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodGet, webClientFilePath+"?path=missing.txt", nil) + require.NoError(t, err) + req.Header.Set("Cookie", userCookie) + req.Header.Set(csrfHeaderToken, csrfToken) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusNotFound, rr.Code) + + tokenValidationMode = 2 + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodGet, webClientFilePath+"?path=missing.txt", nil) + require.NoError(t, err) + req.Header.Set("Cookie", userCookie) + req.Header.Set(csrfHeaderToken, csrfToken) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusFound, rr.Code) + + tokenValidationMode = 0 +} + func TestUpdateWebAdminInvalidClaims(t *testing.T) { server := httpdServer{} - server.initializeRouter() + err := server.initializeRouter() + require.NoError(t, err) rr := httptest.NewRecorder() admin := dataprovider.Admin{ Username: "", Password: "password", } - c := jwtTokenClaims{ + c := &jwt.Claims{ Username: admin.Username, Permissions: admin.Permissions, - Signature: admin.GetSignature(), } - token, err := c.createTokenResponse(server.tokenAuth, tokenAudienceWebAdmin, "") + c.Subject = admin.GetSignature() + token, err := server.tokenAuth.SignWithParams(c, tokenAudienceWebAdmin, "", 10*time.Minute) assert.NoError(t, err) + resp := c.BuildTokenResponse(token) + + req, err := http.NewRequest(http.MethodGet, webAdminPath, nil) + assert.NoError(t, err) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", resp.Token)) + parsedToken, err := jwt.VerifyRequest(server.tokenAuth, req, jwt.TokenFromCookie) + assert.NoError(t, err) + ctx := req.Context() + ctx = jwt.NewContext(ctx, parsedToken, err) + req = req.WithContext(ctx) form := make(url.Values) - form.Set(csrfFormToken, createCSRFToken("")) + form.Set(csrfFormToken, createCSRFToken(rr, req, server.csrfTokenAuth, "", webBaseAdminPath)) form.Set("status", "1") form.Set("default_users_expiration", "30") - req, _ := http.NewRequest(http.MethodPost, path.Join(webAdminPath, "admin"), bytes.NewBuffer([]byte(form.Encode()))) + req, err = http.NewRequest(http.MethodPost, path.Join(webAdminPath, "admin"), bytes.NewBuffer([]byte(form.Encode()))) + assert.NoError(t, err) rctx := chi.NewRouteContext() rctx.URLParams.Add("username", "admin") + req = req.WithContext(ctx) req = req.WithContext(context.WithValue(req.Context(), chi.RouteCtxKey, rctx)) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - req.Header.Set("Cookie", fmt.Sprintf("jwt=%v", token["access_token"])) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", resp.Token)) server.handleWebUpdateAdminPost(rr, req) assert.Equal(t, http.StatusOK, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidToken) } -func TestRetentionInvalidTokenClaims(t *testing.T) { - username := "retentionuser" - user := dataprovider.User{ - BaseUser: sdk.BaseUser{ - Username: username, - Password: "pwd", - HomeDir: filepath.Join(os.TempDir(), username), - Status: 1, - }, - } - user.Permissions = make(map[string][]string) - user.Permissions["/"] = []string{dataprovider.PermAny} - user.Filters.AllowAPIKeyAuth = true - err := dataprovider.AddUser(&user, "", "", "") - assert.NoError(t, err) - folderRetention := []dataprovider.FolderRetention{ - { - Path: "/", - Retention: 0, - DeleteEmptyDirs: true, - }, - } - asJSON, err := json.Marshal(folderRetention) - assert.NoError(t, err) - req, _ := http.NewRequest(http.MethodPost, retentionBasePath+"/"+username+"/check?notifications=Email", bytes.NewBuffer(asJSON)) - - rctx := chi.NewRouteContext() - rctx.URLParams.Add("username", username) - - req = req.WithContext(context.WithValue(req.Context(), chi.RouteCtxKey, rctx)) - req = req.WithContext(context.WithValue(req.Context(), jwtauth.ErrorCtxKey, errors.New("error"))) - rr := httptest.NewRecorder() - startRetentionCheck(rr, req) - assert.Equal(t, http.StatusBadRequest, rr.Code) - assert.Contains(t, rr.Body.String(), "Invalid token claims") - - err = dataprovider.DeleteUser(username, "", "", "") - assert.NoError(t, err) -} - func TestUpdateSMTPSecrets(t *testing.T) { currentConfigs := &dataprovider.SMTPConfigs{ OAuth2: dataprovider.SMTPOAuth2{ @@ -1021,7 +1241,8 @@ func TestUpdateSMTPSecrets(t *testing.T) { func TestOAuth2Redirect(t *testing.T) { server := httpdServer{} - server.initializeRouter() + err := server.initializeRouter() + require.NoError(t, err) rr := httptest.NewRecorder() req, err := http.NewRequest(http.MethodGet, webOAuth2RedirectPath+"?state=invalid", nil) @@ -1031,7 +1252,7 @@ func TestOAuth2Redirect(t *testing.T) { assert.Contains(t, rr.Body.String(), util.I18nOAuth2ErrorTitle) ip := "127.1.1.4" - tokenString := createOAuth2Token(xid.New().String(), ip) + tokenString := createOAuth2Token(server.csrfTokenAuth, xid.New().String(), ip) rr = httptest.NewRecorder() req, err = http.NewRequest(http.MethodGet, webOAuth2RedirectPath+"?state="+tokenString, nil) //nolint:goconst assert.NoError(t, err) @@ -1042,57 +1263,48 @@ func TestOAuth2Redirect(t *testing.T) { } func TestOAuth2Token(t *testing.T) { + server := httpdServer{} + err := server.initializeRouter() + require.NoError(t, err) // invalid token - _, err := verifyOAuth2Token("token", "") + _, err = verifyOAuth2Token(server.csrfTokenAuth, "token", "") if assert.Error(t, err) { assert.Contains(t, err.Error(), "unable to verify OAuth2 state") } // bad audience - claims := make(map[string]any) - now := time.Now().UTC() + claims := jwt.NewClaims(tokenAudienceAPI, "", getTokenDuration(tokenAudienceAPI)) - claims[jwt.JwtIDKey] = xid.New().String() - claims[jwt.NotBeforeKey] = now.Add(-30 * time.Second) - claims[jwt.ExpirationKey] = now.Add(tokenDuration) - claims[jwt.AudienceKey] = []string{tokenAudienceAPI} - - _, tokenString, err := csrfTokenAuth.Encode(claims) + tokenString, err := server.csrfTokenAuth.Sign(claims) assert.NoError(t, err) - _, err = verifyOAuth2Token(tokenString, "") + _, err = verifyOAuth2Token(server.csrfTokenAuth, tokenString, "") if assert.Error(t, err) { assert.Contains(t, err.Error(), "invalid OAuth2 state") } // bad IP - tokenString = createOAuth2Token("state", "127.1.1.1") - _, err = verifyOAuth2Token(tokenString, "127.1.1.2") + tokenString = createOAuth2Token(server.csrfTokenAuth, "state", "127.1.1.1") + _, err = verifyOAuth2Token(server.csrfTokenAuth, tokenString, "127.1.1.2") if assert.Error(t, err) { assert.Contains(t, err.Error(), "invalid OAuth2 state") } // ok state := xid.New().String() - tokenString = createOAuth2Token(state, "127.1.1.3") - s, err := verifyOAuth2Token(tokenString, "127.1.1.3") + tokenString = createOAuth2Token(server.csrfTokenAuth, state, "127.1.1.3") + s, err := verifyOAuth2Token(server.csrfTokenAuth, tokenString, "127.1.1.3") assert.NoError(t, err) assert.Equal(t, state, s) // no jti - claims = make(map[string]any) - - claims[jwt.NotBeforeKey] = now.Add(-30 * time.Second) - claims[jwt.ExpirationKey] = now.Add(tokenDuration) - claims[jwt.AudienceKey] = []string{tokenAudienceOAuth2, "127.1.1.4"} - _, tokenString, err = csrfTokenAuth.Encode(claims) + claims = jwt.NewClaims(tokenAudienceOAuth2, "127.1.1.4", getTokenDuration(tokenAudienceOAuth2)) + tokenString, err = josejwt.Signed(server.csrfTokenAuth.Signer()).Claims(claims).Serialize() assert.NoError(t, err) - _, err = verifyOAuth2Token(tokenString, "127.1.1.4") + _, err = verifyOAuth2Token(server.csrfTokenAuth, tokenString, "127.1.1.4") if assert.Error(t, err) { assert.Contains(t, err.Error(), "invalid OAuth2 state") } // encode error - csrfTokenAuth = jwtauth.New("HT256", util.GenerateRandomBytes(32), nil) - tokenString = createOAuth2Token(xid.New().String(), "") + server.csrfTokenAuth.SetSigner(&failingJoseSigner{}) + tokenString = createOAuth2Token(server.csrfTokenAuth, xid.New().String(), "") assert.Empty(t, tokenString) - server := httpdServer{} - server.initializeRouter() rr := httptest.NewRecorder() testReq := make(map[string]any) testReq["base_redirect_url"] = "http://localhost:8082" @@ -1100,50 +1312,50 @@ func TestOAuth2Token(t *testing.T) { assert.NoError(t, err) req, err := http.NewRequest(http.MethodPost, webOAuth2TokenPath, bytes.NewBuffer(asJSON)) assert.NoError(t, err) - handleSMTPOAuth2TokenRequestPost(rr, req) + server.handleSMTPOAuth2TokenRequestPost(rr, req) assert.Equal(t, http.StatusInternalServerError, rr.Code) assert.Contains(t, rr.Body.String(), "unable to create state token") - - csrfTokenAuth = jwtauth.New(jwa.HS256.String(), util.GenerateRandomBytes(32), nil) } func TestCSRFToken(t *testing.T) { + server := httpdServer{} + err := server.initializeRouter() + require.NoError(t, err) // invalid token - err := verifyCSRFToken("token", "") + req := &http.Request{} + err = verifyCSRFToken(req, server.csrfTokenAuth) if assert.Error(t, err) { assert.Contains(t, err.Error(), "unable to verify form token") } // bad audience - claims := make(map[string]any) - now := time.Now().UTC() - - claims[jwt.JwtIDKey] = xid.New().String() - claims[jwt.NotBeforeKey] = now.Add(-30 * time.Second) - claims[jwt.ExpirationKey] = now.Add(tokenDuration) - claims[jwt.AudienceKey] = []string{tokenAudienceAPI} - - _, tokenString, err := csrfTokenAuth.Encode(claims) + claims := jwt.NewClaims(tokenAudienceAPI, "", getTokenDuration(tokenAudienceAPI)) + tokenString, err := server.csrfTokenAuth.Sign(claims) assert.NoError(t, err) - err = verifyCSRFToken(tokenString, "") + values := url.Values{} + values.Set(csrfFormToken, tokenString) + req.Form = values + err = verifyCSRFToken(req, server.csrfTokenAuth) if assert.Error(t, err) { assert.Contains(t, err.Error(), "form token is not valid") } // bad IP - tokenString = createCSRFToken("127.1.1.1") - err = verifyCSRFToken(tokenString, "127.1.1.2") + req.RemoteAddr = "127.1.1.1" + tokenString = createCSRFToken(httptest.NewRecorder(), req, server.csrfTokenAuth, "", webBaseAdminPath) + values.Set(csrfFormToken, tokenString) + req.Form = values + req.RemoteAddr = "127.1.1.2" + err = verifyCSRFToken(req, server.csrfTokenAuth) if assert.Error(t, err) { assert.Contains(t, err.Error(), "form token is not valid") } - claims[jwt.JwtIDKey] = xid.New().String() - claims[jwt.NotBeforeKey] = now.Add(-30 * time.Second) - claims[jwt.ExpirationKey] = now.Add(tokenDuration) - claims[jwt.AudienceKey] = []string{tokenAudienceAPI} - _, tokenString, err = csrfTokenAuth.Encode(claims) + claims = jwt.NewClaims(tokenAudienceAPI, "", getTokenDuration(tokenAudienceAPI)) + tokenString, err = server.csrfTokenAuth.Sign(claims) assert.NoError(t, err) + assert.NotEmpty(t, tokenString) - r := GetHTTPRouter(Binding{ + r, err := GetHTTPRouter(Binding{ Address: "", Port: 8080, EnableWebAdmin: true, @@ -1151,9 +1363,10 @@ func TestCSRFToken(t *testing.T) { EnableRESTAPI: true, RenderOpenAPI: true, }) - fn := verifyCSRFHeader(r) + assert.NoError(t, err) + fn := server.verifyCSRFHeader(r) rr := httptest.NewRecorder() - req, _ := http.NewRequest(http.MethodDelete, path.Join(userPath, "username"), nil) + req, _ = http.NewRequest(http.MethodDelete, path.Join(userPath, "username"), nil) fn.ServeHTTP(rr, req) assert.Equal(t, http.StatusForbidden, rr.Code) assert.Contains(t, rr.Body.String(), "Invalid token") @@ -1166,18 +1379,22 @@ func TestCSRFToken(t *testing.T) { assert.Contains(t, rr.Body.String(), "the token is not valid") // invalid IP - tokenString = createCSRFToken("172.16.1.2") + tokenString = createCSRFToken(httptest.NewRecorder(), req, server.csrfTokenAuth, "", webBaseAdminPath) req.Header.Set(csrfHeaderToken, tokenString) + req.RemoteAddr = "172.16.1.2" rr = httptest.NewRecorder() fn.ServeHTTP(rr, req) assert.Equal(t, http.StatusForbidden, rr.Code) assert.Contains(t, rr.Body.String(), "the token is not valid") - csrfTokenAuth = jwtauth.New("PS256", util.GenerateRandomBytes(32), nil) - tokenString = createCSRFToken("") + csrfTokenAuth, err := jwt.NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) + csrfTokenAuth.SetSigner(&failingJoseSigner{}) + tokenString = createCSRFToken(httptest.NewRecorder(), req, csrfTokenAuth, "", webBaseAdminPath) assert.Empty(t, tokenString) - - csrfTokenAuth = jwtauth.New(jwa.HS256.String(), util.GenerateRandomBytes(32), nil) + rr = httptest.NewRecorder() + createLoginCookie(rr, req, csrfTokenAuth, "", webBaseAdminPath, req.RemoteAddr) + assert.Empty(t, rr.Header().Get("Set-Cookie")) } func TestCreateShareCookieError(t *testing.T) { @@ -1197,7 +1414,7 @@ func TestCreateShareCookieError(t *testing.T) { err := dataprovider.AddUser(user, "", "", "") assert.NoError(t, err) share := &dataprovider.Share{ - Name: "test share cookie error", + Name: "test_share_cookie_error", ShareID: util.GenerateUniqueID(), Scope: dataprovider.ShareScopeRead, Password: pwd, @@ -1207,20 +1424,44 @@ func TestCreateShareCookieError(t *testing.T) { err = dataprovider.AddShare(share, "", "", "") assert.NoError(t, err) + tokenAuth, err := jwt.NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) + tokenAuth.SetSigner(&failingJoseSigner{}) + csrfTokenAuth, err := jwt.NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) + server := httpdServer{ - tokenAuth: jwtauth.New("TS256", util.GenerateRandomBytes(32), nil), + tokenAuth: tokenAuth, + csrfTokenAuth: csrfTokenAuth, } + + c := jwt.NewClaims(tokenAudienceWebLogin, "127.0.0.1", getTokenDuration(tokenAudienceWebLogin)) + token, err := server.csrfTokenAuth.Sign(c) + assert.NoError(t, err) + resp := c.BuildTokenResponse(token) + parsedToken, err := jwt.VerifyToken(server.csrfTokenAuth, resp.Token) + assert.NoError(t, err) + + req, err := http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, share.ShareID, "login"), nil) + assert.NoError(t, err) + req.RemoteAddr = "127.0.0.1:4567" + ctx := req.Context() + ctx = jwt.NewContext(ctx, parsedToken, err) + req = req.WithContext(ctx) + form := make(url.Values) form.Set("share_password", pwd) - form.Set(csrfFormToken, createCSRFToken("127.0.0.1")) + form.Set(csrfFormToken, createCSRFToken(httptest.NewRecorder(), req, server.csrfTokenAuth, "", webBaseClientPath)) rctx := chi.NewRouteContext() rctx.URLParams.Add("id", share.ShareID) rr := httptest.NewRecorder() - req, err := http.NewRequest(http.MethodPost, path.Join(webClientPubSharesPath, share.ShareID, "login"), + req, err = http.NewRequest(http.MethodPost, path.Join(webClientPubSharesPath, share.ShareID, "login"), bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = "127.0.0.1:2345" + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", resp.Token)) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req = req.WithContext(ctx) req = req.WithContext(context.WithValue(req.Context(), chi.RouteCtxKey, rctx)) server.handleClientShareLoginPost(rr, req) assert.Equal(t, http.StatusOK, rr.Code, rr.Body.String()) @@ -1231,8 +1472,15 @@ func TestCreateShareCookieError(t *testing.T) { } func TestCreateTokenError(t *testing.T) { + tokenAuth, err := jwt.NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) + tokenAuth.SetSigner(&failingJoseSigner{}) + csrfTokenAuth, err := jwt.NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) + server := httpdServer{ - tokenAuth: jwtauth.New("PS256", util.GenerateRandomBytes(32), nil), + tokenAuth: tokenAuth, + csrfTokenAuth: csrfTokenAuth, } rr := httptest.NewRecorder() admin := dataprovider.Admin{ @@ -1256,14 +1504,37 @@ func TestCreateTokenError(t *testing.T) { server.generateAndSendUserToken(rr, req, "", user) assert.Equal(t, http.StatusInternalServerError, rr.Code) + c := &jwt.Claims{} + c.ID = xid.New().String() + c.SetExpiry(time.Now().Add(1 * time.Minute)) + tokenString, err := server.csrfTokenAuth.SignWithParams(c, tokenAudienceAPI, "", getTokenDuration(tokenAudienceAPI)) + assert.NoError(t, err) + token := c.BuildTokenResponse(tokenString) + + req, err = http.NewRequest(http.MethodGet, webAdminLoginPath, nil) + assert.NoError(t, err) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token.Token)) + parsedToken, err := jwt.VerifyRequest(server.csrfTokenAuth, req, jwt.TokenFromCookie) + assert.NoError(t, err) + ctx := req.Context() + ctx = jwt.NewContext(ctx, parsedToken, err) + req = req.WithContext(ctx) + rr = httptest.NewRecorder() form := make(url.Values) form.Set("username", admin.Username) form.Set("password", admin.Password) - form.Set(csrfFormToken, createCSRFToken("127.0.0.1")) + form.Set(csrfFormToken, createCSRFToken(rr, req, server.csrfTokenAuth, xid.New().String(), webBaseAdminPath)) + cookie := rr.Header().Get("Set-Cookie") + assert.NotEmpty(t, cookie) req, _ = http.NewRequest(http.MethodPost, webAdminLoginPath, bytes.NewBuffer([]byte(form.Encode()))) - req.RemoteAddr = "127.0.0.1:1234" + req.Header.Set("Cookie", cookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + parsedToken, err = jwt.VerifyRequest(server.csrfTokenAuth, req, jwt.TokenFromCookie) + assert.NoError(t, err) + ctx = req.Context() + ctx = jwt.NewContext(ctx, parsedToken, err) + req = req.WithContext(ctx) server.handleWebAdminLoginPost(rr, req) assert.Equal(t, http.StatusOK, rr.Code, rr.Body.String()) // req with no content type @@ -1290,7 +1561,7 @@ func TestCreateTokenError(t *testing.T) { req, _ = http.NewRequest(http.MethodGet, webAdminLoginPath+"?a=a%C3%A2%G3", nil) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - _, err := getAdminFromPostFields(req) + _, err = getAdminFromPostFields(req) assert.Error(t, err) req, _ = http.NewRequest(http.MethodPost, webAdminEventActionPath+"?a=a%C3%A2%GG", nil) @@ -1340,6 +1611,7 @@ func TestCreateTokenError(t *testing.T) { assert.Equal(t, http.StatusInternalServerError, rr.Code, rr.Body.String()) req, _ = http.NewRequest(http.MethodPost, webAdminTwoFactorPath+"?a=a%C3%AO%GC", bytes.NewBuffer([]byte(form.Encode()))) + req = req.WithContext(jwt.NewContext(req.Context(), &jwt.Claims{}, nil)) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = httptest.NewRecorder() server.handleWebAdminTwoFactorPost(rr, req) @@ -1347,6 +1619,7 @@ func TestCreateTokenError(t *testing.T) { assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidForm) req, _ = http.NewRequest(http.MethodPost, webAdminTwoFactorRecoveryPath+"?a=a%C3%AO%GD", bytes.NewBuffer([]byte(form.Encode()))) + req = req.WithContext(jwt.NewContext(req.Context(), &jwt.Claims{}, nil)) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = httptest.NewRecorder() server.handleWebAdminTwoFactorRecoveryPost(rr, req) @@ -1354,6 +1627,7 @@ func TestCreateTokenError(t *testing.T) { assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidForm) req, _ = http.NewRequest(http.MethodPost, webClientTwoFactorPath+"?a=a%C3%AO%GC", bytes.NewBuffer([]byte(form.Encode()))) + req = req.WithContext(jwt.NewContext(req.Context(), &jwt.Claims{}, nil)) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = httptest.NewRecorder() server.handleWebClientTwoFactorPost(rr, req) @@ -1361,6 +1635,7 @@ func TestCreateTokenError(t *testing.T) { assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidForm) req, _ = http.NewRequest(http.MethodPost, webClientTwoFactorRecoveryPath+"?a=a%C3%AO%GD", bytes.NewBuffer([]byte(form.Encode()))) + req = req.WithContext(jwt.NewContext(req.Context(), &jwt.Claims{}, nil)) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = httptest.NewRecorder() server.handleWebClientTwoFactorRecoveryPost(rr, req) @@ -1424,13 +1699,21 @@ func TestCreateTokenError(t *testing.T) { err = dataprovider.AddUser(&user, "", "", "") assert.NoError(t, err) + req, err = http.NewRequest(http.MethodGet, webClientLoginPath, nil) + assert.NoError(t, err) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token.Token)) + parsedToken, err = jwt.VerifyRequest(server.csrfTokenAuth, req, jwt.TokenFromCookie) + assert.NoError(t, err) + ctx = req.Context() + ctx = jwt.NewContext(ctx, parsedToken, err) + req = req.WithContext(ctx) + rr = httptest.NewRecorder() form = make(url.Values) form.Set("username", user.Username) form.Set("password", "clientpwd") - form.Set(csrfFormToken, createCSRFToken("127.0.0.1")) + form.Set(csrfFormToken, createCSRFToken(rr, req, server.csrfTokenAuth, "", webBaseClientPath)) req, _ = http.NewRequest(http.MethodPost, webClientLoginPath, bytes.NewBuffer([]byte(form.Encode()))) - req.RemoteAddr = "127.0.0.1:4567" req.Header.Set("Content-Type", "application/x-www-form-urlencoded") server.handleWebClientLoginPost(rr, req) assert.Equal(t, http.StatusOK, rr.Code, rr.Body.String()) @@ -1458,7 +1741,7 @@ func TestCreateTokenError(t *testing.T) { } func TestAPIKeyAuthForbidden(t *testing.T) { - r := GetHTTPRouter(Binding{ + r, err := GetHTTPRouter(Binding{ Address: "", Port: 8080, EnableWebAdmin: true, @@ -1466,6 +1749,7 @@ func TestAPIKeyAuthForbidden(t *testing.T) { EnableRESTAPI: true, RenderOpenAPI: true, }) + require.NoError(t, err) fn := forbidAPIKeyAuthentication(r) rr := httptest.NewRecorder() req, _ := http.NewRequest(http.MethodGet, versionPath, nil) @@ -1475,12 +1759,14 @@ func TestAPIKeyAuthForbidden(t *testing.T) { } func TestJWTTokenValidation(t *testing.T) { - tokenAuth := jwtauth.New(jwa.HS256.String(), util.GenerateRandomBytes(32), nil) - claims := make(map[string]any) - claims["username"] = defaultAdminUsername - claims[jwt.ExpirationKey] = time.Now().UTC().Add(-1 * time.Hour) - token, _, err := tokenAuth.Encode(claims) - assert.NoError(t, err) + tokenAuth, err := jwt.NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) + claims := &jwt.Claims{ + Username: defaultAdminUsername, + } + claims.SetExpiry(time.Now().UTC().Add(-1 * time.Hour)) + _, err = tokenAuth.SignWithParams(claims, tokenAudienceWebAdmin, "", getTokenDuration(tokenAudienceWebAdmin)) + require.NoError(t, err) server := httpdServer{ binding: Binding{ @@ -1492,19 +1778,20 @@ func TestJWTTokenValidation(t *testing.T) { RenderOpenAPI: true, }, } - server.initializeRouter() + err = server.initializeRouter() + require.NoError(t, err) r := server.router fn := jwtAuthenticatorAPI(r) rr := httptest.NewRecorder() req, _ := http.NewRequest(http.MethodGet, userPath, nil) - ctx := jwtauth.NewContext(req.Context(), token, nil) + ctx := jwt.NewContext(req.Context(), claims, nil) fn.ServeHTTP(rr, req.WithContext(ctx)) assert.Equal(t, http.StatusUnauthorized, rr.Code) fn = jwtAuthenticatorWebAdmin(r) rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodGet, webUserPath, nil) - ctx = jwtauth.NewContext(req.Context(), token, nil) + ctx = jwt.NewContext(req.Context(), claims, nil) fn.ServeHTTP(rr, req.WithContext(ctx)) assert.Equal(t, http.StatusFound, rr.Code) assert.Equal(t, webAdminLoginPath, rr.Header().Get("Location")) @@ -1512,26 +1799,26 @@ func TestJWTTokenValidation(t *testing.T) { fn = jwtAuthenticatorWebClient(r) rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodGet, webClientFilesPath, nil) - ctx = jwtauth.NewContext(req.Context(), token, nil) + ctx = jwt.NewContext(req.Context(), claims, nil) fn.ServeHTTP(rr, req.WithContext(ctx)) assert.Equal(t, http.StatusFound, rr.Code) assert.Equal(t, webClientLoginPath, rr.Header().Get("Location")) errTest := errors.New("test error") - permFn := server.checkPerm(dataprovider.PermAdminAny) + permFn := server.checkPerms(dataprovider.PermAdminAny) fn = permFn(r) rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodGet, userPath, nil) - ctx = jwtauth.NewContext(req.Context(), token, errTest) + ctx = jwt.NewContext(req.Context(), claims, errTest) fn.ServeHTTP(rr, req.WithContext(ctx)) assert.Equal(t, http.StatusBadRequest, rr.Code) - permFn = server.checkPerm(dataprovider.PermAdminAny) + permFn = server.checkPerms(dataprovider.PermAdminAny) fn = permFn(r) rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodGet, webUserPath, nil) req.RequestURI = webUserPath - ctx = jwtauth.NewContext(req.Context(), token, errTest) + ctx = jwt.NewContext(req.Context(), claims, errTest) fn.ServeHTTP(rr, req.WithContext(ctx)) assert.Equal(t, http.StatusBadRequest, rr.Code) @@ -1540,14 +1827,14 @@ func TestJWTTokenValidation(t *testing.T) { rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodPost, webClientProfilePath, nil) req.RequestURI = webClientProfilePath - ctx = jwtauth.NewContext(req.Context(), token, errTest) + ctx = jwt.NewContext(req.Context(), claims, errTest) fn.ServeHTTP(rr, req.WithContext(ctx)) assert.Equal(t, http.StatusBadRequest, rr.Code) rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodPost, userProfilePath, nil) req.RequestURI = userProfilePath - ctx = jwtauth.NewContext(req.Context(), token, errTest) + ctx = jwt.NewContext(req.Context(), claims, errTest) fn.ServeHTTP(rr, req.WithContext(ctx)) assert.Equal(t, http.StatusBadRequest, rr.Code) @@ -1555,7 +1842,7 @@ func TestJWTTokenValidation(t *testing.T) { rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodPost, webClientProfilePath, nil) req.RequestURI = webClientProfilePath - ctx = jwtauth.NewContext(req.Context(), token, errTest) + ctx = jwt.NewContext(req.Context(), claims, errTest) fn.ServeHTTP(rr, req.WithContext(ctx)) assert.Equal(t, http.StatusBadRequest, rr.Code) @@ -1563,50 +1850,56 @@ func TestJWTTokenValidation(t *testing.T) { rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodPost, webGroupsPath, nil) req.RequestURI = webGroupsPath - ctx = jwtauth.NewContext(req.Context(), token, errTest) + ctx = jwt.NewContext(req.Context(), claims, errTest) fn.ServeHTTP(rr, req.WithContext(ctx)) assert.Equal(t, http.StatusBadRequest, rr.Code) rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodPost, userSharesPath, nil) req.RequestURI = userSharesPath - ctx = jwtauth.NewContext(req.Context(), token, errTest) + ctx = jwt.NewContext(req.Context(), claims, errTest) fn.ServeHTTP(rr, req.WithContext(ctx)) assert.Equal(t, http.StatusBadRequest, rr.Code) } func TestUpdateContextFromCookie(t *testing.T) { + tokenAuth, err := jwt.NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) server := httpdServer{ - tokenAuth: jwtauth.New(jwa.HS256.String(), util.GenerateRandomBytes(32), nil), + tokenAuth: tokenAuth, } req, _ := http.NewRequest(http.MethodGet, tokenPath, nil) - claims := make(map[string]any) - claims["a"] = "b" - token, _, err := server.tokenAuth.Encode(claims) + claims := jwt.NewClaims(tokenAudienceWebClient, "", getTokenDuration(tokenAudienceWebClient)) + _, err = server.tokenAuth.Sign(claims) assert.NoError(t, err) - ctx := jwtauth.NewContext(req.Context(), token, nil) - server.updateContextFromCookie(req.WithContext(ctx)) + ctx := jwt.NewContext(req.Context(), claims, nil) + req = server.updateContextFromCookie(req.WithContext(ctx)) + token, err := jwt.FromContext(req.Context()) + require.NoError(t, err) + require.True(t, token.Audience.Contains(tokenAudienceWebClient)) + require.NotEmpty(t, token.ID) } func TestCookieExpiration(t *testing.T) { + tokenAuth, err := jwt.NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) server := httpdServer{ - tokenAuth: jwtauth.New(jwa.HS256.String(), util.GenerateRandomBytes(32), nil), + tokenAuth: tokenAuth, } - err := errors.New("test error") + err = errors.New("test error") rr := httptest.NewRecorder() req, _ := http.NewRequest(http.MethodGet, tokenPath, nil) - ctx := jwtauth.NewContext(req.Context(), nil, err) + ctx := jwt.NewContext(req.Context(), nil, err) server.checkCookieExpiration(rr, req.WithContext(ctx)) cookie := rr.Header().Get("Set-Cookie") assert.Empty(t, cookie) req, _ = http.NewRequest(http.MethodGet, tokenPath, nil) - claims := make(map[string]any) - claims["a"] = "b" - token, _, err := server.tokenAuth.Encode(claims) + claims := jwt.NewClaims(tokenAudienceWebClient, "", getTokenDuration(tokenAudienceWebClient)) + _, err = server.tokenAuth.Sign(claims) assert.NoError(t, err) - ctx = jwtauth.NewContext(req.Context(), token, nil) + ctx = jwt.NewContext(req.Context(), claims, nil) server.checkCookieExpiration(rr, req.WithContext(ctx)) cookie = rr.Header().Get("Set-Cookie") assert.Empty(t, cookie) @@ -1616,16 +1909,16 @@ func TestCookieExpiration(t *testing.T) { Password: "password", Permissions: []string{dataprovider.PermAdminAny}, } - claims = make(map[string]any) - claims[claimUsernameKey] = admin.Username - claims[claimPermissionsKey] = admin.Permissions - claims[jwt.SubjectKey] = admin.GetSignature() - claims[jwt.ExpirationKey] = time.Now().Add(1 * time.Minute) - claims[jwt.AudienceKey] = []string{tokenAudienceAPI} - token, _, err = server.tokenAuth.Encode(claims) + claims = jwt.NewClaims(tokenAudienceAPI, "", getTokenDuration(tokenAudienceAPI)) + claims.Username = admin.Username + claims.Permissions = admin.Permissions + claims.Subject = admin.GetSignature() + claims.SetExpiry(time.Now().Add(1 * time.Minute)) + _, err = server.tokenAuth.Sign(claims) assert.NoError(t, err) + req, _ = http.NewRequest(http.MethodGet, tokenPath, nil) - ctx = jwtauth.NewContext(req.Context(), token, nil) + ctx = jwt.NewContext(req.Context(), claims, nil) server.checkCookieExpiration(rr, req.WithContext(ctx)) cookie = rr.Header().Get("Set-Cookie") assert.Empty(t, cookie) @@ -1634,7 +1927,7 @@ func TestCookieExpiration(t *testing.T) { err = dataprovider.AddAdmin(&admin, "", "", "") assert.NoError(t, err) req, _ = http.NewRequest(http.MethodGet, tokenPath, nil) - ctx = jwtauth.NewContext(req.Context(), token, nil) + ctx = jwt.NewContext(req.Context(), claims, nil) server.checkCookieExpiration(rr, req.WithContext(ctx)) cookie = rr.Header().Get("Set-Cookie") assert.Empty(t, cookie) @@ -1644,34 +1937,41 @@ func TestCookieExpiration(t *testing.T) { err = dataprovider.UpdateAdmin(&admin, "", "", "") assert.NoError(t, err) req, _ = http.NewRequest(http.MethodGet, tokenPath, nil) - ctx = jwtauth.NewContext(req.Context(), token, nil) + ctx = jwt.NewContext(req.Context(), claims, nil) server.checkCookieExpiration(rr, req.WithContext(ctx)) cookie = rr.Header().Get("Set-Cookie") assert.Empty(t, cookie) admin, err = dataprovider.AdminExists(admin.Username) assert.NoError(t, err) - claims = make(map[string]any) - claims[claimUsernameKey] = admin.Username - claims[claimPermissionsKey] = admin.Permissions - claims[jwt.SubjectKey] = admin.GetSignature() - claims[jwt.ExpirationKey] = time.Now().Add(1 * time.Minute) - claims[jwt.AudienceKey] = []string{tokenAudienceAPI} - token, _, err = server.tokenAuth.Encode(claims) + tokenID := xid.New().String() + claims = jwt.NewClaims(tokenAudienceAPI, "", getTokenDuration(tokenAudienceAPI)) + claims.ID = tokenID + claims.Username = admin.Username + claims.Permissions = admin.Permissions + claims.Subject = admin.GetSignature() + claims.SetExpiry(time.Now().Add(1 * time.Minute)) + _, err = server.tokenAuth.Sign(claims) assert.NoError(t, err) + req, _ = http.NewRequest(http.MethodGet, tokenPath, nil) req.RemoteAddr = "192.168.8.1:1234" - ctx = jwtauth.NewContext(req.Context(), token, nil) + ctx = jwt.NewContext(req.Context(), claims, nil) server.checkCookieExpiration(rr, req.WithContext(ctx)) cookie = rr.Header().Get("Set-Cookie") assert.Empty(t, cookie) req, _ = http.NewRequest(http.MethodGet, tokenPath, nil) req.RemoteAddr = "172.16.1.12:4567" - ctx = jwtauth.NewContext(req.Context(), token, nil) + ctx = jwt.NewContext(req.Context(), claims, nil) server.checkCookieExpiration(rr, req.WithContext(ctx)) cookie = rr.Header().Get("Set-Cookie") assert.True(t, strings.HasPrefix(cookie, "jwt=")) + req.Header.Set("Cookie", cookie) + c, err := jwt.VerifyRequest(server.tokenAuth, req, jwt.TokenFromCookie) + if assert.NoError(t, err) { + assert.Equal(t, tokenID, c.ID) + } err = dataprovider.DeleteAdmin(admin.Username, "", "", "") assert.NoError(t, err) @@ -1689,18 +1989,18 @@ func TestCookieExpiration(t *testing.T) { user.Permissions = make(map[string][]string) user.Permissions["/"] = []string{"*"} - claims = make(map[string]any) - claims[claimUsernameKey] = user.Username - claims[claimPermissionsKey] = user.Filters.WebClient - claims[jwt.SubjectKey] = user.GetSignature() - claims[jwt.ExpirationKey] = time.Now().Add(1 * time.Minute) - claims[jwt.AudienceKey] = []string{tokenAudienceWebClient} - token, _, err = server.tokenAuth.Encode(claims) + claims = jwt.NewClaims(tokenAudienceWebClient, "", getTokenDuration(tokenAudienceWebClient)) + claims.ID = tokenID + claims.Username = user.Username + claims.Permissions = user.Filters.WebClient + claims.Subject = user.GetSignature() + claims.SetExpiry(time.Now().Add(1 * time.Minute)) + _, err = server.tokenAuth.Sign(claims) assert.NoError(t, err) rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodGet, webClientFilesPath, nil) - ctx = jwtauth.NewContext(req.Context(), token, nil) + ctx = jwt.NewContext(req.Context(), claims, nil) server.checkCookieExpiration(rr, req.WithContext(ctx)) cookie = rr.Header().Get("Set-Cookie") assert.Empty(t, cookie) @@ -1708,7 +2008,7 @@ func TestCookieExpiration(t *testing.T) { err = dataprovider.AddUser(&user, "", "", "") assert.NoError(t, err) req, _ = http.NewRequest(http.MethodGet, webClientFilesPath, nil) - ctx = jwtauth.NewContext(req.Context(), token, nil) + ctx = jwt.NewContext(req.Context(), claims, nil) server.checkCookieExpiration(rr, req.WithContext(ctx)) cookie = rr.Header().Get("Set-Cookie") assert.Empty(t, cookie) @@ -1721,28 +2021,81 @@ func TestCookieExpiration(t *testing.T) { user, err = dataprovider.UserExists(user.Username, "") assert.NoError(t, err) - claims = make(map[string]any) - claims[claimUsernameKey] = user.Username - claims[claimPermissionsKey] = user.Filters.WebClient - claims[jwt.SubjectKey] = user.GetSignature() - claims[jwt.ExpirationKey] = time.Now().Add(1 * time.Minute) - claims[jwt.AudienceKey] = []string{tokenAudienceWebClient} - token, _, err = server.tokenAuth.Encode(claims) + issuedAt := time.Now().Add(-1 * time.Minute) + expiresAt := time.Now().Add(1 * time.Minute) + + claims = jwt.NewClaims(tokenAudienceWebClient, "", getTokenDuration(tokenAudienceWebClient)) + claims.ID = tokenID + claims.Username = user.Username + claims.Permissions = user.Filters.WebClient + claims.Subject = user.GetSignature() + claims.SetExpiry(expiresAt) + claims.SetIssuedAt(issuedAt) + _, err = server.tokenAuth.Sign(claims) assert.NoError(t, err) req, _ = http.NewRequest(http.MethodGet, webClientFilesPath, nil) req.RemoteAddr = "172.16.3.12:4567" - ctx = jwtauth.NewContext(req.Context(), token, nil) + ctx = jwt.NewContext(req.Context(), claims, nil) server.checkCookieExpiration(rr, req.WithContext(ctx)) cookie = rr.Header().Get("Set-Cookie") assert.Empty(t, cookie) req, _ = http.NewRequest(http.MethodGet, webClientFilesPath, nil) req.RemoteAddr = "172.16.4.16:4567" - ctx = jwtauth.NewContext(req.Context(), token, nil) + ctx = jwt.NewContext(req.Context(), claims, nil) server.checkCookieExpiration(rr, req.WithContext(ctx)) cookie = rr.Header().Get("Set-Cookie") assert.NotEmpty(t, cookie) + req.Header.Set("Cookie", cookie) + c, err = jwt.VerifyRequest(server.tokenAuth, req, jwt.TokenFromCookie) + if assert.NoError(t, err) { + assert.Equal(t, tokenID, c.ID) + assert.Equal(t, issuedAt.Unix(), c.IssuedAt.Time().Unix()) + assert.NotEqual(t, expiresAt.Unix(), c.Expiry.Time().Unix()) + } + // test a cookie issued more that 12 hours ago + claims = jwt.NewClaims(tokenAudienceWebClient, "", getTokenDuration(tokenAudienceWebClient)) + claims.ID = tokenID + claims.Username = user.Username + claims.Permissions = user.Filters.WebClient + claims.Subject = user.GetSignature() + claims.SetExpiry(expiresAt) + claims.SetIssuedAt(time.Now().Add(-24 * time.Hour)) + _, err = server.tokenAuth.Sign(claims) + assert.NoError(t, err) + + rr = httptest.NewRecorder() + req, _ = http.NewRequest(http.MethodGet, webClientFilesPath, nil) + req.RemoteAddr = "172.16.4.16:6789" + ctx = jwt.NewContext(req.Context(), claims, nil) + server.checkCookieExpiration(rr, req.WithContext(ctx)) + cookie = rr.Header().Get("Set-Cookie") + assert.Empty(t, cookie) + + // test a disabled user + user.Status = 0 + err = dataprovider.UpdateUser(&user, "", "", "") + assert.NoError(t, err) + user, err = dataprovider.UserExists(user.Username, "") + assert.NoError(t, err) + + claims = jwt.NewClaims(tokenAudienceWebClient, "", getTokenDuration(tokenAudienceWebClient)) + claims.ID = tokenID + claims.Username = user.Username + claims.Permissions = user.Filters.WebClient + claims.Subject = user.GetSignature() + claims.SetExpiry(time.Now().Add(1 * time.Minute)) + claims.SetIssuedAt(issuedAt) + _, err = server.tokenAuth.Sign(claims) + assert.NoError(t, err) + + rr = httptest.NewRecorder() + req, _ = http.NewRequest(http.MethodGet, webClientFilesPath, nil) + ctx = jwt.NewContext(req.Context(), claims, nil) + server.checkCookieExpiration(rr, req.WithContext(ctx)) + cookie = rr.Header().Get("Set-Cookie") + assert.Empty(t, cookie) err = dataprovider.DeleteUser(user.Username, "", "", "") assert.NoError(t, err) @@ -1769,6 +2122,7 @@ func TestChangePwdValidationErrors(t *testing.T) { require.Error(t, err) req, _ := http.NewRequest(http.MethodPut, adminPwdPath, nil) + req = req.WithContext(jwt.NewContext(req.Context(), &jwt.Claims{Claims: josejwt.Claims{ID: xid.New().String()}}, nil)) err = doChangeAdminPassword(req, "currentpwd", "newpwd", "newpwd") assert.Error(t, err) } @@ -1776,23 +2130,24 @@ func TestChangePwdValidationErrors(t *testing.T) { func TestRenderUnexistingFolder(t *testing.T) { rr := httptest.NewRecorder() req, _ := http.NewRequest(http.MethodPost, folderPath, nil) - renderFolder(rr, req, "path not mapped", &jwtTokenClaims{}, http.StatusOK) + renderFolder(rr, req, "path not mapped", &jwt.Claims{}, http.StatusOK) assert.Equal(t, http.StatusNotFound, rr.Code) } func TestCloseConnectionHandler(t *testing.T) { - tokenAuth := jwtauth.New(jwa.HS256.String(), util.GenerateRandomBytes(32), nil) - claims := make(map[string]any) - claims["username"] = defaultAdminUsername - claims[jwt.ExpirationKey] = time.Now().UTC().Add(1 * time.Hour) - token, _, err := tokenAuth.Encode(claims) + tokenAuth, err := jwt.NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) + claims := jwt.NewClaims(tokenAudienceAPI, "", getTokenDuration(tokenAudienceAPI)) + claims.Username = defaultAdminUsername + claims.SetExpiry(time.Now().UTC().Add(1 * time.Hour)) + _, err = tokenAuth.Sign(claims) assert.NoError(t, err) req, err := http.NewRequest(http.MethodDelete, activeConnectionsPath+"/connectionID", nil) assert.NoError(t, err) rctx := chi.NewRouteContext() rctx.URLParams.Add("connectionID", "") req = req.WithContext(context.WithValue(req.Context(), chi.RouteCtxKey, rctx)) - req = req.WithContext(context.WithValue(req.Context(), jwtauth.TokenCtxKey, token)) + req = req.WithContext(context.WithValue(req.Context(), jwt.TokenCtxKey, claims)) rr := httptest.NewRecorder() handleCloseConnection(rr, req) assert.Equal(t, http.StatusBadRequest, rr.Code) @@ -1814,7 +2169,7 @@ func TestRenderInvalidTemplate(t *testing.T) { } func TestQuotaScanInvalidFs(t *testing.T) { - user := dataprovider.User{ + user := &dataprovider.User{ BaseUser: sdk.BaseUser{ Username: "test", HomeDir: os.TempDir(), @@ -1987,31 +2342,38 @@ func TestGetUserFromTemplate(t *testing.T) { } func TestJWTTokenCleanup(t *testing.T) { + tokenAuth, err := jwt.NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) server := httpdServer{ - tokenAuth: jwtauth.New(jwa.HS256.String(), util.GenerateRandomBytes(32), nil), + tokenAuth: tokenAuth, } admin := dataprovider.Admin{ Username: "newtestadmin", Password: "password", Permissions: []string{dataprovider.PermAdminAny}, } - claims := make(map[string]any) - claims[claimUsernameKey] = admin.Username - claims[claimPermissionsKey] = admin.Permissions - claims[jwt.SubjectKey] = admin.GetSignature() - claims[jwt.ExpirationKey] = time.Now().Add(1 * time.Minute) - _, token, err := server.tokenAuth.Encode(claims) + claims := jwt.NewClaims(tokenAudienceAPI, "", getTokenDuration(tokenAudienceAPI)) + claims.Username = admin.Username + claims.Permissions = admin.Permissions + claims.Subject = admin.GetSignature() + claims.SetExpiry(time.Now().Add(1 * time.Minute)) + token, err := server.tokenAuth.Sign(claims) assert.NoError(t, err) req, _ := http.NewRequest(http.MethodGet, versionPath, nil) assert.True(t, isTokenInvalidated(req)) - req.Header.Set("Authorization", fmt.Sprintf("Bearer %v", token)) + fakeToken := "abc" + invalidateTokenString(req, fakeToken, -100*time.Millisecond) + assert.True(t, invalidatedJWTTokens.Get(fakeToken)) - invalidatedJWTTokens.Add(token, time.Now().Add(-tokenDuration).UTC()) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) + + invalidatedJWTTokens.Add(token, time.Now().Add(-getTokenDuration(tokenAudienceWebAdmin)).UTC()) require.True(t, isTokenInvalidated(req)) startCleanupTicker(100 * time.Millisecond) assert.Eventually(t, func() bool { return !isTokenInvalidated(req) }, 1*time.Second, 200*time.Millisecond) + assert.False(t, invalidatedJWTTokens.Get(fakeToken)) stopCleanupTicker() } @@ -2024,22 +2386,71 @@ func TestDbTokenManager(t *testing.T) { testToken := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiV2ViQWRtaW4iLCI6OjEiXSwiZXhwIjoxNjk4NjYwMDM4LCJqdGkiOiJja3ZuazVrYjF1aHUzZXRmZmhyZyIsIm5iZiI6MTY5ODY1ODgwOCwicGVybWlzc2lvbnMiOlsiKiJdLCJzdWIiOiIxNjk3ODIwNDM3NTMyIiwidXNlcm5hbWUiOiJhZG1pbiJ9.LXuFFksvnSuzHqHat6r70yR0jEulNRju7m7SaWrOfy8; csrftoken=mP0C7DqjwpAXsptO2gGCaYBkYw3oNMWB" key := dbTokenManager.getKey(testToken) require.Len(t, key, 64) - dbTokenManager.Add(testToken, time.Now().Add(-tokenDuration).UTC()) + dbTokenManager.Add(testToken, time.Now().Add(-getTokenDuration(tokenAudienceWebClient)).UTC()) isInvalidated := dbTokenManager.Get(testToken) assert.True(t, isInvalidated) dbTokenManager.Cleanup() isInvalidated = dbTokenManager.Get(testToken) assert.False(t, isInvalidated) - dbTokenManager.Add(testToken, time.Now().Add(tokenDuration).UTC()) + dbTokenManager.Add(testToken, time.Now().Add(getTokenDuration(tokenAudienceWebAdmin)).UTC()) isInvalidated = dbTokenManager.Get(testToken) assert.True(t, isInvalidated) dbTokenManager.Cleanup() isInvalidated = dbTokenManager.Get(testToken) assert.True(t, isInvalidated) - err := dataprovider.DeleteSharedSession(key) + err := dataprovider.DeleteSharedSession(key, dataprovider.SessionTypeInvalidToken) assert.NoError(t, err) } +func TestDatabaseSharedSessions(t *testing.T) { + if !isSharedProviderSupported() { + t.Skip("this test it is not available with this provider") + } + session1 := dataprovider.Session{ + Key: "1", + Data: map[string]string{"a": "b"}, + Type: dataprovider.SessionTypeOIDCAuth, + Timestamp: 10, + } + err := dataprovider.AddSharedSession(session1) + assert.NoError(t, err) + // Adding another session with the same key but a different type should work + session2 := session1 + session2.Type = dataprovider.SessionTypeOIDCToken + err = dataprovider.AddSharedSession(session2) + assert.NoError(t, err) + err = dataprovider.DeleteSharedSession(session1.Key, dataprovider.SessionTypeInvalidToken) + assert.ErrorIs(t, err, util.ErrNotFound) + _, err = dataprovider.GetSharedSession(session1.Key, dataprovider.SessionTypeResetCode) + assert.ErrorIs(t, err, util.ErrNotFound) + session1Get, err := dataprovider.GetSharedSession(session1.Key, dataprovider.SessionTypeOIDCAuth) + assert.NoError(t, err) + assert.Equal(t, session1.Timestamp, session1Get.Timestamp) + var stored map[string]string + err = json.Unmarshal(session1Get.Data.([]byte), &stored) + assert.NoError(t, err) + assert.Equal(t, session1.Data, stored) + session1.Timestamp = 20 + session1.Data = map[string]string{"c": "d"} + err = dataprovider.AddSharedSession(session1) + assert.NoError(t, err) + session1Get, err = dataprovider.GetSharedSession(session1.Key, dataprovider.SessionTypeOIDCAuth) + assert.NoError(t, err) + assert.Equal(t, session1.Timestamp, session1Get.Timestamp) + stored = make(map[string]string) + err = json.Unmarshal(session1Get.Data.([]byte), &stored) + assert.NoError(t, err) + assert.Equal(t, session1.Data, stored) + err = dataprovider.DeleteSharedSession(session1.Key, dataprovider.SessionTypeOIDCAuth) + assert.NoError(t, err) + err = dataprovider.DeleteSharedSession(session2.Key, dataprovider.SessionTypeOIDCToken) + assert.NoError(t, err) + _, err = dataprovider.GetSharedSession(session1.Key, dataprovider.SessionTypeOIDCAuth) + assert.ErrorIs(t, err, util.ErrNotFound) + _, err = dataprovider.GetSharedSession(session2.Key, dataprovider.SessionTypeOIDCToken) + assert.ErrorIs(t, err, util.ErrNotFound) +} + func TestAllowedProxyUnixDomainSocket(t *testing.T) { b := Binding{ Address: filepath.Join(os.TempDir(), "sock"), @@ -2052,6 +2463,15 @@ func TestAllowedProxyUnixDomainSocket(t *testing.T) { } } +func TestProxyListenerWrapper(t *testing.T) { + b := Binding{ + ProxyMode: 0, + } + require.Nil(t, b.listenerWrapper()) + b.ProxyMode = 1 + require.NotNil(t, b.listenerWrapper()) +} + func TestProxyHeaders(t *testing.T) { username := "adminTest" password := "testPwd" @@ -2082,7 +2502,8 @@ func TestProxyHeaders(t *testing.T) { err = b.parseAllowedProxy() assert.NoError(t, err) server := newHttpdServer(b, "", "", CorsConfig{Enabled: true}, "") - server.initializeRouter() + err = server.initializeRouter() + require.NoError(t, err) testServer := httptest.NewServer(server.router) defer testServer.Close() @@ -2095,7 +2516,7 @@ func TestProxyHeaders(t *testing.T) { rr := httptest.NewRecorder() testServer.Config.Handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusUnauthorized, rr.Code) - assert.Contains(t, rr.Body.String(), "login from IP 127.0.0.1 not allowed") + assert.NotContains(t, rr.Body.String(), "login from IP 127.0.0.1 not allowed") req.RemoteAddr = testIP rr = httptest.NewRecorder() @@ -2107,34 +2528,95 @@ func TestProxyHeaders(t *testing.T) { testServer.Config.Handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusOK, rr.Code) + req, err = http.NewRequest(http.MethodGet, webAdminLoginPath, nil) + assert.NoError(t, err) + req.RemoteAddr = testIP + rr = httptest.NewRecorder() + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code, rr.Body.String()) + cookie := rr.Header().Get("Set-Cookie") + assert.NotEmpty(t, cookie) + req.Header.Set("Cookie", cookie) + parsedToken, err := jwt.VerifyRequest(server.csrfTokenAuth, req, jwt.TokenFromCookie) + assert.NoError(t, err) + ctx := req.Context() + ctx = jwt.NewContext(ctx, parsedToken, err) + req = req.WithContext(ctx) + form := make(url.Values) form.Set("username", username) form.Set("password", password) - form.Set(csrfFormToken, createCSRFToken(testIP)) + form.Set(csrfFormToken, createCSRFToken(httptest.NewRecorder(), req, server.csrfTokenAuth, "", webBaseAdminPath)) req, err = http.NewRequest(http.MethodPost, webAdminLoginPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = testIP + req.Header.Set("Cookie", cookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") rr = httptest.NewRecorder() testServer.Config.Handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusOK, rr.Code, rr.Body.String()) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCredentials) - form.Set(csrfFormToken, createCSRFToken(validForwardedFor)) + req, err = http.NewRequest(http.MethodGet, webAdminLoginPath, nil) + assert.NoError(t, err) + req.RemoteAddr = validForwardedFor + rr = httptest.NewRecorder() + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code, rr.Body.String()) + loginCookie := rr.Header().Get("Set-Cookie") + assert.NotEmpty(t, loginCookie) + req.Header.Set("Cookie", loginCookie) + parsedToken, err = jwt.VerifyRequest(server.csrfTokenAuth, req, jwt.TokenFromCookie) + assert.NoError(t, err) + ctx = req.Context() + ctx = jwt.NewContext(ctx, parsedToken, err) + req = req.WithContext(ctx) + + form.Set(csrfFormToken, createCSRFToken(httptest.NewRecorder(), req, server.csrfTokenAuth, "", webBaseAdminPath)) req, err = http.NewRequest(http.MethodPost, webAdminLoginPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = testIP + req.Header.Set("Cookie", loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.Header.Set("X-Forwarded-For", validForwardedFor) rr = httptest.NewRecorder() testServer.Config.Handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusFound, rr.Code, rr.Body.String()) - cookie := rr.Header().Get("Set-Cookie") + cookie = rr.Header().Get("Set-Cookie") assert.NotContains(t, cookie, "Secure") + // The login cookie is invalidated after a successful login, the same request will fail req, err = http.NewRequest(http.MethodPost, webAdminLoginPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = testIP + req.Header.Set("Cookie", loginCookie) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("X-Forwarded-For", validForwardedFor) + rr = httptest.NewRecorder() + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code, rr.Body.String()) + assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidCSRF) + + req, err = http.NewRequest(http.MethodGet, webAdminLoginPath, nil) + assert.NoError(t, err) + req.RemoteAddr = validForwardedFor + rr = httptest.NewRecorder() + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code, rr.Body.String()) + loginCookie = rr.Header().Get("Set-Cookie") + assert.NotEmpty(t, loginCookie) + req.Header.Set("Cookie", loginCookie) + parsedToken, err = jwt.VerifyRequest(server.csrfTokenAuth, req, jwt.TokenFromCookie) + assert.NoError(t, err) + ctx = req.Context() + ctx = jwt.NewContext(ctx, parsedToken, err) + req = req.WithContext(ctx) + + form.Set(csrfFormToken, createCSRFToken(httptest.NewRecorder(), req, server.csrfTokenAuth, "", webBaseAdminPath)) + req, err = http.NewRequest(http.MethodPost, webAdminLoginPath, bytes.NewBuffer([]byte(form.Encode()))) + assert.NoError(t, err) + req.RemoteAddr = testIP + req.Header.Set("Cookie", loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.Header.Set("X-Forwarded-For", validForwardedFor) req.Header.Set(xForwardedProto, "https") @@ -2144,9 +2626,26 @@ func TestProxyHeaders(t *testing.T) { cookie = rr.Header().Get("Set-Cookie") assert.Contains(t, cookie, "Secure") + req, err = http.NewRequest(http.MethodGet, webAdminLoginPath, nil) + assert.NoError(t, err) + req.RemoteAddr = validForwardedFor + rr = httptest.NewRecorder() + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code, rr.Body.String()) + loginCookie = rr.Header().Get("Set-Cookie") + assert.NotEmpty(t, loginCookie) + req.Header.Set("Cookie", loginCookie) + parsedToken, err = jwt.VerifyRequest(server.csrfTokenAuth, req, jwt.TokenFromCookie) + assert.NoError(t, err) + ctx = req.Context() + ctx = jwt.NewContext(ctx, parsedToken, err) + req = req.WithContext(ctx) + + form.Set(csrfFormToken, createCSRFToken(httptest.NewRecorder(), req, server.csrfTokenAuth, "", webBaseAdminPath)) req, err = http.NewRequest(http.MethodPost, webAdminLoginPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) req.RemoteAddr = testIP + req.Header.Set("Cookie", loginCookie) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.Header.Set("X-Forwarded-For", validForwardedFor) req.Header.Set(xForwardedProto, "http") @@ -2170,7 +2669,8 @@ func TestRecoverer(t *testing.T) { EnableRESTAPI: true, } server := newHttpdServer(b, "../static", "", CorsConfig{}, "../openapi") - server.initializeRouter() + err := server.initializeRouter() + require.NoError(t, err) server.router.Get(recoveryPath, func(_ http.ResponseWriter, _ *http.Request) { panic("panic") }) @@ -2231,10 +2731,11 @@ func TestCompressorAbortHandler(t *testing.T) { assert.Equal(t, http.ErrAbortHandler, rcv) }() - connection := &Connection{ - BaseConnection: common.NewBaseConnection(xid.New().String(), common.ProtocolHTTP, "", "", dataprovider.User{}), - request: nil, - } + connection := newConnection( + common.NewBaseConnection(xid.New().String(), common.ProtocolHTTP, "", "", dataprovider.User{}), + nil, + nil, + ) share := &dataprovider.Share{} renderCompressedFiles(&failingWriter{}, connection, "", nil, share) } @@ -2256,10 +2757,11 @@ func TestZipErrors(t *testing.T) { } user.Permissions = make(map[string][]string) user.Permissions["/"] = []string{dataprovider.PermAny} - connection := &Connection{ - BaseConnection: common.NewBaseConnection(xid.New().String(), common.ProtocolHTTP, "", "", user), - request: nil, - } + connection := newConnection( + common.NewBaseConnection(xid.New().String(), common.ProtocolHTTP, "", "", user), + nil, + nil, + ) testDir := filepath.Join(os.TempDir(), "testDir") err := os.MkdirAll(testDir, os.ModePerm) @@ -2271,14 +2773,14 @@ func TestZipErrors(t *testing.T) { assert.Contains(t, err.Error(), "write error") } - err = addZipEntry(wr, connection, "/"+filepath.Base(testDir), "/", 0) + err = addZipEntry(wr, connection, "/"+filepath.Base(testDir), "/", nil, 0) if assert.Error(t, err) { assert.Contains(t, err.Error(), "write error") } - err = addZipEntry(wr, connection, "/"+filepath.Base(testDir), "/", 2000) + err = addZipEntry(wr, connection, "/"+filepath.Base(testDir), "/", nil, 2000) assert.ErrorIs(t, err, util.ErrRecursionTooDeep) - err = addZipEntry(wr, connection, "/"+filepath.Base(testDir), path.Join("/", filepath.Base(testDir), "dir"), 0) + err = addZipEntry(wr, connection, "/"+filepath.Base(testDir), path.Join("/", filepath.Base(testDir), "dir"), nil, 0) if assert.Error(t, err) { assert.Contains(t, err.Error(), "is outside base dir") } @@ -2287,14 +2789,14 @@ func TestZipErrors(t *testing.T) { err = os.WriteFile(testFilePath, util.GenerateRandomBytes(65535), os.ModePerm) assert.NoError(t, err) err = addZipEntry(wr, connection, path.Join("/", filepath.Base(testDir), filepath.Base(testFilePath)), - "/"+filepath.Base(testDir), 0) + "/"+filepath.Base(testDir), nil, 0) if assert.Error(t, err) { assert.Contains(t, err.Error(), "write error") } connection.User.Permissions["/"] = []string{dataprovider.PermListItems} err = addZipEntry(wr, connection, path.Join("/", filepath.Base(testDir), filepath.Base(testFilePath)), - "/"+filepath.Base(testDir), 0) + "/"+filepath.Base(testDir), nil, 0) assert.ErrorIs(t, err, os.ErrPermission) // creating a virtual folder to a missing path stat is ok but readdir fails @@ -2306,14 +2808,14 @@ func TestZipErrors(t *testing.T) { }) connection.User = user wr = zip.NewWriter(bytes.NewBuffer(make([]byte, 0))) - err = addZipEntry(wr, connection, user.VirtualFolders[0].VirtualPath, "/", 0) + err = addZipEntry(wr, connection, user.VirtualFolders[0].VirtualPath, "/", nil, 0) assert.Error(t, err) user.Filters.FilePatterns = append(user.Filters.FilePatterns, sdk.PatternsFilter{ Path: "/", DeniedPatterns: []string{"*.zip"}, }) - err = addZipEntry(wr, connection, "/"+filepath.Base(testDir), "/", 0) + err = addZipEntry(wr, connection, "/"+filepath.Base(testDir), "/", nil, 0) assert.ErrorIs(t, err, os.ErrPermission) err = os.RemoveAll(testDir) @@ -2329,7 +2831,8 @@ func TestWebAdminRedirect(t *testing.T) { EnableRESTAPI: true, } server := newHttpdServer(b, "../static", "", CorsConfig{}, "../openapi") - server.initializeRouter() + err := server.initializeRouter() + require.NoError(t, err) testServer := httptest.NewServer(server.router) defer testServer.Close() @@ -2480,10 +2983,11 @@ func TestConnection(t *testing.T) { } user.Permissions = make(map[string][]string) user.Permissions["/"] = []string{dataprovider.PermAny} - connection := &Connection{ - BaseConnection: common.NewBaseConnection(xid.New().String(), common.ProtocolHTTP, "", "", user), - request: nil, - } + connection := newConnection( + common.NewBaseConnection(xid.New().String(), common.ProtocolHTTP, "", "", user), + nil, + nil, + ) assert.Empty(t, connection.GetClientVersion()) assert.Empty(t, connection.GetRemoteAddress()) assert.Empty(t, connection.GetCommand()) @@ -2504,10 +3008,11 @@ func TestGetFileWriterErrors(t *testing.T) { } user.Permissions = make(map[string][]string) user.Permissions["/"] = []string{dataprovider.PermAny} - connection := &Connection{ - BaseConnection: common.NewBaseConnection(xid.New().String(), common.ProtocolHTTP, "", "", user), - request: nil, - } + connection := newConnection( + common.NewBaseConnection(xid.New().String(), common.ProtocolHTTP, "", "", user), + nil, + nil, + ) _, err := connection.getFileWriter("name") assert.Error(t, err) @@ -2520,10 +3025,11 @@ func TestGetFileWriterErrors(t *testing.T) { }, AccessSecret: kms.NewPlainSecret("secret"), } - connection = &Connection{ - BaseConnection: common.NewBaseConnection(xid.New().String(), common.ProtocolHTTP, "", "", user), - request: nil, - } + connection = newConnection( + common.NewBaseConnection(xid.New().String(), common.ProtocolHTTP, "", "", user), + nil, + nil, + ) _, err = connection.getFileWriter("/path") assert.Error(t, err) } @@ -2552,10 +3058,11 @@ func TestHTTPDFile(t *testing.T) { } user.Permissions = make(map[string][]string) user.Permissions["/"] = []string{dataprovider.PermAny} - connection := &Connection{ - BaseConnection: common.NewBaseConnection(xid.New().String(), common.ProtocolHTTP, "", "", user), - request: nil, - } + connection := newConnection( + common.NewBaseConnection(xid.New().String(), common.ProtocolHTTP, "", "", user), + nil, + nil, + ) fs, err := user.GetFilesystem("") assert.NoError(t, err) @@ -2613,7 +3120,8 @@ func TestChangeUserPwd(t *testing.T) { func TestWebUserInvalidClaims(t *testing.T) { server := httpdServer{} - server.initializeRouter() + err := server.initializeRouter() + require.NoError(t, err) rr := httptest.NewRecorder() user := dataprovider.User{ @@ -2622,79 +3130,81 @@ func TestWebUserInvalidClaims(t *testing.T) { Password: "pwd", }, } - c := jwtTokenClaims{ + c := &jwt.Claims{ Username: user.Username, Permissions: nil, - Signature: user.GetSignature(), } - token, err := c.createTokenResponse(server.tokenAuth, tokenAudienceWebClient, "") + c.Subject = user.GetSignature() + c.SetExpiry(time.Now().Add(10 * time.Minute)) + c.Audience = []string{tokenAudienceAPI} + token, err := server.tokenAuth.Sign(c) assert.NoError(t, err) req, _ := http.NewRequest(http.MethodGet, webClientFilesPath, nil) - req.Header.Set("Cookie", fmt.Sprintf("jwt=%v", token["access_token"])) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token)) server.handleClientGetFiles(rr, req) assert.Equal(t, http.StatusForbidden, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidToken) rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodGet, webClientDirsPath, nil) - req.Header.Set("Cookie", fmt.Sprintf("jwt=%v", token["access_token"])) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token)) server.handleClientGetDirContents(rr, req) assert.Equal(t, http.StatusForbidden, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorDirList403) rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodGet, webClientDownloadZipPath, nil) - req.Header.Set("Cookie", fmt.Sprintf("jwt=%v", token["access_token"])) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token)) server.handleWebClientDownloadZip(rr, req) assert.Equal(t, http.StatusForbidden, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidToken) rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodGet, webClientEditFilePath, nil) - req.Header.Set("Cookie", fmt.Sprintf("jwt=%v", token["access_token"])) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token)) server.handleClientEditFile(rr, req) assert.Equal(t, http.StatusForbidden, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidToken) rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodGet, webClientSharePath, nil) - req.Header.Set("Cookie", fmt.Sprintf("jwt=%v", token["access_token"])) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token)) server.handleClientAddShareGet(rr, req) assert.Equal(t, http.StatusForbidden, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidToken) rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodGet, webClientSharePath, nil) - req.Header.Set("Cookie", fmt.Sprintf("jwt=%v", token["access_token"])) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token)) server.handleClientUpdateShareGet(rr, req) assert.Equal(t, http.StatusForbidden, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidToken) rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodPost, webClientSharePath, nil) - req.Header.Set("Cookie", fmt.Sprintf("jwt=%v", token["access_token"])) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token)) server.handleClientAddSharePost(rr, req) assert.Equal(t, http.StatusForbidden, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidToken) rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodPost, webClientSharePath+"/id", nil) - req.Header.Set("Cookie", fmt.Sprintf("jwt=%v", token["access_token"])) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token)) server.handleClientUpdateSharePost(rr, req) assert.Equal(t, http.StatusForbidden, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidToken) rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodGet, webClientSharesPath+jsonAPISuffix, nil) - req.Header.Set("Cookie", fmt.Sprintf("jwt=%v", token["access_token"])) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token)) getAllShares(rr, req) assert.Equal(t, http.StatusForbidden, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidToken) rr = httptest.NewRecorder() req, _ = http.NewRequest(http.MethodGet, webClientViewPDFPath, nil) - req.Header.Set("Cookie", fmt.Sprintf("jwt=%v", token["access_token"])) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token)) server.handleClientGetPDF(rr, req) assert.Equal(t, http.StatusForbidden, rr.Code) assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidToken) @@ -2702,7 +3212,8 @@ func TestWebUserInvalidClaims(t *testing.T) { func TestInvalidClaims(t *testing.T) { server := httpdServer{} - server.initializeRouter() + err := server.initializeRouter() + require.NoError(t, err) rr := httptest.NewRecorder() user := dataprovider.User{ @@ -2711,19 +3222,31 @@ func TestInvalidClaims(t *testing.T) { Password: "pwd", }, } - c := jwtTokenClaims{ + c := &jwt.Claims{ Username: user.Username, Permissions: nil, - Signature: user.GetSignature(), } - token, err := c.createTokenResponse(server.tokenAuth, tokenAudienceWebClient, "") + c.Subject = user.GetSignature() + token, err := server.tokenAuth.SignWithParams(c, tokenAudienceWebClient, "", getTokenDuration(tokenAudienceWebClient)) assert.NoError(t, err) + + req, err := http.NewRequest(http.MethodGet, webClientProfilePath, nil) + assert.NoError(t, err) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token)) + parsedToken, err := jwt.VerifyRequest(server.tokenAuth, req, jwt.TokenFromCookie) + assert.NoError(t, err) + ctx := req.Context() + ctx = jwt.NewContext(ctx, parsedToken, err) + req = req.WithContext(ctx) + form := make(url.Values) - form.Set(csrfFormToken, createCSRFToken("")) + form.Set(csrfFormToken, createCSRFToken(rr, req, server.csrfTokenAuth, "", webBaseClientPath)) form.Set("public_keys", "") - req, _ := http.NewRequest(http.MethodPost, webClientProfilePath, bytes.NewBuffer([]byte(form.Encode()))) + req, err = http.NewRequest(http.MethodPost, webClientProfilePath, bytes.NewBuffer([]byte(form.Encode()))) + assert.NoError(t, err) + req = req.WithContext(ctx) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - req.Header.Set("Cookie", fmt.Sprintf("jwt=%v", token["access_token"])) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token)) server.handleWebClientProfilePost(rr, req) assert.Equal(t, http.StatusForbidden, rr.Code) @@ -2731,21 +3254,34 @@ func TestInvalidClaims(t *testing.T) { Username: "", Password: user.Password, } - c = jwtTokenClaims{ + c = &jwt.Claims{ Username: admin.Username, Permissions: nil, - Signature: admin.GetSignature(), } - token, err = c.createTokenResponse(server.tokenAuth, tokenAudienceWebAdmin, "") + c.Subject = admin.GetSignature() + token, err = server.tokenAuth.SignWithParams(c, tokenAudienceWebAdmin, "", getTokenDuration(tokenAudienceWebAdmin)) assert.NoError(t, err) + + req, err = http.NewRequest(http.MethodGet, webAdminProfilePath, nil) + assert.NoError(t, err) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token)) + parsedToken, err = jwt.VerifyRequest(server.tokenAuth, req, jwt.TokenFromCookie) + assert.NoError(t, err) + ctx = req.Context() + ctx = jwt.NewContext(ctx, parsedToken, err) + req = req.WithContext(ctx) + form = make(url.Values) - form.Set(csrfFormToken, createCSRFToken("")) + form.Set(csrfFormToken, createCSRFToken(rr, req, server.csrfTokenAuth, "", webBaseAdminPath)) form.Set("allow_api_key_auth", "") - req, _ = http.NewRequest(http.MethodPost, webAdminProfilePath, bytes.NewBuffer([]byte(form.Encode()))) + req, err = http.NewRequest(http.MethodPost, webAdminProfilePath, bytes.NewBuffer([]byte(form.Encode()))) + assert.NoError(t, err) + req = req.WithContext(ctx) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - req.Header.Set("Cookie", fmt.Sprintf("jwt=%v", token["access_token"])) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token)) server.handleWebAdminProfilePost(rr, req) assert.Equal(t, http.StatusForbidden, rr.Code) + assert.Contains(t, rr.Body.String(), util.I18nErrorInvalidToken) } func TestTLSReq(t *testing.T) { @@ -2766,12 +3302,14 @@ func TestSigningKey(t *testing.T) { server1 := httpdServer{ signingPassphrase: signingPassphrase, } - server1.initializeRouter() + err := server1.initializeRouter() + require.NoError(t, err) server2 := httpdServer{ signingPassphrase: signingPassphrase, } - server2.initializeRouter() + err = server2.initializeRouter() + require.NoError(t, err) user := dataprovider.User{ BaseUser: sdk.BaseUser{ @@ -2779,18 +3317,17 @@ func TestSigningKey(t *testing.T) { Password: "pwd", }, } - c := jwtTokenClaims{ + c := &jwt.Claims{ Username: user.Username, Permissions: nil, - Signature: user.GetSignature(), } - token, err := c.createTokenResponse(server1.tokenAuth, tokenAudienceWebClient, "") + c.Subject = user.GetSignature() + token, err := server1.tokenAuth.SignWithParams(c, tokenAudienceWebClient, "", getTokenDuration(tokenAudienceWebClient)) assert.NoError(t, err) - accessToken := token["access_token"].(string) - assert.NotEmpty(t, accessToken) - _, err = server1.tokenAuth.Decode(accessToken) + assert.NotEmpty(t, token) + _, err = jwt.VerifyToken(server1.tokenAuth, token) assert.NoError(t, err) - _, err = server2.tokenAuth.Decode(accessToken) + _, err = jwt.VerifyToken(server2.tokenAuth, token) assert.NoError(t, err) } @@ -2919,10 +3456,15 @@ func TestSecureMiddlewareIntegration(t *testing.T) { Value: "https", }, }, - STSSeconds: 31536000, - STSIncludeSubdomains: true, - STSPreload: true, - ContentTypeNosniff: true, + STSSeconds: 31536000, + STSIncludeSubdomains: true, + STSPreload: true, + ContentTypeNosniff: true, + CacheControl: "private", + CrossOriginOpenerPolicy: "same-origin", + CrossOriginResourcePolicy: "same-site", + CrossOriginEmbedderPolicy: "require-corp", + ReferrerPolicy: "no-referrer", }, }, enableWebAdmin: true, @@ -2934,7 +3476,8 @@ func TestSecureMiddlewareIntegration(t *testing.T) { assert.NoError(t, err) assert.Equal(t, []string{forwardedHostHeader, xForwardedProto}, server.binding.Security.proxyHeaders) assert.Equal(t, map[string]string{xForwardedProto: "https"}, server.binding.Security.getHTTPSProxyHeaders()) - server.initializeRouter() + err = server.initializeRouter() + require.NoError(t, err) rr := httptest.NewRecorder() r, err := http.NewRequest(http.MethodGet, webClientLoginPath, nil) @@ -2942,6 +3485,7 @@ func TestSecureMiddlewareIntegration(t *testing.T) { r.Host = "127.0.0.1" server.router.ServeHTTP(rr, r) assert.Equal(t, http.StatusForbidden, rr.Code) + assert.Equal(t, "no-cache, no-store, max-age=0, must-revalidate, private", rr.Header().Get("Cache-Control")) rr = httptest.NewRecorder() r.Header.Set(forwardedHostHeader, "www.sftpgo.com") @@ -2976,6 +3520,10 @@ func TestSecureMiddlewareIntegration(t *testing.T) { assert.NotEmpty(t, r.Header.Get(forwardedHostHeader)) assert.Equal(t, "max-age=31536000; includeSubDomains; preload", rr.Header().Get("Strict-Transport-Security")) assert.Equal(t, "nosniff", rr.Header().Get("X-Content-Type-Options")) + assert.Equal(t, "require-corp", rr.Header().Get("Cross-Origin-Embedder-Policy")) + assert.Equal(t, "same-origin", rr.Header().Get("Cross-Origin-Opener-Policy")) + assert.Equal(t, "same-site", rr.Header().Get("Cross-Origin-Resource-Policy")) + assert.Equal(t, "no-referrer", rr.Header().Get("Referrer-Policy")) server.binding.Security.Enabled = false server.binding.Security.updateProxyHeaders() @@ -3005,7 +3553,8 @@ func TestRESTAPIDisabled(t *testing.T) { enableWebClient: true, enableRESTAPI: false, } - server.initializeRouter() + err := server.initializeRouter() + require.NoError(t, err) assert.False(t, server.enableRESTAPI) rr := httptest.NewRecorder() r, err := http.NewRequest(http.MethodGet, healthzPath, nil) @@ -3042,26 +3591,34 @@ func TestWebAdminSetupWithInstallCode(t *testing.T) { enableWebClient: true, enableRESTAPI: true, } - server.initializeRouter() - - rr := httptest.NewRecorder() - r, err := http.NewRequest(http.MethodGet, webAdminSetupPath, nil) - assert.NoError(t, err) - server.router.ServeHTTP(rr, r) - assert.Equal(t, http.StatusOK, rr.Code) + err = server.initializeRouter() + require.NoError(t, err) for _, webURL := range []string{"/", webBasePath, webBaseAdminPath, webAdminLoginPath, webClientLoginPath} { - rr = httptest.NewRecorder() - r, err = http.NewRequest(http.MethodGet, webURL, nil) + rr := httptest.NewRecorder() + r, err := http.NewRequest(http.MethodGet, webURL, nil) assert.NoError(t, err) server.router.ServeHTTP(rr, r) assert.Equal(t, http.StatusFound, rr.Code) assert.Equal(t, webAdminSetupPath, rr.Header().Get("Location")) } + rr := httptest.NewRecorder() + r, err := http.NewRequest(http.MethodGet, webAdminSetupPath, nil) + assert.NoError(t, err) + server.router.ServeHTTP(rr, r) + assert.Equal(t, http.StatusOK, rr.Code) + cookie := rr.Header().Get("Set-Cookie") + r.Header.Set("Cookie", cookie) + parsedToken, err := jwt.VerifyRequest(server.csrfTokenAuth, r, jwt.TokenFromCookie) + assert.NoError(t, err) + ctx := r.Context() + ctx = jwt.NewContext(ctx, parsedToken, err) + r = r.WithContext(ctx) + form := make(url.Values) - csrfToken := createCSRFToken("") - form.Set("_form_token", csrfToken) + csrfToken := createCSRFToken(rr, r, server.csrfTokenAuth, "", webBaseAdminPath) + form.Set(csrfFormToken, csrfToken) form.Set("install_code", installationCode+"5") form.Set("username", defaultAdminUsername) form.Set("password", "password") @@ -3069,6 +3626,8 @@ func TestWebAdminSetupWithInstallCode(t *testing.T) { rr = httptest.NewRecorder() r, err = http.NewRequest(http.MethodPost, webAdminSetupPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) + r = r.WithContext(ctx) + r.Header.Set("Cookie", cookie) r.Header.Set("Content-Type", "application/x-www-form-urlencoded") server.router.ServeHTTP(rr, r) assert.Equal(t, http.StatusOK, rr.Code) @@ -3080,6 +3639,8 @@ func TestWebAdminSetupWithInstallCode(t *testing.T) { rr = httptest.NewRecorder() r, err = http.NewRequest(http.MethodPost, webAdminSetupPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) + r = r.WithContext(ctx) + r.Header.Set("Cookie", cookie) r.Header.Set("Content-Type", "application/x-www-form-urlencoded") server.router.ServeHTTP(rr, r) assert.Equal(t, http.StatusFound, rr.Code) @@ -3101,12 +3662,6 @@ func TestWebAdminSetupWithInstallCode(t *testing.T) { return "5678" }) - rr = httptest.NewRecorder() - r, err = http.NewRequest(http.MethodGet, webAdminSetupPath, nil) - assert.NoError(t, err) - server.router.ServeHTTP(rr, r) - assert.Equal(t, http.StatusOK, rr.Code) - for _, webURL := range []string{"/", webBasePath, webBaseAdminPath, webAdminLoginPath, webClientLoginPath} { rr = httptest.NewRecorder() r, err = http.NewRequest(http.MethodGet, webURL, nil) @@ -3116,9 +3671,22 @@ func TestWebAdminSetupWithInstallCode(t *testing.T) { assert.Equal(t, webAdminSetupPath, rr.Header().Get("Location")) } + rr = httptest.NewRecorder() + r, err = http.NewRequest(http.MethodGet, webAdminSetupPath, nil) + assert.NoError(t, err) + server.router.ServeHTTP(rr, r) + assert.Equal(t, http.StatusOK, rr.Code) + cookie = rr.Header().Get("Set-Cookie") + r.Header.Set("Cookie", cookie) + parsedToken, err = jwt.VerifyRequest(server.csrfTokenAuth, r, jwt.TokenFromCookie) + assert.NoError(t, err) + ctx = r.Context() + ctx = jwt.NewContext(ctx, parsedToken, err) + r = r.WithContext(ctx) + form = make(url.Values) - csrfToken = createCSRFToken("") - form.Set("_form_token", csrfToken) + csrfToken = createCSRFToken(rr, r, server.csrfTokenAuth, "", webBaseAdminPath) + form.Set(csrfFormToken, csrfToken) form.Set("install_code", installationCode) form.Set("username", defaultAdminUsername) form.Set("password", "password") @@ -3126,6 +3694,8 @@ func TestWebAdminSetupWithInstallCode(t *testing.T) { rr = httptest.NewRecorder() r, err = http.NewRequest(http.MethodPost, webAdminSetupPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) + r = r.WithContext(ctx) + r.Header.Set("Cookie", cookie) r.Header.Set("Content-Type", "application/x-www-form-urlencoded") server.router.ServeHTTP(rr, r) assert.Equal(t, http.StatusOK, rr.Code) @@ -3137,6 +3707,8 @@ func TestWebAdminSetupWithInstallCode(t *testing.T) { rr = httptest.NewRecorder() r, err = http.NewRequest(http.MethodPost, webAdminSetupPath, bytes.NewBuffer([]byte(form.Encode()))) assert.NoError(t, err) + r = r.WithContext(ctx) + r.Header.Set("Cookie", cookie) r.Header.Set("Content-Type", "application/x-www-form-urlencoded") server.router.ServeHTTP(rr, r) assert.Equal(t, http.StatusFound, rr.Code) @@ -3193,37 +3765,6 @@ func TestDbResetCodeManager(t *testing.T) { } } -func TestDecodeToken(t *testing.T) { - nodeID := "nodeID" - token := map[string]any{ - claimUsernameKey: defaultAdminUsername, - claimPermissionsKey: []string{dataprovider.PermAdminAny}, - jwt.SubjectKey: "", - claimNodeID: nodeID, - claimMustChangePasswordKey: false, - claimMustSetSecondFactorKey: true, - } - c := jwtTokenClaims{} - c.Decode(token) - assert.Equal(t, defaultAdminUsername, c.Username) - assert.Equal(t, nodeID, c.NodeID) - assert.False(t, c.MustChangePassword) - assert.True(t, c.MustSetTwoFactorAuth) - - token[claimMustChangePasswordKey] = 10 - c = jwtTokenClaims{} - c.Decode(token) - assert.False(t, c.MustChangePassword) - - token[claimMustChangePasswordKey] = true - c = jwtTokenClaims{} - c.Decode(token) - assert.True(t, c.MustChangePassword) - - claims := c.asMap() - assert.Equal(t, token, claims) -} - func TestEventRoleFilter(t *testing.T) { defaultVal := "default" req, err := http.NewRequest(http.MethodGet, fsEventsPath+"?role=role1", nil) @@ -3354,7 +3895,8 @@ func TestHTTPSRedirect(t *testing.T) { }, }, } - server.initializeRouter() + err = server.initializeRouter() + require.NoError(t, err) rr := httptest.NewRecorder() r, err := http.NewRequest(http.MethodGet, path.Join(acmeChallengeURI, tokenName), nil) @@ -3393,6 +3935,118 @@ func TestHTTPSRedirect(t *testing.T) { assert.NoError(t, err) } +func TestDisabledAdminLoginMethods(t *testing.T) { + server := httpdServer{ + binding: Binding{ + Address: "", + Port: 8080, + EnableWebAdmin: true, + EnableWebClient: true, + EnableRESTAPI: true, + DisabledLoginMethods: 20, + }, + enableWebAdmin: true, + enableWebClient: true, + enableRESTAPI: true, + } + err := server.initializeRouter() + require.NoError(t, err) + testServer := httptest.NewServer(server.router) + defer testServer.Close() + + rr := httptest.NewRecorder() + req, err := http.NewRequest(http.MethodGet, tokenPath, nil) + require.NoError(t, err) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusNotFound, rr.Code) + + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodPost, path.Join(adminPath, defaultAdminUsername, "forgot-password"), nil) + require.NoError(t, err) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusNotFound, rr.Code) + + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodPost, path.Join(adminPath, defaultAdminUsername, "reset-password"), nil) + require.NoError(t, err) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusNotFound, rr.Code) + + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodPost, webAdminLoginPath, nil) + require.NoError(t, err) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusMethodNotAllowed, rr.Code) + + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodPost, webAdminResetPwdPath, nil) + require.NoError(t, err) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusNotFound, rr.Code) + + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodPost, webAdminForgotPwdPath, nil) + require.NoError(t, err) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusNotFound, rr.Code) +} + +func TestDisabledUserLoginMethods(t *testing.T) { + server := httpdServer{ + binding: Binding{ + Address: "", + Port: 8080, + EnableWebAdmin: true, + EnableWebClient: true, + EnableRESTAPI: true, + DisabledLoginMethods: 40, + }, + enableWebAdmin: true, + enableWebClient: true, + enableRESTAPI: true, + } + err := server.initializeRouter() + require.NoError(t, err) + testServer := httptest.NewServer(server.router) + defer testServer.Close() + + rr := httptest.NewRecorder() + req, err := http.NewRequest(http.MethodGet, userTokenPath, nil) + require.NoError(t, err) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusNotFound, rr.Code) + + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodPost, userPath+"/user/forgot-password", nil) + require.NoError(t, err) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusNotFound, rr.Code) + + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodPost, userPath+"/user/reset-password", nil) + require.NoError(t, err) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusNotFound, rr.Code) + + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodPost, webClientLoginPath, nil) + require.NoError(t, err) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusMethodNotAllowed, rr.Code) + + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodPost, webClientResetPwdPath, nil) + require.NoError(t, err) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusNotFound, rr.Code) + + rr = httptest.NewRecorder() + req, err = http.NewRequest(http.MethodPost, webClientForgotPwdPath, nil) + require.NoError(t, err) + testServer.Config.Handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusNotFound, rr.Code) +} + func TestGetLogEventString(t *testing.T) { assert.Equal(t, "Login failed", getLogEventString(notifier.LogEventTypeLoginFailed)) assert.Equal(t, "Login with non-existent user", getLogEventString(notifier.LogEventTypeLoginNoUser)) @@ -3560,6 +4214,153 @@ func TestI18NErrors(t *testing.T) { assert.Equal(t, `{"a":"b"}`, errI18n.Args()) } +func TestConvertEnabledLoginMethods(t *testing.T) { + b := Binding{ + EnabledLoginMethods: 0, + DisabledLoginMethods: 1, + } + b.convertLoginMethods() + assert.Equal(t, 1, b.DisabledLoginMethods) + b.DisabledLoginMethods = 0 + b.EnabledLoginMethods = 1 + b.convertLoginMethods() + assert.Equal(t, 14, b.DisabledLoginMethods) + b.DisabledLoginMethods = 0 + b.EnabledLoginMethods = 2 + b.convertLoginMethods() + assert.Equal(t, 13, b.DisabledLoginMethods) + b.DisabledLoginMethods = 0 + b.EnabledLoginMethods = 3 + b.convertLoginMethods() + assert.Equal(t, 12, b.DisabledLoginMethods) + b.DisabledLoginMethods = 0 + b.EnabledLoginMethods = 4 + b.convertLoginMethods() + assert.Equal(t, 11, b.DisabledLoginMethods) + b.DisabledLoginMethods = 0 + b.EnabledLoginMethods = 7 + b.convertLoginMethods() + assert.Equal(t, 8, b.DisabledLoginMethods) + b.DisabledLoginMethods = 0 + b.EnabledLoginMethods = 15 + b.convertLoginMethods() + assert.Equal(t, 0, b.DisabledLoginMethods) +} + +func TestValidateBaseURL(t *testing.T) { + tests := []struct { + name string + inputURL string + expectedURL string + expectErr bool + }{ + { + name: "Valid HTTPS URL", + inputURL: "https://sftp.example.com", + expectedURL: "https://sftp.example.com", + expectErr: false, + }, + { + name: "Remove trailing slash", + inputURL: "https://sftp.example.com/", + expectedURL: "https://sftp.example.com", + expectErr: false, + }, + { + name: "Remove multiple trailing slashes", + inputURL: "http://192.168.1.100:8080///", + expectedURL: "http://192.168.1.100:8080", + expectErr: false, + }, + { + name: "Empty BaseURL (optional case)", + inputURL: "", + expectedURL: "", + expectErr: false, + }, + { + name: "Unsupported scheme (FTP)", + inputURL: "ftp://files.example.com", + expectErr: true, + }, + { + name: "Malformed URL string", + inputURL: "not-a-url", + expectErr: true, + }, + { + name: "Missing Host", + inputURL: "https://", + expectErr: true, + }, + { + name: "Preserve path without trailing slash", + inputURL: "https://example.com/sftp/", + expectedURL: "https://example.com/sftp", + expectErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + b := &Binding{ + BaseURL: tt.inputURL, + } + + err := b.validateBaseURL() + + if (err != nil) != tt.expectErr { + t.Errorf("validateBaseURL() error = %v, expectErr %v", err, tt.expectErr) + return + } + + if !tt.expectErr && b.BaseURL != tt.expectedURL { + t.Errorf("validateBaseURL() got = %v, want %v", b.BaseURL, tt.expectedURL) + } + }) + } +} + +func getCSRFTokenFromBody(body io.Reader) (string, error) { + doc, err := html.Parse(body) + if err != nil { + return "", err + } + + var csrfToken string + var f func(*html.Node) + + f = func(n *html.Node) { + if n.Type == html.ElementNode && n.Data == "input" { + var name, value string + for _, attr := range n.Attr { + if attr.Key == "value" { + value = attr.Val + } + if attr.Key == "name" { + name = attr.Val + } + } + if name == csrfFormToken { + csrfToken = value + return + } + } + + for c := n.FirstChild; c != nil; c = c.NextSibling { + f(c) + } + } + + f(doc) + + if csrfToken == "" { + return "", errors.New("CSRF token not found") + } + + return csrfToken, nil +} + func isSharedProviderSupported() bool { // SQLite shares the implementation with other SQL-based provider but it makes no sense // to use it outside test cases diff --git a/internal/httpd/middleware.go b/internal/httpd/middleware.go index 8c98f02b..199fa89f 100644 --- a/internal/httpd/middleware.go +++ b/internal/httpd/middleware.go @@ -20,15 +20,16 @@ import ( "io/fs" "net/http" "net/url" + "slices" "strings" + "time" - "github.com/go-chi/jwtauth/v5" - "github.com/lestrrat-go/jwx/v2/jwt" "github.com/rs/xid" "github.com/sftpgo/sdk" "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/logger" "github.com/drakkan/sftpgo/v2/internal/util" ) @@ -47,7 +48,7 @@ func (k *contextKey) String() string { } func validateJWTToken(w http.ResponseWriter, r *http.Request, audience tokenAudience) error { - token, _, err := jwtauth.FromContext(r.Context()) + token, err := jwt.FromContext(r.Context()) var redirectPath string if audience == tokenAudienceWebAdmin { @@ -69,52 +70,48 @@ func validateJWTToken(w http.ResponseWriter, r *http.Request, audience tokenAudi } } - if err != nil || token == nil { + if err != nil { logger.Debug(logSender, "", "error getting jwt token: %v", err) doRedirect(http.StatusText(http.StatusUnauthorized), err) return errInvalidToken } - err = jwt.Validate(token) - if err != nil { - logger.Debug(logSender, "", "error validating jwt token: %v", err) - doRedirect(http.StatusText(http.StatusUnauthorized), err) - return errInvalidToken - } if isTokenInvalidated(r) { logger.Debug(logSender, "", "the token has been invalidated") doRedirect("Your token is no longer valid", nil) return errInvalidToken } // a user with a partial token will be always redirected to the appropriate two factor auth page - if err := checkPartialAuth(w, r, audience, token.Audience()); err != nil { + if err := checkPartialAuth(w, r, audience, token.Audience); err != nil { return err } - if !util.Contains(token.Audience(), audience) { + if !token.Audience.Contains(audience) { logger.Debug(logSender, "", "the token is not valid for audience %q", audience) doRedirect("Your token audience is not valid", nil) return errInvalidToken } - if tokenValidationMode != tokenValidationNoIPMatch { - ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if !util.Contains(token.Audience(), ipAddr) { - logger.Debug(logSender, "", "the token with id %q is not valid for the ip address %q", token.JwtID(), ipAddr) - doRedirect("Your token is not valid", nil) - return errInvalidToken - } + ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) + if err := validateIPForToken(token, ipAddr); err != nil { + logger.Debug(logSender, "", "the token with id %q is not valid for the ip address %q", token.ID, ipAddr) + doRedirect("Your token is not valid", nil) + return err + } + if err := checkTokenSignature(r, token); err != nil { + doRedirect("Your token is no longer valid", nil) + return err } return nil } func (s *httpdServer) validateJWTPartialToken(w http.ResponseWriter, r *http.Request, audience tokenAudience) error { - token, _, err := jwtauth.FromContext(r.Context()) + token, err := jwt.FromContext(r.Context()) var notFoundFunc func(w http.ResponseWriter, r *http.Request, err error) if audience == tokenAudienceWebAdminPartial { notFoundFunc = s.renderNotFoundPage } else { notFoundFunc = s.renderClientNotFoundPage } - if err != nil || token == nil || jwt.Validate(token) != nil { + if err != nil { notFoundFunc(w, r, nil) return errInvalidToken } @@ -122,11 +119,17 @@ func (s *httpdServer) validateJWTPartialToken(w http.ResponseWriter, r *http.Req notFoundFunc(w, r, nil) return errInvalidToken } - if !util.Contains(token.Audience(), audience) { - logger.Debug(logSender, "", "the token is not valid for audience %q", audience) + if !token.Audience.Contains(audience) { + logger.Debug(logSender, "", "the partial token with id %q is not valid for audience %q", token.ID, audience) notFoundFunc(w, r, nil) return errInvalidToken } + ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) + if err := validateIPForToken(token, ipAddr); err != nil { + logger.Debug(logSender, "", "the partial token with id %q is not valid for the ip address %q", token.ID, ipAddr) + notFoundFunc(w, r, nil) + return err + } return nil } @@ -191,7 +194,7 @@ func jwtAuthenticatorWebClient(next http.Handler) http.Handler { func (s *httpdServer) checkHTTPUserPerm(perm string) func(next http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - _, claims, err := jwtauth.FromContext(r.Context()) + claims, err := jwt.FromContext(r.Context()) if err != nil { if isWebRequest(r) { s.renderClientBadRequestPage(w, r, err) @@ -200,10 +203,8 @@ func (s *httpdServer) checkHTTPUserPerm(perm string) func(next http.Handler) htt } return } - tokenClaims := jwtTokenClaims{} - tokenClaims.Decode(claims) // for web client perms are negated and not granted - if tokenClaims.hasPerm(perm) { + if claims.HasPerm(perm) { if isWebRequest(r) { s.renderClientForbiddenPage(w, r, errors.New("you don't have permission for this action")) } else { @@ -220,7 +221,7 @@ func (s *httpdServer) checkHTTPUserPerm(perm string) func(next http.Handler) htt // checkAuthRequirements checks if the user must set a second factor auth or change the password func (s *httpdServer) checkAuthRequirements(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - _, claims, err := jwtauth.FromContext(r.Context()) + claims, err := jwt.FromContext(r.Context()) if err != nil { if isWebRequest(r) { if isWebClientRequest(r) { @@ -233,13 +234,11 @@ func (s *httpdServer) checkAuthRequirements(next http.Handler) http.Handler { } return } - tokenClaims := jwtTokenClaims{} - tokenClaims.Decode(claims) - if tokenClaims.MustSetTwoFactorAuth || tokenClaims.MustChangePassword { + if claims.MustSetTwoFactorAuth || claims.MustChangePassword { var err error - if tokenClaims.MustSetTwoFactorAuth { - if len(tokenClaims.RequiredTwoFactorProtocols) > 0 { - protocols := strings.Join(tokenClaims.RequiredTwoFactorProtocols, ", ") + if claims.MustSetTwoFactorAuth { + if len(claims.RequiredTwoFactorProtocols) > 0 { + protocols := strings.Join(claims.RequiredTwoFactorProtocols, ", ") err = util.NewI18nError( util.NewGenericError( fmt.Sprintf("Two-factor authentication requirements not met, please configure two-factor authentication for the following protocols: %v", @@ -295,10 +294,10 @@ func (s *httpdServer) requireBuiltinLogin(next http.Handler) http.Handler { }) } -func (s *httpdServer) checkPerm(perm string) func(next http.Handler) http.Handler { +func (s *httpdServer) checkPerms(perms ...string) func(next http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - _, claims, err := jwtauth.FromContext(r.Context()) + claims, err := jwt.FromContext(r.Context()) if err != nil { if isWebRequest(r) { s.renderBadRequestPage(w, r, err) @@ -307,16 +306,16 @@ func (s *httpdServer) checkPerm(perm string) func(next http.Handler) http.Handle } return } - tokenClaims := jwtTokenClaims{} - tokenClaims.Decode(claims) - if !tokenClaims.hasPerm(perm) { - if isWebRequest(r) { - s.renderForbiddenPage(w, r, util.NewI18nError(fs.ErrPermission, util.I18nError403Message)) - } else { - sendAPIResponse(w, r, nil, http.StatusText(http.StatusForbidden), http.StatusForbidden) + for _, perm := range perms { + if !claims.HasPerm(perm) { + if isWebRequest(r) { + s.renderForbiddenPage(w, r, util.NewI18nError(fs.ErrPermission, util.I18nError403Message)) + } else { + sendAPIResponse(w, r, nil, http.StatusText(http.StatusForbidden), http.StatusForbidden) + } + return } - return } next.ServeHTTP(w, r) @@ -324,70 +323,82 @@ func (s *httpdServer) checkPerm(perm string) func(next http.Handler) http.Handle } } -func verifyCSRFHeader(next http.Handler) http.Handler { +func (s *httpdServer) verifyCSRFHeader(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { tokenString := r.Header.Get(csrfHeaderToken) - token, err := jwtauth.VerifyToken(csrfTokenAuth, tokenString) + token, err := jwt.VerifyToken(s.csrfTokenAuth, tokenString) if err != nil || token == nil { logger.Debug(logSender, "", "error validating CSRF header: %v", err) sendAPIResponse(w, r, err, "Invalid token", http.StatusForbidden) return } - if !util.Contains(token.Audience(), tokenAudienceCSRF) { + if !token.Audience.Contains(tokenAudienceCSRF) { logger.Debug(logSender, "", "error validating CSRF header token audience") sendAPIResponse(w, r, errors.New("the token is not valid"), "", http.StatusForbidden) return } - if tokenValidationMode != tokenValidationNoIPMatch { - if !util.Contains(token.Audience(), util.GetIPFromRemoteAddress(r.RemoteAddr)) { - logger.Debug(logSender, "", "error validating CSRF header IP audience") - sendAPIResponse(w, r, errors.New("the token is not valid"), "", http.StatusForbidden) - return - } + if err := validateIPForToken(token, util.GetIPFromRemoteAddress(r.RemoteAddr)); err != nil { + logger.Debug(logSender, "", "error validating CSRF header IP audience") + sendAPIResponse(w, r, errors.New("the token is not valid"), "", http.StatusForbidden) + return + } + if err := checkCSRFTokenRef(r, token); err != nil { + sendAPIResponse(w, r, errors.New("the token is not valid"), "", http.StatusForbidden) + return } next.ServeHTTP(w, r) }) } -func checkNodeToken(tokenAuth *jwtauth.JWTAuth) func(next http.Handler) http.Handler { +func checkNodeToken(tokenAuth *jwt.Signer) func(next http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get(dataprovider.NodeTokenHeader) - if token == "" { + bearer := r.Header.Get(dataprovider.NodeTokenHeader) + if bearer == "" { next.ServeHTTP(w, r) return } - if len(token) > 7 && strings.ToUpper(token[0:6]) == "BEARER" { - token = token[7:] + const prefix = "Bearer " + if len(bearer) >= len(prefix) && strings.EqualFold(bearer[:len(prefix)], prefix) { + bearer = bearer[len(prefix):] } - admin, role, err := dataprovider.AuthenticateNodeToken(token) + if invalidatedJWTTokens.Get(bearer) { + logger.Debug(logSender, "", "the node token has been invalidated") + sendAPIResponse(w, r, fmt.Errorf("the provided token is not valid"), "", http.StatusUnauthorized) + return + } + claims, err := dataprovider.AuthenticateNodeToken(bearer) if err != nil { - logger.Debug(logSender, "", "unable to authenticate node token %q: %v", token, err) + logger.Debug(logSender, "", "unable to authenticate node token %q: %v", bearer, err) sendAPIResponse(w, r, fmt.Errorf("the provided token cannot be authenticated"), "", http.StatusUnauthorized) return } - c := jwtTokenClaims{ - Username: admin, - Permissions: []string{dataprovider.PermAdminViewConnections, dataprovider.PermAdminCloseConnections}, + defer invalidatedJWTTokens.Add(bearer, time.Now().Add(2*time.Minute).UTC()) + + c := &jwt.Claims{ + Username: claims.Username, + Permissions: claims.Permissions, NodeID: dataprovider.GetNodeName(), - Role: role, + Role: claims.Role, } - resp, err := c.createTokenResponse(tokenAuth, tokenAudienceAPI, util.GetIPFromRemoteAddress(r.RemoteAddr)) + + token, err := tokenAuth.SignWithParams(c, tokenAudienceAPI, util.GetIPFromRemoteAddress(r.RemoteAddr), getTokenDuration(tokenAudienceAPI)) if err != nil { sendAPIResponse(w, r, err, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) return } - r.Header.Set("Authorization", fmt.Sprintf("Bearer %v", resp["access_token"])) + resp := c.BuildTokenResponse(token) + r.Header.Set("Authorization", fmt.Sprintf("Bearer %s", resp.Token)) next.ServeHTTP(w, r) }) } } -func checkAPIKeyAuth(tokenAuth *jwtauth.JWTAuth, scope dataprovider.APIKeyScope) func(next http.Handler) http.Handler { +func checkAPIKeyAuth(tokenAuth *jwt.Signer, scope dataprovider.APIKeyScope) func(next http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { apiKey := r.Header.Get("X-SFTPGO-API-KEY") @@ -411,7 +422,7 @@ func checkAPIKeyAuth(tokenAuth *jwtauth.JWTAuth, scope dataprovider.APIKeyScope) k, err := dataprovider.APIKeyExists(keyID) if err != nil { handleDefenderEventLoginFailed(util.GetIPFromRemoteAddress(r.RemoteAddr), util.NewRecordNotFoundError("invalid api key")) //nolint:errcheck - logger.Debug(logSender, "invalid api key %q: %v", apiKey, err) + logger.Debug(logSender, "", "invalid api key %q: %v", apiKey, err) sendAPIResponse(w, r, errors.New("the provided api key is not valid"), "", http.StatusBadRequest) return } @@ -440,6 +451,7 @@ func checkAPIKeyAuth(tokenAuth *jwtauth.JWTAuth, scope dataprovider.APIKeyScope) "", http.StatusUnauthorized) return } + common.DelayLogin(nil) } else { if k.User != "" { apiUser = k.User @@ -448,7 +460,7 @@ func checkAPIKeyAuth(tokenAuth *jwtauth.JWTAuth, scope dataprovider.APIKeyScope) logger.Debug(logSender, "", "unable to authenticate user %q associated with api key %q: %v", apiUser, apiKey, err) updateLoginMetrics(&dataprovider.User{BaseUser: sdk.BaseUser{Username: apiUser}}, - dataprovider.LoginMethodPassword, util.GetIPFromRemoteAddress(r.RemoteAddr), err) + dataprovider.LoginMethodPassword, util.GetIPFromRemoteAddress(r.RemoteAddr), err, r) code := http.StatusUnauthorized if errors.Is(err, common.ErrInternalFailure) { code = http.StatusInternalServerError @@ -458,7 +470,7 @@ func checkAPIKeyAuth(tokenAuth *jwtauth.JWTAuth, scope dataprovider.APIKeyScope) return } updateLoginMetrics(&dataprovider.User{BaseUser: sdk.BaseUser{Username: apiUser}}, - dataprovider.LoginMethodPassword, util.GetIPFromRemoteAddress(r.RemoteAddr), nil) + dataprovider.LoginMethodPassword, util.GetIPFromRemoteAddress(r.RemoteAddr), nil, r) } dataprovider.UpdateAPIKeyLastUse(&k) //nolint:errcheck @@ -469,7 +481,7 @@ func checkAPIKeyAuth(tokenAuth *jwtauth.JWTAuth, scope dataprovider.APIKeyScope) func forbidAPIKeyAuthentication(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return @@ -483,7 +495,7 @@ func forbidAPIKeyAuthentication(next http.Handler) http.Handler { }) } -func authenticateAdminWithAPIKey(username, keyID string, tokenAuth *jwtauth.JWTAuth, r *http.Request) error { +func authenticateAdminWithAPIKey(username, keyID string, tokenAuth *jwt.Signer, r *http.Request) error { if username == "" { return errors.New("the provided key is not associated with any admin and no username was provided") } @@ -498,30 +510,32 @@ func authenticateAdminWithAPIKey(username, keyID string, tokenAuth *jwtauth.JWTA if err := admin.CanLogin(ipAddr); err != nil { return err } - c := jwtTokenClaims{ + c := &jwt.Claims{ Username: admin.Username, Permissions: admin.Permissions, - Signature: admin.GetSignature(), Role: admin.Role, APIKeyID: keyID, } + c.Subject = admin.GetSignature() - resp, err := c.createTokenResponse(tokenAuth, tokenAudienceAPI, ipAddr) + token, err := tokenAuth.SignWithParams(c, tokenAudienceAPI, ipAddr, getTokenDuration(tokenAudienceAPI)) if err != nil { return err } - r.Header.Set("Authorization", fmt.Sprintf("Bearer %v", resp["access_token"])) + resp := c.BuildTokenResponse(token) + r.Header.Set("Authorization", fmt.Sprintf("Bearer %s", resp.Token)) dataprovider.UpdateAdminLastLogin(&admin) + common.DelayLogin(nil) return nil } -func authenticateUserWithAPIKey(username, keyID string, tokenAuth *jwtauth.JWTAuth, r *http.Request) error { +func authenticateUserWithAPIKey(username, keyID string, tokenAuth *jwt.Signer, r *http.Request) error { ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) protocol := common.ProtocolHTTP if username == "" { err := errors.New("the provided key is not associated with any user and no username was provided") updateLoginMetrics(&dataprovider.User{BaseUser: sdk.BaseUser{Username: username}}, - dataprovider.LoginMethodPassword, ipAddr, err) + dataprovider.LoginMethodPassword, ipAddr, err, r) return err } if err := common.Config.ExecutePostConnectHook(ipAddr, protocol); err != nil { @@ -530,57 +544,72 @@ func authenticateUserWithAPIKey(username, keyID string, tokenAuth *jwtauth.JWTAu user, err := dataprovider.GetUserWithGroupSettings(username, "") if err != nil { updateLoginMetrics(&dataprovider.User{BaseUser: sdk.BaseUser{Username: username}}, - dataprovider.LoginMethodPassword, ipAddr, err) + dataprovider.LoginMethodPassword, ipAddr, err, r) return err } if !user.Filters.AllowAPIKeyAuth { err := fmt.Errorf("API key authentication disabled for user %q", user.Username) - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, err) + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, err, r) return err } if err := user.CheckLoginConditions(); err != nil { - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, err) + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, err, r) return err } connectionID := fmt.Sprintf("%v_%v", protocol, xid.New().String()) - if err := checkHTTPClientUser(&user, r, connectionID, true); err != nil { - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, err) + if err := checkHTTPClientUser(&user, r, connectionID, true, false); err != nil { + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, err, r) return err } defer user.CloseFs() //nolint:errcheck err = user.CheckFsRoot(connectionID) if err != nil { - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure) + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure, r) return common.ErrInternalFailure } - c := jwtTokenClaims{ + c := &jwt.Claims{ Username: user.Username, Permissions: user.Filters.WebClient, - Signature: user.GetSignature(), Role: user.Role, APIKeyID: keyID, } + c.Subject = user.GetSignature() - resp, err := c.createTokenResponse(tokenAuth, tokenAudienceAPIUser, ipAddr) + token, err := tokenAuth.SignWithParams(c, tokenAudienceAPIUser, ipAddr, getTokenDuration(tokenAudienceAPIUser)) if err != nil { - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure) + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure, r) return err } - r.Header.Set("Authorization", fmt.Sprintf("Bearer %v", resp["access_token"])) + resp := c.BuildTokenResponse(token) + r.Header.Set("Authorization", fmt.Sprintf("Bearer %s", resp.Token)) dataprovider.UpdateLastLogin(&user) - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, nil) + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, nil, r) return nil } func checkPartialAuth(w http.ResponseWriter, r *http.Request, audience string, tokenAudience []string) error { - if audience == tokenAudienceWebAdmin && util.Contains(tokenAudience, tokenAudienceWebAdminPartial) { + if audience == tokenAudienceWebAdmin && slices.Contains(tokenAudience, tokenAudienceWebAdminPartial) { http.Redirect(w, r, webAdminTwoFactorPath, http.StatusFound) return errInvalidToken } - if audience == tokenAudienceWebClient && util.Contains(tokenAudience, tokenAudienceWebClientPartial) { + if audience == tokenAudienceWebClient && slices.Contains(tokenAudience, tokenAudienceWebClientPartial) { http.Redirect(w, r, webClientTwoFactorPath, http.StatusFound) return errInvalidToken } return nil } + +func cacheControlMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate, private") + next.ServeHTTP(w, r) + }) +} + +func cleanCacheControlMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Del("Cache-Control") + next.ServeHTTP(w, r) + }) +} diff --git a/internal/httpd/oauth2.go b/internal/httpd/oauth2.go index fa0c3c62..bb3e7806 100644 --- a/internal/httpd/oauth2.go +++ b/internal/httpd/oauth2.go @@ -20,7 +20,7 @@ import ( "sync" "time" - "github.com/rs/xid" + "golang.org/x/oauth2" "github.com/drakkan/sftpgo/v2/internal/dataprovider" "github.com/drakkan/sftpgo/v2/internal/kms" @@ -50,16 +50,18 @@ type oauth2PendingAuth struct { ClientSecret *kms.Secret `json:"client_secret"` RedirectURL string `json:"redirect_url"` IssuedAt int64 `json:"issued_at"` + Verifier string `json:"verifier"` } func newOAuth2PendingAuth(provider int, redirectURL, clientID string, clientSecret *kms.Secret) oauth2PendingAuth { return oauth2PendingAuth{ - State: xid.New().String(), + State: util.GenerateOpaqueString(), Provider: provider, ClientID: clientID, ClientSecret: clientSecret, RedirectURL: redirectURL, IssuedAt: util.GetTimeAsMsSinceEpoch(time.Now()), + Verifier: oauth2.GenerateVerifier(), } } @@ -134,11 +136,11 @@ func (o *dbOAuth2Manager) addPendingAuth(pendingAuth oauth2PendingAuth) { } func (o *dbOAuth2Manager) removePendingAuth(state string) { - dataprovider.DeleteSharedSession(state) //nolint:errcheck + dataprovider.DeleteSharedSession(state, dataprovider.SessionTypeOAuth2Auth) //nolint:errcheck } func (o *dbOAuth2Manager) getPendingAuth(state string) (oauth2PendingAuth, error) { - session, err := dataprovider.GetSharedSession(state) + session, err := dataprovider.GetSharedSession(state, dataprovider.SessionTypeOAuth2Auth) if err != nil { return oauth2PendingAuth{}, errors.New("oauth2: unable to get the auth request for the specified state") } diff --git a/internal/httpd/oauth2_test.go b/internal/httpd/oauth2_test.go index a676905d..0e488136 100644 --- a/internal/httpd/oauth2_test.go +++ b/internal/httpd/oauth2_test.go @@ -86,7 +86,7 @@ func TestDbOAuth2Manager(t *testing.T) { a, err := m.getPendingAuth(auth.State) assert.NoError(t, err) assert.Equal(t, sdkkms.SecretStatusPlain, a.ClientSecret.GetStatus()) - session, err := dataprovider.GetSharedSession(auth.State) + session, err := dataprovider.GetSharedSession(auth.State, dataprovider.SessionTypeOAuth2Auth) assert.NoError(t, err) authReq := oauth2PendingAuth{} err = json.Unmarshal(session.Data.([]byte), &authReq) @@ -107,10 +107,10 @@ func TestDbOAuth2Manager(t *testing.T) { m.addPendingAuth(auth) _, err = m.getPendingAuth(auth.State) assert.Error(t, err) - _, err = dataprovider.GetSharedSession(auth.State) + _, err = dataprovider.GetSharedSession(auth.State, dataprovider.SessionTypeOAuth2Auth) assert.NoError(t, err) m.cleanup() - _, err = dataprovider.GetSharedSession(auth.State) + _, err = dataprovider.GetSharedSession(auth.State, dataprovider.SessionTypeOAuth2Auth) assert.Error(t, err) _, err = m.decodePendingAuthData("not a byte array") require.Error(t, err) @@ -126,7 +126,7 @@ func TestDbOAuth2Manager(t *testing.T) { } auth.ClientSecret.SetStatus(sdkkms.SecretStatusSecretBox) m.addPendingAuth(auth) - _, err = dataprovider.GetSharedSession(auth.State) + _, err = dataprovider.GetSharedSession(auth.State, dataprovider.SessionTypeOAuth2Auth) assert.Error(t, err) asJSON, err := json.Marshal(auth) assert.NoError(t, err) diff --git a/internal/httpd/oidc.go b/internal/httpd/oidc.go index b686caab..7c43fac5 100644 --- a/internal/httpd/oidc.go +++ b/internal/httpd/oidc.go @@ -20,6 +20,7 @@ import ( "fmt" "net/http" "net/url" + "slices" "strings" "time" @@ -30,6 +31,7 @@ import ( "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/dataprovider" "github.com/drakkan/sftpgo/v2/internal/httpclient" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/logger" "github.com/drakkan/sftpgo/v2/internal/util" ) @@ -37,7 +39,7 @@ import ( const ( oidcCookieKey = "oidc" adminRoleFieldValue = "admin" - authStateValidity = 1 * 60 * 1000 // 1 minute + authStateValidity = 2 * 60 * 1000 // 2 minutes tokenUpdateInterval = 3 * 60 * 1000 // 3 minutes tokenDeleteInterval = 2 * 3600 * 1000 // 2 hours ) @@ -142,7 +144,7 @@ func (o *OIDC) initialize() error { if o.RedirectBaseURL == "" { return errors.New("oidc: redirect base URL cannot be empty") } - if !util.Contains(o.Scopes, oidc.ScopeOpenID) { + if !slices.Contains(o.Scopes, oidc.ScopeOpenID) { return fmt.Errorf("oidc: required scope %q is not set", oidc.ScopeOpenID) } if o.ClientSecretFile != "" { @@ -198,33 +200,38 @@ type oidcPendingAuth struct { Nonce string `json:"nonce"` Audience tokenAudience `json:"audience"` IssuedAt int64 `json:"issued_at"` + Verifier string `json:"verifier"` } func newOIDCPendingAuth(audience tokenAudience) oidcPendingAuth { return oidcPendingAuth{ - State: xid.New().String(), - Nonce: xid.New().String(), + State: util.GenerateOpaqueString(), + Nonce: util.GenerateOpaqueString(), Audience: audience, IssuedAt: util.GetTimeAsMsSinceEpoch(time.Now()), + Verifier: oauth2.GenerateVerifier(), } } type oidcToken struct { - AccessToken string `json:"access_token"` - TokenType string `json:"token_type,omitempty"` - RefreshToken string `json:"refresh_token,omitempty"` - ExpiresAt int64 `json:"expires_at,omitempty"` - SessionID string `json:"session_id"` - IDToken string `json:"id_token"` - Nonce string `json:"nonce"` - Username string `json:"username"` - Permissions []string `json:"permissions"` - HideUserPageSections int `json:"hide_user_page_sections,omitempty"` - TokenRole string `json:"token_role,omitempty"` // SFTPGo role name - Role any `json:"role"` // oidc user role: SFTPGo user or admin - CustomFields *map[string]any `json:"custom_fields,omitempty"` - Cookie string `json:"cookie"` - UsedAt int64 `json:"used_at"` + AccessToken string `json:"access_token"` + TokenType string `json:"token_type,omitempty"` + RefreshToken string `json:"refresh_token,omitempty"` + ExpiresAt int64 `json:"expires_at,omitempty"` + SessionID string `json:"session_id"` + IDToken string `json:"id_token"` + Nonce string `json:"nonce"` + Username string `json:"username"` + Permissions []string `json:"permissions"` + HideUserPageSections int `json:"hide_user_page_sections,omitempty"` + MustSetTwoFactorAuth bool `json:"must_set_2fa,omitempty"` + MustChangePassword bool `json:"must_change_password,omitempty"` + RequiredTwoFactorProtocols []string `json:"required_two_factor_protocols,omitempty"` + TokenRole string `json:"token_role,omitempty"` // SFTPGo role name + Role any `json:"role"` // oidc user role: SFTPGo user or admin + CustomFields *map[string]any `json:"custom_fields,omitempty"` + Cookie string `json:"cookie"` + UsedAt int64 `json:"used_at"` } func (t *oidcToken) parseClaims(claims map[string]any, usernameField, roleField string, customFields []string, @@ -345,14 +352,15 @@ func (t *oidcToken) refresh(ctx context.Context, config OAuth2Config, verifier O logger.Debug(logSender, "", "unable to verify refreshed id token for cookie %q: %v", t.Cookie, err) return err } - if idToken.Nonce != t.Nonce { - logger.Debug(logSender, "", "unable to verify refreshed id token for cookie %q: nonce mismatch", t.Cookie) + if idToken.Nonce != "" && idToken.Nonce != t.Nonce { + logger.Warn(logSender, "", "unable to verify refreshed id token for cookie %q: nonce mismatch, expected: %q, actual: %q", + t.Cookie, t.Nonce, idToken.Nonce) return errors.New("the refreshed token nonce mismatch") } claims := make(map[string]any) err = idToken.Claims(&claims) if err != nil { - logger.Debug(logSender, "", "unable to get refreshed id token claims for cookie %q: %v", t.Cookie, err) + logger.Warn(logSender, "", "unable to get refreshed id token claims for cookie %q: %v", t.Cookie, err) return err } sid, ok := claims["sid"].(string) @@ -391,11 +399,14 @@ func (t *oidcToken) refreshUser(r *http.Request) error { if err := user.CheckLoginConditions(); err != nil { return err } - if err := checkHTTPClientUser(&user, r, xid.New().String(), true); err != nil { + if err := checkHTTPClientUser(&user, r, xid.New().String(), true, false); err != nil { return err } t.Permissions = user.Filters.WebClient t.TokenRole = user.Role + t.MustSetTwoFactorAuth = user.MustSetSecondFactor() + t.MustChangePassword = user.MustChangePassword() + t.RequiredTwoFactorProtocols = user.Filters.TwoFactorAuthProtocols return nil } @@ -405,7 +416,7 @@ func (t *oidcToken) getUser(r *http.Request) error { Name: t.Username, IP: ipAddr, Protocol: common.ProtocolOIDC, - Timestamp: time.Now().UnixNano(), + Timestamp: time.Now(), Status: 1, } if t.isAdmin() { @@ -428,6 +439,7 @@ func (t *oidcToken) getUser(r *http.Request) error { t.TokenRole = admin.Role t.HideUserPageSections = admin.Filters.Preferences.HideUserPageSections dataprovider.UpdateAdminLastLogin(admin) + common.DelayLogin(nil) return nil } params.Event = common.IDPLoginUser @@ -443,29 +455,32 @@ func (t *oidcToken) getUser(r *http.Request) error { user = &u } if err := common.Config.ExecutePostConnectHook(ipAddr, common.ProtocolOIDC); err != nil { - updateLoginMetrics(user, dataprovider.LoginMethodIDP, ipAddr, err) + updateLoginMetrics(user, dataprovider.LoginMethodIDP, ipAddr, err, r) return fmt.Errorf("access denied: %w", err) } if err := user.CheckLoginConditions(); err != nil { - updateLoginMetrics(user, dataprovider.LoginMethodIDP, ipAddr, err) + updateLoginMetrics(user, dataprovider.LoginMethodIDP, ipAddr, err, r) return err } connectionID := fmt.Sprintf("%s_%s", common.ProtocolOIDC, xid.New().String()) - if err := checkHTTPClientUser(user, r, connectionID, true); err != nil { - updateLoginMetrics(user, dataprovider.LoginMethodIDP, ipAddr, err) + if err := checkHTTPClientUser(user, r, connectionID, true, true); err != nil { + updateLoginMetrics(user, dataprovider.LoginMethodIDP, ipAddr, err, r) return err } defer user.CloseFs() //nolint:errcheck err = user.CheckFsRoot(connectionID) if err != nil { logger.Warn(logSender, connectionID, "unable to check fs root: %v", err) - updateLoginMetrics(user, dataprovider.LoginMethodIDP, ipAddr, common.ErrInternalFailure) + updateLoginMetrics(user, dataprovider.LoginMethodIDP, ipAddr, common.ErrInternalFailure, r) return err } - updateLoginMetrics(user, dataprovider.LoginMethodIDP, ipAddr, nil) + updateLoginMetrics(user, dataprovider.LoginMethodIDP, ipAddr, nil, r) dataprovider.UpdateLastLogin(user) t.Permissions = user.Filters.WebClient t.TokenRole = user.Role + t.MustSetTwoFactorAuth = user.MustSetSecondFactor() + t.MustChangePassword = user.MustChangePassword() + t.RequiredTwoFactorProtocols = user.Filters.TwoFactorAuthProtocols return nil } @@ -539,13 +554,20 @@ func (s *httpdServer) oidcTokenAuthenticator(audience tokenAudience) func(next h if err != nil { return } - jwtTokenClaims := jwtTokenClaims{ - Username: token.Username, + claims := jwt.Claims{ + Username: dataprovider.ConvertName(token.Username), Permissions: token.Permissions, Role: token.TokenRole, HideUserPageSections: token.HideUserPageSections, } - _, tokenString, err := jwtTokenClaims.createToken(s.tokenAuth, audience, util.GetIPFromRemoteAddress(r.RemoteAddr)) + claims.ID = token.Cookie + if audience == tokenAudienceWebClient { + claims.MustSetTwoFactorAuth = token.MustSetTwoFactorAuth + claims.MustChangePassword = token.MustChangePassword + claims.RequiredTwoFactorProtocols = token.RequiredTwoFactorProtocols + } + tokenString, err := s.tokenAuth.SignWithParams(&claims, audience, util.GetIPFromRemoteAddress(r.RemoteAddr), + getTokenDuration(audience)) if err != nil { setFlashMessage(w, r, newFlashMessage("Unable to create cookie", util.I18nError500Message)) if audience == tokenAudienceWebAdmin { @@ -575,7 +597,7 @@ func (s *httpdServer) oidcLoginRedirect(w http.ResponseWriter, r *http.Request, pendingAuth := newOIDCPendingAuth(audience) oidcMgr.addPendingAuth(pendingAuth) http.Redirect(w, r, s.binding.OIDC.oauth2Config.AuthCodeURL(pendingAuth.State, - oidc.Nonce(pendingAuth.Nonce)), http.StatusFound) + oidc.Nonce(pendingAuth.Nonce), oauth2.S256ChallengeOption(pendingAuth.Verifier)), http.StatusFound) } func (s *httpdServer) debugTokenClaims(claims map[string]any, rawIDToken string) { @@ -593,6 +615,7 @@ func (s *httpdServer) handleOIDCRedirect(w http.ResponseWriter, r *http.Request) authReq, err := oidcMgr.getPendingAuth(state) if err != nil { logger.Debug(logSender, "", "oidc authentication state did not match") + oidcMgr.removePendingAuth(state) s.renderClientMessagePage(w, r, util.I18nInvalidAuthReqTitle, http.StatusBadRequest, util.NewI18nError(err, util.I18nInvalidAuth), "") return @@ -613,7 +636,8 @@ func (s *httpdServer) handleOIDCRedirect(w http.ResponseWriter, r *http.Request) ctx, cancel := context.WithTimeout(r.Context(), 20*time.Second) defer cancel() - oauth2Token, err := s.binding.OIDC.oauth2Config.Exchange(ctx, r.URL.Query().Get("code")) + oauth2Token, err := s.binding.OIDC.oauth2Config.Exchange(ctx, r.URL.Query().Get("code"), + oauth2.VerifierOption(authReq.Verifier)) if err != nil { logger.Debug(logSender, "", "failed to exchange oidc token: %v", err) setFlashMessage(w, r, newFlashMessage("Failed to exchange OpenID token", util.I18nOIDCErrTokenExchange)) @@ -660,7 +684,7 @@ func (s *httpdServer) handleOIDCRedirect(w http.ResponseWriter, r *http.Request) RefreshToken: oauth2Token.RefreshToken, IDToken: rawIDToken, Nonce: idToken.Nonce, - Cookie: xid.New().String(), + Cookie: util.GenerateOpaqueString(), } if !oauth2Token.Expiry.IsZero() { token.ExpiresAt = util.GetTimeAsMsSinceEpoch(oauth2Token.Expiry) @@ -788,7 +812,7 @@ func removeOIDCCookie(w http.ResponseWriter, r *http.Request) { func canSkipOIDCValidation(r *http.Request) bool { _, err := r.Cookie(oidcCookieKey) if err != nil { - _, err = r.Cookie(jwtCookieKey) + _, err = r.Cookie(jwt.CookieKey) return err == nil } return false diff --git a/internal/httpd/oidc_test.go b/internal/httpd/oidc_test.go index be04d2ab..4a14c76c 100644 --- a/internal/httpd/oidc_test.go +++ b/internal/httpd/oidc_test.go @@ -32,8 +32,6 @@ import ( "unsafe" "github.com/coreos/go-oidc/v3/oidc" - "github.com/go-chi/jwtauth/v5" - "github.com/lestrrat-go/jwx/v2/jwa" "github.com/rs/xid" "github.com/sftpgo/sdk" "github.com/stretchr/testify/assert" @@ -42,6 +40,7 @@ import ( "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/kms" "github.com/drakkan/sftpgo/v2/internal/util" "github.com/drakkan/sftpgo/v2/internal/vfs" @@ -136,12 +135,15 @@ func TestOIDCInitialization(t *testing.T) { } func TestOIDCLoginLogout(t *testing.T) { + tokenValidationMode = 2 + oidcMgr, ok := oidcMgr.(*memoryOIDCManager) require.True(t, ok) server := getTestOIDCServer() err := server.binding.OIDC.initialize() assert.NoError(t, err) - server.initializeRouter() + err = server.initializeRouter() + require.NoError(t, err) rr := httptest.NewRecorder() r, err := http.NewRequest(http.MethodGet, webOIDCRedirectPath, nil) @@ -151,8 +153,8 @@ func TestOIDCLoginLogout(t *testing.T) { assert.Contains(t, rr.Body.String(), util.I18nInvalidAuth) expiredAuthReq := oidcPendingAuth{ - State: xid.New().String(), - Nonce: xid.New().String(), + State: util.GenerateOpaqueString(), + Nonce: util.GenerateOpaqueString(), Audience: tokenAudienceWebClient, IssuedAt: util.GetTimeAsMsSinceEpoch(time.Now().Add(-10 * time.Minute)), } @@ -553,6 +555,8 @@ func TestOIDCLoginLogout(t *testing.T) { assert.NoError(t, err) err = dataprovider.DeleteUser(username, "", "", "") assert.NoError(t, err) + + tokenValidationMode = 0 } func TestOIDCRefreshToken(t *testing.T) { @@ -561,7 +565,7 @@ func TestOIDCRefreshToken(t *testing.T) { r, err := http.NewRequest(http.MethodGet, webUsersPath, nil) assert.NoError(t, err) token := oidcToken{ - Cookie: xid.New().String(), + Cookie: util.GenerateOpaqueString(), AccessToken: xid.New().String(), TokenType: "Bearer", ExpiresAt: util.GetTimeAsMsSinceEpoch(time.Now().Add(-1 * time.Minute)), @@ -627,7 +631,9 @@ func TestOIDCRefreshToken(t *testing.T) { }, } verifier = mockOIDCVerifier{ - token: &oidc.IDToken{}, + token: &oidc.IDToken{ + Nonce: xid.New().String(), // nonce is different from the expected one + }, } err = token.refresh(context.Background(), &config, &verifier, r) if assert.Error(t, err) { @@ -635,7 +641,7 @@ func TestOIDCRefreshToken(t *testing.T) { } verifier = mockOIDCVerifier{ token: &oidc.IDToken{ - Nonce: token.Nonce, + Nonce: "", // empty token is fine on refresh but claims are not set }, } err = token.refresh(context.Background(), &config, &verifier, r) @@ -663,7 +669,7 @@ func TestOIDCRefreshToken(t *testing.T) { func TestOIDCRefreshUser(t *testing.T) { token := oidcToken{ - Cookie: xid.New().String(), + Cookie: util.GenerateOpaqueString(), AccessToken: xid.New().String(), TokenType: "Bearer", ExpiresAt: util.GetTimeAsMsSinceEpoch(time.Now().Add(1 * time.Minute)), @@ -763,7 +769,8 @@ func TestValidateOIDCToken(t *testing.T) { server := getTestOIDCServer() err := server.binding.OIDC.initialize() assert.NoError(t, err) - server.initializeRouter() + err = server.initializeRouter() + require.NoError(t, err) rr := httptest.NewRecorder() r, err := http.NewRequest(http.MethodGet, webClientLogoutPath, nil) @@ -777,7 +784,7 @@ func TestValidateOIDCToken(t *testing.T) { }, } token := oidcToken{ - Cookie: xid.New().String(), + Cookie: util.GenerateOpaqueString(), AccessToken: xid.New().String(), ExpiresAt: util.GetTimeAsMsSinceEpoch(time.Now().Add(-2 * time.Minute)), } @@ -791,10 +798,10 @@ func TestValidateOIDCToken(t *testing.T) { oidcMgr.removeToken(token.Cookie) assert.Len(t, oidcMgr.tokens, 0) - server.tokenAuth = jwtauth.New("PS256", util.GenerateRandomBytes(32), nil) + server.tokenAuth.SetSigner(&failingJoseSigner{}) token = oidcToken{ - Cookie: xid.New().String(), - AccessToken: xid.New().String(), + Cookie: util.GenerateOpaqueString(), + AccessToken: util.GenerateUniqueID(), } oidcMgr.addToken(token) rr = httptest.NewRecorder() @@ -808,7 +815,7 @@ func TestValidateOIDCToken(t *testing.T) { assert.Len(t, oidcMgr.tokens, 0) token = oidcToken{ - Cookie: xid.New().String(), + Cookie: util.GenerateOpaqueString(), AccessToken: xid.New().String(), Role: "admin", } @@ -828,16 +835,17 @@ func TestSkipOIDCAuth(t *testing.T) { server := getTestOIDCServer() err := server.binding.OIDC.initialize() assert.NoError(t, err) - server.initializeRouter() - jwtTokenClaims := jwtTokenClaims{ - Username: "user", - } - _, tokenString, err := jwtTokenClaims.createToken(server.tokenAuth, tokenAudienceWebClient, "") + err = server.initializeRouter() + require.NoError(t, err) + + claims := jwt.NewClaims(tokenAudienceWebClient, "", getTokenDuration(tokenAudienceWebClient)) + claims.Username = "user" + tokenString, err := server.tokenAuth.Sign(claims) assert.NoError(t, err) rr := httptest.NewRecorder() r, err := http.NewRequest(http.MethodGet, webClientLogoutPath, nil) assert.NoError(t, err) - r.Header.Set("Cookie", fmt.Sprintf("%v=%v", jwtCookieKey, tokenString)) + r.Header.Set("Cookie", fmt.Sprintf("%v=%v", jwt.CookieKey, tokenString)) server.router.ServeHTTP(rr, r) assert.Equal(t, http.StatusFound, rr.Code) assert.Equal(t, webClientLoginPath, rr.Header().Get("Location")) @@ -901,7 +909,8 @@ func TestOIDCToken(t *testing.T) { }, Filters: dataprovider.UserFilters{ BaseUserFilters: sdk.BaseUserFilters{ - DeniedProtocols: []string{common.ProtocolHTTP}, + DeniedProtocols: []string{common.ProtocolHTTP}, + DeniedLoginMethods: []string{dataprovider.LoginMethodPassword}, }, }, } @@ -962,7 +971,8 @@ func TestOIDCImplicitRoles(t *testing.T) { server.binding.OIDC.ImplicitRoles = true err := server.binding.OIDC.initialize() assert.NoError(t, err) - server.initializeRouter() + err = server.initializeRouter() + require.NoError(t, err) authReq := newOIDCPendingAuth(tokenAudienceWebAdmin) oidcMgr.addPendingAuth(authReq) @@ -1088,7 +1098,7 @@ func TestMemoryOIDCManager(t *testing.T) { assert.NoError(t, err) oidcMgr.removePendingAuth(authReq.State) require.Len(t, oidcMgr.pendingAuths, 0) - authReq.IssuedAt = util.GetTimeAsMsSinceEpoch(time.Now().Add(-61 * time.Second)) + authReq.IssuedAt = util.GetTimeAsMsSinceEpoch(time.Now().Add(-600 * time.Second)) oidcMgr.addPendingAuth(authReq) require.Len(t, oidcMgr.pendingAuths, 1) _, err = oidcMgr.getPendingAuth(authReq.State) @@ -1102,7 +1112,7 @@ func TestMemoryOIDCManager(t *testing.T) { AccessToken: xid.New().String(), Nonce: xid.New().String(), SessionID: xid.New().String(), - Cookie: xid.New().String(), + Cookie: util.GenerateOpaqueString(), Username: xid.New().String(), Role: "admin", Permissions: []string{dataprovider.PermAdminAny}, @@ -1152,7 +1162,7 @@ func TestMemoryOIDCManager(t *testing.T) { token.UsedAt = usedAt oidcMgr.tokens[token.Cookie] = token newToken := oidcToken{ - Cookie: xid.New().String(), + Cookie: util.GenerateOpaqueString(), } oidcMgr.addToken(newToken) oidcMgr.cleanup() @@ -1174,20 +1184,20 @@ func TestOIDCEvMgrIntegration(t *testing.T) { err = dataprovider.Initialize(newProviderConf, configDir, true) assert.NoError(t, err) // add a special chars to check json replacer - username := `test_"oidc_eventmanager` + username := `test_'oidc_eventmanager` u := map[string]any{ - "username": "{{Name}}", + "username": "{{.Name}}", "status": 1, - "home_dir": filepath.Join(os.TempDir(), "{{IDPFieldcustom1.sub}}"), + "home_dir": filepath.Join(os.TempDir(), "{{.IDPFieldcustom1.sub}}"), "permissions": map[string][]string{ "/": {dataprovider.PermAny}, }, - "description": "{{IDPFieldcustom2}}", + "description": "{{.IDPFieldcustom2}}", } userTmpl, err := json.Marshal(u) require.NoError(t, err) a := map[string]any{ - "username": "{{Name}}", + "username": "{{.Name}}", "status": 1, "permissions": []string{dataprovider.PermAdminAny}, } @@ -1235,7 +1245,8 @@ func TestOIDCEvMgrIntegration(t *testing.T) { server.binding.OIDC.CustomFields = []string{"custom1.sub", "custom2"} err = server.binding.OIDC.initialize() assert.NoError(t, err) - server.initializeRouter() + err = server.initializeRouter() + require.NoError(t, err) // login a user with OIDC _, err = dataprovider.UserExists(username, "") assert.ErrorIs(t, err, util.ErrNotFound) @@ -1372,7 +1383,8 @@ func TestOIDCPreLoginHook(t *testing.T) { server.binding.OIDC.CustomFields = []string{"field1", "field2"} err = server.binding.OIDC.initialize() assert.NoError(t, err) - server.initializeRouter() + err = server.initializeRouter() + require.NoError(t, err) _, err = dataprovider.UserExists(username, "") assert.ErrorIs(t, err, util.ErrNotFound) @@ -1543,12 +1555,13 @@ func TestOIDCWithLoginFormsDisabled(t *testing.T) { server := getTestOIDCServer() server.binding.OIDC.ImplicitRoles = true - server.binding.EnabledLoginMethods = 3 + server.binding.DisabledLoginMethods = 12 server.binding.EnableWebAdmin = true server.binding.EnableWebClient = true err := server.binding.OIDC.initialize() assert.NoError(t, err) - server.initializeRouter() + err = server.initializeRouter() + require.NoError(t, err) // login with an admin user authReq := newOIDCPendingAuth(tokenAudienceWebAdmin) oidcMgr.addPendingAuth(authReq) @@ -1584,12 +1597,9 @@ func TestOIDCWithLoginFormsDisabled(t *testing.T) { tokenCookie = k } // we should be able to create admins without setting a password - if csrfTokenAuth == nil { - csrfTokenAuth = jwtauth.New(jwa.HS256.String(), util.GenerateRandomBytes(32), nil) - } adminUsername := "testAdmin" form := make(url.Values) - form.Set(csrfFormToken, createCSRFToken("")) + form.Set(csrfFormToken, createCSRFToken(rr, r, server.csrfTokenAuth, tokenCookie, webBaseAdminPath)) form.Set("username", adminUsername) form.Set("password", "") form.Set("status", "1") @@ -1661,7 +1671,7 @@ func TestDbOIDCManager(t *testing.T) { } token := oidcToken{ - Cookie: xid.New().String(), + Cookie: util.GenerateOpaqueString(), AccessToken: xid.New().String(), TokenType: "Bearer", RefreshToken: xid.New().String(), diff --git a/internal/httpd/oidcmanager.go b/internal/httpd/oidcmanager.go index d0acade6..79336748 100644 --- a/internal/httpd/oidcmanager.go +++ b/internal/httpd/oidcmanager.go @@ -167,11 +167,11 @@ func (o *dbOIDCManager) addPendingAuth(pendingAuth oidcPendingAuth) { } func (o *dbOIDCManager) removePendingAuth(state string) { - dataprovider.DeleteSharedSession(state) //nolint:errcheck + dataprovider.DeleteSharedSession(state, dataprovider.SessionTypeOIDCAuth) //nolint:errcheck } func (o *dbOIDCManager) getPendingAuth(state string) (oidcPendingAuth, error) { - session, err := dataprovider.GetSharedSession(state) + session, err := dataprovider.GetSharedSession(state, dataprovider.SessionTypeOIDCAuth) if err != nil { return oidcPendingAuth{}, errors.New("oidc: unable to get the auth request for the specified state") } @@ -204,7 +204,7 @@ func (o *dbOIDCManager) addToken(token oidcToken) { } func (o *dbOIDCManager) removeToken(cookie string) { - dataprovider.DeleteSharedSession(cookie) //nolint:errcheck + dataprovider.DeleteSharedSession(cookie, dataprovider.SessionTypeOIDCToken) //nolint:errcheck } func (o *dbOIDCManager) updateTokenUsage(token oidcToken) { @@ -215,7 +215,7 @@ func (o *dbOIDCManager) updateTokenUsage(token oidcToken) { } func (o *dbOIDCManager) getToken(cookie string) (oidcToken, error) { - session, err := dataprovider.GetSharedSession(cookie) + session, err := dataprovider.GetSharedSession(cookie, dataprovider.SessionTypeOIDCToken) if err != nil { return oidcToken{}, errors.New("oidc: unable to get the token for the specified session") } diff --git a/internal/httpd/resetcode.go b/internal/httpd/resetcode.go index 6e680c02..0be7d890 100644 --- a/internal/httpd/resetcode.go +++ b/internal/httpd/resetcode.go @@ -110,7 +110,7 @@ func (m *dbResetCodeManager) Add(code *resetCode) error { } func (m *dbResetCodeManager) Get(code string) (*resetCode, error) { - session, err := dataprovider.GetSharedSession(code) + session, err := dataprovider.GetSharedSession(code, dataprovider.SessionTypeResetCode) if err != nil { return nil, err } @@ -132,7 +132,7 @@ func (m *dbResetCodeManager) decodeData(data any) (*resetCode, error) { } func (m *dbResetCodeManager) Delete(code string) error { - return dataprovider.DeleteSharedSession(code) + return dataprovider.DeleteSharedSession(code, dataprovider.SessionTypeResetCode) } func (m *dbResetCodeManager) Cleanup() { diff --git a/internal/httpd/resources.go b/internal/httpd/resources.go index a68a7167..54bc58c9 100644 --- a/internal/httpd/resources.go +++ b/internal/httpd/resources.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build !bundle -// +build !bundle package httpd diff --git a/internal/httpd/resources_embedded.go b/internal/httpd/resources_embedded.go index 66ac0a8e..e15bc985 100644 --- a/internal/httpd/resources_embedded.go +++ b/internal/httpd/resources_embedded.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build bundle -// +build bundle package httpd diff --git a/internal/httpd/server.go b/internal/httpd/server.go index 0584344f..3fa54c1b 100644 --- a/internal/httpd/server.go +++ b/internal/httpd/server.go @@ -16,6 +16,7 @@ package httpd import ( "context" + "crypto/rand" "crypto/tls" "crypto/x509" "errors" @@ -24,15 +25,16 @@ import ( "net" "net/http" "net/url" + "path" "path/filepath" + "slices" "strings" "time" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" - "github.com/go-chi/jwtauth/v5" "github.com/go-chi/render" - "github.com/lestrrat-go/jwx/v2/jwa" + "github.com/go-jose/go-jose/v4" "github.com/rs/cors" "github.com/rs/xid" "github.com/sftpgo/sdk" @@ -41,6 +43,7 @@ import ( "github.com/drakkan/sftpgo/v2/internal/acme" "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/logger" "github.com/drakkan/sftpgo/v2/internal/mfa" "github.com/drakkan/sftpgo/v2/internal/smtp" @@ -67,7 +70,8 @@ type httpdServer struct { renderOpenAPI bool isShared int router *chi.Mux - tokenAuth *jwtauth.JWTAuth + tokenAuth *jwt.Signer + csrfTokenAuth *jwt.Signer signingPassphrase string cors CorsConfig } @@ -96,12 +100,12 @@ func (s *httpdServer) setShared(value int) { } func (s *httpdServer) listenAndServe() error { - s.initializeRouter() + if err := s.initializeRouter(); err != nil { + return err + } httpServer := &http.Server{ Handler: s.router, ReadHeaderTimeout: 30 * time.Second, - ReadTimeout: 60 * time.Second, - WriteTimeout: 60 * time.Second, IdleTimeout: 60 * time.Second, MaxHeaderBytes: 1 << 16, // 64KB ErrorLog: log.New(&logger.StdLoggerWrapper{Sender: logSender}, "", 0), @@ -120,14 +124,16 @@ func (s *httpdServer) listenAndServe() error { httpServer.TLSConfig = config logger.Debug(logSender, "", "configured TLS cipher suites for binding %q: %v, certID: %v", s.binding.GetAddress(), httpServer.TLSConfig.CipherSuites, certID) - if s.binding.ClientAuthType == 1 { + if s.binding.isMutualTLSEnabled() { httpServer.TLSConfig.ClientCAs = certMgr.GetRootCAs() httpServer.TLSConfig.ClientAuth = tls.RequireAndVerifyClientCert httpServer.TLSConfig.VerifyConnection = s.verifyTLSConnection } - return util.HTTPListenAndServe(httpServer, s.binding.Address, s.binding.Port, true, logSender) + return util.HTTPListenAndServe(httpServer, s.binding.Address, s.binding.Port, true, + s.binding.listenerWrapper(), logSender) } - return util.HTTPListenAndServe(httpServer, s.binding.Address, s.binding.Port, false, logSender) + return util.HTTPListenAndServe(httpServer, s.binding.Address, s.binding.Port, false, + s.binding.listenerWrapper(), logSender) } func (s *httpdServer) verifyTLSConnection(state tls.ConnectionState) error { @@ -164,14 +170,15 @@ func (s *httpdServer) refreshCookie(next http.Handler) http.Handler { }) } -func (s *httpdServer) renderClientLoginPage(w http.ResponseWriter, r *http.Request, err *util.I18nError, ip string) { +func (s *httpdServer) renderClientLoginPage(w http.ResponseWriter, r *http.Request, err *util.I18nError) { data := loginPage{ commonBasePage: getCommonBasePage(r), Title: util.I18nLoginTitle, CurrentURL: webClientLoginPath, Error: err, - CSRFToken: createCSRFToken(ip), - Branding: s.binding.Branding.WebClient, + CSRFToken: createCSRFToken(w, r, s.csrfTokenAuth, rand.Text(), webBaseClientPath), + Branding: s.binding.webClientBranding(), + Languages: s.binding.languages(), FormDisabled: s.binding.isWebClientLoginFormDisabled(), CheckRedirect: true, } @@ -180,7 +187,7 @@ func (s *httpdServer) renderClientLoginPage(w http.ResponseWriter, r *http.Reque } if s.binding.showAdminLoginURL() { data.AltLoginURL = webAdminLoginPath - data.AltLoginName = s.binding.Branding.WebAdmin.ShortName + data.AltLoginName = s.binding.webAdminBranding().ShortName } if smtp.IsEnabled() && !data.FormDisabled { data.ForgotPwdURL = webClientForgotPwdPath @@ -193,8 +200,7 @@ func (s *httpdServer) renderClientLoginPage(w http.ResponseWriter, r *http.Reque func (s *httpdServer) handleWebClientLogout(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxLoginBodySize) - c := jwtTokenClaims{} - c.removeCookie(w, r, webBaseClientPath) + removeCookie(w, r, webBaseClientPath) s.logoutOIDCUser(w, r) http.Redirect(w, r, webClientLoginPath, http.StatusFound) @@ -206,7 +212,7 @@ func (s *httpdServer) handleWebClientChangePwdPost(w http.ResponseWriter, r *htt s.renderClientChangePasswordPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm)) return } - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), util.GetIPFromRemoteAddress(r.RemoteAddr)); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderClientForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -226,7 +232,7 @@ func (s *httpdServer) handleClientWebLogin(w http.ResponseWriter, r *http.Reques return } msg := getFlashMessage(w, r) - s.renderClientLoginPage(w, r, msg.getI18nError(), util.GetIPFromRemoteAddress(r.RemoteAddr)) + s.renderClientLoginPage(w, r, msg.getI18nError()) } func (s *httpdServer) handleWebClientLoginPost(w http.ResponseWriter, r *http.Request) { @@ -234,44 +240,43 @@ func (s *httpdServer) handleWebClientLoginPost(w http.ResponseWriter, r *http.Re ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) if err := r.ParseForm(); err != nil { - s.renderClientLoginPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm), ipAddr) + s.renderClientLoginPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm)) return } protocol := common.ProtocolHTTP username := strings.TrimSpace(r.Form.Get("username")) - password := strings.TrimSpace(r.Form.Get("password")) + password := r.Form.Get("password") if username == "" || password == "" { updateLoginMetrics(&dataprovider.User{BaseUser: sdk.BaseUser{Username: username}}, - dataprovider.LoginMethodPassword, ipAddr, common.ErrNoCredentials) + dataprovider.LoginMethodPassword, ipAddr, common.ErrNoCredentials, r) s.renderClientLoginPage(w, r, - util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), ipAddr) + util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) return } - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyLoginCookieAndCSRFToken(r, s.csrfTokenAuth); err != nil { updateLoginMetrics(&dataprovider.User{BaseUser: sdk.BaseUser{Username: username}}, - dataprovider.LoginMethodPassword, ipAddr, err) - s.renderClientLoginPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF), ipAddr) - return + dataprovider.LoginMethodPassword, ipAddr, err, r) + s.renderClientLoginPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) } if err := common.Config.ExecutePostConnectHook(ipAddr, protocol); err != nil { updateLoginMetrics(&dataprovider.User{BaseUser: sdk.BaseUser{Username: username}}, - dataprovider.LoginMethodPassword, ipAddr, err) - s.renderClientLoginPage(w, r, util.NewI18nError(err, util.I18nError403Message), ipAddr) + dataprovider.LoginMethodPassword, ipAddr, err, r) + s.renderClientLoginPage(w, r, util.NewI18nError(err, util.I18nError403Message)) return } user, err := dataprovider.CheckUserAndPass(username, password, ipAddr, protocol) if err != nil { - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, err) + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, err, r) s.renderClientLoginPage(w, r, - util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), ipAddr) + util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) return } connectionID := fmt.Sprintf("%v_%v", protocol, xid.New().String()) - if err := checkHTTPClientUser(&user, r, connectionID, true); err != nil { - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, err) - s.renderClientLoginPage(w, r, util.NewI18nError(err, util.I18nError403Message), ipAddr) + if err := checkHTTPClientUser(&user, r, connectionID, true, false); err != nil { + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, err, r) + s.renderClientLoginPage(w, r, util.NewI18nError(err, util.I18nError403Message)) return } @@ -279,8 +284,8 @@ func (s *httpdServer) handleWebClientLoginPost(w http.ResponseWriter, r *http.Re err = user.CheckFsRoot(connectionID) if err != nil { logger.Warn(logSender, connectionID, "unable to check fs root: %v", err) - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure) - s.renderClientLoginPage(w, r, util.NewI18nError(err, util.I18nErrorFsGeneric), ipAddr) + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure, r) + s.renderClientLoginPage(w, r, util.NewI18nError(err, util.I18nErrorFsGeneric)) return } s.loginUser(w, r, &user, connectionID, ipAddr, false, s.renderClientLoginPage) @@ -292,10 +297,10 @@ func (s *httpdServer) handleWebClientPasswordResetPost(w http.ResponseWriter, r ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) err := r.ParseForm() if err != nil { - s.renderClientResetPwdPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm), ipAddr) + s.renderClientResetPwdPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm)) return } - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyLoginCookieAndCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderClientForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -304,12 +309,12 @@ func (s *httpdServer) handleWebClientPasswordResetPost(w http.ResponseWriter, r _, user, err := handleResetPassword(r, strings.TrimSpace(r.Form.Get("code")), newPassword, confirmPassword, false) if err != nil { - s.renderClientResetPwdPage(w, r, util.NewI18nError(err, util.I18nErrorChangePwdGeneric), ipAddr) + s.renderClientResetPwdPage(w, r, util.NewI18nError(err, util.I18nErrorChangePwdGeneric)) return } connectionID := fmt.Sprintf("%v_%v", getProtocolFromRequest(r), xid.New().String()) - if err := checkHTTPClientUser(user, r, connectionID, true); err != nil { - s.renderClientResetPwdPage(w, r, util.NewI18nError(err, util.I18nErrorDirList403), ipAddr) + if err := checkHTTPClientUser(user, r, connectionID, true, false); err != nil { + s.renderClientResetPwdPage(w, r, util.NewI18nError(err, util.I18nErrorLoginAfterReset)) return } @@ -317,7 +322,7 @@ func (s *httpdServer) handleWebClientPasswordResetPost(w http.ResponseWriter, r err = user.CheckFsRoot(connectionID) if err != nil { logger.Warn(logSender, connectionID, "unable to check fs root: %v", err) - s.renderClientResetPwdPage(w, r, util.NewI18nError(err, util.I18nErrorLoginAfterReset), ipAddr) + s.renderClientResetPwdPage(w, r, util.NewI18nError(err, util.I18nErrorLoginAfterReset)) return } s.loginUser(w, r, user, connectionID, ipAddr, false, s.renderClientResetPwdPage) @@ -325,25 +330,25 @@ func (s *httpdServer) handleWebClientPasswordResetPost(w http.ResponseWriter, r func (s *httpdServer) handleWebClientTwoFactorRecoveryPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxLoginBodySize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil { s.renderNotFoundPage(w, r, nil) return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) if err := r.ParseForm(); err != nil { - s.renderClientTwoFactorRecoveryPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm), ipAddr) + s.renderClientTwoFactorRecoveryPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm)) return } username := claims.Username recoveryCode := strings.TrimSpace(r.Form.Get("recovery_code")) if username == "" || recoveryCode == "" { s.renderClientTwoFactorRecoveryPage(w, r, - util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), ipAddr) + util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) return } - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { - s.renderClientTwoFactorRecoveryPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF), ipAddr) + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { + s.renderClientTwoFactorRecoveryPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } user, userMerged, err := dataprovider.GetUserVariants(username, "") @@ -352,12 +357,12 @@ func (s *httpdServer) handleWebClientTwoFactorRecoveryPost(w http.ResponseWriter handleDefenderEventLoginFailed(ipAddr, err) //nolint:errcheck } s.renderClientTwoFactorRecoveryPage(w, r, - util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), ipAddr) + util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) return } - if !userMerged.Filters.TOTPConfig.Enabled || !util.Contains(userMerged.Filters.TOTPConfig.Protocols, common.ProtocolHTTP) { + if !userMerged.Filters.TOTPConfig.Enabled || !slices.Contains(userMerged.Filters.TOTPConfig.Protocols, common.ProtocolHTTP) { s.renderClientTwoFactorPage(w, r, util.NewI18nError( - util.NewValidationError("two factory authentication is not enabled"), util.I18n2FADisabled), ipAddr) + util.NewValidationError("two factory authentication is not enabled"), util.I18n2FADisabled)) return } for idx, code := range user.Filters.RecoveryCodes { @@ -368,7 +373,7 @@ func (s *httpdServer) handleWebClientTwoFactorRecoveryPost(w http.ResponseWriter if code.Secret.GetPayload() == recoveryCode { if code.Used { s.renderClientTwoFactorRecoveryPage(w, r, - util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), ipAddr) + util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) return } user.Filters.RecoveryCodes[idx].Used = true @@ -386,60 +391,60 @@ func (s *httpdServer) handleWebClientTwoFactorRecoveryPost(w http.ResponseWriter } handleDefenderEventLoginFailed(ipAddr, dataprovider.ErrInvalidCredentials) //nolint:errcheck s.renderClientTwoFactorRecoveryPage(w, r, - util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), ipAddr) + util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) } func (s *httpdServer) handleWebClientTwoFactorPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxLoginBodySize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil { s.renderNotFoundPage(w, r, nil) return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) if err := r.ParseForm(); err != nil { - s.renderClientTwoFactorPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm), ipAddr) + s.renderClientTwoFactorPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm)) return } username := claims.Username passcode := strings.TrimSpace(r.Form.Get("passcode")) if username == "" || passcode == "" { updateLoginMetrics(&dataprovider.User{BaseUser: sdk.BaseUser{Username: username}}, - dataprovider.LoginMethodPassword, ipAddr, common.ErrNoCredentials) + dataprovider.LoginMethodPassword, ipAddr, common.ErrNoCredentials, r) s.renderClientTwoFactorPage(w, r, - util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), ipAddr) + util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) return } - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { updateLoginMetrics(&dataprovider.User{BaseUser: sdk.BaseUser{Username: username}}, - dataprovider.LoginMethodPassword, ipAddr, err) - s.renderClientTwoFactorPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF), ipAddr) + dataprovider.LoginMethodPassword, ipAddr, err, r) + s.renderClientTwoFactorPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } user, err := dataprovider.GetUserWithGroupSettings(username, "") if err != nil { updateLoginMetrics(&dataprovider.User{BaseUser: sdk.BaseUser{Username: username}}, - dataprovider.LoginMethodPassword, ipAddr, err) - s.renderClientTwoFactorPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCredentials), ipAddr) + dataprovider.LoginMethodPassword, ipAddr, err, r) + s.renderClientTwoFactorPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCredentials)) return } - if !user.Filters.TOTPConfig.Enabled || !util.Contains(user.Filters.TOTPConfig.Protocols, common.ProtocolHTTP) { - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure) - s.renderClientTwoFactorPage(w, r, util.NewI18nError(common.ErrInternalFailure, util.I18n2FADisabled), ipAddr) + if !user.Filters.TOTPConfig.Enabled || !slices.Contains(user.Filters.TOTPConfig.Protocols, common.ProtocolHTTP) { + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure, r) + s.renderClientTwoFactorPage(w, r, util.NewI18nError(common.ErrInternalFailure, util.I18n2FADisabled)) return } err = user.Filters.TOTPConfig.Secret.Decrypt() if err != nil { - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure) + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure, r) s.renderClientInternalServerErrorPage(w, r, err) return } match, err := mfa.ValidateTOTPPasscode(user.Filters.TOTPConfig.ConfigName, passcode, user.Filters.TOTPConfig.Secret.GetPayload()) if !match || err != nil { - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, dataprovider.ErrInvalidCredentials) + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, dataprovider.ErrInvalidCredentials, r) s.renderClientTwoFactorPage(w, r, - util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), ipAddr) + util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) return } connectionID := fmt.Sprintf("%s_%s", getProtocolFromRequest(r), xid.New().String()) @@ -449,25 +454,24 @@ func (s *httpdServer) handleWebClientTwoFactorPost(w http.ResponseWriter, r *htt func (s *httpdServer) handleWebAdminTwoFactorRecoveryPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxLoginBodySize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil { s.renderNotFoundPage(w, r, nil) return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) if err := r.ParseForm(); err != nil { - s.renderTwoFactorRecoveryPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm), ipAddr) + s.renderTwoFactorRecoveryPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm)) return } username := claims.Username recoveryCode := strings.TrimSpace(r.Form.Get("recovery_code")) if username == "" || recoveryCode == "" { - s.renderTwoFactorRecoveryPage(w, r, util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), - ipAddr) + s.renderTwoFactorRecoveryPage(w, r, util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) return } - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { - s.renderTwoFactorRecoveryPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF), ipAddr) + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { + s.renderTwoFactorRecoveryPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } admin, err := dataprovider.AdminExists(username) @@ -475,12 +479,11 @@ func (s *httpdServer) handleWebAdminTwoFactorRecoveryPost(w http.ResponseWriter, if errors.Is(err, util.ErrNotFound) { handleDefenderEventLoginFailed(ipAddr, err) //nolint:errcheck } - s.renderTwoFactorRecoveryPage(w, r, util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), - ipAddr) + s.renderTwoFactorRecoveryPage(w, r, util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) return } if !admin.Filters.TOTPConfig.Enabled { - s.renderTwoFactorRecoveryPage(w, r, util.NewI18nError(util.NewValidationError("two factory authentication is not enabled"), util.I18n2FADisabled), ipAddr) + s.renderTwoFactorRecoveryPage(w, r, util.NewI18nError(util.NewValidationError("two factory authentication is not enabled"), util.I18n2FADisabled)) return } for idx, code := range admin.Filters.RecoveryCodes { @@ -491,7 +494,7 @@ func (s *httpdServer) handleWebAdminTwoFactorRecoveryPost(w http.ResponseWriter, if code.Secret.GetPayload() == recoveryCode { if code.Used { s.renderTwoFactorRecoveryPage(w, r, - util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), ipAddr) + util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) return } admin.Filters.RecoveryCodes[idx].Used = true @@ -506,32 +509,30 @@ func (s *httpdServer) handleWebAdminTwoFactorRecoveryPost(w http.ResponseWriter, } } handleDefenderEventLoginFailed(ipAddr, dataprovider.ErrInvalidCredentials) //nolint:errcheck - s.renderTwoFactorRecoveryPage(w, r, util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), - ipAddr) + s.renderTwoFactorRecoveryPage(w, r, util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) } func (s *httpdServer) handleWebAdminTwoFactorPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxLoginBodySize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil { s.renderNotFoundPage(w, r, nil) return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) if err := r.ParseForm(); err != nil { - s.renderTwoFactorPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm), ipAddr) + s.renderTwoFactorPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm)) return } username := claims.Username passcode := strings.TrimSpace(r.Form.Get("passcode")) if username == "" || passcode == "" { - s.renderTwoFactorPage(w, r, util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), - ipAddr) + s.renderTwoFactorPage(w, r, util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) return } - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { - err = handleDefenderEventLoginFailed(ipAddr, err) - s.renderTwoFactorPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF), ipAddr) + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { + handleDefenderEventLoginFailed(ipAddr, err) //nolint:errcheck + s.renderTwoFactorPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } admin, err := dataprovider.AdminExists(username) @@ -539,11 +540,11 @@ func (s *httpdServer) handleWebAdminTwoFactorPost(w http.ResponseWriter, r *http if errors.Is(err, util.ErrNotFound) { handleDefenderEventLoginFailed(ipAddr, err) //nolint:errcheck } - s.renderTwoFactorPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCredentials), ipAddr) + s.renderTwoFactorPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCredentials)) return } if !admin.Filters.TOTPConfig.Enabled { - s.renderTwoFactorPage(w, r, util.NewI18nError(common.ErrInternalFailure, util.I18n2FADisabled), ipAddr) + s.renderTwoFactorPage(w, r, util.NewI18nError(common.ErrInternalFailure, util.I18n2FADisabled)) return } err = admin.Filters.TOTPConfig.Secret.Decrypt() @@ -555,8 +556,7 @@ func (s *httpdServer) handleWebAdminTwoFactorPost(w http.ResponseWriter, r *http admin.Filters.TOTPConfig.Secret.GetPayload()) if !match || err != nil { handleDefenderEventLoginFailed(ipAddr, dataprovider.ErrInvalidCredentials) //nolint:errcheck - s.renderTwoFactorPage(w, r, util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), - ipAddr) + s.renderTwoFactorPage(w, r, util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) return } s.loginAdmin(w, r, &admin, true, s.renderTwoFactorPage, ipAddr) @@ -567,44 +567,43 @@ func (s *httpdServer) handleWebAdminLoginPost(w http.ResponseWriter, r *http.Req ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) if err := r.ParseForm(); err != nil { - s.renderAdminLoginPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm), ipAddr) + s.renderAdminLoginPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm)) return } username := strings.TrimSpace(r.Form.Get("username")) password := strings.TrimSpace(r.Form.Get("password")) if username == "" || password == "" { - s.renderAdminLoginPage(w, r, util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), - ipAddr) + s.renderAdminLoginPage(w, r, util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) return } - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { - s.renderAdminLoginPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF), ipAddr) + if err := verifyLoginCookieAndCSRFToken(r, s.csrfTokenAuth); err != nil { + s.renderAdminLoginPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } admin, err := dataprovider.CheckAdminAndPass(username, password, ipAddr) if err != nil { handleDefenderEventLoginFailed(ipAddr, err) //nolint:errcheck - s.renderAdminLoginPage(w, r, util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), - ipAddr) + s.renderAdminLoginPage(w, r, util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) return } s.loginAdmin(w, r, &admin, false, s.renderAdminLoginPage, ipAddr) } -func (s *httpdServer) renderAdminLoginPage(w http.ResponseWriter, r *http.Request, err *util.I18nError, ip string) { +func (s *httpdServer) renderAdminLoginPage(w http.ResponseWriter, r *http.Request, err *util.I18nError) { data := loginPage{ commonBasePage: getCommonBasePage(r), Title: util.I18nLoginTitle, CurrentURL: webAdminLoginPath, Error: err, - CSRFToken: createCSRFToken(ip), - Branding: s.binding.Branding.WebAdmin, + CSRFToken: createCSRFToken(w, r, s.csrfTokenAuth, rand.Text(), webBaseAdminPath), + Branding: s.binding.webAdminBranding(), + Languages: s.binding.languages(), FormDisabled: s.binding.isWebAdminLoginFormDisabled(), CheckRedirect: false, } if s.binding.showClientLoginURL() { data.AltLoginURL = webClientLoginPath - data.AltLoginName = s.binding.Branding.WebClient.ShortName + data.AltLoginName = s.binding.webClientBranding().ShortName } if smtp.IsEnabled() && !data.FormDisabled { data.ForgotPwdURL = webAdminForgotPwdPath @@ -622,13 +621,12 @@ func (s *httpdServer) handleWebAdminLogin(w http.ResponseWriter, r *http.Request return } msg := getFlashMessage(w, r) - s.renderAdminLoginPage(w, r, msg.getI18nError(), util.GetIPFromRemoteAddress(r.RemoteAddr)) + s.renderAdminLoginPage(w, r, msg.getI18nError()) } func (s *httpdServer) handleWebAdminLogout(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - c := jwtTokenClaims{} - c.removeCookie(w, r, webBaseAdminPath) + removeCookie(w, r, webBaseAdminPath) s.logoutOIDCUser(w, r) http.Redirect(w, r, webAdminLoginPath, http.StatusFound) @@ -641,7 +639,7 @@ func (s *httpdServer) handleWebAdminChangePwdPost(w http.ResponseWriter, r *http s.renderChangePasswordPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm)) return } - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), util.GetIPFromRemoteAddress(r.RemoteAddr)); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -660,10 +658,10 @@ func (s *httpdServer) handleWebAdminPasswordResetPost(w http.ResponseWriter, r * ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) err := r.ParseForm() if err != nil { - s.renderResetPwdPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm), ipAddr) + s.renderResetPwdPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm)) return } - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyLoginCookieAndCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -672,7 +670,7 @@ func (s *httpdServer) handleWebAdminPasswordResetPost(w http.ResponseWriter, r * admin, _, err := handleResetPassword(r, strings.TrimSpace(r.Form.Get("code")), newPassword, confirmPassword, true) if err != nil { - s.renderResetPwdPage(w, r, util.NewI18nError(err, util.I18nErrorChangePwdGeneric), ipAddr) + s.renderResetPwdPage(w, r, util.NewI18nError(err, util.I18nErrorChangePwdGeneric)) return } @@ -688,10 +686,10 @@ func (s *httpdServer) handleWebAdminSetupPost(w http.ResponseWriter, r *http.Req ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) err := r.ParseForm() if err != nil { - s.renderAdminSetupPage(w, r, "", ipAddr, util.NewI18nError(err, util.I18nErrorInvalidForm)) + s.renderAdminSetupPage(w, r, "", util.NewI18nError(err, util.I18nErrorInvalidForm)) return } - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyLoginCookieAndCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -700,7 +698,7 @@ func (s *httpdServer) handleWebAdminSetupPost(w http.ResponseWriter, r *http.Req confirmPassword := strings.TrimSpace(r.Form.Get("confirm_password")) installCode := strings.TrimSpace(r.Form.Get("install_code")) if installationCode != "" && installCode != resolveInstallationCode() { - s.renderAdminSetupPage(w, r, username, ipAddr, + s.renderAdminSetupPage(w, r, username, util.NewI18nError( util.NewValidationError(fmt.Sprintf("%v mismatch", installationCodeHint)), util.I18nErrorSetupInstallCode), @@ -708,17 +706,17 @@ func (s *httpdServer) handleWebAdminSetupPost(w http.ResponseWriter, r *http.Req return } if username == "" { - s.renderAdminSetupPage(w, r, username, ipAddr, + s.renderAdminSetupPage(w, r, username, util.NewI18nError(util.NewValidationError("please set a username"), util.I18nError500Message)) return } if password == "" { - s.renderAdminSetupPage(w, r, username, ipAddr, + s.renderAdminSetupPage(w, r, username, util.NewI18nError(util.NewValidationError("please set a password"), util.I18nError500Message)) return } if password != confirmPassword { - s.renderAdminSetupPage(w, r, username, ipAddr, + s.renderAdminSetupPage(w, r, username, util.NewI18nError(errors.New("the two password fields do not match"), util.I18nErrorChangePwdNoMatch)) return } @@ -730,7 +728,7 @@ func (s *httpdServer) handleWebAdminSetupPost(w http.ResponseWriter, r *http.Req } err = dataprovider.AddAdmin(&admin, username, ipAddr, "") if err != nil { - s.renderAdminSetupPage(w, r, username, ipAddr, util.NewI18nError(err, util.I18nError500Message)) + s.renderAdminSetupPage(w, r, username, util.NewI18nError(err, util.I18nError500Message)) return } s.loginAdmin(w, r, &admin, false, nil, ipAddr) @@ -738,34 +736,32 @@ func (s *httpdServer) handleWebAdminSetupPost(w http.ResponseWriter, r *http.Req func (s *httpdServer) loginUser( w http.ResponseWriter, r *http.Request, user *dataprovider.User, connectionID, ipAddr string, - isSecondFactorAuth bool, errorFunc func(w http.ResponseWriter, r *http.Request, err *util.I18nError, ip string), + isSecondFactorAuth bool, errorFunc func(w http.ResponseWriter, r *http.Request, err *util.I18nError), ) { - c := jwtTokenClaims{ + c := &jwt.Claims{ Username: user.Username, Permissions: user.Filters.WebClient, - Signature: user.GetSignature(), Role: user.Role, MustSetTwoFactorAuth: user.MustSetSecondFactor(), MustChangePassword: user.MustChangePassword(), RequiredTwoFactorProtocols: user.Filters.TwoFactorAuthProtocols, } + c.Subject = user.GetSignature() audience := tokenAudienceWebClient - if user.Filters.TOTPConfig.Enabled && util.Contains(user.Filters.TOTPConfig.Protocols, common.ProtocolHTTP) && + if user.Filters.TOTPConfig.Enabled && slices.Contains(user.Filters.TOTPConfig.Protocols, common.ProtocolHTTP) && user.CanManageMFA() && !isSecondFactorAuth { audience = tokenAudienceWebClientPartial } - err := c.createAndSetCookie(w, r, s.tokenAuth, audience, ipAddr) + err := createAndSetCookie(w, r, c, s.tokenAuth, audience, ipAddr) if err != nil { logger.Warn(logSender, connectionID, "unable to set user login cookie %v", err) - updateLoginMetrics(user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure) - errorFunc(w, r, util.NewI18nError(err, util.I18nError500Message), ipAddr) + updateLoginMetrics(user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure, r) + errorFunc(w, r, util.NewI18nError(err, util.I18nError500Message)) return } - if isSecondFactorAuth { - invalidateToken(r) - } + invalidateToken(r) if audience == tokenAudienceWebClientPartial { redirectPath := webClientTwoFactorPath if next := r.URL.Query().Get("next"); strings.HasPrefix(next, webClientFilesPath) { @@ -774,7 +770,7 @@ func (s *httpdServer) loginUser( http.Redirect(w, r, redirectPath, http.StatusFound) return } - updateLoginMetrics(user, dataprovider.LoginMethodPassword, ipAddr, err) + updateLoginMetrics(user, dataprovider.LoginMethodPassword, ipAddr, err, r) dataprovider.UpdateLastLogin(user) if next := r.URL.Query().Get("next"); strings.HasPrefix(next, webClientFilesPath) { http.Redirect(w, r, next, http.StatusFound) @@ -785,42 +781,41 @@ func (s *httpdServer) loginUser( func (s *httpdServer) loginAdmin( w http.ResponseWriter, r *http.Request, admin *dataprovider.Admin, - isSecondFactorAuth bool, errorFunc func(w http.ResponseWriter, r *http.Request, err *util.I18nError, ip string), + isSecondFactorAuth bool, errorFunc func(w http.ResponseWriter, r *http.Request, err *util.I18nError), ipAddr string, ) { - c := jwtTokenClaims{ + c := &jwt.Claims{ Username: admin.Username, Permissions: admin.Permissions, Role: admin.Role, - Signature: admin.GetSignature(), HideUserPageSections: admin.Filters.Preferences.HideUserPageSections, MustSetTwoFactorAuth: admin.Filters.RequireTwoFactor && !admin.Filters.TOTPConfig.Enabled, MustChangePassword: admin.Filters.RequirePasswordChange, } + c.Subject = admin.GetSignature() audience := tokenAudienceWebAdmin if admin.Filters.TOTPConfig.Enabled && admin.CanManageMFA() && !isSecondFactorAuth { audience = tokenAudienceWebAdminPartial } - err := c.createAndSetCookie(w, r, s.tokenAuth, audience, ipAddr) + err := createAndSetCookie(w, r, c, s.tokenAuth, audience, ipAddr) if err != nil { logger.Warn(logSender, "", "unable to set admin login cookie %v", err) if errorFunc == nil { - s.renderAdminSetupPage(w, r, admin.Username, ipAddr, util.NewI18nError(err, util.I18nError500Message)) + s.renderAdminSetupPage(w, r, admin.Username, util.NewI18nError(err, util.I18nError500Message)) return } - errorFunc(w, r, util.NewI18nError(err, util.I18nError500Message), ipAddr) + errorFunc(w, r, util.NewI18nError(err, util.I18nError500Message)) return } - if isSecondFactorAuth { - invalidateToken(r) - } + invalidateToken(r) if audience == tokenAudienceWebAdminPartial { http.Redirect(w, r, webAdminTwoFactorPath, http.StatusFound) return } dataprovider.UpdateAdminLastLogin(admin) + common.DelayLogin(nil) redirectURL := webUsersPath if errorFunc == nil { redirectURL = webAdminMFAPath @@ -841,52 +836,52 @@ func (s *httpdServer) getUserToken(w http.ResponseWriter, r *http.Request) { protocol := common.ProtocolHTTP if !ok { updateLoginMetrics(&dataprovider.User{BaseUser: sdk.BaseUser{Username: username}}, - dataprovider.LoginMethodPassword, ipAddr, common.ErrNoCredentials) + dataprovider.LoginMethodPassword, ipAddr, common.ErrNoCredentials, r) w.Header().Set(common.HTTPAuthenticationHeader, basicRealm) sendAPIResponse(w, r, nil, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) return } - if username == "" || password == "" { + if username == "" || strings.TrimSpace(password) == "" { updateLoginMetrics(&dataprovider.User{BaseUser: sdk.BaseUser{Username: username}}, - dataprovider.LoginMethodPassword, ipAddr, common.ErrNoCredentials) + dataprovider.LoginMethodPassword, ipAddr, common.ErrNoCredentials, r) w.Header().Set(common.HTTPAuthenticationHeader, basicRealm) sendAPIResponse(w, r, nil, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) return } if err := common.Config.ExecutePostConnectHook(ipAddr, protocol); err != nil { updateLoginMetrics(&dataprovider.User{BaseUser: sdk.BaseUser{Username: username}}, - dataprovider.LoginMethodPassword, ipAddr, err) + dataprovider.LoginMethodPassword, ipAddr, err, r) sendAPIResponse(w, r, err, http.StatusText(http.StatusForbidden), http.StatusForbidden) return } user, err := dataprovider.CheckUserAndPass(username, password, ipAddr, protocol) if err != nil { w.Header().Set(common.HTTPAuthenticationHeader, basicRealm) - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, err) + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, err, r) sendAPIResponse(w, r, dataprovider.ErrInvalidCredentials, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) return } connectionID := fmt.Sprintf("%v_%v", protocol, xid.New().String()) - if err := checkHTTPClientUser(&user, r, connectionID, true); err != nil { - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, err) + if err := checkHTTPClientUser(&user, r, connectionID, true, false); err != nil { + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, err, r) sendAPIResponse(w, r, err, http.StatusText(http.StatusForbidden), http.StatusForbidden) return } - if user.Filters.TOTPConfig.Enabled && util.Contains(user.Filters.TOTPConfig.Protocols, common.ProtocolHTTP) { + if user.Filters.TOTPConfig.Enabled && slices.Contains(user.Filters.TOTPConfig.Protocols, common.ProtocolHTTP) { passcode := r.Header.Get(otpHeaderCode) if passcode == "" { logger.Debug(logSender, "", "TOTP enabled for user %q and not passcode provided, authentication refused", user.Username) w.Header().Set(common.HTTPAuthenticationHeader, basicRealm) - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, dataprovider.ErrInvalidCredentials) + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, dataprovider.ErrInvalidCredentials, r) sendAPIResponse(w, r, dataprovider.ErrInvalidCredentials, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) return } err = user.Filters.TOTPConfig.Secret.Decrypt() if err != nil { - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure) + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure, r) sendAPIResponse(w, r, fmt.Errorf("unable to decrypt TOTP secret: %w", err), http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) return } @@ -895,7 +890,7 @@ func (s *httpdServer) getUserToken(w http.ResponseWriter, r *http.Request) { if !match || err != nil { logger.Debug(logSender, "invalid passcode for user %q, match? %v, err: %v", user.Username, match, err) w.Header().Set(common.HTTPAuthenticationHeader, basicRealm) - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, dataprovider.ErrInvalidCredentials) + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, dataprovider.ErrInvalidCredentials, r) sendAPIResponse(w, r, dataprovider.ErrInvalidCredentials, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) return @@ -906,7 +901,7 @@ func (s *httpdServer) getUserToken(w http.ResponseWriter, r *http.Request) { err = user.CheckFsRoot(connectionID) if err != nil { logger.Warn(logSender, connectionID, "unable to check fs root: %v", err) - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure) + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure, r) sendAPIResponse(w, r, err, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) return } @@ -915,26 +910,26 @@ func (s *httpdServer) getUserToken(w http.ResponseWriter, r *http.Request) { } func (s *httpdServer) generateAndSendUserToken(w http.ResponseWriter, r *http.Request, ipAddr string, user dataprovider.User) { - c := jwtTokenClaims{ + c := &jwt.Claims{ Username: user.Username, Permissions: user.Filters.WebClient, - Signature: user.GetSignature(), Role: user.Role, MustSetTwoFactorAuth: user.MustSetSecondFactor(), MustChangePassword: user.MustChangePassword(), RequiredTwoFactorProtocols: user.Filters.TwoFactorAuthProtocols, } + c.Subject = user.GetSignature() - resp, err := c.createTokenResponse(s.tokenAuth, tokenAudienceAPIUser, ipAddr) + token, err := s.tokenAuth.SignWithParams(c, tokenAudienceAPIUser, ipAddr, getTokenDuration(tokenAudienceAPIUser)) if err != nil { - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure) + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, common.ErrInternalFailure, r) sendAPIResponse(w, r, err, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) return } - updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, err) + updateLoginMetrics(&user, dataprovider.LoginMethodPassword, ipAddr, err, r) dataprovider.UpdateLastLogin(&user) - render.JSON(w, r, resp) + render.JSON(w, r, c.BuildTokenResponse(token)) } func (s *httpdServer) getToken(w http.ResponseWriter, r *http.Request) { @@ -947,9 +942,10 @@ func (s *httpdServer) getToken(w http.ResponseWriter, r *http.Request) { ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) admin, err := dataprovider.CheckAdminAndPass(username, password, ipAddr) if err != nil { - err = handleDefenderEventLoginFailed(ipAddr, err) + handleDefenderEventLoginFailed(ipAddr, err) //nolint:errcheck w.Header().Set(common.HTTPAuthenticationHeader, basicRealm) - sendAPIResponse(w, r, err, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) + sendAPIResponse(w, r, dataprovider.ErrInvalidCredentials, http.StatusText(http.StatusUnauthorized), + http.StatusUnauthorized) return } if admin.Filters.TOTPConfig.Enabled { @@ -983,59 +979,64 @@ func (s *httpdServer) getToken(w http.ResponseWriter, r *http.Request) { } func (s *httpdServer) generateAndSendToken(w http.ResponseWriter, r *http.Request, admin dataprovider.Admin, ip string) { - c := jwtTokenClaims{ + c := &jwt.Claims{ Username: admin.Username, Permissions: admin.Permissions, Role: admin.Role, - Signature: admin.GetSignature(), MustSetTwoFactorAuth: admin.Filters.RequireTwoFactor && !admin.Filters.TOTPConfig.Enabled, MustChangePassword: admin.Filters.RequirePasswordChange, } + c.Subject = admin.GetSignature() - resp, err := c.createTokenResponse(s.tokenAuth, tokenAudienceAPI, ip) - + token, err := s.tokenAuth.SignWithParams(c, tokenAudienceAPI, ip, getTokenDuration(tokenAudienceAPI)) if err != nil { sendAPIResponse(w, r, err, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) return } dataprovider.UpdateAdminLastLogin(&admin) - render.JSON(w, r, resp) + common.DelayLogin(nil) + render.JSON(w, r, c.BuildTokenResponse(token)) } func (s *httpdServer) checkCookieExpiration(w http.ResponseWriter, r *http.Request) { if _, ok := r.Context().Value(oidcTokenKey).(string); ok { return } - token, claims, err := jwtauth.FromContext(r.Context()) + claims, err := jwt.FromContext(r.Context()) if err != nil { return } - tokenClaims := jwtTokenClaims{} - tokenClaims.Decode(claims) - if tokenClaims.Username == "" || tokenClaims.Signature == "" { + if claims.Username == "" || claims.Subject == "" { return } - if time.Until(token.Expiration()) > tokenRefreshThreshold { + if time.Until(claims.Expiry.Time()) > cookieRefreshThreshold { return } - if util.Contains(token.Audience(), tokenAudienceWebClient) { - s.refreshClientToken(w, r, tokenClaims) + if (time.Since(claims.IssuedAt.Time()) + cookieTokenDuration) > maxTokenDuration { + return + } + if claims.Audience.Contains(tokenAudienceWebClient) { + s.refreshClientToken(w, r, claims) } else { - s.refreshAdminToken(w, r, tokenClaims) + s.refreshAdminToken(w, r, claims) } } -func (s *httpdServer) refreshClientToken(w http.ResponseWriter, r *http.Request, tokenClaims jwtTokenClaims) { +func (s *httpdServer) refreshClientToken(w http.ResponseWriter, r *http.Request, tokenClaims *jwt.Claims) { user, err := dataprovider.GetUserWithGroupSettings(tokenClaims.Username, "") if err != nil { return } - if user.GetSignature() != tokenClaims.Signature { + if user.GetSignature() != tokenClaims.Subject { logger.Debug(logSender, "", "signature mismatch for user %q, unable to refresh cookie", user.Username) return } - if err := checkHTTPClientUser(&user, r, xid.New().String(), true); err != nil { + if err := user.CheckLoginConditions(); err != nil { + logger.Debug(logSender, "", "unable to refresh cookie for user %q: %v", user.Username, err) + return + } + if err := checkHTTPClientUser(&user, r, xid.New().String(), true, false); err != nil { logger.Debug(logSender, "", "unable to refresh cookie for user %q: %v", user.Username, err) return } @@ -1043,43 +1044,39 @@ func (s *httpdServer) refreshClientToken(w http.ResponseWriter, r *http.Request, tokenClaims.Permissions = user.Filters.WebClient tokenClaims.Role = user.Role logger.Debug(logSender, "", "cookie refreshed for user %q", user.Username) - tokenClaims.createAndSetCookie(w, r, s.tokenAuth, tokenAudienceWebClient, util.GetIPFromRemoteAddress(r.RemoteAddr)) //nolint:errcheck + createAndSetCookie(w, r, tokenClaims, s.tokenAuth, tokenAudienceWebClient, util.GetIPFromRemoteAddress(r.RemoteAddr)) //nolint:errcheck } -func (s *httpdServer) refreshAdminToken(w http.ResponseWriter, r *http.Request, tokenClaims jwtTokenClaims) { +func (s *httpdServer) refreshAdminToken(w http.ResponseWriter, r *http.Request, tokenClaims *jwt.Claims) { admin, err := dataprovider.AdminExists(tokenClaims.Username) if err != nil { return } - if admin.Status != 1 { - logger.Debug(logSender, "", "admin %q is disabled, unable to refresh cookie", admin.Username) - return - } - if admin.GetSignature() != tokenClaims.Signature { + if admin.GetSignature() != tokenClaims.Subject { logger.Debug(logSender, "", "signature mismatch for admin %q, unable to refresh cookie", admin.Username) return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if !admin.CanLoginFromIP(ipAddr) { - logger.Debug(logSender, "", "admin %q cannot login from %v, unable to refresh cookie", admin.Username, r.RemoteAddr) + if err := admin.CanLogin(ipAddr); err != nil { + logger.Debug(logSender, "", "unable to refresh cookie for admin %q, err: %v", admin.Username, err) return } tokenClaims.Permissions = admin.Permissions tokenClaims.Role = admin.Role tokenClaims.HideUserPageSections = admin.Filters.Preferences.HideUserPageSections logger.Debug(logSender, "", "cookie refreshed for admin %q", admin.Username) - tokenClaims.createAndSetCookie(w, r, s.tokenAuth, tokenAudienceWebAdmin, ipAddr) //nolint:errcheck + createAndSetCookie(w, r, tokenClaims, s.tokenAuth, tokenAudienceWebAdmin, ipAddr) //nolint:errcheck } func (s *httpdServer) updateContextFromCookie(r *http.Request) *http.Request { - token, _, err := jwtauth.FromContext(r.Context()) - if token == nil || err != nil { - _, err = r.Cookie(jwtCookieKey) + _, err := jwt.FromContext(r.Context()) + if err != nil { + _, err = r.Cookie(jwt.CookieKey) if err != nil { return r } - token, err = jwtauth.VerifyRequest(s.tokenAuth, r, jwtauth.TokenFromCookie) - ctx := jwtauth.NewContext(r.Context(), token, err) + token, err := jwt.VerifyRequest(s.tokenAuth, r, jwt.TokenFromCookie) + ctx := jwt.NewContext(r.Context(), token, err) return r.WithContext(ctx) } return r @@ -1087,6 +1084,11 @@ func (s *httpdServer) updateContextFromCookie(r *http.Request) *http.Request { func (s *httpdServer) parseHeaders(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + responseControllerDeadlines( + http.NewResponseController(w), + time.Now().Add(60*time.Second), + time.Now().Add(60*time.Second), + ) w.Header().Set("Server", version.GetServerVersion("/", false)) ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) var ip net.IP @@ -1188,8 +1190,9 @@ func (s *httpdServer) badHostHandler(w http.ResponseWriter, r *http.Request) { break } } + logger.Debug(logSender, "", "the host %q is not allowed", host) s.sendForbiddenResponse(w, r, util.NewI18nError( - util.NewGenericError(fmt.Sprintf("The host %q is not allowed", host)), + util.NewGenericError(http.StatusText(http.StatusForbidden)), util.I18nErrorConnectionForbidden, )) } @@ -1231,31 +1234,45 @@ func (s *httpdServer) mustCheckPath(r *http.Request) bool { return !strings.HasPrefix(urlPath, webStaticFilesPath) && !strings.HasPrefix(urlPath, acmeChallengeURI) } -func (s *httpdServer) initializeRouter() { +func (s *httpdServer) initializeRouter() error { + signer, err := jwt.NewSigner(jose.HS256, getSigningKey(s.signingPassphrase)) + if err != nil { + return err + } + csrfSigner, err := jwt.NewSigner(jose.HS256, getSigningKey(s.signingPassphrase)) + if err != nil { + return err + } var hasHTTPSRedirect bool - s.tokenAuth = jwtauth.New(jwa.HS256.String(), getSigningKey(s.signingPassphrase), nil) + s.tokenAuth = signer + s.csrfTokenAuth = csrfSigner s.router = chi.NewRouter() s.router.Use(middleware.RequestID) s.router.Use(s.parseHeaders) s.router.Use(logger.NewStructuredLogger(logger.GetLogger())) s.router.Use(middleware.Recoverer) - s.router.Use(middleware.Maybe(s.checkConnection, s.mustCheckPath)) if s.binding.Security.Enabled { secureMiddleware := secure.New(secure.Options{ - AllowedHosts: s.binding.Security.AllowedHosts, - AllowedHostsAreRegex: s.binding.Security.AllowedHostsAreRegex, - HostsProxyHeaders: s.binding.Security.HostsProxyHeaders, - SSLProxyHeaders: s.binding.Security.getHTTPSProxyHeaders(), - STSSeconds: s.binding.Security.STSSeconds, - STSIncludeSubdomains: s.binding.Security.STSIncludeSubdomains, - STSPreload: s.binding.Security.STSPreload, - ContentTypeNosniff: s.binding.Security.ContentTypeNosniff, - ContentSecurityPolicy: s.binding.Security.ContentSecurityPolicy, - PermissionsPolicy: s.binding.Security.PermissionsPolicy, - CrossOriginOpenerPolicy: s.binding.Security.CrossOriginOpenerPolicy, + AllowedHosts: s.binding.Security.AllowedHosts, + AllowedHostsAreRegex: s.binding.Security.AllowedHostsAreRegex, + HostsProxyHeaders: s.binding.Security.HostsProxyHeaders, + SSLProxyHeaders: s.binding.Security.getHTTPSProxyHeaders(), + STSSeconds: s.binding.Security.STSSeconds, + STSIncludeSubdomains: s.binding.Security.STSIncludeSubdomains, + STSPreload: s.binding.Security.STSPreload, + ContentTypeNosniff: s.binding.Security.ContentTypeNosniff, + ContentSecurityPolicy: s.binding.Security.ContentSecurityPolicy, + PermissionsPolicy: s.binding.Security.PermissionsPolicy, + CrossOriginOpenerPolicy: s.binding.Security.CrossOriginOpenerPolicy, + CrossOriginResourcePolicy: s.binding.Security.CrossOriginResourcePolicy, + CrossOriginEmbedderPolicy: s.binding.Security.CrossOriginEmbedderPolicy, + ReferrerPolicy: s.binding.Security.ReferrerPolicy, }) secureMiddleware.SetBadHostHandler(http.HandlerFunc(s.badHostHandler)) + if s.binding.Security.CacheControl == "private" { + s.router.Use(cacheControlMiddleware) + } s.router.Use(secureMiddleware.Handler) if s.binding.Security.HTTPSRedirect { s.router.Use(s.binding.Security.redirectHandler) @@ -1276,6 +1293,7 @@ func (s *httpdServer) initializeRouter() { }) s.router.Use(c.Handler) } + s.router.Use(middleware.Maybe(s.checkConnection, s.mustCheckPath)) s.router.Use(middleware.GetHead) s.router.Use(middleware.Maybe(middleware.StripSlashes, s.mustStripSlash)) @@ -1291,24 +1309,57 @@ func (s *httpdServer) initializeRouter() { } } - if s.enableRESTAPI { - // share API available to external users - s.router.Get(sharesPath+"/{id}", s.downloadFromShare) //nolint:goconst - s.router.Post(sharesPath+"/{id}", s.uploadFilesToShare) - s.router.Post(sharesPath+"/{id}/{name}", s.uploadFileToShare) - s.router.With(compressor.Handler).Get(sharesPath+"/{id}/dirs", s.readBrowsableShareContents) - s.router.Get(sharesPath+"/{id}/files", s.downloadBrowsableSharedFile) + s.setupRESTAPIRoutes() - s.router.Get(tokenPath, s.getToken) - s.router.Post(adminPath+"/{username}/forgot-password", forgotAdminPassword) - s.router.Post(adminPath+"/{username}/reset-password", resetAdminPassword) - s.router.Post(userPath+"/{username}/forgot-password", forgotUserPassword) - s.router.Post(userPath+"/{username}/reset-password", resetUserPassword) + if s.enableWebAdmin || s.enableWebClient { + s.router.Group(func(router chi.Router) { + router.Use(cleanCacheControlMiddleware) + router.Use(compressor.Handler) + serveStaticDir(router, webStaticFilesPath, s.staticFilesPath, true) + }) + if s.binding.OIDC.isEnabled() { + s.router.Get(webOIDCRedirectPath, s.handleOIDCRedirect) + } + if s.enableWebClient { + s.router.Get(webRootPath, func(w http.ResponseWriter, r *http.Request) { + r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) + s.redirectToWebPath(w, r, webClientLoginPath) + }) + s.router.Get(webBasePath, func(w http.ResponseWriter, r *http.Request) { + r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) + s.redirectToWebPath(w, r, webClientLoginPath) + }) + } else { + s.router.Get(webRootPath, func(w http.ResponseWriter, r *http.Request) { + r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) + s.redirectToWebPath(w, r, webAdminLoginPath) + }) + s.router.Get(webBasePath, func(w http.ResponseWriter, r *http.Request) { + r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) + s.redirectToWebPath(w, r, webAdminLoginPath) + }) + } + } + + s.setupWebClientRoutes() + s.setupWebAdminRoutes() + return nil +} + +func (s *httpdServer) setupRESTAPIRoutes() { + if s.enableRESTAPI { + if !s.binding.isAdminTokenEndpointDisabled() { + s.router.Get(tokenPath, s.getToken) + s.router.Post(adminPath+"/{username}/forgot-password", forgotAdminPassword) + s.router.Post(adminPath+"/{username}/reset-password", resetAdminPassword) + } s.router.Group(func(router chi.Router) { router.Use(checkNodeToken(s.tokenAuth)) - router.Use(checkAPIKeyAuth(s.tokenAuth, dataprovider.APIKeyScopeAdmin)) - router.Use(jwtauth.Verify(s.tokenAuth, jwtauth.TokenFromHeader)) + if !s.binding.isAdminAPIKeyAuthDisabled() { + router.Use(checkAPIKeyAuth(s.tokenAuth, dataprovider.APIKeyScopeAdmin)) + } + router.Use(jwt.Verify(s.tokenAuth, jwt.TokenFromHeader)) router.Use(jwtAuthenticatorAPI) router.Get(versionPath, func(w http.ResponseWriter, r *http.Request) { @@ -1328,105 +1379,116 @@ func (s *httpdServer) initializeRouter() { router.With(forbidAPIKeyAuthentication).Get(admin2FARecoveryCodesPath, getRecoveryCodes) router.With(forbidAPIKeyAuthentication).Post(admin2FARecoveryCodesPath, generateRecoveryCodes) - router.With(forbidAPIKeyAuthentication, s.checkPerm(dataprovider.PermAdminManageAPIKeys)). + router.With(forbidAPIKeyAuthentication, s.checkPerms(dataprovider.PermAdminAny)). Get(apiKeysPath, getAPIKeys) - router.With(forbidAPIKeyAuthentication, s.checkPerm(dataprovider.PermAdminManageAPIKeys)). + router.With(forbidAPIKeyAuthentication, s.checkPerms(dataprovider.PermAdminAny)). Post(apiKeysPath, addAPIKey) - router.With(forbidAPIKeyAuthentication, s.checkPerm(dataprovider.PermAdminManageAPIKeys)). + router.With(forbidAPIKeyAuthentication, s.checkPerms(dataprovider.PermAdminAny)). Get(apiKeysPath+"/{id}", getAPIKeyByID) - router.With(forbidAPIKeyAuthentication, s.checkPerm(dataprovider.PermAdminManageAPIKeys)). + router.With(forbidAPIKeyAuthentication, s.checkPerms(dataprovider.PermAdminAny)). Put(apiKeysPath+"/{id}", updateAPIKey) - router.With(forbidAPIKeyAuthentication, s.checkPerm(dataprovider.PermAdminManageAPIKeys)). + router.With(forbidAPIKeyAuthentication, s.checkPerms(dataprovider.PermAdminAny)). Delete(apiKeysPath+"/{id}", deleteAPIKey) router.Group(func(router chi.Router) { router.Use(s.checkAuthRequirements) - router.With(s.checkPerm(dataprovider.PermAdminViewServerStatus)). + router.With(s.checkPerms(dataprovider.PermAdminViewServerStatus)). Get(serverStatusPath, func(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) render.JSON(w, r, getServicesStatus()) }) - router.With(s.checkPerm(dataprovider.PermAdminViewConnections)).Get(activeConnectionsPath, getActiveConnections) - router.With(s.checkPerm(dataprovider.PermAdminCloseConnections)). + router.With(s.checkPerms(dataprovider.PermAdminViewConnections)).Get(activeConnectionsPath, getActiveConnections) + router.With(s.checkPerms(dataprovider.PermAdminCloseConnections)). Delete(activeConnectionsPath+"/{connectionID}", handleCloseConnection) - router.With(s.checkPerm(dataprovider.PermAdminQuotaScans)).Get(quotasBasePath+"/users/scans", getUsersQuotaScans) - router.With(s.checkPerm(dataprovider.PermAdminQuotaScans)).Post(quotasBasePath+"/users/{username}/scan", startUserQuotaScan) - router.With(s.checkPerm(dataprovider.PermAdminQuotaScans)).Get(quotasBasePath+"/folders/scans", getFoldersQuotaScans) - router.With(s.checkPerm(dataprovider.PermAdminQuotaScans)).Post(quotasBasePath+"/folders/{name}/scan", startFolderQuotaScan) - router.With(s.checkPerm(dataprovider.PermAdminViewUsers)).Get(userPath, getUsers) - router.With(s.checkPerm(dataprovider.PermAdminAddUsers)).Post(userPath, addUser) - router.With(s.checkPerm(dataprovider.PermAdminViewUsers)).Get(userPath+"/{username}", getUserByUsername) //nolint:goconst - router.With(s.checkPerm(dataprovider.PermAdminChangeUsers)).Put(userPath+"/{username}", updateUser) - router.With(s.checkPerm(dataprovider.PermAdminDeleteUsers)).Delete(userPath+"/{username}", deleteUser) - router.With(s.checkPerm(dataprovider.PermAdminDisableMFA)).Put(userPath+"/{username}/2fa/disable", disableUser2FA) //nolint:goconst - router.With(s.checkPerm(dataprovider.PermAdminManageFolders)).Get(folderPath, getFolders) - router.With(s.checkPerm(dataprovider.PermAdminManageFolders)).Get(folderPath+"/{name}", getFolderByName) //nolint:goconst - router.With(s.checkPerm(dataprovider.PermAdminManageFolders)).Post(folderPath, addFolder) - router.With(s.checkPerm(dataprovider.PermAdminManageFolders)).Put(folderPath+"/{name}", updateFolder) - router.With(s.checkPerm(dataprovider.PermAdminManageFolders)).Delete(folderPath+"/{name}", deleteFolder) - router.With(s.checkPerm(dataprovider.PermAdminManageGroups)).Get(groupPath, getGroups) - router.With(s.checkPerm(dataprovider.PermAdminManageGroups)).Get(groupPath+"/{name}", getGroupByName) - router.With(s.checkPerm(dataprovider.PermAdminManageGroups)).Post(groupPath, addGroup) - router.With(s.checkPerm(dataprovider.PermAdminManageGroups)).Put(groupPath+"/{name}", updateGroup) - router.With(s.checkPerm(dataprovider.PermAdminManageGroups)).Delete(groupPath+"/{name}", deleteGroup) - router.With(s.checkPerm(dataprovider.PermAdminManageSystem)).Get(dumpDataPath, dumpData) - router.With(s.checkPerm(dataprovider.PermAdminManageSystem)).Get(loadDataPath, loadData) - router.With(s.checkPerm(dataprovider.PermAdminManageSystem)).Post(loadDataPath, loadDataFromRequest) - router.With(s.checkPerm(dataprovider.PermAdminChangeUsers)).Put(quotasBasePath+"/users/{username}/usage", + router.With(s.checkPerms(dataprovider.PermAdminQuotaScans)).Get(quotasBasePath+"/users/scans", getUsersQuotaScans) + router.With(s.checkPerms(dataprovider.PermAdminQuotaScans)).Post(quotasBasePath+"/users/{username}/scan", startUserQuotaScan) + router.With(s.checkPerms(dataprovider.PermAdminQuotaScans)).Get(quotasBasePath+"/folders/scans", getFoldersQuotaScans) + router.With(s.checkPerms(dataprovider.PermAdminQuotaScans)).Post(quotasBasePath+"/folders/{name}/scan", startFolderQuotaScan) + router.With(s.checkPerms(dataprovider.PermAdminViewUsers)).Get(userPath, getUsers) + router.With(s.checkPerms(dataprovider.PermAdminAddUsers)).Post(userPath, addUser) + router.With(s.checkPerms(dataprovider.PermAdminViewUsers)).Get(userPath+"/{username}", getUserByUsername) //nolint:goconst + router.With(s.checkPerms(dataprovider.PermAdminChangeUsers)).Put(userPath+"/{username}", updateUser) + router.With(s.checkPerms(dataprovider.PermAdminDeleteUsers)).Delete(userPath+"/{username}", deleteUser) + router.With(s.checkPerms(dataprovider.PermAdminDisableMFA)).Put(userPath+"/{username}/2fa/disable", disableUser2FA) //nolint:goconst + router.With(s.checkPerms(dataprovider.PermAdminManageFolders)).Get(folderPath, getFolders) + router.With(s.checkPerms(dataprovider.PermAdminManageFolders)).Get(folderPath+"/{name}", getFolderByName) //nolint:goconst + router.With(s.checkPerms(dataprovider.PermAdminManageFolders)).Post(folderPath, addFolder) + router.With(s.checkPerms(dataprovider.PermAdminManageFolders)).Put(folderPath+"/{name}", updateFolder) + router.With(s.checkPerms(dataprovider.PermAdminManageFolders)).Delete(folderPath+"/{name}", deleteFolder) + router.With(s.checkPerms(dataprovider.PermAdminManageGroups)).Get(groupPath, getGroups) + router.With(s.checkPerms(dataprovider.PermAdminManageGroups)).Get(groupPath+"/{name}", getGroupByName) + router.With(s.checkPerms(dataprovider.PermAdminManageGroups)).Post(groupPath, addGroup) + router.With(s.checkPerms(dataprovider.PermAdminManageGroups)).Put(groupPath+"/{name}", updateGroup) + router.With(s.checkPerms(dataprovider.PermAdminManageGroups)).Delete(groupPath+"/{name}", deleteGroup) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Get(dumpDataPath, dumpData) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Get(loadDataPath, loadData) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(loadDataPath, loadDataFromRequest) + router.With(s.checkPerms(dataprovider.PermAdminChangeUsers)).Put(quotasBasePath+"/users/{username}/usage", updateUserQuotaUsage) - router.With(s.checkPerm(dataprovider.PermAdminChangeUsers)).Put(quotasBasePath+"/users/{username}/transfer-usage", + router.With(s.checkPerms(dataprovider.PermAdminChangeUsers)).Put(quotasBasePath+"/users/{username}/transfer-usage", updateUserTransferQuotaUsage) - router.With(s.checkPerm(dataprovider.PermAdminChangeUsers)).Put(quotasBasePath+"/folders/{name}/usage", + router.With(s.checkPerms(dataprovider.PermAdminChangeUsers)).Put(quotasBasePath+"/folders/{name}/usage", updateFolderQuotaUsage) - router.With(s.checkPerm(dataprovider.PermAdminViewDefender)).Get(defenderHosts, getDefenderHosts) - router.With(s.checkPerm(dataprovider.PermAdminViewDefender)).Get(defenderHosts+"/{id}", getDefenderHostByID) - router.With(s.checkPerm(dataprovider.PermAdminManageDefender)).Delete(defenderHosts+"/{id}", deleteDefenderHostByID) - router.With(s.checkPerm(dataprovider.PermAdminManageAdmins)).Get(adminPath, getAdmins) - router.With(s.checkPerm(dataprovider.PermAdminManageAdmins)).Post(adminPath, addAdmin) - router.With(s.checkPerm(dataprovider.PermAdminManageAdmins)).Get(adminPath+"/{username}", getAdminByUsername) - router.With(s.checkPerm(dataprovider.PermAdminManageAdmins)).Put(adminPath+"/{username}", updateAdmin) - router.With(s.checkPerm(dataprovider.PermAdminManageAdmins)).Delete(adminPath+"/{username}", deleteAdmin) - router.With(s.checkPerm(dataprovider.PermAdminDisableMFA)).Put(adminPath+"/{username}/2fa/disable", disableAdmin2FA) - router.With(s.checkPerm(dataprovider.PermAdminRetentionChecks)).Get(retentionChecksPath, getRetentionChecks) - router.With(s.checkPerm(dataprovider.PermAdminRetentionChecks)).Post(retentionBasePath+"/{username}/check", - startRetentionCheck) - router.With(s.checkPerm(dataprovider.PermAdminViewEvents), compressor.Handler). + router.With(s.checkPerms(dataprovider.PermAdminViewDefender)).Get(defenderHosts, getDefenderHosts) + router.With(s.checkPerms(dataprovider.PermAdminViewDefender)).Get(defenderHosts+"/{id}", getDefenderHostByID) + router.With(s.checkPerms(dataprovider.PermAdminManageDefender)).Delete(defenderHosts+"/{id}", deleteDefenderHostByID) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Get(adminPath, getAdmins) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(adminPath, addAdmin) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Get(adminPath+"/{username}", getAdminByUsername) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Put(adminPath+"/{username}", updateAdmin) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Delete(adminPath+"/{username}", deleteAdmin) + router.With(s.checkPerms(dataprovider.PermAdminDisableMFA)).Put(adminPath+"/{username}/2fa/disable", disableAdmin2FA) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Get(retentionChecksPath, getRetentionChecks) + router.With(s.checkPerms(dataprovider.PermAdminViewEvents), compressor.Handler). Get(fsEventsPath, searchFsEvents) - router.With(s.checkPerm(dataprovider.PermAdminViewEvents), compressor.Handler). + router.With(s.checkPerms(dataprovider.PermAdminViewEvents), compressor.Handler). Get(providerEventsPath, searchProviderEvents) - router.With(s.checkPerm(dataprovider.PermAdminViewEvents), compressor.Handler). + router.With(s.checkPerms(dataprovider.PermAdminViewEvents), compressor.Handler). Get(logEventsPath, searchLogEvents) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules)).Get(eventActionsPath, getEventActions) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules)).Get(eventActionsPath+"/{name}", getEventActionByName) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules)).Post(eventActionsPath, addEventAction) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules)).Put(eventActionsPath+"/{name}", updateEventAction) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules)).Delete(eventActionsPath+"/{name}", deleteEventAction) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules)).Get(eventRulesPath, getEventRules) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules)).Get(eventRulesPath+"/{name}", getEventRuleByName) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules)).Post(eventRulesPath, addEventRule) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules)).Put(eventRulesPath+"/{name}", updateEventRule) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules)).Delete(eventRulesPath+"/{name}", deleteEventRule) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules)).Post(eventRulesPath+"/run/{name}", runOnDemandRule) - router.With(s.checkPerm(dataprovider.PermAdminManageRoles)).Get(rolesPath, getRoles) - router.With(s.checkPerm(dataprovider.PermAdminManageRoles)).Post(rolesPath, addRole) - router.With(s.checkPerm(dataprovider.PermAdminManageRoles)).Get(rolesPath+"/{name}", getRoleByName) - router.With(s.checkPerm(dataprovider.PermAdminManageRoles)).Put(rolesPath+"/{name}", updateRole) - router.With(s.checkPerm(dataprovider.PermAdminManageRoles)).Delete(rolesPath+"/{name}", deleteRole) - router.With(s.checkPerm(dataprovider.PermAdminManageIPLists), compressor.Handler).Get(ipListsPath+"/{type}", getIPListEntries) //nolint:goconst - router.With(s.checkPerm(dataprovider.PermAdminManageIPLists)).Post(ipListsPath+"/{type}", addIPListEntry) - router.With(s.checkPerm(dataprovider.PermAdminManageIPLists)).Get(ipListsPath+"/{type}/{ipornet}", getIPListEntry) //nolint:goconst - router.With(s.checkPerm(dataprovider.PermAdminManageIPLists)).Put(ipListsPath+"/{type}/{ipornet}", updateIPListEntry) - router.With(s.checkPerm(dataprovider.PermAdminManageIPLists)).Delete(ipListsPath+"/{type}/{ipornet}", deleteIPListEntry) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Get(eventActionsPath, getEventActions) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Get(eventActionsPath+"/{name}", getEventActionByName) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(eventActionsPath, addEventAction) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Put(eventActionsPath+"/{name}", updateEventAction) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Delete(eventActionsPath+"/{name}", deleteEventAction) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Get(eventRulesPath, getEventRules) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Get(eventRulesPath+"/{name}", getEventRuleByName) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(eventRulesPath, addEventRule) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Put(eventRulesPath+"/{name}", updateEventRule) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Delete(eventRulesPath+"/{name}", deleteEventRule) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(eventRulesPath+"/run/{name}", runOnDemandRule) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Get(rolesPath, getRoles) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(rolesPath, addRole) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Get(rolesPath+"/{name}", getRoleByName) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Put(rolesPath+"/{name}", updateRole) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Delete(rolesPath+"/{name}", deleteRole) + router.With(s.checkPerms(dataprovider.PermAdminAny), compressor.Handler).Get(ipListsPath+"/{type}", getIPListEntries) //nolint:goconst + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(ipListsPath+"/{type}", addIPListEntry) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Get(ipListsPath+"/{type}/{ipornet}", getIPListEntry) //nolint:goconst + router.With(s.checkPerms(dataprovider.PermAdminAny)).Put(ipListsPath+"/{type}/{ipornet}", updateIPListEntry) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Delete(ipListsPath+"/{type}/{ipornet}", deleteIPListEntry) }) }) - s.router.Get(userTokenPath, s.getUserToken) + // share API available to external users + s.router.Get(sharesPath+"/{id}", s.downloadFromShare) + s.router.Post(sharesPath+"/{id}", s.uploadFilesToShare) + s.router.Post(sharesPath+"/{id}/{name}", s.uploadFileToShare) + s.router.With(compressor.Handler).Get(sharesPath+"/{id}/dirs", s.readBrowsableShareContents) + s.router.Get(sharesPath+"/{id}/files", s.downloadBrowsableSharedFile) + + if !s.binding.isUserTokenEndpointDisabled() { + s.router.Get(userTokenPath, s.getUserToken) + s.router.Post(userPath+"/{username}/forgot-password", forgotUserPassword) + s.router.Post(userPath+"/{username}/reset-password", resetUserPassword) + } s.router.Group(func(router chi.Router) { - router.Use(checkAPIKeyAuth(s.tokenAuth, dataprovider.APIKeyScopeUser)) - router.Use(jwtauth.Verify(s.tokenAuth, jwtauth.TokenFromHeader)) + if !s.binding.isUserAPIKeyAuthDisabled() { + router.Use(checkAPIKeyAuth(s.tokenAuth, dataprovider.APIKeyScopeUser)) + } + router.Use(jwt.Verify(s.tokenAuth, jwt.TokenFromHeader)) router.Use(jwtAuthenticatorAPIUser) router.With(forbidAPIKeyAuthentication).Get(userLogoutPath, s.logout) @@ -1485,43 +1547,12 @@ func (s *httpdServer) initializeRouter() { if s.renderOpenAPI { s.router.Group(func(router chi.Router) { + router.Use(cleanCacheControlMiddleware) router.Use(compressor.Handler) serveStaticDir(router, webOpenAPIPath, s.openAPIPath, false) }) } } - - if s.enableWebAdmin || s.enableWebClient { - s.router.Group(func(router chi.Router) { - router.Use(compressor.Handler) - serveStaticDir(router, webStaticFilesPath, s.staticFilesPath, true) - }) - if s.binding.OIDC.isEnabled() { - s.router.Get(webOIDCRedirectPath, s.handleOIDCRedirect) - } - if s.enableWebClient { - s.router.Get(webRootPath, func(w http.ResponseWriter, r *http.Request) { - r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - s.redirectToWebPath(w, r, webClientLoginPath) - }) - s.router.Get(webBasePath, func(w http.ResponseWriter, r *http.Request) { - r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - s.redirectToWebPath(w, r, webClientLoginPath) - }) - } else { - s.router.Get(webRootPath, func(w http.ResponseWriter, r *http.Request) { - r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - s.redirectToWebPath(w, r, webAdminLoginPath) - }) - s.router.Get(webBasePath, func(w http.ResponseWriter, r *http.Request) { - r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - s.redirectToWebPath(w, r, webAdminLoginPath) - }) - } - } - - s.setupWebClientRoutes() - s.setupWebAdminRoutes() } func (s *httpdServer) setupWebClientRoutes() { @@ -1530,32 +1561,48 @@ func (s *httpdServer) setupWebClientRoutes() { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) http.Redirect(w, r, webClientLoginPath, http.StatusFound) }) + s.router.With(cleanCacheControlMiddleware).Get(path.Join(webStaticFilesPath, "branding/webclient/logo.png"), + func(w http.ResponseWriter, r *http.Request) { + r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) + renderPNGImage(w, r, dbBrandingConfig.getWebClientLogo()) + }) + s.router.With(cleanCacheControlMiddleware).Get(path.Join(webStaticFilesPath, "branding/webclient/favicon.png"), + func(w http.ResponseWriter, r *http.Request) { + r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) + renderPNGImage(w, r, dbBrandingConfig.getWebClientFavicon()) + }) s.router.Get(webClientLoginPath, s.handleClientWebLogin) if s.binding.OIDC.isEnabled() && !s.binding.isWebClientOIDCLoginDisabled() { s.router.Get(webClientOIDCLoginPath, s.handleWebClientOIDCLogin) } if !s.binding.isWebClientLoginFormDisabled() { - s.router.Post(webClientLoginPath, s.handleWebClientLoginPost) + s.router.With(jwt.Verify(s.csrfTokenAuth, jwt.TokenFromCookie)). + Post(webClientLoginPath, s.handleWebClientLoginPost) s.router.Get(webClientForgotPwdPath, s.handleWebClientForgotPwd) - s.router.Post(webClientForgotPwdPath, s.handleWebClientForgotPwdPost) - s.router.Get(webClientResetPwdPath, s.handleWebClientPasswordReset) - s.router.Post(webClientResetPwdPath, s.handleWebClientPasswordResetPost) - s.router.With(jwtauth.Verify(s.tokenAuth, jwtauth.TokenFromCookie), + s.router.With(jwt.Verify(s.csrfTokenAuth, jwt.TokenFromCookie)). + Post(webClientForgotPwdPath, s.handleWebClientForgotPwdPost) + s.router.With(jwt.Verify(s.csrfTokenAuth, jwt.TokenFromCookie)). + Get(webClientResetPwdPath, s.handleWebClientPasswordReset) + s.router.With(jwt.Verify(s.csrfTokenAuth, jwt.TokenFromCookie)). + Post(webClientResetPwdPath, s.handleWebClientPasswordResetPost) + s.router.With(jwt.Verify(s.tokenAuth, jwt.TokenFromCookie), s.jwtAuthenticatorPartial(tokenAudienceWebClientPartial)). Get(webClientTwoFactorPath, s.handleWebClientTwoFactor) - s.router.With(jwtauth.Verify(s.tokenAuth, jwtauth.TokenFromCookie), + s.router.With(jwt.Verify(s.tokenAuth, jwt.TokenFromCookie), s.jwtAuthenticatorPartial(tokenAudienceWebClientPartial)). Post(webClientTwoFactorPath, s.handleWebClientTwoFactorPost) - s.router.With(jwtauth.Verify(s.tokenAuth, jwtauth.TokenFromCookie), + s.router.With(jwt.Verify(s.tokenAuth, jwt.TokenFromCookie), s.jwtAuthenticatorPartial(tokenAudienceWebClientPartial)). Get(webClientTwoFactorRecoveryPath, s.handleWebClientTwoFactorRecovery) - s.router.With(jwtauth.Verify(s.tokenAuth, jwtauth.TokenFromCookie), + s.router.With(jwt.Verify(s.tokenAuth, jwt.TokenFromCookie), s.jwtAuthenticatorPartial(tokenAudienceWebClientPartial)). Post(webClientTwoFactorRecoveryPath, s.handleWebClientTwoFactorRecoveryPost) } // share routes available to external users s.router.Get(webClientPubSharesPath+"/{id}/login", s.handleClientShareLoginGet) - s.router.Post(webClientPubSharesPath+"/{id}/login", s.handleClientShareLoginPost) + s.router.With(jwt.Verify(s.csrfTokenAuth, jwt.TokenFromCookie)). + Post(webClientPubSharesPath+"/{id}/login", s.handleClientShareLoginPost) + s.router.Get(webClientPubSharesPath+"/{id}/logout", s.handleClientShareLogout) s.router.Get(webClientPubSharesPath+"/{id}", s.downloadFromShare) s.router.Post(webClientPubSharesPath+"/{id}/partial", s.handleClientSharePartialDownload) s.router.Get(webClientPubSharesPath+"/{id}/browse", s.handleShareGetFiles) @@ -1572,32 +1619,32 @@ func (s *httpdServer) setupWebClientRoutes() { if s.binding.OIDC.isEnabled() { router.Use(s.oidcTokenAuthenticator(tokenAudienceWebClient)) } - router.Use(jwtauth.Verify(s.tokenAuth, tokenFromContext, jwtauth.TokenFromCookie)) + router.Use(jwt.Verify(s.tokenAuth, oidcTokenFromContext, jwt.TokenFromCookie)) router.Use(jwtAuthenticatorWebClient) router.Get(webClientLogoutPath, s.handleWebClientLogout) router.With(s.checkAuthRequirements, s.refreshCookie).Get(webClientFilesPath, s.handleClientGetFiles) router.With(s.checkAuthRequirements, s.refreshCookie).Get(webClientViewPDFPath, s.handleClientViewPDF) router.With(s.checkAuthRequirements, s.refreshCookie).Get(webClientGetPDFPath, s.handleClientGetPDF) - router.With(s.checkAuthRequirements, s.refreshCookie, verifyCSRFHeader).Get(webClientFilePath, getUserFile) - router.With(s.checkAuthRequirements, s.refreshCookie, verifyCSRFHeader).Get(webClientTasksPath+"/{id}", + router.With(s.checkAuthRequirements, s.refreshCookie, s.verifyCSRFHeader).Get(webClientFilePath, getUserFile) + router.With(s.checkAuthRequirements, s.refreshCookie, s.verifyCSRFHeader).Get(webClientTasksPath+"/{id}", getWebTask) - router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientWriteDisabled), verifyCSRFHeader). + router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientWriteDisabled), s.verifyCSRFHeader). Post(webClientFilePath, uploadUserFile) - router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientWriteDisabled), verifyCSRFHeader). + router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientWriteDisabled), s.verifyCSRFHeader). Post(webClientExistPath, s.handleClientCheckExist) router.With(s.checkAuthRequirements, s.refreshCookie).Get(webClientEditFilePath, s.handleClientEditFile) - router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientWriteDisabled), verifyCSRFHeader). + router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientWriteDisabled), s.verifyCSRFHeader). Delete(webClientFilesPath, deleteUserFile) router.With(s.checkAuthRequirements, compressor.Handler, s.refreshCookie). Get(webClientDirsPath, s.handleClientGetDirContents) - router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientWriteDisabled), verifyCSRFHeader). + router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientWriteDisabled), s.verifyCSRFHeader). Post(webClientDirsPath, createUserDir) - router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientWriteDisabled), verifyCSRFHeader). + router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientWriteDisabled), s.verifyCSRFHeader). Delete(webClientDirsPath, taskDeleteDir) - router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientWriteDisabled), verifyCSRFHeader). + router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientWriteDisabled), s.verifyCSRFHeader). Post(webClientFileActionsPath+"/move", taskRenameFsEntry) - router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientWriteDisabled), verifyCSRFHeader). + router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientWriteDisabled), s.verifyCSRFHeader). Post(webClientFileActionsPath+"/copy", taskCopyFsEntry) router.With(s.checkAuthRequirements, s.refreshCookie). Post(webClientDownloadZipPath, s.handleWebClientDownloadZip) @@ -1613,15 +1660,15 @@ func (s *httpdServer) setupWebClientRoutes() { Get(webClientMFAPath, s.handleWebClientMFA) router.With(s.checkHTTPUserPerm(sdk.WebClientMFADisabled), s.refreshCookie). Get(webClientMFAPath+"/qrcode", getQRCode) - router.With(s.checkHTTPUserPerm(sdk.WebClientMFADisabled), verifyCSRFHeader). + router.With(s.checkHTTPUserPerm(sdk.WebClientMFADisabled), s.verifyCSRFHeader). Post(webClientTOTPGeneratePath, generateTOTPSecret) - router.With(s.checkHTTPUserPerm(sdk.WebClientMFADisabled), verifyCSRFHeader). + router.With(s.checkHTTPUserPerm(sdk.WebClientMFADisabled), s.verifyCSRFHeader). Post(webClientTOTPValidatePath, validateTOTPPasscode) - router.With(s.checkHTTPUserPerm(sdk.WebClientMFADisabled), verifyCSRFHeader). + router.With(s.checkHTTPUserPerm(sdk.WebClientMFADisabled), s.verifyCSRFHeader). Post(webClientTOTPSavePath, saveTOTPConfig) - router.With(s.checkHTTPUserPerm(sdk.WebClientMFADisabled), verifyCSRFHeader, s.refreshCookie). + router.With(s.checkHTTPUserPerm(sdk.WebClientMFADisabled), s.verifyCSRFHeader, s.refreshCookie). Get(webClientRecoveryCodesPath, getRecoveryCodes) - router.With(s.checkHTTPUserPerm(sdk.WebClientMFADisabled), verifyCSRFHeader). + router.With(s.checkHTTPUserPerm(sdk.WebClientMFADisabled), s.verifyCSRFHeader). Post(webClientRecoveryCodesPath, generateRecoveryCodes) router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientSharesDisabled), compressor.Handler, s.refreshCookie). Get(webClientSharesPath+jsonAPISuffix, getAllShares) @@ -1635,7 +1682,7 @@ func (s *httpdServer) setupWebClientRoutes() { Get(webClientSharePath+"/{id}", s.handleClientUpdateShareGet) router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientSharesDisabled)). Post(webClientSharePath+"/{id}", s.handleClientUpdateSharePost) - router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientSharesDisabled), verifyCSRFHeader). + router.With(s.checkAuthRequirements, s.checkHTTPUserPerm(sdk.WebClientSharesDisabled), s.verifyCSRFHeader). Delete(webClientSharePath+"/{id}", deleteShare) }) } @@ -1647,38 +1694,53 @@ func (s *httpdServer) setupWebAdminRoutes() { r.Body = http.MaxBytesReader(w, r.Body, maxLoginBodySize) s.redirectToWebPath(w, r, webAdminLoginPath) }) + s.router.With(cleanCacheControlMiddleware).Get(path.Join(webStaticFilesPath, "branding/webadmin/logo.png"), + func(w http.ResponseWriter, r *http.Request) { + r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) + renderPNGImage(w, r, dbBrandingConfig.getWebAdminLogo()) + }) + s.router.With(cleanCacheControlMiddleware).Get(path.Join(webStaticFilesPath, "branding/webadmin/favicon.png"), + func(w http.ResponseWriter, r *http.Request) { + r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) + renderPNGImage(w, r, dbBrandingConfig.getWebAdminFavicon()) + }) s.router.Get(webAdminLoginPath, s.handleWebAdminLogin) if s.binding.OIDC.hasRoles() && !s.binding.isWebAdminOIDCLoginDisabled() { s.router.Get(webAdminOIDCLoginPath, s.handleWebAdminOIDCLogin) } s.router.Get(webOAuth2RedirectPath, s.handleOAuth2TokenRedirect) s.router.Get(webAdminSetupPath, s.handleWebAdminSetupGet) - s.router.Post(webAdminSetupPath, s.handleWebAdminSetupPost) + s.router.With(jwt.Verify(s.csrfTokenAuth, jwt.TokenFromCookie)). + Post(webAdminSetupPath, s.handleWebAdminSetupPost) if !s.binding.isWebAdminLoginFormDisabled() { - s.router.Post(webAdminLoginPath, s.handleWebAdminLoginPost) - s.router.With(jwtauth.Verify(s.tokenAuth, jwtauth.TokenFromCookie), + s.router.With(jwt.Verify(s.csrfTokenAuth, jwt.TokenFromCookie)). + Post(webAdminLoginPath, s.handleWebAdminLoginPost) + s.router.With(jwt.Verify(s.tokenAuth, jwt.TokenFromCookie), s.jwtAuthenticatorPartial(tokenAudienceWebAdminPartial)). Get(webAdminTwoFactorPath, s.handleWebAdminTwoFactor) - s.router.With(jwtauth.Verify(s.tokenAuth, jwtauth.TokenFromCookie), + s.router.With(jwt.Verify(s.tokenAuth, jwt.TokenFromCookie), s.jwtAuthenticatorPartial(tokenAudienceWebAdminPartial)). Post(webAdminTwoFactorPath, s.handleWebAdminTwoFactorPost) - s.router.With(jwtauth.Verify(s.tokenAuth, jwtauth.TokenFromCookie), + s.router.With(jwt.Verify(s.tokenAuth, jwt.TokenFromCookie), s.jwtAuthenticatorPartial(tokenAudienceWebAdminPartial)). Get(webAdminTwoFactorRecoveryPath, s.handleWebAdminTwoFactorRecovery) - s.router.With(jwtauth.Verify(s.tokenAuth, jwtauth.TokenFromCookie), + s.router.With(jwt.Verify(s.tokenAuth, jwt.TokenFromCookie), s.jwtAuthenticatorPartial(tokenAudienceWebAdminPartial)). Post(webAdminTwoFactorRecoveryPath, s.handleWebAdminTwoFactorRecoveryPost) s.router.Get(webAdminForgotPwdPath, s.handleWebAdminForgotPwd) - s.router.Post(webAdminForgotPwdPath, s.handleWebAdminForgotPwdPost) - s.router.Get(webAdminResetPwdPath, s.handleWebAdminPasswordReset) - s.router.Post(webAdminResetPwdPath, s.handleWebAdminPasswordResetPost) + s.router.With(jwt.Verify(s.csrfTokenAuth, jwt.TokenFromCookie)). + Post(webAdminForgotPwdPath, s.handleWebAdminForgotPwdPost) + s.router.With(jwt.Verify(s.csrfTokenAuth, jwt.TokenFromCookie)). + Get(webAdminResetPwdPath, s.handleWebAdminPasswordReset) + s.router.With(jwt.Verify(s.csrfTokenAuth, jwt.TokenFromCookie)). + Post(webAdminResetPwdPath, s.handleWebAdminPasswordResetPost) } s.router.Group(func(router chi.Router) { if s.binding.OIDC.isEnabled() { router.Use(s.oidcTokenAuthenticator(tokenAudienceWebAdmin)) } - router.Use(jwtauth.Verify(s.tokenAuth, tokenFromContext, jwtauth.TokenFromCookie)) + router.Use(jwt.Verify(s.tokenAuth, oidcTokenFromContext, jwt.TokenFromCookie)) router.Use(jwtAuthenticatorWebAdmin) router.Get(webLogoutPath, s.handleWebAdminLogout) @@ -1690,167 +1752,168 @@ func (s *httpdServer) setupWebAdminRoutes() { router.With(s.refreshCookie, s.requireBuiltinLogin).Get(webAdminMFAPath, s.handleWebAdminMFA) router.With(s.refreshCookie, s.requireBuiltinLogin).Get(webAdminMFAPath+"/qrcode", getQRCode) - router.With(verifyCSRFHeader, s.requireBuiltinLogin).Post(webAdminTOTPGeneratePath, generateTOTPSecret) - router.With(verifyCSRFHeader, s.requireBuiltinLogin).Post(webAdminTOTPValidatePath, validateTOTPPasscode) - router.With(verifyCSRFHeader, s.requireBuiltinLogin).Post(webAdminTOTPSavePath, saveTOTPConfig) - router.With(verifyCSRFHeader, s.requireBuiltinLogin, s.refreshCookie).Get(webAdminRecoveryCodesPath, + router.With(s.verifyCSRFHeader, s.requireBuiltinLogin).Post(webAdminTOTPGeneratePath, generateTOTPSecret) + router.With(s.verifyCSRFHeader, s.requireBuiltinLogin).Post(webAdminTOTPValidatePath, validateTOTPPasscode) + router.With(s.verifyCSRFHeader, s.requireBuiltinLogin).Post(webAdminTOTPSavePath, saveTOTPConfig) + router.With(s.verifyCSRFHeader, s.requireBuiltinLogin, s.refreshCookie).Get(webAdminRecoveryCodesPath, getRecoveryCodes) - router.With(verifyCSRFHeader, s.requireBuiltinLogin).Post(webAdminRecoveryCodesPath, generateRecoveryCodes) + router.With(s.verifyCSRFHeader, s.requireBuiltinLogin).Post(webAdminRecoveryCodesPath, generateRecoveryCodes) router.Group(func(router chi.Router) { router.Use(s.checkAuthRequirements) - router.With(s.checkPerm(dataprovider.PermAdminViewUsers), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminViewUsers), s.refreshCookie). Get(webUsersPath, s.handleGetWebUsers) - router.With(s.checkPerm(dataprovider.PermAdminViewUsers), compressor.Handler, s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminViewUsers), compressor.Handler, s.refreshCookie). Get(webUsersPath+jsonAPISuffix, getAllUsers) - router.With(s.checkPerm(dataprovider.PermAdminAddUsers), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAddUsers), s.refreshCookie). Get(webUserPath, s.handleWebAddUserGet) - router.With(s.checkPerm(dataprovider.PermAdminChangeUsers), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminChangeUsers), s.refreshCookie). Get(webUserPath+"/{username}", s.handleWebUpdateUserGet) - router.With(s.checkPerm(dataprovider.PermAdminAddUsers)).Post(webUserPath, s.handleWebAddUserPost) - router.With(s.checkPerm(dataprovider.PermAdminChangeUsers)).Post(webUserPath+"/{username}", + router.With(s.checkPerms(dataprovider.PermAdminAddUsers)).Post(webUserPath, s.handleWebAddUserPost) + router.With(s.checkPerms(dataprovider.PermAdminChangeUsers)).Post(webUserPath+"/{username}", s.handleWebUpdateUserPost) - router.With(s.checkPerm(dataprovider.PermAdminManageGroups), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminManageGroups), s.refreshCookie). Get(webGroupsPath, s.handleWebGetGroups) - router.With(s.checkPerm(dataprovider.PermAdminManageGroups), compressor.Handler, s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminManageGroups), compressor.Handler, s.refreshCookie). Get(webGroupsPath+jsonAPISuffix, getAllGroups) - router.With(s.checkPerm(dataprovider.PermAdminManageGroups), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminManageGroups), s.refreshCookie). Get(webGroupPath, s.handleWebAddGroupGet) - router.With(s.checkPerm(dataprovider.PermAdminManageGroups)).Post(webGroupPath, s.handleWebAddGroupPost) - router.With(s.checkPerm(dataprovider.PermAdminManageGroups), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminManageGroups)).Post(webGroupPath, s.handleWebAddGroupPost) + router.With(s.checkPerms(dataprovider.PermAdminManageGroups), s.refreshCookie). Get(webGroupPath+"/{name}", s.handleWebUpdateGroupGet) - router.With(s.checkPerm(dataprovider.PermAdminManageGroups)).Post(webGroupPath+"/{name}", + router.With(s.checkPerms(dataprovider.PermAdminManageGroups)).Post(webGroupPath+"/{name}", s.handleWebUpdateGroupPost) - router.With(s.checkPerm(dataprovider.PermAdminManageGroups), verifyCSRFHeader). + router.With(s.checkPerms(dataprovider.PermAdminManageGroups), s.verifyCSRFHeader). Delete(webGroupPath+"/{name}", deleteGroup) - router.With(s.checkPerm(dataprovider.PermAdminViewConnections), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminViewConnections), s.refreshCookie). Get(webConnectionsPath, s.handleWebGetConnections) - router.With(s.checkPerm(dataprovider.PermAdminViewConnections), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminViewConnections), s.refreshCookie). Get(webConnectionsPath+jsonAPISuffix, getActiveConnections) - router.With(s.checkPerm(dataprovider.PermAdminManageFolders), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminManageFolders), s.refreshCookie). Get(webFoldersPath, s.handleWebGetFolders) - router.With(s.checkPerm(dataprovider.PermAdminManageFolders), compressor.Handler, s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminManageFolders), compressor.Handler, s.refreshCookie). Get(webFoldersPath+jsonAPISuffix, getAllFolders) - router.With(s.checkPerm(dataprovider.PermAdminManageFolders), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminManageFolders), s.refreshCookie). Get(webFolderPath, s.handleWebAddFolderGet) - router.With(s.checkPerm(dataprovider.PermAdminManageFolders)).Post(webFolderPath, s.handleWebAddFolderPost) - router.With(s.checkPerm(dataprovider.PermAdminViewServerStatus), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminManageFolders)).Post(webFolderPath, s.handleWebAddFolderPost) + router.With(s.checkPerms(dataprovider.PermAdminViewServerStatus), s.refreshCookie). Get(webStatusPath, s.handleWebGetStatus) - router.With(s.checkPerm(dataprovider.PermAdminManageAdmins), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.refreshCookie). Get(webAdminsPath, s.handleGetWebAdmins) - router.With(s.checkPerm(dataprovider.PermAdminManageAdmins), compressor.Handler, s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny), compressor.Handler, s.refreshCookie). Get(webAdminsPath+jsonAPISuffix, getAllAdmins) - router.With(s.checkPerm(dataprovider.PermAdminManageAdmins), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.refreshCookie). Get(webAdminPath, s.handleWebAddAdminGet) - router.With(s.checkPerm(dataprovider.PermAdminManageAdmins), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.refreshCookie). Get(webAdminPath+"/{username}", s.handleWebUpdateAdminGet) - router.With(s.checkPerm(dataprovider.PermAdminManageAdmins)).Post(webAdminPath, s.handleWebAddAdminPost) - router.With(s.checkPerm(dataprovider.PermAdminManageAdmins)).Post(webAdminPath+"/{username}", + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(webAdminPath, s.handleWebAddAdminPost) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(webAdminPath+"/{username}", s.handleWebUpdateAdminPost) - router.With(s.checkPerm(dataprovider.PermAdminManageAdmins), verifyCSRFHeader). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.verifyCSRFHeader). Delete(webAdminPath+"/{username}", deleteAdmin) - router.With(s.checkPerm(dataprovider.PermAdminDisableMFA), verifyCSRFHeader). + router.With(s.checkPerms(dataprovider.PermAdminDisableMFA), s.verifyCSRFHeader). Put(webAdminPath+"/{username}/2fa/disable", disableAdmin2FA) - router.With(s.checkPerm(dataprovider.PermAdminCloseConnections), verifyCSRFHeader). + router.With(s.checkPerms(dataprovider.PermAdminCloseConnections), s.verifyCSRFHeader). Delete(webConnectionsPath+"/{connectionID}", handleCloseConnection) - router.With(s.checkPerm(dataprovider.PermAdminManageFolders), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminManageFolders), s.refreshCookie). Get(webFolderPath+"/{name}", s.handleWebUpdateFolderGet) - router.With(s.checkPerm(dataprovider.PermAdminManageFolders)).Post(webFolderPath+"/{name}", + router.With(s.checkPerms(dataprovider.PermAdminManageFolders)).Post(webFolderPath+"/{name}", s.handleWebUpdateFolderPost) - router.With(s.checkPerm(dataprovider.PermAdminManageFolders), verifyCSRFHeader). + router.With(s.checkPerms(dataprovider.PermAdminManageFolders), s.verifyCSRFHeader). Delete(webFolderPath+"/{name}", deleteFolder) - router.With(s.checkPerm(dataprovider.PermAdminQuotaScans), verifyCSRFHeader). + router.With(s.checkPerms(dataprovider.PermAdminQuotaScans), s.verifyCSRFHeader). Post(webScanVFolderPath+"/{name}", startFolderQuotaScan) - router.With(s.checkPerm(dataprovider.PermAdminDeleteUsers), verifyCSRFHeader). + router.With(s.checkPerms(dataprovider.PermAdminDeleteUsers), s.verifyCSRFHeader). Delete(webUserPath+"/{username}", deleteUser) - router.With(s.checkPerm(dataprovider.PermAdminDisableMFA), verifyCSRFHeader). + router.With(s.checkPerms(dataprovider.PermAdminDisableMFA), s.verifyCSRFHeader). Put(webUserPath+"/{username}/2fa/disable", disableUser2FA) - router.With(s.checkPerm(dataprovider.PermAdminQuotaScans), verifyCSRFHeader). + router.With(s.checkPerms(dataprovider.PermAdminQuotaScans), s.verifyCSRFHeader). Post(webQuotaScanPath+"/{username}", startUserQuotaScan) - router.With(s.checkPerm(dataprovider.PermAdminManageSystem)).Get(webMaintenancePath, s.handleWebMaintenance) - router.With(s.checkPerm(dataprovider.PermAdminManageSystem)).Get(webBackupPath, dumpData) - router.With(s.checkPerm(dataprovider.PermAdminManageSystem)).Post(webRestorePath, s.handleWebRestore) - router.With(s.checkPerm(dataprovider.PermAdminManageSystem), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny)).Get(webMaintenancePath, s.handleWebMaintenance) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Get(webBackupPath, dumpData) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(webRestorePath, s.handleWebRestore) + router.With(s.checkPerms(dataprovider.PermAdminAddUsers, dataprovider.PermAdminChangeUsers), s.refreshCookie). Get(webTemplateUser, s.handleWebTemplateUserGet) - router.With(s.checkPerm(dataprovider.PermAdminManageSystem)).Post(webTemplateUser, s.handleWebTemplateUserPost) - router.With(s.checkPerm(dataprovider.PermAdminManageSystem), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAddUsers, dataprovider.PermAdminChangeUsers)). + Post(webTemplateUser, s.handleWebTemplateUserPost) + router.With(s.checkPerms(dataprovider.PermAdminManageFolders), s.refreshCookie). Get(webTemplateFolder, s.handleWebTemplateFolderGet) - router.With(s.checkPerm(dataprovider.PermAdminManageSystem)).Post(webTemplateFolder, s.handleWebTemplateFolderPost) - router.With(s.checkPerm(dataprovider.PermAdminViewDefender)).Get(webDefenderPath, s.handleWebDefenderPage) - router.With(s.checkPerm(dataprovider.PermAdminViewDefender)).Get(webDefenderHostsPath, getDefenderHosts) - router.With(s.checkPerm(dataprovider.PermAdminManageDefender)).Delete(webDefenderHostsPath+"/{id}", - deleteDefenderHostByID) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules), compressor.Handler, s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminManageFolders)).Post(webTemplateFolder, s.handleWebTemplateFolderPost) + router.With(s.checkPerms(dataprovider.PermAdminViewDefender)).Get(webDefenderPath, s.handleWebDefenderPage) + router.With(s.checkPerms(dataprovider.PermAdminViewDefender)).Get(webDefenderHostsPath, getDefenderHosts) + router.With(s.checkPerms(dataprovider.PermAdminManageDefender), s.verifyCSRFHeader). + Delete(webDefenderHostsPath+"/{id}", deleteDefenderHostByID) + router.With(s.checkPerms(dataprovider.PermAdminAny), compressor.Handler, s.refreshCookie). Get(webAdminEventActionsPath+jsonAPISuffix, getAllActions) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.refreshCookie). Get(webAdminEventActionsPath, s.handleWebGetEventActions) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.refreshCookie). Get(webAdminEventActionPath, s.handleWebAddEventActionGet) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules)).Post(webAdminEventActionPath, + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(webAdminEventActionPath, s.handleWebAddEventActionPost) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.refreshCookie). Get(webAdminEventActionPath+"/{name}", s.handleWebUpdateEventActionGet) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules)).Post(webAdminEventActionPath+"/{name}", + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(webAdminEventActionPath+"/{name}", s.handleWebUpdateEventActionPost) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules), verifyCSRFHeader). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.verifyCSRFHeader). Delete(webAdminEventActionPath+"/{name}", deleteEventAction) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules), compressor.Handler, s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny), compressor.Handler, s.refreshCookie). Get(webAdminEventRulesPath+jsonAPISuffix, getAllRules) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.refreshCookie). Get(webAdminEventRulesPath, s.handleWebGetEventRules) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.refreshCookie). Get(webAdminEventRulePath, s.handleWebAddEventRuleGet) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules)).Post(webAdminEventRulePath, + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(webAdminEventRulePath, s.handleWebAddEventRulePost) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.refreshCookie). Get(webAdminEventRulePath+"/{name}", s.handleWebUpdateEventRuleGet) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules)).Post(webAdminEventRulePath+"/{name}", + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(webAdminEventRulePath+"/{name}", s.handleWebUpdateEventRulePost) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules), verifyCSRFHeader). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.verifyCSRFHeader). Delete(webAdminEventRulePath+"/{name}", deleteEventRule) - router.With(s.checkPerm(dataprovider.PermAdminManageEventRules), verifyCSRFHeader). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.verifyCSRFHeader). Post(webAdminEventRulePath+"/run/{name}", runOnDemandRule) - router.With(s.checkPerm(dataprovider.PermAdminManageRoles), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.refreshCookie). Get(webAdminRolesPath, s.handleWebGetRoles) - router.With(s.checkPerm(dataprovider.PermAdminManageRoles), compressor.Handler, s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny), compressor.Handler, s.refreshCookie). Get(webAdminRolesPath+jsonAPISuffix, getAllRoles) - router.With(s.checkPerm(dataprovider.PermAdminManageRoles), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.refreshCookie). Get(webAdminRolePath, s.handleWebAddRoleGet) - router.With(s.checkPerm(dataprovider.PermAdminManageRoles)).Post(webAdminRolePath, s.handleWebAddRolePost) - router.With(s.checkPerm(dataprovider.PermAdminManageRoles), s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(webAdminRolePath, s.handleWebAddRolePost) + router.With(s.checkPerms(dataprovider.PermAdminAny), s.refreshCookie). Get(webAdminRolePath+"/{name}", s.handleWebUpdateRoleGet) - router.With(s.checkPerm(dataprovider.PermAdminManageRoles)).Post(webAdminRolePath+"/{name}", + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(webAdminRolePath+"/{name}", s.handleWebUpdateRolePost) - router.With(s.checkPerm(dataprovider.PermAdminManageRoles), verifyCSRFHeader). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.verifyCSRFHeader). Delete(webAdminRolePath+"/{name}", deleteRole) - router.With(s.checkPerm(dataprovider.PermAdminViewEvents), s.refreshCookie).Get(webEventsPath, + router.With(s.checkPerms(dataprovider.PermAdminViewEvents), s.refreshCookie).Get(webEventsPath, s.handleWebGetEvents) - router.With(s.checkPerm(dataprovider.PermAdminViewEvents), compressor.Handler, s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminViewEvents), compressor.Handler, s.refreshCookie). Get(webEventsFsSearchPath, searchFsEvents) - router.With(s.checkPerm(dataprovider.PermAdminViewEvents), compressor.Handler, s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminViewEvents), compressor.Handler, s.refreshCookie). Get(webEventsProviderSearchPath, searchProviderEvents) - router.With(s.checkPerm(dataprovider.PermAdminViewEvents), compressor.Handler, s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminViewEvents), compressor.Handler, s.refreshCookie). Get(webEventsLogSearchPath, searchLogEvents) - router.With(s.checkPerm(dataprovider.PermAdminManageIPLists)).Get(webIPListsPath, s.handleWebIPListsPage) - router.With(s.checkPerm(dataprovider.PermAdminManageIPLists), compressor.Handler, s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny)).Get(webIPListsPath, s.handleWebIPListsPage) + router.With(s.checkPerms(dataprovider.PermAdminAny), compressor.Handler, s.refreshCookie). Get(webIPListsPath+"/{type}", getIPListEntries) - router.With(s.checkPerm(dataprovider.PermAdminManageIPLists), s.refreshCookie).Get(webIPListPath+"/{type}", + router.With(s.checkPerms(dataprovider.PermAdminAny), s.refreshCookie).Get(webIPListPath+"/{type}", s.handleWebAddIPListEntryGet) - router.With(s.checkPerm(dataprovider.PermAdminManageIPLists)).Post(webIPListPath+"/{type}", + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(webIPListPath+"/{type}", s.handleWebAddIPListEntryPost) - router.With(s.checkPerm(dataprovider.PermAdminManageIPLists), s.refreshCookie).Get(webIPListPath+"/{type}/{ipornet}", + router.With(s.checkPerms(dataprovider.PermAdminAny), s.refreshCookie).Get(webIPListPath+"/{type}/{ipornet}", s.handleWebUpdateIPListEntryGet) - router.With(s.checkPerm(dataprovider.PermAdminManageIPLists)).Post(webIPListPath+"/{type}/{ipornet}", + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(webIPListPath+"/{type}/{ipornet}", s.handleWebUpdateIPListEntryPost) - router.With(s.checkPerm(dataprovider.PermAdminManageIPLists), verifyCSRFHeader). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.verifyCSRFHeader). Delete(webIPListPath+"/{type}/{ipornet}", deleteIPListEntry) - router.With(s.checkPerm(dataprovider.PermAdminManageSystem), s.refreshCookie).Get(webConfigsPath, s.handleWebConfigs) - router.With(s.checkPerm(dataprovider.PermAdminManageSystem)).Post(webConfigsPath, s.handleWebConfigsPost) - router.With(s.checkPerm(dataprovider.PermAdminManageSystem), verifyCSRFHeader, s.refreshCookie). + router.With(s.checkPerms(dataprovider.PermAdminAny), s.refreshCookie).Get(webConfigsPath, s.handleWebConfigs) + router.With(s.checkPerms(dataprovider.PermAdminAny)).Post(webConfigsPath, s.handleWebConfigsPost) + router.With(s.checkPerms(dataprovider.PermAdminAny), s.verifyCSRFHeader, s.refreshCookie). Post(webConfigsPath+"/smtp/test", testSMTPConfig) - router.With(s.checkPerm(dataprovider.PermAdminManageSystem), verifyCSRFHeader, s.refreshCookie). - Post(webOAuth2TokenPath, handleSMTPOAuth2TokenRequestPost) + router.With(s.checkPerms(dataprovider.PermAdminAny), s.verifyCSRFHeader, s.refreshCookie). + Post(webOAuth2TokenPath, s.handleSMTPOAuth2TokenRequestPost) }) }) } diff --git a/internal/httpd/token.go b/internal/httpd/token.go index 93413281..4a0f9873 100644 --- a/internal/httpd/token.go +++ b/internal/httpd/token.go @@ -86,7 +86,7 @@ func (m *dbTokenManager) Add(token string, expiresAt time.Time) { func (m *dbTokenManager) Get(token string) bool { key := m.getKey(token) - _, err := dataprovider.GetSharedSession(key) + _, err := dataprovider.GetSharedSession(key, dataprovider.SessionTypeInvalidToken) return err == nil } diff --git a/internal/httpd/web.go b/internal/httpd/web.go index d4bc68f5..da7e7542 100644 --- a/internal/httpd/web.go +++ b/internal/httpd/web.go @@ -27,23 +27,20 @@ import ( ) const ( - pageMFATitle = "Two-factor authentication" - pageTwoFactorTitle = "Two-Factor authentication" - pageTwoFactorRecoveryTitle = "Two-Factor recovery" - webDateTimeFormat = "2006-01-02 15:04:05" // YYYY-MM-DD HH:MM:SS - redactedSecret = "[**redacted**]" - csrfFormToken = "_form_token" - csrfHeaderToken = "X-CSRF-TOKEN" - templateCommonDir = "common" - templateTwoFactor = "twofactor.html" - templateTwoFactorRecovery = "twofactor-recovery.html" - templateForgotPassword = "forgot-password.html" - templateResetPassword = "reset-password.html" - templateChangePwd = "changepassword.html" - templateMessage = "message.html" - templateCommonBase = "base.html" - templateCommonBaseLogin = "baselogin.html" - templateCommonLogin = "login.html" + webDateTimeFormat = "2006-01-02 15:04:05" // YYYY-MM-DD HH:MM:SS + redactedSecret = "[**redacted**]" + csrfFormToken = "_form_token" + csrfHeaderToken = "X-CSRF-TOKEN" + templateCommonDir = "common" + templateTwoFactor = "twofactor.html" + templateTwoFactorRecovery = "twofactor-recovery.html" + templateForgotPassword = "forgot-password.html" + templateResetPassword = "reset-password.html" + templateChangePwd = "changepassword.html" + templateMessage = "message.html" + templateCommonBase = "base.html" + templateCommonBaseLogin = "baselogin.html" + templateCommonLogin = "login.html" ) var ( @@ -67,43 +64,50 @@ type loginPage struct { OpenIDLoginURL string Title string Branding UIBranding + Languages []string FormDisabled bool CheckRedirect bool } type twoFactorPage struct { commonBasePage - CurrentURL string - Error *util.I18nError - CSRFToken string - RecoveryURL string - Title string - Branding UIBranding + CurrentURL string + Error *util.I18nError + CSRFToken string + RecoveryURL string + Title string + Branding UIBranding + Languages []string + CheckRedirect bool } type forgotPwdPage struct { commonBasePage - CurrentURL string - Error *util.I18nError - CSRFToken string - LoginURL string - Title string - Branding UIBranding + CurrentURL string + Error *util.I18nError + CSRFToken string + LoginURL string + Title string + Branding UIBranding + Languages []string + CheckRedirect bool } type resetPwdPage struct { commonBasePage - CurrentURL string - Error *util.I18nError - CSRFToken string - LoginURL string - Title string - Branding UIBranding + CurrentURL string + Error *util.I18nError + CSRFToken string + LoginURL string + Title string + Branding UIBranding + Languages []string + CheckRedirect bool } func getSliceFromDelimitedValues(values, delimiter string) []string { result := []string{} - for _, v := range strings.Split(values, delimiter) { + for v := range strings.SplitSeq(values, delimiter) { cleaned := strings.TrimSpace(v) if cleaned != "" { result = append(result, cleaned) diff --git a/internal/httpd/webadmin.go b/internal/httpd/webadmin.go index f8ffa63f..a565c05e 100644 --- a/internal/httpd/webadmin.go +++ b/internal/httpd/webadmin.go @@ -16,6 +16,7 @@ package httpd import ( "context" + "crypto/rand" "encoding/json" "errors" "fmt" @@ -25,18 +26,21 @@ import ( "net/url" "os" "path/filepath" + "slices" "sort" "strconv" "strings" "time" - "github.com/go-chi/render" "github.com/sftpgo/sdk" sdkkms "github.com/sftpgo/sdk/kms" + "golang.org/x/oauth2" "github.com/drakkan/sftpgo/v2/internal/acme" "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/ftpd" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/kms" "github.com/drakkan/sftpgo/v2/internal/logger" "github.com/drakkan/sftpgo/v2/internal/mfa" @@ -44,6 +48,7 @@ import ( "github.com/drakkan/sftpgo/v2/internal/smtp" "github.com/drakkan/sftpgo/v2/internal/util" "github.com/drakkan/sftpgo/v2/internal/vfs" + "github.com/drakkan/sftpgo/v2/internal/webdavd" ) type userPageMode int @@ -70,37 +75,36 @@ const ( ) const ( - templateAdminDir = "webadmin" - templateBase = "base.html" - templateFsConfig = "fsconfig.html" - templateSharedComponents = "sharedcomponents.html" - templateUsers = "users.html" - templateUser = "user.html" - templateAdmins = "admins.html" - templateAdmin = "admin.html" - templateConnections = "connections.html" - templateGroups = "groups.html" - templateGroup = "group.html" - templateFolders = "folders.html" - templateFolder = "folder.html" - templateEventRules = "eventrules.html" - templateEventRule = "eventrule.html" - templateEventActions = "eventactions.html" - templateEventAction = "eventaction.html" - templateRoles = "roles.html" - templateRole = "role.html" - templateEvents = "events.html" - templateStatus = "status.html" - templateDefender = "defender.html" - templateIPLists = "iplists.html" - templateIPList = "iplist.html" - templateConfigs = "configs.html" - templateProfile = "profile.html" - templateMaintenance = "maintenance.html" - templateMFA = "mfa.html" - templateSetup = "adminsetup.html" - defaultQueryLimit = 1000 - inversePatternType = "inverse" + templateAdminDir = "webadmin" + templateBase = "base.html" + templateFsConfig = "fsconfig.html" + templateUsers = "users.html" + templateUser = "user.html" + templateAdmins = "admins.html" + templateAdmin = "admin.html" + templateConnections = "connections.html" + templateGroups = "groups.html" + templateGroup = "group.html" + templateFolders = "folders.html" + templateFolder = "folder.html" + templateEventRules = "eventrules.html" + templateEventRule = "eventrule.html" + templateEventActions = "eventactions.html" + templateEventAction = "eventaction.html" + templateRoles = "roles.html" + templateRole = "role.html" + templateEvents = "events.html" + templateStatus = "status.html" + templateDefender = "defender.html" + templateIPLists = "iplists.html" + templateIPList = "iplist.html" + templateConfigs = "configs.html" + templateProfile = "profile.html" + templateMaintenance = "maintenance.html" + templateMFA = "mfa.html" + templateSetup = "adminsetup.html" + defaultQueryLimit = 1000 + inversePatternType = "inverse" ) var ( @@ -150,7 +154,9 @@ type basePage struct { HasSearcher bool HasExternalLogin bool LoggedUser *dataprovider.Admin + IsLoggedToShare bool Branding UIBranding + Languages []string } type statusPage struct { @@ -184,6 +190,7 @@ type userPage struct { Roles []dataprovider.Role CanImpersonate bool FsWrapper fsWrapper + CanUseTLSCerts bool } type adminPage struct { @@ -257,6 +264,8 @@ type setupPage struct { HideSupportLink bool Title string Branding UIBranding + Languages []string + CheckRedirect bool } type folderPage struct { @@ -290,13 +299,14 @@ type rolePage struct { type eventActionPage struct { basePage - Action dataprovider.BaseEventAction - ActionTypes []dataprovider.EnumMapping - FsActions []dataprovider.EnumMapping - HTTPMethods []string - RedactedSecret string - Error *util.I18nError - Mode genericPageMode + Action dataprovider.BaseEventAction + ActionTypes []dataprovider.EnumMapping + FsActions []dataprovider.EnumMapping + HTTPMethods []string + EnabledCommands []string + RedactedSecret string + Error *util.I18nError + Mode genericPageMode } type eventRulePage struct { @@ -327,6 +337,7 @@ type configsPage struct { RedactedSecret string OAuth2TokenURL string OAuth2RedirectURL string + WebClientBranding UIBranding Error *util.I18nError } @@ -338,9 +349,10 @@ type messagePage struct { } type userTemplateFields struct { - Username string - Password string - PublicKeys []string + Username string + Password string + PublicKeys []string + RequirePwdChange bool } func loadAdminTemplates(templatesPath string) { @@ -612,10 +624,10 @@ func isServerManagerResource(currentURL string) bool { currentURL == webConfigsPath } -func (s *httpdServer) getBasePageData(title, currentURL string, r *http.Request) basePage { +func (s *httpdServer) getBasePageData(title, currentURL string, w http.ResponseWriter, r *http.Request) basePage { var csrfToken string if currentURL != "" { - csrfToken = createCSRFToken(util.GetIPFromRemoteAddress(r.RemoteAddr)) + csrfToken = createCSRFToken(w, r, s.csrfTokenAuth, "", webBaseAdminPath) } return basePage{ commonBasePage: getCommonBasePage(r), @@ -660,7 +672,8 @@ func (s *httpdServer) getBasePageData(title, currentURL string, r *http.Request) HasSearcher: plugin.Handler.HasSearcher(), HasExternalLogin: isLoggedInWithOIDC(r), CSRFToken: csrfToken, - Branding: s.binding.Branding.WebAdmin, + Branding: s.binding.webAdminBranding(), + Languages: s.binding.languages(), } } @@ -675,7 +688,7 @@ func (s *httpdServer) renderMessagePageWithString(w http.ResponseWriter, r *http err error, message, text string, ) { data := messagePage{ - basePage: s.getBasePageData(title, "", r), + basePage: s.getBasePageData(title, "", w, r), Error: getI18nError(err), Success: message, Text: text, @@ -710,60 +723,64 @@ func (s *httpdServer) renderNotFoundPage(w http.ResponseWriter, r *http.Request, util.NewI18nError(err, util.I18nError404Message), "") } -func (s *httpdServer) renderForgotPwdPage(w http.ResponseWriter, r *http.Request, err *util.I18nError, ip string) { +func (s *httpdServer) renderForgotPwdPage(w http.ResponseWriter, r *http.Request, err *util.I18nError) { data := forgotPwdPage{ commonBasePage: getCommonBasePage(r), CurrentURL: webAdminForgotPwdPath, Error: err, - CSRFToken: createCSRFToken(ip), + CSRFToken: createCSRFToken(w, r, s.csrfTokenAuth, rand.Text(), webBaseAdminPath), LoginURL: webAdminLoginPath, Title: util.I18nForgotPwdTitle, - Branding: s.binding.Branding.WebAdmin, + Branding: s.binding.webAdminBranding(), + Languages: s.binding.languages(), } renderAdminTemplate(w, templateForgotPassword, data) } -func (s *httpdServer) renderResetPwdPage(w http.ResponseWriter, r *http.Request, err *util.I18nError, ip string) { +func (s *httpdServer) renderResetPwdPage(w http.ResponseWriter, r *http.Request, err *util.I18nError) { data := resetPwdPage{ commonBasePage: getCommonBasePage(r), CurrentURL: webAdminResetPwdPath, Error: err, - CSRFToken: createCSRFToken(ip), + CSRFToken: createCSRFToken(w, r, s.csrfTokenAuth, "", webBaseAdminPath), LoginURL: webAdminLoginPath, Title: util.I18nResetPwdTitle, - Branding: s.binding.Branding.WebAdmin, + Branding: s.binding.webAdminBranding(), + Languages: s.binding.languages(), } renderAdminTemplate(w, templateResetPassword, data) } -func (s *httpdServer) renderTwoFactorPage(w http.ResponseWriter, r *http.Request, err *util.I18nError, ip string) { +func (s *httpdServer) renderTwoFactorPage(w http.ResponseWriter, r *http.Request, err *util.I18nError) { data := twoFactorPage{ commonBasePage: getCommonBasePage(r), - Title: pageTwoFactorTitle, + Title: util.I18n2FATitle, CurrentURL: webAdminTwoFactorPath, Error: err, - CSRFToken: createCSRFToken(ip), + CSRFToken: createCSRFToken(w, r, s.csrfTokenAuth, "", webBaseAdminPath), RecoveryURL: webAdminTwoFactorRecoveryPath, - Branding: s.binding.Branding.WebAdmin, + Branding: s.binding.webAdminBranding(), + Languages: s.binding.languages(), } renderAdminTemplate(w, templateTwoFactor, data) } -func (s *httpdServer) renderTwoFactorRecoveryPage(w http.ResponseWriter, r *http.Request, err *util.I18nError, ip string) { +func (s *httpdServer) renderTwoFactorRecoveryPage(w http.ResponseWriter, r *http.Request, err *util.I18nError) { data := twoFactorPage{ commonBasePage: getCommonBasePage(r), - Title: pageTwoFactorRecoveryTitle, + Title: util.I18n2FATitle, CurrentURL: webAdminTwoFactorRecoveryPath, Error: err, - CSRFToken: createCSRFToken(ip), - Branding: s.binding.Branding.WebAdmin, + CSRFToken: createCSRFToken(w, r, s.csrfTokenAuth, "", webBaseAdminPath), + Branding: s.binding.webAdminBranding(), + Languages: s.binding.languages(), } renderAdminTemplate(w, templateTwoFactorRecovery, data) } func (s *httpdServer) renderMFAPage(w http.ResponseWriter, r *http.Request) { data := mfaPage{ - basePage: s.getBasePageData(pageMFATitle, webAdminMFAPath, r), + basePage: s.getBasePageData(util.I18n2FATitle, webAdminMFAPath, w, r), TOTPConfigs: mfa.GetAvailableTOTPConfigNames(), GenerateTOTPURL: webAdminTOTPGeneratePath, ValidateTOTPURL: webAdminTOTPValidatePath, @@ -782,7 +799,7 @@ func (s *httpdServer) renderMFAPage(w http.ResponseWriter, r *http.Request) { func (s *httpdServer) renderProfilePage(w http.ResponseWriter, r *http.Request, err error) { data := profilePage{ - basePage: s.getBasePageData(util.I18nProfileTitle, webAdminProfilePath, r), + basePage: s.getBasePageData(util.I18nProfileTitle, webAdminProfilePath, w, r), Error: getI18nError(err), } admin, err := dataprovider.AdminExists(data.LoggedUser.Username) @@ -799,7 +816,7 @@ func (s *httpdServer) renderProfilePage(w http.ResponseWriter, r *http.Request, func (s *httpdServer) renderChangePasswordPage(w http.ResponseWriter, r *http.Request, err *util.I18nError) { data := changePasswordPage{ - basePage: s.getBasePageData(util.I18nChangePwdTitle, webChangeAdminPwdPath, r), + basePage: s.getBasePageData(util.I18nChangePwdTitle, webChangeAdminPwdPath, w, r), Error: err, } @@ -808,7 +825,7 @@ func (s *httpdServer) renderChangePasswordPage(w http.ResponseWriter, r *http.Re func (s *httpdServer) renderMaintenancePage(w http.ResponseWriter, r *http.Request, err error) { data := maintenancePage{ - basePage: s.getBasePageData(util.I18nMaintenanceTitle, webMaintenancePath, r), + basePage: s.getBasePageData(util.I18nMaintenanceTitle, webMaintenancePath, w, r), BackupPath: webBackupPath, RestorePath: webRestorePath, Error: getI18nError(err), @@ -830,30 +847,32 @@ func (s *httpdServer) renderConfigsPage(w http.ResponseWriter, r *http.Request, configs.ACME.HTTP01Challenge.Port = 80 } data := configsPage{ - basePage: s.getBasePageData(util.I18nConfigsTitle, webConfigsPath, r), + basePage: s.getBasePageData(util.I18nConfigsTitle, webConfigsPath, w, r), Configs: configs, ConfigSection: section, RedactedSecret: redactedSecret, OAuth2TokenURL: webOAuth2TokenPath, OAuth2RedirectURL: webOAuth2RedirectPath, + WebClientBranding: s.binding.webClientBranding(), Error: getI18nError(err), } renderAdminTemplate(w, templateConfigs, data) } -func (s *httpdServer) renderAdminSetupPage(w http.ResponseWriter, r *http.Request, username, ip string, err *util.I18nError) { +func (s *httpdServer) renderAdminSetupPage(w http.ResponseWriter, r *http.Request, username string, err *util.I18nError) { data := setupPage{ commonBasePage: getCommonBasePage(r), Title: util.I18nSetupTitle, CurrentURL: webAdminSetupPath, - CSRFToken: createCSRFToken(ip), + CSRFToken: createCSRFToken(w, r, s.csrfTokenAuth, rand.Text(), webBaseAdminPath), Username: username, HasInstallationCode: installationCode != "", InstallationCodeHint: installationCodeHint, HideSupportLink: hideSupportLink, Error: err, - Branding: s.binding.Branding.WebAdmin, + Branding: s.binding.webAdminBranding(), + Languages: s.binding.languages(), } renderAdminTemplate(w, templateSetup, data) @@ -876,7 +895,7 @@ func (s *httpdServer) renderAddUpdateAdminPage(w http.ResponseWriter, r *http.Re title = util.I18nUpdateAdminTitle } data := adminPage{ - basePage: s.getBasePageData(title, currentURL, r), + basePage: s.getBasePageData(title, currentURL, w, r), Admin: admin, Groups: groups, Roles: roles, @@ -917,7 +936,7 @@ func (s *httpdServer) renderUserPage(w http.ResponseWriter, r *http.Request, use } } user.FsConfig.RedactedSecret = redactedSecret - basePage := s.getBasePageData(title, currentURL, r) + basePage := s.getBasePageData(title, currentURL, w, r) if (mode == userPageModeAdd || mode == userPageModeTemplate) && len(user.Groups) == 0 && admin != nil { for _, group := range admin.Groups { user.Groups = append(user.Groups, sdk.GroupMapping{ @@ -957,6 +976,7 @@ func (s *httpdServer) renderUserPage(w http.ResponseWriter, r *http.Request, use Groups: groups, Roles: roles, CanImpersonate: os.Getuid() == 0, + CanUseTLSCerts: ftpd.GetStatus().IsActive || webdavd.GetStatus().IsActive, FsWrapper: fsWrapper{ Filesystem: user.FsConfig, IsUserPage: true, @@ -982,7 +1002,7 @@ func (s *httpdServer) renderIPListPage(w http.ResponseWriter, r *http.Request, e currentURL = fmt.Sprintf("%s/%d/%s", webIPListPath, entry.Type, url.PathEscape(entry.IPOrNet)) } data := ipListPage{ - basePage: s.getBasePageData(title, currentURL, r), + basePage: s.getBasePageData(title, currentURL, w, r), Error: getI18nError(err), Entry: &entry, Mode: mode, @@ -1003,7 +1023,7 @@ func (s *httpdServer) renderRolePage(w http.ResponseWriter, r *http.Request, rol currentURL = fmt.Sprintf("%s/%s", webAdminRolePath, url.PathEscape(role.Name)) } data := rolePage{ - basePage: s.getBasePageData(title, currentURL, r), + basePage: s.getBasePageData(title, currentURL, w, r), Error: getI18nError(err), Role: &role, Mode: mode, @@ -1033,7 +1053,7 @@ func (s *httpdServer) renderGroupPage(w http.ResponseWriter, r *http.Request, gr group.UserSettings.FsConfig.SetEmptySecretsIfNil() data := groupPage{ - basePage: s.getBasePageData(title, currentURL, r), + basePage: s.getBasePageData(title, currentURL, w, r), Error: getI18nError(err), Group: &group, Mode: mode, @@ -1078,14 +1098,15 @@ func (s *httpdServer) renderEventActionPage(w http.ResponseWriter, r *http.Reque } data := eventActionPage{ - basePage: s.getBasePageData(title, currentURL, r), - Action: action, - ActionTypes: dataprovider.EventActionTypes, - FsActions: dataprovider.FsActionTypes, - HTTPMethods: dataprovider.SupportedHTTPActionMethods, - RedactedSecret: redactedSecret, - Error: getI18nError(err), - Mode: mode, + basePage: s.getBasePageData(title, currentURL, w, r), + Action: action, + ActionTypes: dataprovider.EventActionTypes, + FsActions: dataprovider.FsActionTypes, + HTTPMethods: dataprovider.SupportedHTTPActionMethods, + EnabledCommands: dataprovider.EnabledActionCommands, + RedactedSecret: redactedSecret, + Error: getI18nError(err), + Mode: mode, } renderAdminTemplate(w, templateEventAction, data) } @@ -1108,7 +1129,7 @@ func (s *httpdServer) renderEventRulePage(w http.ResponseWriter, r *http.Request } data := eventRulePage{ - basePage: s.getBasePageData(title, currentURL, r), + basePage: s.getBasePageData(title, currentURL, w, r), Rule: rule, TriggerTypes: dataprovider.EventTriggerTypes, Actions: actions, @@ -1142,7 +1163,7 @@ func (s *httpdServer) renderFolderPage(w http.ResponseWriter, r *http.Request, f folder.FsConfig.SetEmptySecretsIfNil() data := folderPage{ - basePage: s.getBasePageData(title, currentURL, r), + basePage: s.getBasePageData(title, currentURL, w, r), Error: getI18nError(err), Folder: folder, Mode: mode, @@ -1206,9 +1227,10 @@ func getUsersForTemplate(r *http.Request) []userTemplateFields { users[username] = true res = append(res, userTemplateFields{ - Username: username, - Password: password, - PublicKeys: []string{publicKey}, + Username: username, + Password: password, + PublicKeys: []string{publicKey}, + RequirePwdChange: r.Form.Get("tpl_require_password_change") != "", }) } @@ -1484,13 +1506,13 @@ func getFiltersFromUserPostFields(r *http.Request) (sdk.BaseUserFilters, error) filters.PasswordStrength = passwordStrength filters.AccessTime = getAccessTimeRestrictionsFromPostFields(r) hooks := r.Form["hooks"] - if util.Contains(hooks, "external_auth_disabled") { + if slices.Contains(hooks, "external_auth_disabled") { filters.Hooks.ExternalAuthDisabled = true } - if util.Contains(hooks, "pre_login_disabled") { + if slices.Contains(hooks, "pre_login_disabled") { filters.Hooks.PreLoginDisabled = true } - if util.Contains(hooks, "check_password_disabled") { + if slices.Contains(hooks, "check_password_disabled") { filters.Hooks.CheckPasswordDisabled = true } filters.IsAnonymous = r.Form.Get("is_anonymous") != "" @@ -1524,6 +1546,7 @@ func getS3Config(r *http.Request) (vfs.S3FsConfig, error) { config.AccessKey = strings.TrimSpace(r.Form.Get("s3_access_key")) config.RoleARN = strings.TrimSpace(r.Form.Get("s3_role_arn")) config.AccessSecret = getSecretFromFormField(r, "s3_access_secret") + config.SSECustomerKey = getSecretFromFormField(r, "s3_sse_customer_key") config.Endpoint = strings.TrimSpace(r.Form.Get("s3_endpoint")) config.StorageClass = strings.TrimSpace(r.Form.Get("s3_storage_class")) config.ACL = strings.TrimSpace(r.Form.Get("s3_acl")) @@ -1580,7 +1603,7 @@ func getGCSConfig(r *http.Request) (vfs.GCSFsConfig, error) { config.AutomaticCredentials = 0 } credentials, _, err := r.FormFile("gcs_credential_file") - if err == http.ErrMissingFile { + if errors.Is(err, http.ErrMissingFile) { return config, nil } if err != nil { @@ -1849,6 +1872,10 @@ func getS3FsFromTemplate(fsConfig vfs.S3FsConfig, replacements map[string]string payload := replacePlaceholders(fsConfig.AccessSecret.GetPayload(), replacements) fsConfig.AccessSecret = kms.NewPlainSecret(payload) } + if fsConfig.SSECustomerKey != nil && fsConfig.SSECustomerKey.IsPlain() { + payload := replacePlaceholders(fsConfig.SSECustomerKey.GetPayload(), replacements) + fsConfig.SSECustomerKey = kms.NewPlainSecret(payload) + } return fsConfig } @@ -1886,6 +1913,7 @@ func getUserFromTemplate(user dataprovider.User, template userTemplateFields) da user.Username = template.Username user.Password = template.Password user.PublicKeys = template.PublicKeys + user.Filters.RequirePasswordChange = template.RequirePwdChange replacements := make(map[string]string) replacements["%username%"] = user.Username if user.Password != "" && !user.IsPasswordHashed() { @@ -1967,6 +1995,13 @@ func updateRepeaterFormFields(r *http.Request) { } continue } + if hasPrefixAndSuffix(k, "additional_emails[", "][additional_email]") { + email := strings.TrimSpace(r.Form.Get(k)) + if email != "" { + r.Form.Add("additional_emails", email) + } + continue + } if hasPrefixAndSuffix(k, "virtual_folders[", "][vfolder_path]") { base, _ := strings.CutSuffix(k, "[vfolder_path]") r.Form.Add("vfolder_path", strings.TrimSpace(r.Form.Get(k))) @@ -2100,6 +2135,7 @@ func getUserFromPostFields(r *http.Request) (dataprovider.User, error) { Filters: dataprovider.UserFilters{ BaseUserFilters: filters, RequirePasswordChange: r.Form.Get("require_password_change") != "", + AdditionalEmails: r.Form["additional_emails"], }, VirtualFolders: getVirtualFoldersFromPostFields(r), FsConfig: fsConfig, @@ -2196,6 +2232,28 @@ func getKeyValsFromPostFields(r *http.Request, key, val string) []dataprovider.K return res } +func getRenameConfigsFromPostFields(r *http.Request) []dataprovider.RenameConfig { + var res []dataprovider.RenameConfig + keys := r.Form["fs_rename_source"] + values := r.Form["fs_rename_target"] + + for idx, k := range keys { + v := values[idx] + if k != "" && v != "" { + opts := r.Form["fs_rename_options"+strconv.Itoa(idx)] + res = append(res, dataprovider.RenameConfig{ + KeyValue: dataprovider.KeyValue{ + Key: k, + Value: v, + }, + UpdateModTime: slices.Contains(opts, "1"), + }) + } + } + + return res +} + func getFoldersRetentionFromPostFields(r *http.Request) ([]dataprovider.FolderRetention, error) { var res []dataprovider.FolderRetention paths := r.Form["folder_retention_path"] @@ -2211,7 +2269,7 @@ func getFoldersRetentionFromPostFields(r *http.Request) ([]dataprovider.FolderRe res = append(res, dataprovider.FolderRetention{ Path: p, Retention: retention, - DeleteEmptyDirs: util.Contains(opts, "1"), + DeleteEmptyDirs: slices.Contains(opts, "1"), }) } } @@ -2305,6 +2363,8 @@ func updateRepeaterFormActionFields(r *http.Request) { base, _ := strings.CutSuffix(k, "[fs_rename_source]") r.Form.Add("fs_rename_source", strings.TrimSpace(r.Form.Get(k))) r.Form.Add("fs_rename_target", strings.TrimSpace(r.Form.Get(base+"[fs_rename_target]"))) + r.Form["fs_rename_options"+strconv.Itoa(len(r.Form["fs_rename_source"])-1)] = + r.Form[base+"[fs_rename_options][]"] continue } if hasPrefixAndSuffix(k, "fs_copy[", "][fs_copy_source]") { @@ -2393,7 +2453,7 @@ func getEventActionOptionsFromPostFields(r *http.Request) (dataprovider.BaseEven }, FsConfig: dataprovider.EventActionFilesystemConfig{ Type: fsActionType, - Renames: getKeyValsFromPostFields(r, "fs_rename_source", "fs_rename_target"), + Renames: getRenameConfigsFromPostFields(r), Deletes: getSliceFromDelimitedValues(r.Form.Get("fs_delete_paths"), ","), MkDirs: getSliceFromDelimitedValues(r.Form.Get("fs_mkdir_paths"), ","), Exist: getSliceFromDelimitedValues(r.Form.Get("fs_exist_paths"), ","), @@ -2516,6 +2576,13 @@ func getEventRuleConditionsFromPostFields(r *http.Request) (dataprovider.EventCo if err != nil { return dataprovider.EventConditions{}, util.NewI18nError(fmt.Errorf("invalid max file size: %w", err), util.I18nErrorInvalidMaxSize) } + var eventStatuses []int + for _, s := range r.Form["fs_statuses"] { + status, err := strconv.ParseInt(s, 10, 32) + if err == nil { + eventStatuses = append(eventStatuses, int(status)) + } + } conditions := dataprovider.EventConditions{ FsEvents: r.Form["fs_events"], ProviderEvents: r.Form["provider_events"], @@ -2527,6 +2594,7 @@ func getEventRuleConditionsFromPostFields(r *http.Request) (dataprovider.EventCo RoleNames: roleNames, FsPaths: fsPaths, Protocols: r.Form["fs_protocols"], + EventStatuses: eventStatuses, ProviderObjects: r.Form["provider_objects"], MinFileSize: minFileSize, MaxFileSize: maxFileSize, @@ -2553,9 +2621,9 @@ func getEventRuleActionsFromPostFields(r *http.Request) []dataprovider.EventActi }, Order: order + 1, Options: dataprovider.EventActionOptions{ - IsFailureAction: util.Contains(options, "1"), - StopOnFailure: util.Contains(options, "2"), - ExecuteSync: util.Contains(options, "3"), + IsFailureAction: slices.Contains(options, "1"), + StopOnFailure: slices.Contains(options, "2"), + ExecuteSync: slices.Contains(options, "3"), }, }) } @@ -2758,31 +2826,95 @@ func getSMTPConfigsFromPostFields(r *http.Request) *dataprovider.SMTPConfigs { } } +func getImageInputBytes(r *http.Request, fieldName, removeFieldName string, defaultVal []byte) ([]byte, error) { + var result []byte + remove := r.Form.Get(removeFieldName) + if remove == "" || remove == "0" { + result = defaultVal + } + f, _, err := r.FormFile(fieldName) + if err != nil { + if errors.Is(err, http.ErrMissingFile) { + return result, nil + } + return nil, err + } + defer f.Close() + + return io.ReadAll(f) +} + +func getBrandingConfigFromPostFields(r *http.Request, config *dataprovider.BrandingConfigs) ( + *dataprovider.BrandingConfigs, error, +) { + if config == nil { + config = &dataprovider.BrandingConfigs{} + } + adminLogo, err := getImageInputBytes(r, "branding_webadmin_logo", "branding_webadmin_logo_remove", config.WebAdmin.Logo) + if err != nil { + return nil, util.NewI18nError(err, util.I18nErrorInvalidForm) + } + adminFavicon, err := getImageInputBytes(r, "branding_webadmin_favicon", "branding_webadmin_favicon_remove", + config.WebAdmin.Favicon) + if err != nil { + return nil, util.NewI18nError(err, util.I18nErrorInvalidForm) + } + clientLogo, err := getImageInputBytes(r, "branding_webclient_logo", "branding_webclient_logo_remove", + config.WebClient.Logo) + if err != nil { + return nil, util.NewI18nError(err, util.I18nErrorInvalidForm) + } + clientFavicon, err := getImageInputBytes(r, "branding_webclient_favicon", "branding_webclient_favicon_remove", + config.WebClient.Favicon) + if err != nil { + return nil, util.NewI18nError(err, util.I18nErrorInvalidForm) + } + + branding := &dataprovider.BrandingConfigs{ + WebAdmin: dataprovider.BrandingConfig{ + Name: strings.TrimSpace(r.Form.Get("branding_webadmin_name")), + ShortName: strings.TrimSpace(r.Form.Get("branding_webadmin_short_name")), + Logo: adminLogo, + Favicon: adminFavicon, + DisclaimerName: strings.TrimSpace(r.Form.Get("branding_webadmin_disclaimer_name")), + DisclaimerURL: strings.TrimSpace(r.Form.Get("branding_webadmin_disclaimer_url")), + }, + WebClient: dataprovider.BrandingConfig{ + Name: strings.TrimSpace(r.Form.Get("branding_webclient_name")), + ShortName: strings.TrimSpace(r.Form.Get("branding_webclient_short_name")), + Logo: clientLogo, + Favicon: clientFavicon, + DisclaimerName: strings.TrimSpace(r.Form.Get("branding_webclient_disclaimer_name")), + DisclaimerURL: strings.TrimSpace(r.Form.Get("branding_webclient_disclaimer_url")), + }, + } + return branding, nil +} + func (s *httpdServer) handleWebAdminForgotPwd(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) if !smtp.IsEnabled() { s.renderNotFoundPage(w, r, errors.New("this page does not exist")) return } - s.renderForgotPwdPage(w, r, nil, util.GetIPFromRemoteAddress(r.RemoteAddr)) + s.renderForgotPwdPage(w, r, nil) } func (s *httpdServer) handleWebAdminForgotPwdPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) err := r.ParseForm() if err != nil { - s.renderForgotPwdPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm), ipAddr) + s.renderForgotPwdPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm)) return } - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyLoginCookieAndCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } err = handleForgotPassword(r, r.Form.Get("username"), true) if err != nil { - s.renderForgotPwdPage(w, r, util.NewI18nError(err, util.I18nErrorPwdResetGeneric), ipAddr) + s.renderForgotPwdPage(w, r, util.NewI18nError(err, util.I18nErrorPwdResetGeneric)) return } http.Redirect(w, r, webAdminResetPwdPath, http.StatusFound) @@ -2794,17 +2926,17 @@ func (s *httpdServer) handleWebAdminPasswordReset(w http.ResponseWriter, r *http s.renderNotFoundPage(w, r, errors.New("this page does not exist")) return } - s.renderResetPwdPage(w, r, nil, util.GetIPFromRemoteAddress(r.RemoteAddr)) + s.renderResetPwdPage(w, r, nil) } func (s *httpdServer) handleWebAdminTwoFactor(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - s.renderTwoFactorPage(w, r, nil, util.GetIPFromRemoteAddress(r.RemoteAddr)) + s.renderTwoFactorPage(w, r, nil) } func (s *httpdServer) handleWebAdminTwoFactorRecovery(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - s.renderTwoFactorRecoveryPage(w, r, nil, util.GetIPFromRemoteAddress(r.RemoteAddr)) + s.renderTwoFactorRecoveryPage(w, r, nil) } func (s *httpdServer) handleWebAdminMFA(w http.ResponseWriter, r *http.Request) { @@ -2830,11 +2962,11 @@ func (s *httpdServer) handleWebAdminProfilePost(w http.ResponseWriter, r *http.R return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderProfilePage(w, r, util.NewI18nError(err, util.I18nErrorInvalidToken)) return @@ -2862,7 +2994,7 @@ func (s *httpdServer) handleWebMaintenance(w http.ResponseWriter, r *http.Reques func (s *httpdServer) handleWebRestore(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, MaxRestoreSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -2875,7 +3007,7 @@ func (s *httpdServer) handleWebRestore(w http.ResponseWriter, r *http.Request) { defer r.MultipartForm.RemoveAll() //nolint:errcheck ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -2915,7 +3047,7 @@ func (s *httpdServer) handleWebRestore(w http.ResponseWriter, r *http.Request) { func getAllAdmins(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, nil, util.I18nErrorInvalidToken, http.StatusForbidden) return @@ -2936,7 +3068,7 @@ func getAllAdmins(w http.ResponseWriter, r *http.Request) { func (s *httpdServer) handleGetWebAdmins(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - data := s.getBasePageData(util.I18nAdminsTitle, webAdminsPath, r) + data := s.getBasePageData(util.I18nAdminsTitle, webAdminsPath, w, r) renderAdminTemplate(w, templateAdmins, data) } @@ -2946,7 +3078,7 @@ func (s *httpdServer) handleWebAdminSetupGet(w http.ResponseWriter, r *http.Requ http.Redirect(w, r, webAdminLoginPath, http.StatusFound) return } - s.renderAdminSetupPage(w, r, "", util.GetIPFromRemoteAddress(r.RemoteAddr), nil) + s.renderAdminSetupPage(w, r, "", nil) } func (s *httpdServer) handleWebAddAdminGet(w http.ResponseWriter, r *http.Request) { @@ -2973,7 +3105,7 @@ func (s *httpdServer) handleWebUpdateAdminGet(w http.ResponseWriter, r *http.Req func (s *httpdServer) handleWebAddAdminPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -2983,11 +3115,15 @@ func (s *httpdServer) handleWebAddAdminPost(w http.ResponseWriter, r *http.Reque s.renderAddUpdateAdminPage(w, r, &admin, err, true) return } - if admin.Password == "" && s.binding.isWebAdminLoginFormDisabled() { + if admin.Password == "" { + // Administrators can be used with OpenID Connect or for authentication + // via API key, in these cases the password is not necessary, we create + // a non-usable one. This feature is only useful for WebAdmin, in REST + // API you can create an unusable password externally. admin.Password = util.GenerateUniqueID() } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -3018,7 +3154,7 @@ func (s *httpdServer) handleWebUpdateAdminPost(w http.ResponseWriter, r *http.Re return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -3029,15 +3165,15 @@ func (s *httpdServer) handleWebUpdateAdminPost(w http.ResponseWriter, r *http.Re } updatedAdmin.Filters.TOTPConfig = admin.Filters.TOTPConfig updatedAdmin.Filters.RecoveryCodes = admin.Filters.RecoveryCodes - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderAddUpdateAdminPage(w, r, &updatedAdmin, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken), false) return } if username == claims.Username { - if claims.isCriticalPermRemoved(updatedAdmin.Permissions) { + if !util.SlicesEqual(admin.Permissions, updatedAdmin.Permissions) { s.renderAddUpdateAdminPage(w, r, &updatedAdmin, - util.NewI18nError(errors.New("you cannot remove these permissions to yourself"), + util.NewI18nError(errors.New("you cannot change your permissions"), util.I18nErrorAdminSelfPerms, ), false) return @@ -3071,7 +3207,7 @@ func (s *httpdServer) handleWebUpdateAdminPost(w http.ResponseWriter, r *http.Re func (s *httpdServer) handleWebDefenderPage(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) data := defenderHostsPage{ - basePage: s.getBasePageData(util.I18nDefenderTitle, webDefenderPath, r), + basePage: s.getBasePageData(util.I18nDefenderTitle, webDefenderPath, w, r), DefenderHostsURL: webDefenderHostsPath, } @@ -3080,7 +3216,7 @@ func (s *httpdServer) handleWebDefenderPage(w http.ResponseWriter, r *http.Reque func getAllUsers(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, nil, util.I18nErrorInvalidToken, http.StatusForbidden) return @@ -3100,12 +3236,12 @@ func getAllUsers(w http.ResponseWriter, r *http.Request) { func (s *httpdServer) handleGetWebUsers(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return } - data := s.getBasePageData(util.I18nUsersTitle, webUsersPath, r) + data := s.getBasePageData(util.I18nUsersTitle, webUsersPath, w, r) renderAdminTemplate(w, templateUsers, data) } @@ -3130,7 +3266,7 @@ func (s *httpdServer) handleWebTemplateFolderGet(w http.ResponseWriter, r *http. func (s *httpdServer) handleWebTemplateFolderPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -3144,7 +3280,7 @@ func (s *httpdServer) handleWebTemplateFolderPost(w http.ResponseWriter, r *http defer r.MultipartForm.RemoveAll() //nolint:errcheck ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -3159,7 +3295,6 @@ func (s *httpdServer) handleWebTemplateFolderPost(w http.ResponseWriter, r *http templateFolder.FsConfig = fsConfig var dump dataprovider.BackupData - dump.Version = dataprovider.DumpVersion foldersFields := getFoldersForTemplate(r) for _, tmpl := range foldersFields { @@ -3179,12 +3314,6 @@ func (s *httpdServer) handleWebTemplateFolderPost(w http.ResponseWriter, r *http ), "") return } - if r.Form.Get("form_action") == "export_from_template" { - w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"sftpgo-%v-folders-from-template.json\"", - len(dump.Folders))) - render.JSON(w, r, dump) - return - } if err = RestoreFolders(dump.Folders, "", 1, 0, claims.Username, ipAddr, claims.Role); err != nil { s.renderMessagePage(w, r, util.I18nTemplateFolderTitle, getRespStatus(err), err, "") return @@ -3207,6 +3336,7 @@ func (s *httpdServer) handleWebTemplateUserGet(w http.ResponseWriter, r *http.Re user.SetEmptySecrets() user.PublicKeys = nil user.Email = "" + user.Filters.AdditionalEmails = nil user.Description = "" if user.ExpirationDate == 0 && admin.Filters.Preferences.DefaultUsersExpiration > 0 { user.ExpirationDate = util.GetTimeAsMsSinceEpoch(time.Now().Add(24 * time.Hour * time.Duration(admin.Filters.Preferences.DefaultUsersExpiration))) @@ -3233,7 +3363,7 @@ func (s *httpdServer) handleWebTemplateUserGet(w http.ResponseWriter, r *http.Re func (s *httpdServer) handleWebTemplateUserPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -3244,13 +3374,12 @@ func (s *httpdServer) handleWebTemplateUserPost(w http.ResponseWriter, r *http.R return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } var dump dataprovider.BackupData - dump.Version = dataprovider.DumpVersion userTmplFields := getUsersForTemplate(r) for _, tmpl := range userTmplFields { @@ -3259,14 +3388,10 @@ func (s *httpdServer) handleWebTemplateUserPost(w http.ResponseWriter, r *http.R s.renderMessagePage(w, r, util.I18nTemplateUserTitle, http.StatusBadRequest, err, "") return } - // to create a template the "manage_system" permission is required, so role admins cannot use - // this method, we don't need to force the role - dump.Users = append(dump.Users, u) - for _, folder := range u.VirtualFolders { - if !dump.HasFolder(folder.Name) { - dump.Folders = append(dump.Folders, folder.BaseVirtualFolder) - } + if claims.Role != "" { + u.Role = claims.Role } + dump.Users = append(dump.Users, u) } if len(dump.Users) == 0 { @@ -3277,12 +3402,6 @@ func (s *httpdServer) handleWebTemplateUserPost(w http.ResponseWriter, r *http.R ), "") return } - if r.Form.Get("form_action") == "export_from_template" { - w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"sftpgo-%v-users-from-template.json\"", - len(dump.Users))) - render.JSON(w, r, dump) - return - } if err = RestoreUsers(dump.Users, "", 1, 0, claims.Username, ipAddr, claims.Role); err != nil { s.renderMessagePage(w, r, util.I18nTemplateUserTitle, getRespStatus(err), err, "") return @@ -3312,7 +3431,7 @@ func (s *httpdServer) handleWebAddUserGet(w http.ResponseWriter, r *http.Request func (s *httpdServer) handleWebUpdateUserGet(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -3330,7 +3449,7 @@ func (s *httpdServer) handleWebUpdateUserGet(w http.ResponseWriter, r *http.Requ func (s *httpdServer) handleWebAddUserPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -3341,14 +3460,15 @@ func (s *httpdServer) handleWebAddUserPost(w http.ResponseWriter, r *http.Reques return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } user = getUserFromTemplate(user, userTemplateFields{ - Username: user.Username, - Password: user.Password, - PublicKeys: user.PublicKeys, + Username: user.Username, + Password: user.Password, + PublicKeys: user.PublicKeys, + RequirePwdChange: user.Filters.RequirePasswordChange, }) if claims.Role != "" { user.Role = claims.Role @@ -3367,7 +3487,7 @@ func (s *httpdServer) handleWebAddUserPost(w http.ResponseWriter, r *http.Reques func (s *httpdServer) handleWebUpdateUserPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -3387,7 +3507,7 @@ func (s *httpdServer) handleWebUpdateUserPost(w http.ResponseWriter, r *http.Req return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -3403,9 +3523,10 @@ func (s *httpdServer) handleWebUpdateUserPost(w http.ResponseWriter, r *http.Req updateEncryptedSecrets(&updatedUser.FsConfig, &user.FsConfig) updatedUser = getUserFromTemplate(updatedUser, userTemplateFields{ - Username: updatedUser.Username, - Password: updatedUser.Password, - PublicKeys: updatedUser.PublicKeys, + Username: updatedUser.Username, + Password: updatedUser.Password, + PublicKeys: updatedUser.PublicKeys, + RequirePwdChange: updatedUser.Filters.RequirePasswordChange, }) if claims.Role != "" { updatedUser.Role = claims.Role @@ -3425,7 +3546,7 @@ func (s *httpdServer) handleWebUpdateUserPost(w http.ResponseWriter, r *http.Req func (s *httpdServer) handleWebGetStatus(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) data := statusPage{ - basePage: s.getBasePageData(util.I18nStatusTitle, webStatusPath, r), + basePage: s.getBasePageData(util.I18nStatusTitle, webStatusPath, w, r), Status: getServicesStatus(), } renderAdminTemplate(w, templateStatus, data) @@ -3433,13 +3554,13 @@ func (s *httpdServer) handleWebGetStatus(w http.ResponseWriter, r *http.Request) func (s *httpdServer) handleWebGetConnections(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return } - data := s.getBasePageData(util.I18nSessionsTitle, webConnectionsPath, r) + data := s.getBasePageData(util.I18nSessionsTitle, webConnectionsPath, w, r) renderAdminTemplate(w, templateConnections, data) } @@ -3450,7 +3571,7 @@ func (s *httpdServer) handleWebAddFolderGet(w http.ResponseWriter, r *http.Reque func (s *httpdServer) handleWebAddFolderPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -3464,7 +3585,7 @@ func (s *httpdServer) handleWebAddFolderPost(w http.ResponseWriter, r *http.Requ defer r.MultipartForm.RemoveAll() //nolint:errcheck ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -3502,7 +3623,7 @@ func (s *httpdServer) handleWebUpdateFolderGet(w http.ResponseWriter, r *http.Re func (s *httpdServer) handleWebUpdateFolderPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -3525,7 +3646,7 @@ func (s *httpdServer) handleWebUpdateFolderPost(w http.ResponseWriter, r *http.R defer r.MultipartForm.RemoveAll() //nolint:errcheck ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -3588,7 +3709,7 @@ func getAllFolders(w http.ResponseWriter, r *http.Request) { func (s *httpdServer) handleWebGetFolders(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - data := s.getBasePageData(util.I18nFoldersTitle, webFoldersPath, r) + data := s.getBasePageData(util.I18nFoldersTitle, webFoldersPath, w, r) renderAdminTemplate(w, templateFolders, data) } @@ -3626,7 +3747,7 @@ func getAllGroups(w http.ResponseWriter, r *http.Request) { func (s *httpdServer) handleWebGetGroups(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - data := s.getBasePageData(util.I18nGroupsTitle, webGroupsPath, r) + data := s.getBasePageData(util.I18nGroupsTitle, webGroupsPath, w, r) renderAdminTemplate(w, templateGroups, data) } @@ -3637,7 +3758,7 @@ func (s *httpdServer) handleWebAddGroupGet(w http.ResponseWriter, r *http.Reques func (s *httpdServer) handleWebAddGroupPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -3648,7 +3769,7 @@ func (s *httpdServer) handleWebAddGroupPost(w http.ResponseWriter, r *http.Reque return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -3675,7 +3796,7 @@ func (s *httpdServer) handleWebUpdateGroupGet(w http.ResponseWriter, r *http.Req func (s *httpdServer) handleWebUpdateGroupPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -3695,7 +3816,7 @@ func (s *httpdServer) handleWebUpdateGroupPost(w http.ResponseWriter, r *http.Re return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -3748,7 +3869,7 @@ func getAllActions(w http.ResponseWriter, r *http.Request) { func (s *httpdServer) handleWebGetEventActions(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - data := s.getBasePageData(util.I18nActionsTitle, webAdminEventActionsPath, r) + data := s.getBasePageData(util.I18nActionsTitle, webAdminEventActionsPath, w, r) renderAdminTemplate(w, templateEventActions, data) } @@ -3762,7 +3883,7 @@ func (s *httpdServer) handleWebAddEventActionGet(w http.ResponseWriter, r *http. func (s *httpdServer) handleWebAddEventActionPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -3773,7 +3894,7 @@ func (s *httpdServer) handleWebAddEventActionPost(w http.ResponseWriter, r *http return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -3799,7 +3920,7 @@ func (s *httpdServer) handleWebUpdateEventActionGet(w http.ResponseWriter, r *ht func (s *httpdServer) handleWebUpdateEventActionPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -3819,7 +3940,7 @@ func (s *httpdServer) handleWebUpdateEventActionPost(w http.ResponseWriter, r *h return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -3858,7 +3979,7 @@ func getAllRules(w http.ResponseWriter, r *http.Request) { func (s *httpdServer) handleWebGetEventRules(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - data := s.getBasePageData(util.I18nRulesTitle, webAdminEventRulesPath, r) + data := s.getBasePageData(util.I18nRulesTitle, webAdminEventRulesPath, w, r) renderAdminTemplate(w, templateEventRules, data) } @@ -3873,7 +3994,7 @@ func (s *httpdServer) handleWebAddEventRuleGet(w http.ResponseWriter, r *http.Re func (s *httpdServer) handleWebAddEventRulePost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -3884,7 +4005,7 @@ func (s *httpdServer) handleWebAddEventRulePost(w http.ResponseWriter, r *http.R return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - err = verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr) + err = verifyCSRFToken(r, s.csrfTokenAuth) if err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return @@ -3911,7 +4032,7 @@ func (s *httpdServer) handleWebUpdateEventRuleGet(w http.ResponseWriter, r *http func (s *httpdServer) handleWebUpdateEventRulePost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -3931,7 +4052,7 @@ func (s *httpdServer) handleWebUpdateEventRulePost(w http.ResponseWriter, r *htt return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -3978,7 +4099,7 @@ func getAllRoles(w http.ResponseWriter, r *http.Request) { func (s *httpdServer) handleWebGetRoles(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - data := s.getBasePageData(util.I18nRolesTitle, webAdminRolesPath, r) + data := s.getBasePageData(util.I18nRolesTitle, webAdminRolesPath, w, r) renderAdminTemplate(w, templateRoles, data) } @@ -3995,13 +4116,13 @@ func (s *httpdServer) handleWebAddRolePost(w http.ResponseWriter, r *http.Reques s.renderRolePage(w, r, role, genericPageModeAdd, err) return } - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -4027,7 +4148,7 @@ func (s *httpdServer) handleWebUpdateRoleGet(w http.ResponseWriter, r *http.Requ func (s *httpdServer) handleWebUpdateRolePost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -4047,7 +4168,7 @@ func (s *httpdServer) handleWebUpdateRolePost(w http.ResponseWriter, r *http.Req return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -4065,7 +4186,7 @@ func (s *httpdServer) handleWebGetEvents(w http.ResponseWriter, r *http.Request) r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) data := eventsPage{ - basePage: s.getBasePageData(util.I18nEventsTitle, webEventsPath, r), + basePage: s.getBasePageData(util.I18nEventsTitle, webEventsPath, w, r), FsEventsSearchURL: webEventsFsSearchPath, ProviderEventsSearchURL: webEventsProviderSearchPath, LogEventsSearchURL: webEventsLogSearchPath, @@ -4077,7 +4198,7 @@ func (s *httpdServer) handleWebIPListsPage(w http.ResponseWriter, r *http.Reques r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) rtlStatus, rtlProtocols := common.Config.GetRateLimitersStatus() data := ipListsPage{ - basePage: s.getBasePageData(util.I18nIPListsTitle, webIPListsPath, r), + basePage: s.getBasePageData(util.I18nIPListsTitle, webIPListsPath, w, r), RateLimitersStatus: rtlStatus, RateLimitersProtocols: strings.Join(rtlProtocols, ", "), IsAllowListEnabled: common.Config.IsAllowListEnabled(), @@ -4109,13 +4230,13 @@ func (s *httpdServer) handleWebAddIPListEntryPost(w http.ResponseWriter, r *http return } entry.Type = listType - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -4146,7 +4267,7 @@ func (s *httpdServer) handleWebUpdateIPListEntryGet(w http.ResponseWriter, r *ht func (s *httpdServer) handleWebUpdateIPListEntryPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -4170,7 +4291,7 @@ func (s *httpdServer) handleWebUpdateIPListEntryPost(w http.ResponseWriter, r *h return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -4196,7 +4317,7 @@ func (s *httpdServer) handleWebConfigs(w http.ResponseWriter, r *http.Request) { func (s *httpdServer) handleWebConfigsPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -4206,13 +4327,15 @@ func (s *httpdServer) handleWebConfigsPost(w http.ResponseWriter, r *http.Reques s.renderInternalServerErrorPage(w, r, err) return } - err = r.ParseForm() + err = r.ParseMultipartForm(maxRequestSize) if err != nil { s.renderBadRequestPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm)) return } + defer r.MultipartForm.RemoveAll() //nolint:errcheck + ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -4236,6 +4359,15 @@ func (s *httpdServer) handleWebConfigsPost(w http.ResponseWriter, r *http.Reques smtpConfigs := getSMTPConfigsFromPostFields(r) updateSMTPSecrets(smtpConfigs, configs.SMTP) configs.SMTP = smtpConfigs + case "branding_submit": + configSection = 4 + brandingConfigs, err := getBrandingConfigFromPostFields(r, configs.Branding) + configs.Branding = brandingConfigs + if err != nil { + logger.Info(logSender, "", "unable to get branding config: %v", err) + s.renderConfigsPage(w, r, configs, err, configSection) + return + } default: s.renderBadRequestPage(w, r, errors.New("unsupported form action")) return @@ -4246,15 +4378,22 @@ func (s *httpdServer) handleWebConfigsPost(w http.ResponseWriter, r *http.Reques s.renderConfigsPage(w, r, configs, err, configSection) return } - if configSection == 3 { + postConfigsUpdate(configSection, configs) + s.renderMessagePage(w, r, util.I18nConfigsTitle, http.StatusOK, nil, util.I18nConfigsOK) +} + +func postConfigsUpdate(section int, configs dataprovider.Configs) { + switch section { + case 3: err := configs.SMTP.TryDecrypt() if err == nil { smtp.Activate(configs.SMTP) } else { logger.Error(logSender, "", "unable to decrypt SMTP configuration, cannot activate configuration: %v", err) } + case 4: + dbBrandingConfig.Set(configs.Branding) } - s.renderMessagePage(w, r, util.I18nConfigsTitle, http.StatusOK, nil, util.I18nConfigsOK) } func (s *httpdServer) handleOAuth2TokenRedirect(w http.ResponseWriter, r *http.Request) { @@ -4262,20 +4401,21 @@ func (s *httpdServer) handleOAuth2TokenRedirect(w http.ResponseWriter, r *http.R stateToken := r.URL.Query().Get("state") - state, err := verifyOAuth2Token(stateToken, util.GetIPFromRemoteAddress(r.RemoteAddr)) + state, err := verifyOAuth2Token(s.csrfTokenAuth, stateToken, util.GetIPFromRemoteAddress(r.RemoteAddr)) if err != nil { s.renderMessagePage(w, r, util.I18nOAuth2ErrorTitle, http.StatusBadRequest, err, "") return } - defer oauth2Mgr.removePendingAuth(state) - pendingAuth, err := oauth2Mgr.getPendingAuth(state) if err != nil { + oauth2Mgr.removePendingAuth(state) s.renderMessagePage(w, r, util.I18nOAuth2ErrorTitle, http.StatusInternalServerError, util.NewI18nError(err, util.I18nOAuth2ErrorValidateState), "") return } + oauth2Mgr.removePendingAuth(state) + oauth2Config := smtp.OAuth2Config{ Provider: pendingAuth.Provider, ClientID: pendingAuth.ClientID, @@ -4286,7 +4426,7 @@ func (s *httpdServer) handleOAuth2TokenRedirect(w http.ResponseWriter, r *http.R cfg := oauth2Config.GetOAuth2() cfg.RedirectURL = pendingAuth.RedirectURL - token, err := cfg.Exchange(ctx, r.URL.Query().Get("code")) + token, err := cfg.Exchange(ctx, r.URL.Query().Get("code"), oauth2.VerifierOption(pendingAuth.Verifier)) if err != nil { s.renderMessagePage(w, r, util.I18nOAuth2ErrorTitle, http.StatusInternalServerError, util.NewI18nError(err, util.I18nOAuth2ErrTokenExchange), "") @@ -4306,6 +4446,9 @@ func (s *httpdServer) handleOAuth2TokenRedirect(w http.ResponseWriter, r *http.R } func updateSMTPSecrets(newConfigs, currentConfigs *dataprovider.SMTPConfigs) { + if currentConfigs == nil { + currentConfigs = &dataprovider.SMTPConfigs{} + } if newConfigs.Password.IsNotPlainAndNotEmpty() { newConfigs.Password = currentConfigs.Password } diff --git a/internal/httpd/webclient.go b/internal/httpd/webclient.go index 10fd2c49..71aba2ce 100644 --- a/internal/httpd/webclient.go +++ b/internal/httpd/webclient.go @@ -16,6 +16,7 @@ package httpd import ( "bytes" + "crypto/rand" "encoding/json" "errors" "fmt" @@ -27,6 +28,7 @@ import ( "os" "path" "path/filepath" + "slices" "strconv" "strings" "time" @@ -37,6 +39,7 @@ import ( "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/dataprovider" + "github.com/drakkan/sftpgo/v2/internal/jwt" "github.com/drakkan/sftpgo/v2/internal/logger" "github.com/drakkan/sftpgo/v2/internal/mfa" "github.com/drakkan/sftpgo/v2/internal/smtp" @@ -81,21 +84,23 @@ func isZeroTime(t time.Time) bool { type baseClientPage struct { commonBasePage - Title string - CurrentURL string - FilesURL string - SharesURL string - ShareURL string - ProfileURL string - PingURL string - ChangePwdURL string - LogoutURL string - LoginURL string - EditURL string - MFAURL string - CSRFToken string - LoggedUser *dataprovider.User - Branding UIBranding + Title string + CurrentURL string + FilesURL string + SharesURL string + ShareURL string + ProfileURL string + PingURL string + ChangePwdURL string + LogoutURL string + LoginURL string + EditURL string + MFAURL string + CSRFToken string + LoggedUser *dataprovider.User + IsLoggedToShare bool + Branding UIBranding + Languages []string } type dirMapping struct { @@ -105,9 +110,10 @@ type dirMapping struct { type viewPDFPage struct { commonBasePage - Title string - URL string - Branding UIBranding + Title string + URL string + Branding UIBranding + Languages []string } type editFilePage struct { @@ -141,15 +147,18 @@ type filesPage struct { Error *util.I18nError Paths []dirMapping QuotaUsage *userQuotaUsage + KeepAliveInterval int } type shareLoginPage struct { commonBasePage - CurrentURL string - Error *util.I18nError - CSRFToken string - Title string - Branding UIBranding + CurrentURL string + Error *util.I18nError + CSRFToken string + Title string + Branding UIBranding + Languages []string + CheckRedirect bool } type shareDownloadPage struct { @@ -172,13 +181,15 @@ type clientMessagePage struct { type clientProfilePage struct { baseClientPage - PublicKeys []string - TLSCerts []string - CanSubmit bool - AllowAPIKeyAuth bool - Email string - Description string - Error *util.I18nError + PublicKeys []string + TLSCerts []string + CanSubmit bool + AllowAPIKeyAuth bool + Email string + AdditionalEmails []string + AdditionalEmailsString string + Description string + Error *util.I18nError } type changeClientPasswordPage struct { @@ -201,6 +212,7 @@ type clientMFAPage struct { type clientSharesPage struct { baseClientPage BasePublicSharesURL string + BaseURL string } type clientSharePage struct { @@ -523,28 +535,30 @@ func loadClientTemplates(templatesPath string) { clientTemplates[templateShareDownload] = shareDownloadTmpl } -func (s *httpdServer) getBaseClientPageData(title, currentURL string, r *http.Request) baseClientPage { +func (s *httpdServer) getBaseClientPageData(title, currentURL string, w http.ResponseWriter, r *http.Request) baseClientPage { var csrfToken string if currentURL != "" { - csrfToken = createCSRFToken(util.GetIPFromRemoteAddress(r.RemoteAddr)) + csrfToken = createCSRFToken(w, r, s.csrfTokenAuth, "", webBaseClientPath) } data := baseClientPage{ - commonBasePage: getCommonBasePage(r), - Title: title, - CurrentURL: currentURL, - FilesURL: webClientFilesPath, - SharesURL: webClientSharesPath, - ShareURL: webClientSharePath, - ProfileURL: webClientProfilePath, - PingURL: webClientPingPath, - ChangePwdURL: webChangeClientPwdPath, - LogoutURL: webClientLogoutPath, - EditURL: webClientEditFilePath, - MFAURL: webClientMFAPath, - CSRFToken: csrfToken, - LoggedUser: getUserFromToken(r), - Branding: s.binding.Branding.WebClient, + commonBasePage: getCommonBasePage(r), + Title: title, + CurrentURL: currentURL, + FilesURL: webClientFilesPath, + SharesURL: webClientSharesPath, + ShareURL: webClientSharePath, + ProfileURL: webClientProfilePath, + PingURL: webClientPingPath, + ChangePwdURL: webChangeClientPwdPath, + LogoutURL: webClientLogoutPath, + EditURL: webClientEditFilePath, + MFAURL: webClientMFAPath, + CSRFToken: csrfToken, + LoggedUser: getUserFromToken(r), + IsLoggedToShare: false, + Branding: s.binding.webClientBranding(), + Languages: s.binding.languages(), } if !strings.HasPrefix(r.RequestURI, webClientPubSharesPath) { data.LoginURL = webClientLoginPath @@ -552,40 +566,44 @@ func (s *httpdServer) getBaseClientPageData(title, currentURL string, r *http.Re return data } -func (s *httpdServer) renderClientForgotPwdPage(w http.ResponseWriter, r *http.Request, err *util.I18nError, ip string) { +func (s *httpdServer) renderClientForgotPwdPage(w http.ResponseWriter, r *http.Request, err *util.I18nError) { data := forgotPwdPage{ commonBasePage: getCommonBasePage(r), CurrentURL: webClientForgotPwdPath, Error: err, - CSRFToken: createCSRFToken(ip), + CSRFToken: createCSRFToken(w, r, s.csrfTokenAuth, rand.Text(), webBaseClientPath), LoginURL: webClientLoginPath, Title: util.I18nForgotPwdTitle, - Branding: s.binding.Branding.WebClient, + Branding: s.binding.webClientBranding(), + Languages: s.binding.languages(), } renderClientTemplate(w, templateForgotPassword, data) } -func (s *httpdServer) renderClientResetPwdPage(w http.ResponseWriter, r *http.Request, err *util.I18nError, ip string) { +func (s *httpdServer) renderClientResetPwdPage(w http.ResponseWriter, r *http.Request, err *util.I18nError) { data := resetPwdPage{ commonBasePage: getCommonBasePage(r), CurrentURL: webClientResetPwdPath, Error: err, - CSRFToken: createCSRFToken(ip), + CSRFToken: createCSRFToken(w, r, s.csrfTokenAuth, "", webBaseClientPath), LoginURL: webClientLoginPath, Title: util.I18nResetPwdTitle, - Branding: s.binding.Branding.WebClient, + Branding: s.binding.webClientBranding(), + Languages: s.binding.languages(), } renderClientTemplate(w, templateResetPassword, data) } -func (s *httpdServer) renderShareLoginPage(w http.ResponseWriter, r *http.Request, err *util.I18nError, ip string) { +func (s *httpdServer) renderShareLoginPage(w http.ResponseWriter, r *http.Request, err *util.I18nError) { data := shareLoginPage{ commonBasePage: getCommonBasePage(r), Title: util.I18nShareLoginTitle, CurrentURL: r.RequestURI, Error: err, - CSRFToken: createCSRFToken(ip), - Branding: s.binding.Branding.WebClient, + CSRFToken: createCSRFToken(w, r, s.csrfTokenAuth, rand.Text(), webBaseClientPath), + Branding: s.binding.webClientBranding(), + Languages: s.binding.languages(), + CheckRedirect: false, } renderClientTemplate(w, templateShareLogin, data) } @@ -599,7 +617,7 @@ func renderClientTemplate(w http.ResponseWriter, tmplName string, data any) { func (s *httpdServer) renderClientMessagePage(w http.ResponseWriter, r *http.Request, title string, statusCode int, err error, message string) { data := clientMessagePage{ - baseClientPage: s.getBaseClientPageData(title, "", r), + baseClientPage: s.getBaseClientPageData(title, "", w, r), Error: getI18nError(err), Success: message, } @@ -627,15 +645,16 @@ func (s *httpdServer) renderClientNotFoundPage(w http.ResponseWriter, r *http.Re util.NewI18nError(err, util.I18nError404Message), "") } -func (s *httpdServer) renderClientTwoFactorPage(w http.ResponseWriter, r *http.Request, err *util.I18nError, ip string) { +func (s *httpdServer) renderClientTwoFactorPage(w http.ResponseWriter, r *http.Request, err *util.I18nError) { data := twoFactorPage{ commonBasePage: getCommonBasePage(r), - Title: pageTwoFactorTitle, + Title: util.I18n2FATitle, CurrentURL: webClientTwoFactorPath, Error: err, - CSRFToken: createCSRFToken(ip), + CSRFToken: createCSRFToken(w, r, s.csrfTokenAuth, "", webBaseClientPath), RecoveryURL: webClientTwoFactorRecoveryPath, - Branding: s.binding.Branding.WebClient, + Branding: s.binding.webClientBranding(), + Languages: s.binding.languages(), } if next := r.URL.Query().Get("next"); strings.HasPrefix(next, webClientFilesPath) { data.CurrentURL += "?next=" + url.QueryEscape(next) @@ -643,21 +662,22 @@ func (s *httpdServer) renderClientTwoFactorPage(w http.ResponseWriter, r *http.R renderClientTemplate(w, templateTwoFactor, data) } -func (s *httpdServer) renderClientTwoFactorRecoveryPage(w http.ResponseWriter, r *http.Request, err *util.I18nError, ip string) { +func (s *httpdServer) renderClientTwoFactorRecoveryPage(w http.ResponseWriter, r *http.Request, err *util.I18nError) { data := twoFactorPage{ commonBasePage: getCommonBasePage(r), - Title: pageTwoFactorRecoveryTitle, + Title: util.I18n2FATitle, CurrentURL: webClientTwoFactorRecoveryPath, Error: err, - CSRFToken: createCSRFToken(ip), - Branding: s.binding.Branding.WebClient, + CSRFToken: createCSRFToken(w, r, s.csrfTokenAuth, "", webBaseClientPath), + Branding: s.binding.webClientBranding(), + Languages: s.binding.languages(), } renderClientTemplate(w, templateTwoFactorRecovery, data) } func (s *httpdServer) renderClientMFAPage(w http.ResponseWriter, r *http.Request) { data := clientMFAPage{ - baseClientPage: s.getBaseClientPageData(util.I18n2FATitle, webClientMFAPath, r), + baseClientPage: s.getBaseClientPageData(util.I18n2FATitle, webClientMFAPath, w, r), TOTPConfigs: mfa.GetAvailableTOTPConfigNames(), GenerateTOTPURL: webClientTOTPGeneratePath, ValidateTOTPURL: webClientTOTPValidatePath, @@ -681,7 +701,7 @@ func (s *httpdServer) renderEditFilePage(w http.ResponseWriter, r *http.Request, title = util.I18nEditFileTitle } data := editFilePage{ - baseClientPage: s.getBaseClientPageData(title, webClientEditFilePath, r), + baseClientPage: s.getBaseClientPageData(title, webClientEditFilePath, w, r), Path: fileName, Name: path.Base(fileName), CurrentDir: path.Dir(fileName), @@ -701,8 +721,11 @@ func (s *httpdServer) renderAddUpdateSharePage(w http.ResponseWriter, r *http.Re currentURL = fmt.Sprintf("%v/%v", webClientSharePath, url.PathEscape(share.ShareID)) title = util.I18nShareUpdateTitle } + if share.IsPasswordHashed() { + share.Password = redactedSecret + } data := clientSharePage{ - baseClientPage: s.getBaseClientPageData(title, currentURL, r), + baseClientPage: s.getBaseClientPageData(title, currentURL, w, r), Share: share, Error: err, IsAdd: isAdd, @@ -736,9 +759,11 @@ func (s *httpdServer) renderSharedFilesPage(w http.ResponseWriter, r *http.Reque err *util.I18nError, share dataprovider.Share, ) { currentURL := path.Join(webClientPubSharesPath, share.ShareID, "browse") - baseData := s.getBaseClientPageData(util.I18nSharedFilesTitle, currentURL, r) + baseData := s.getBaseClientPageData(util.I18nSharedFilesTitle, currentURL, w, r) baseData.FilesURL = currentURL baseSharePath := path.Join(webClientPubSharesPath, share.ShareID) + baseData.LogoutURL = path.Join(webClientPubSharesPath, share.ShareID, "logout") + baseData.IsLoggedToShare = share.Password != "" data := filesPage{ baseClientPage: baseData, @@ -762,32 +787,44 @@ func (s *httpdServer) renderSharedFilesPage(w http.ResponseWriter, r *http.Reque CanCopy: false, Paths: getDirMapping(dirName, currentURL), QuotaUsage: newUserQuotaUsage(&dataprovider.User{}), + KeepAliveInterval: int(cookieRefreshThreshold / time.Millisecond), } renderClientTemplate(w, templateClientFiles, data) } -func (s *httpdServer) renderShareDownloadPage(w http.ResponseWriter, r *http.Request, downloadLink string) { +func (s *httpdServer) renderShareDownloadPage(w http.ResponseWriter, r *http.Request, share *dataprovider.Share, + downloadLink string, +) { data := shareDownloadPage{ - baseClientPage: s.getBaseClientPageData(util.I18nShareDownloadTitle, "", r), + baseClientPage: s.getBaseClientPageData(util.I18nShareDownloadTitle, "", w, r), DownloadLink: downloadLink, } + data.LogoutURL = "" + if share.Password != "" { + data.LogoutURL = path.Join(webClientPubSharesPath, share.ShareID, "logout") + } + renderClientTemplate(w, templateShareDownload, data) } -func (s *httpdServer) renderUploadToSharePage(w http.ResponseWriter, r *http.Request, share dataprovider.Share) { +func (s *httpdServer) renderUploadToSharePage(w http.ResponseWriter, r *http.Request, share *dataprovider.Share) { currentURL := path.Join(webClientPubSharesPath, share.ShareID, "upload") data := shareUploadPage{ - baseClientPage: s.getBaseClientPageData(util.I18nShareUploadTitle, currentURL, r), - Share: &share, + baseClientPage: s.getBaseClientPageData(util.I18nShareUploadTitle, currentURL, w, r), + Share: share, UploadBasePath: path.Join(webClientPubSharesPath, share.ShareID), } + data.LogoutURL = "" + if share.Password != "" { + data.LogoutURL = path.Join(webClientPubSharesPath, share.ShareID, "logout") + } renderClientTemplate(w, templateUploadToShare, data) } func (s *httpdServer) renderFilesPage(w http.ResponseWriter, r *http.Request, dirName string, err *util.I18nError, user *dataprovider.User) { data := filesPage{ - baseClientPage: s.getBaseClientPageData(util.I18nFilesTitle, webClientFilesPath, r), + baseClientPage: s.getBaseClientPageData(util.I18nFilesTitle, webClientFilesPath, w, r), Error: err, CurrentDir: url.QueryEscape(dirName), DownloadURL: webClientDownloadZipPath, @@ -807,13 +844,14 @@ func (s *httpdServer) renderFilesPage(w http.ResponseWriter, r *http.Request, di ShareUploadBaseURL: "", Paths: getDirMapping(dirName, webClientFilesPath), QuotaUsage: newUserQuotaUsage(user), + KeepAliveInterval: int(cookieRefreshThreshold / time.Millisecond), } renderClientTemplate(w, templateClientFiles, data) } func (s *httpdServer) renderClientProfilePage(w http.ResponseWriter, r *http.Request, err *util.I18nError) { data := clientProfilePage{ - baseClientPage: s.getBaseClientPageData(util.I18nProfileTitle, webClientProfilePath, r), + baseClientPage: s.getBaseClientPageData(util.I18nProfileTitle, webClientProfilePath, w, r), Error: err, } user, userMerged, errUser := dataprovider.GetUserVariants(data.LoggedUser.Username, "") @@ -825,6 +863,8 @@ func (s *httpdServer) renderClientProfilePage(w http.ResponseWriter, r *http.Req data.TLSCerts = user.Filters.TLSCerts data.AllowAPIKeyAuth = user.Filters.AllowAPIKeyAuth data.Email = user.Email + data.AdditionalEmails = user.Filters.AdditionalEmails + data.AdditionalEmailsString = strings.Join(data.AdditionalEmails, ", ") data.Description = user.Description data.CanSubmit = userMerged.CanUpdateProfile() renderClientTemplate(w, templateClientProfile, data) @@ -832,7 +872,7 @@ func (s *httpdServer) renderClientProfilePage(w http.ResponseWriter, r *http.Req func (s *httpdServer) renderClientChangePasswordPage(w http.ResponseWriter, r *http.Request, err *util.I18nError) { data := changeClientPasswordPage{ - baseClientPage: s.getBaseClientPageData(util.I18nChangePwdTitle, webChangeClientPwdPath, r), + baseClientPage: s.getBaseClientPageData(util.I18nChangePwdTitle, webChangeClientPwdPath, w, r), Error: err, } @@ -841,7 +881,7 @@ func (s *httpdServer) renderClientChangePasswordPage(w http.ResponseWriter, r *h func (s *httpdServer) handleWebClientDownloadZip(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxMultipartMem) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderClientForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -850,8 +890,7 @@ func (s *httpdServer) handleWebClientDownloadZip(w http.ResponseWriter, r *http. s.renderClientBadRequestPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm)) return } - ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderClientForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -866,15 +905,12 @@ func (s *httpdServer) handleWebClientDownloadZip(w http.ResponseWriter, r *http. connID := xid.New().String() protocol := getProtocolFromRequest(r) connectionID := fmt.Sprintf("%v_%v", protocol, connID) - if err := checkHTTPClientUser(&user, r, connectionID, false); err != nil { + if err := checkHTTPClientUser(&user, r, connectionID, false, false); err != nil { s.renderClientForbiddenPage(w, r, err) return } - connection := &Connection{ - BaseConnection: common.NewBaseConnection(connID, protocol, util.GetHTTPLocalAddress(r), - r.RemoteAddr, user), - request: r, - } + baseConn := common.NewBaseConnection(connID, protocol, util.GetHTTPLocalAddress(r), r.RemoteAddr, user) + connection := newConnection(baseConn, w, r) if err = common.Connections.Add(connection); err != nil { s.renderClientMessagePage(w, r, util.I18nError429Title, http.StatusTooManyRequests, util.NewI18nError(err, util.I18nError429Message), "") @@ -973,7 +1009,7 @@ func (s *httpdServer) handleShareGetDirContents(w http.ResponseWriter, r *http.R } defer lister.Close() - dataGetter := func(limit, _ int) ([]byte, int, error) { + dataGetter := func(limit, offset int) ([]byte, int, error) { contents, err := lister.Next(limit) if errors.Is(err, io.EOF) { err = nil @@ -982,11 +1018,12 @@ func (s *httpdServer) handleShareGetDirContents(w http.ResponseWriter, r *http.R return nil, 0, err } results := make([]map[string]any, 0, len(contents)) - for _, info := range contents { + for idx, info := range contents { if !info.Mode().IsDir() && !info.Mode().IsRegular() { continue } res := make(map[string]any) + res["id"] = offset + idx + 1 if info.IsDir() { res["type"] = "1" res["size"] = "" @@ -1023,7 +1060,7 @@ func (s *httpdServer) handleClientUploadToShare(w http.ResponseWriter, r *http.R http.Redirect(w, r, path.Join(webClientPubSharesPath, share.ShareID, "browse"), http.StatusFound) return } - s.renderUploadToSharePage(w, r, share) + s.renderUploadToSharePage(w, r, &share) } func (s *httpdServer) handleShareGetFiles(w http.ResponseWriter, r *http.Request) { @@ -1088,7 +1125,8 @@ func (s *httpdServer) handleShareViewPDF(w http.ResponseWriter, r *http.Request) Title: path.Base(name), URL: fmt.Sprintf("%s?path=%s&_=%d", path.Join(webClientPubSharesPath, share.ShareID, "getpdf"), url.QueryEscape(name), time.Now().UTC().Unix()), - Branding: s.binding.Branding.WebClient, + Branding: s.binding.webClientBranding(), + Languages: s.binding.languages(), } renderClientTemplate(w, templateClientViewPDF, data) } @@ -1140,7 +1178,7 @@ func (s *httpdServer) handleShareGetPDF(w http.ResponseWriter, r *http.Request) func (s *httpdServer) handleClientGetDirContents(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, nil, util.I18nErrorDirList403, http.StatusForbidden) return @@ -1155,15 +1193,12 @@ func (s *httpdServer) handleClientGetDirContents(w http.ResponseWriter, r *http. connID := xid.New().String() protocol := getProtocolFromRequest(r) connectionID := fmt.Sprintf("%s_%s", protocol, connID) - if err := checkHTTPClientUser(&user, r, connectionID, false); err != nil { + if err := checkHTTPClientUser(&user, r, connectionID, false, false); err != nil { sendAPIResponse(w, r, err, getI18NErrorString(err, util.I18nErrorDirList403), http.StatusForbidden) return } - connection := &Connection{ - BaseConnection: common.NewBaseConnection(connID, protocol, util.GetHTTPLocalAddress(r), - r.RemoteAddr, user), - request: r, - } + baseConn := common.NewBaseConnection(connID, protocol, util.GetHTTPLocalAddress(r), r.RemoteAddr, user) + connection := newConnection(baseConn, w, r) if err = common.Connections.Add(connection); err != nil { sendAPIResponse(w, r, err, util.I18nErrorDirList429, http.StatusTooManyRequests) return @@ -1180,7 +1215,7 @@ func (s *httpdServer) handleClientGetDirContents(w http.ResponseWriter, r *http. defer lister.Close() dirTree := r.URL.Query().Get("dirtree") == "1" - dataGetter := func(limit, _ int) ([]byte, int, error) { + dataGetter := func(limit, offset int) ([]byte, int, error) { contents, err := lister.Next(limit) if errors.Is(err, io.EOF) { err = nil @@ -1189,8 +1224,9 @@ func (s *httpdServer) handleClientGetDirContents(w http.ResponseWriter, r *http. return nil, 0, err } results := make([]map[string]any, 0, len(contents)) - for _, info := range contents { + for idx, info := range contents { res := make(map[string]any) + res["id"] = offset + idx + 1 res["url"] = getFileObjectURL(name, info.Name(), webClientFilesPath) if info.IsDir() { res["type"] = "1" @@ -1228,7 +1264,7 @@ func (s *httpdServer) handleClientGetDirContents(w http.ResponseWriter, r *http. func (s *httpdServer) handleClientGetFiles(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderClientForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -1244,15 +1280,12 @@ func (s *httpdServer) handleClientGetFiles(w http.ResponseWriter, r *http.Reques connID := xid.New().String() protocol := getProtocolFromRequest(r) connectionID := fmt.Sprintf("%v_%v", protocol, connID) - if err := checkHTTPClientUser(&user, r, connectionID, false); err != nil { + if err := checkHTTPClientUser(&user, r, connectionID, false, false); err != nil { s.renderClientForbiddenPage(w, r, err) return } - connection := &Connection{ - BaseConnection: common.NewBaseConnection(connID, protocol, util.GetHTTPLocalAddress(r), - r.RemoteAddr, user), - request: r, - } + baseConn := common.NewBaseConnection(connID, protocol, util.GetHTTPLocalAddress(r), r.RemoteAddr, user) + connection := newConnection(baseConn, w, r) if err = common.Connections.Add(connection); err != nil { s.renderClientMessagePage(w, r, util.I18nError429Title, http.StatusTooManyRequests, util.NewI18nError(err, util.I18nError429Message), "") @@ -1289,7 +1322,7 @@ func (s *httpdServer) handleClientGetFiles(w http.ResponseWriter, r *http.Reques func (s *httpdServer) handleClientEditFile(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderClientForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -1305,15 +1338,12 @@ func (s *httpdServer) handleClientEditFile(w http.ResponseWriter, r *http.Reques connID := xid.New().String() protocol := getProtocolFromRequest(r) connectionID := fmt.Sprintf("%v_%v", protocol, connID) - if err := checkHTTPClientUser(&user, r, connectionID, false); err != nil { + if err := checkHTTPClientUser(&user, r, connectionID, false, false); err != nil { s.renderClientForbiddenPage(w, r, err) return } - connection := &Connection{ - BaseConnection: common.NewBaseConnection(connID, protocol, util.GetHTTPLocalAddress(r), - r.RemoteAddr, user), - request: r, - } + baseConn := common.NewBaseConnection(connID, protocol, util.GetHTTPLocalAddress(r), r.RemoteAddr, user) + connection := newConnection(baseConn, w, r) if err = common.Connections.Add(connection); err != nil { s.renderClientMessagePage(w, r, util.I18nError429Title, http.StatusTooManyRequests, util.NewI18nError(err, util.I18nError429Message), "") @@ -1368,7 +1398,7 @@ func (s *httpdServer) handleClientEditFile(w http.ResponseWriter, r *http.Reques func (s *httpdServer) handleClientAddShareGet(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderClientForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -1410,7 +1440,7 @@ func (s *httpdServer) handleClientAddShareGet(w http.ResponseWriter, r *http.Req func (s *httpdServer) handleClientUpdateShareGet(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderClientForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -1418,7 +1448,6 @@ func (s *httpdServer) handleClientUpdateShareGet(w http.ResponseWriter, r *http. shareID := getURLParam(r, "id") share, err := dataprovider.ShareExists(shareID, claims.Username) if err == nil { - share.HideConfidentialData() s.renderAddUpdateSharePage(w, r, &share, nil, false) } else if errors.Is(err, util.ErrNotFound) { s.renderClientNotFoundPage(w, r, err) @@ -1429,7 +1458,7 @@ func (s *httpdServer) handleClientUpdateShareGet(w http.ResponseWriter, r *http. func (s *httpdServer) handleClientAddSharePost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderClientForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -1440,7 +1469,7 @@ func (s *httpdServer) handleClientAddSharePost(w http.ResponseWriter, r *http.Re return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderClientForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -1449,7 +1478,7 @@ func (s *httpdServer) handleClientAddSharePost(w http.ResponseWriter, r *http.Re share.LastUseAt = 0 share.Username = claims.Username if share.Password == "" { - if util.Contains(claims.Permissions, sdk.WebClientShareNoPasswordDisabled) { + if slices.Contains(claims.Permissions, sdk.WebClientShareNoPasswordDisabled) { s.renderAddUpdateSharePage(w, r, share, util.NewI18nError(util.NewValidationError("You are not allowed to share files/folders without password"), util.I18nErrorShareNoPwd), true) @@ -1488,7 +1517,7 @@ func (s *httpdServer) handleClientAddSharePost(w http.ResponseWriter, r *http.Re func (s *httpdServer) handleClientUpdateSharePost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderClientForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -1508,7 +1537,7 @@ func (s *httpdServer) handleClientUpdateSharePost(w http.ResponseWriter, r *http return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderClientForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } @@ -1518,7 +1547,7 @@ func (s *httpdServer) handleClientUpdateSharePost(w http.ResponseWriter, r *http updatedShare.Password = share.Password } if updatedShare.Password == "" { - if util.Contains(claims.Permissions, sdk.WebClientShareNoPasswordDisabled) { + if slices.Contains(claims.Permissions, sdk.WebClientShareNoPasswordDisabled) { s.renderAddUpdateSharePage(w, r, updatedShare, util.NewI18nError(util.NewValidationError("You are not allowed to share files/folders without password"), util.I18nErrorShareNoPwd), false) @@ -1557,7 +1586,7 @@ func (s *httpdServer) handleClientUpdateSharePost(w http.ResponseWriter, r *http func getAllShares(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, nil, util.I18nErrorInvalidToken, http.StatusForbidden) return @@ -1579,8 +1608,9 @@ func (s *httpdServer) handleClientGetShares(w http.ResponseWriter, r *http.Reque r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) data := clientSharesPage{ - baseClientPage: s.getBaseClientPageData(util.I18nSharesTitle, webClientSharesPath, r), + baseClientPage: s.getBaseClientPageData(util.I18nSharesTitle, webClientSharesPath, w, r), BasePublicSharesURL: webClientPubSharesPath, + BaseURL: s.binding.BaseURL, } renderClientTemplate(w, templateClientShares, data) } @@ -1603,11 +1633,11 @@ func (s *httpdServer) handleWebClientProfilePost(w http.ResponseWriter, r *http. return } ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderClientForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderClientForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -1646,6 +1676,15 @@ func (s *httpdServer) handleWebClientProfilePost(w http.ResponseWriter, r *http. if userMerged.CanChangeInfo() { user.Email = strings.TrimSpace(r.Form.Get("email")) user.Description = r.Form.Get("description") + for k := range r.Form { + if hasPrefixAndSuffix(k, "additional_emails[", "][additional_email]") { + email := strings.TrimSpace(r.Form.Get(k)) + if email != "" { + r.Form.Add("additional_emails", email) + } + } + } + user.Filters.AdditionalEmails = r.Form["additional_emails"] } err = dataprovider.UpdateUser(&user, dataprovider.ActionExecutorSelf, ipAddr, user.Role) if err != nil { @@ -1662,12 +1701,12 @@ func (s *httpdServer) handleWebClientMFA(w http.ResponseWriter, r *http.Request) func (s *httpdServer) handleWebClientTwoFactor(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - s.renderClientTwoFactorPage(w, r, nil, util.GetIPFromRemoteAddress(r.RemoteAddr)) + s.renderClientTwoFactorPage(w, r, nil) } func (s *httpdServer) handleWebClientTwoFactorRecovery(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - s.renderClientTwoFactorRecoveryPage(w, r, nil, util.GetIPFromRemoteAddress(r.RemoteAddr)) + s.renderClientTwoFactorRecoveryPage(w, r, nil) } func getShareFromPostFields(r *http.Request) (*dataprovider.Share, error) { @@ -1719,26 +1758,25 @@ func (s *httpdServer) handleWebClientForgotPwd(w http.ResponseWriter, r *http.Re s.renderClientNotFoundPage(w, r, errors.New("this page does not exist")) return } - s.renderClientForgotPwdPage(w, r, nil, util.GetIPFromRemoteAddress(r.RemoteAddr)) + s.renderClientForgotPwdPage(w, r, nil) } func (s *httpdServer) handleWebClientForgotPwdPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) err := r.ParseForm() if err != nil { - s.renderClientForgotPwdPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm), ipAddr) + s.renderClientForgotPwdPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm)) return } - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { + if err := verifyLoginCookieAndCSRFToken(r, s.csrfTokenAuth); err != nil { s.renderClientForbiddenPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } username := strings.TrimSpace(r.Form.Get("username")) err = handleForgotPassword(r, username, false) if err != nil { - s.renderClientForgotPwdPage(w, r, util.NewI18nError(err, util.I18nErrorPwdResetGeneric), ipAddr) + s.renderClientForgotPwdPage(w, r, util.NewI18nError(err, util.I18nErrorPwdResetGeneric)) return } http.Redirect(w, r, webClientResetPwdPath, http.StatusFound) @@ -1750,7 +1788,7 @@ func (s *httpdServer) handleWebClientPasswordReset(w http.ResponseWriter, r *htt s.renderClientNotFoundPage(w, r, errors.New("this page does not exist")) return } - s.renderClientResetPwdPage(w, r, nil, util.GetIPFromRemoteAddress(r.RemoteAddr)) + s.renderClientResetPwdPage(w, r, nil) } func (s *httpdServer) handleClientViewPDF(w http.ResponseWriter, r *http.Request) { @@ -1765,14 +1803,15 @@ func (s *httpdServer) handleClientViewPDF(w http.ResponseWriter, r *http.Request commonBasePage: getCommonBasePage(r), Title: path.Base(name), URL: fmt.Sprintf("%s?path=%s&_=%d", webClientGetPDFPath, url.QueryEscape(name), time.Now().UTC().Unix()), - Branding: s.binding.Branding.WebClient, + Branding: s.binding.webClientBranding(), + Languages: s.binding.languages(), } renderClientTemplate(w, templateClientViewPDF, data) } func (s *httpdServer) handleClientGetPDF(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxLoginBodySize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { s.renderClientForbiddenPage(w, r, util.NewI18nError(errInvalidTokenClaims, util.I18nErrorInvalidToken)) return @@ -1793,15 +1832,12 @@ func (s *httpdServer) handleClientGetPDF(w http.ResponseWriter, r *http.Request) connID := xid.New().String() protocol := getProtocolFromRequest(r) connectionID := fmt.Sprintf("%v_%v", protocol, connID) - if err := checkHTTPClientUser(&user, r, connectionID, false); err != nil { + if err := checkHTTPClientUser(&user, r, connectionID, false, false); err != nil { s.renderClientForbiddenPage(w, r, err) return } - connection := &Connection{ - BaseConnection: common.NewBaseConnection(connID, protocol, util.GetHTTPLocalAddress(r), - r.RemoteAddr, user), - request: r, - } + baseConn := common.NewBaseConnection(connID, protocol, util.GetHTTPLocalAddress(r), r.RemoteAddr, user) + connection := newConnection(baseConn, w, r) if err = common.Connections.Add(connection); err != nil { s.renderClientMessagePage(w, r, util.I18nError429Title, http.StatusTooManyRequests, util.NewI18nError(err, util.I18nError429Message), "") @@ -1853,43 +1889,46 @@ func (s *httpdServer) ensurePDF(w http.ResponseWriter, r *http.Request, name str func (s *httpdServer) handleClientShareLoginGet(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxLoginBodySize) - s.renderShareLoginPage(w, r, nil, util.GetIPFromRemoteAddress(r.RemoteAddr)) + s.renderShareLoginPage(w, r, nil) } func (s *httpdServer) handleClientShareLoginPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxLoginBodySize) ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr) if err := r.ParseForm(); err != nil { - s.renderShareLoginPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm), ipAddr) + s.renderShareLoginPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidForm)) return } - if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil { - s.renderShareLoginPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF), ipAddr) + if err := verifyLoginCookieAndCSRFToken(r, s.csrfTokenAuth); err != nil { + s.renderShareLoginPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCSRF)) return } + invalidateToken(r) shareID := getURLParam(r, "id") share, err := dataprovider.ShareExists(shareID, "") if err != nil { - s.renderShareLoginPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCredentials), ipAddr) + s.renderShareLoginPage(w, r, util.NewI18nError(err, util.I18nErrorInvalidCredentials)) return } match, err := share.CheckCredentials(strings.TrimSpace(r.Form.Get("share_password"))) if !match || err != nil { - s.renderShareLoginPage(w, r, util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials), - ipAddr) - return - } - c := jwtTokenClaims{ - Username: shareID, - } - err = c.createAndSetCookie(w, r, s.tokenAuth, tokenAudienceWebShare, ipAddr) - if err != nil { - s.renderShareLoginPage(w, r, util.NewI18nError(err, util.I18nError500Message), ipAddr) + s.renderShareLoginPage(w, r, util.NewI18nError(dataprovider.ErrInvalidCredentials, util.I18nErrorInvalidCredentials)) return } next := path.Clean(r.URL.Query().Get("next")) baseShareURL := path.Join(webClientPubSharesPath, share.ShareID) isRedirect, redirectTo := checkShareRedirectURL(next, baseShareURL) + c := &jwt.Claims{ + Username: shareID, + } + if isRedirect { + c.Ref = next + } + err = createAndSetCookie(w, r, c, s.tokenAuth, tokenAudienceWebShare, ipAddr) + if err != nil { + s.renderShareLoginPage(w, r, util.NewI18nError(err, util.I18nError500Message)) + return + } if isRedirect { http.Redirect(w, r, redirectTo, http.StatusFound) return @@ -1897,6 +1936,22 @@ func (s *httpdServer) handleClientShareLoginPost(w http.ResponseWriter, r *http. s.renderClientMessagePage(w, r, util.I18nSharedFilesTitle, http.StatusOK, nil, util.I18nShareLoginOK) } +func (s *httpdServer) handleClientShareLogout(w http.ResponseWriter, r *http.Request) { + r.Body = http.MaxBytesReader(w, r.Body, maxLoginBodySize) + + shareID := getURLParam(r, "id") + ctx, claims, err := s.getShareClaims(r, shareID) + if err != nil { + s.renderClientMessagePage(w, r, util.I18nShareAccessErrorTitle, http.StatusForbidden, + util.NewI18nError(err, util.I18nErrorInvalidToken), "") + return + } + removeCookie(w, r.WithContext(ctx), webBaseClientPath) + + redirectURL := path.Join(webClientPubSharesPath, shareID, fmt.Sprintf("login?next=%s", url.QueryEscape(claims.Ref))) + http.Redirect(w, r, redirectURL, http.StatusFound) +} + func (s *httpdServer) handleClientSharedFile(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) validScopes := []dataprovider.ShareScope{dataprovider.ShareScopeRead} @@ -1908,7 +1963,7 @@ func (s *httpdServer) handleClientSharedFile(w http.ResponseWriter, r *http.Requ if r.URL.RawQuery != "" { query = "?" + r.URL.RawQuery } - s.renderShareDownloadPage(w, r, path.Join(webClientPubSharesPath, share.ShareID)+query) + s.renderShareDownloadPage(w, r, &share, path.Join(webClientPubSharesPath, share.ShareID)+query) } func (s *httpdServer) handleClientCheckExist(w http.ResponseWriter, r *http.Request) { @@ -1983,7 +2038,7 @@ func doCheckExist(w http.ResponseWriter, r *http.Request, connection *Connection } existing := make([]map[string]any, 0) for _, info := range contents { - if util.Contains(filesList.Files, info.Name()) { + if slices.Contains(filesList.Files, info.Name()) { res := make(map[string]any) res["name"] = info.Name() if info.IsDir() { @@ -2031,7 +2086,7 @@ func checkShareRedirectURL(next, base string) (bool, string) { func getWebTask(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxLoginBodySize) - claims, err := getTokenClaims(r) + claims, err := jwt.FromContext(r.Context()) if err != nil || claims.Username == "" { sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest) return diff --git a/internal/httpd/webtask.go b/internal/httpd/webtask.go index 8375c9c0..0c328c06 100644 --- a/internal/httpd/webtask.go +++ b/internal/httpd/webtask.go @@ -93,7 +93,7 @@ func (m *dbTaskManager) Add(data webTaskData) error { } func (m *dbTaskManager) Get(ID string) (webTaskData, error) { - sess, err := dataprovider.GetSharedSession(ID) + sess, err := dataprovider.GetSharedSession(ID, dataprovider.SessionTypeWebTask) if err != nil { return webTaskData{}, err } diff --git a/internal/httpdtest/httpdtest.go b/internal/httpdtest/httpdtest.go index 382e2ca0..bacfa675 100644 --- a/internal/httpdtest/httpdtest.go +++ b/internal/httpdtest/httpdtest.go @@ -25,6 +25,7 @@ import ( "net/http" "net/url" "path" + "slices" "strconv" "strings" @@ -36,7 +37,6 @@ import ( "github.com/drakkan/sftpgo/v2/internal/httpclient" "github.com/drakkan/sftpgo/v2/internal/httpd" "github.com/drakkan/sftpgo/v2/internal/kms" - "github.com/drakkan/sftpgo/v2/internal/util" "github.com/drakkan/sftpgo/v2/internal/version" "github.com/drakkan/sftpgo/v2/internal/vfs" ) @@ -58,7 +58,6 @@ const ( adminPath = "/api/v2/admins" adminPwdPath = "/api/v2/admin/changepwd" apiKeysPath = "/api/v2/apikeys" - retentionBasePath = "/api/v2/retention/users" retentionChecksPath = "/api/v2/retention/users/checks" eventActionsPath = "/api/v2/eventactions" eventRulesPath = "/api/v2/eventrules" @@ -1173,20 +1172,6 @@ func GetRetentionChecks(expectedStatusCode int) ([]common.ActiveRetentionChecks, return checks, body, err } -// StartRetentionCheck starts a new retention check -func StartRetentionCheck(username string, retention []dataprovider.FolderRetention, expectedStatusCode int) ([]byte, error) { - var body []byte - asJSON, _ := json.Marshal(retention) - resp, err := sendHTTPRequest(http.MethodPost, buildURLRelativeToBase(retentionBasePath, username, "check"), - bytes.NewBuffer(asJSON), "application/json", getDefaultToken()) - if err != nil { - return body, err - } - defer resp.Body.Close() - body, _ = getResponseBody(resp) - return body, checkResponse(resp.StatusCode, expectedStatusCode) -} - // GetConnections returns status and stats for active SFTP/SCP connections func GetConnections(expectedStatusCode int) ([]common.ConnectionStatus, []byte, error) { var connections []common.ConnectionStatus @@ -1662,7 +1647,7 @@ func compareConditionPatternOptions(expected, actual []dataprovider.ConditionPat return nil } -func checkEventConditionOptions(expected, actual dataprovider.ConditionOptions) error { +func checkEventConditionOptions(expected, actual dataprovider.ConditionOptions) error { //nolint:gocyclo if err := compareConditionPatternOptions(expected.Names, actual.Names); err != nil { return errors.New("condition names mismatch") } @@ -1679,15 +1664,23 @@ func checkEventConditionOptions(expected, actual dataprovider.ConditionOptions) return errors.New("condition protocols mismatch") } for _, v := range expected.Protocols { - if !util.Contains(actual.Protocols, v) { + if !slices.Contains(actual.Protocols, v) { return errors.New("condition protocols content mismatch") } } + if len(expected.EventStatuses) != len(actual.EventStatuses) { + return errors.New("condition statuses mismatch") + } + for _, v := range expected.EventStatuses { + if !slices.Contains(actual.EventStatuses, v) { + return errors.New("condition statuses content mismatch") + } + } if len(expected.ProviderObjects) != len(actual.ProviderObjects) { return errors.New("condition provider objects mismatch") } for _, v := range expected.ProviderObjects { - if !util.Contains(actual.ProviderObjects, v) { + if !slices.Contains(actual.ProviderObjects, v) { return errors.New("condition provider objects content mismatch") } } @@ -1705,7 +1698,7 @@ func checkEventConditions(expected, actual dataprovider.EventConditions) error { return errors.New("fs events mismatch") } for _, v := range expected.FsEvents { - if !util.Contains(actual.FsEvents, v) { + if !slices.Contains(actual.FsEvents, v) { return errors.New("fs events content mismatch") } } @@ -1713,7 +1706,7 @@ func checkEventConditions(expected, actual dataprovider.EventConditions) error { return errors.New("provider events mismatch") } for _, v := range expected.ProviderEvents { - if !util.Contains(actual.ProviderEvents, v) { + if !slices.Contains(actual.ProviderEvents, v) { return errors.New("provider events content mismatch") } } @@ -1948,7 +1941,7 @@ func checkAdmin(expected, actual *dataprovider.Admin) error { return errors.New("permissions mismatch") } for _, p := range expected.Permissions { - if !util.Contains(actual.Permissions, p) { + if !slices.Contains(actual.Permissions, p) { return errors.New("permissions content mismatch") } } @@ -1966,7 +1959,7 @@ func compareAdminFilters(expected, actual dataprovider.AdminFilters) error { return errors.New("allow list mismatch") } for _, v := range expected.AllowList { - if !util.Contains(actual.AllowList, v) { + if !slices.Contains(actual.AllowList, v) { return errors.New("allow list content mismatch") } } @@ -2029,6 +2022,9 @@ func checkUser(expected *dataprovider.User, actual *dataprovider.User) error { if expected.Email != actual.Email { return errors.New("email mismatch") } + if !slices.Equal(expected.Filters.AdditionalEmails, actual.Filters.AdditionalEmails) { + return errors.New("additional emails mismatch") + } if expected.Filters.RequirePasswordChange != actual.Filters.RequirePasswordChange { return errors.New("require_password_change mismatch") } @@ -2057,7 +2053,7 @@ func compareUserPermissions(expected map[string][]string, actual map[string][]st for dir, perms := range expected { if actualPerms, ok := actual[dir]; ok { for _, v := range actualPerms { - if !util.Contains(perms, v) { + if !slices.Contains(perms, v) { return errors.New("permissions contents mismatch") } } @@ -2188,6 +2184,9 @@ func compareS3Config(expected *vfs.Filesystem, actual *vfs.Filesystem) error { / if err := checkEncryptedSecret(expected.S3Config.AccessSecret, actual.S3Config.AccessSecret); err != nil { return fmt.Errorf("fs S3 access secret mismatch: %v", err) } + if err := checkEncryptedSecret(expected.S3Config.SSECustomerKey, actual.S3Config.SSECustomerKey); err != nil { + return fmt.Errorf("fs S3 SSE customer key mismatch: %v", err) + } if expected.S3Config.Endpoint != actual.S3Config.Endpoint { return errors.New("fs S3 endpoint mismatch") } @@ -2310,7 +2309,7 @@ func compareSFTPFsConfig(expected *vfs.Filesystem, actual *vfs.Filesystem) error return errors.New("SFTPFs fingerprints mismatch") } for _, value := range actual.SFTPConfig.Fingerprints { - if !util.Contains(expected.SFTPConfig.Fingerprints, value) { + if !slices.Contains(expected.SFTPConfig.Fingerprints, value) { return errors.New("SFTPFs fingerprints mismatch") } } @@ -2401,27 +2400,27 @@ func checkEncryptedSecret(expected, actual *kms.Secret) error { func compareUserFilterSubStructs(expected sdk.BaseUserFilters, actual sdk.BaseUserFilters) error { for _, IPMask := range expected.AllowedIP { - if !util.Contains(actual.AllowedIP, IPMask) { + if !slices.Contains(actual.AllowedIP, IPMask) { return errors.New("allowed IP contents mismatch") } } for _, IPMask := range expected.DeniedIP { - if !util.Contains(actual.DeniedIP, IPMask) { + if !slices.Contains(actual.DeniedIP, IPMask) { return errors.New("denied IP contents mismatch") } } for _, method := range expected.DeniedLoginMethods { - if !util.Contains(actual.DeniedLoginMethods, method) { + if !slices.Contains(actual.DeniedLoginMethods, method) { return errors.New("denied login methods contents mismatch") } } for _, protocol := range expected.DeniedProtocols { - if !util.Contains(actual.DeniedProtocols, protocol) { + if !slices.Contains(actual.DeniedProtocols, protocol) { return errors.New("denied protocols contents mismatch") } } for _, options := range expected.WebClient { - if !util.Contains(actual.WebClient, options) { + if !slices.Contains(actual.WebClient, options) { return errors.New("web client options contents mismatch") } } @@ -2430,7 +2429,7 @@ func compareUserFilterSubStructs(expected sdk.BaseUserFilters, actual sdk.BaseUs return errors.New("TLS certs mismatch") } for _, cert := range expected.TLSCerts { - if !util.Contains(actual.TLSCerts, cert) { + if !slices.Contains(actual.TLSCerts, cert) { return errors.New("TLS certs content mismatch") } } @@ -2527,7 +2526,7 @@ func checkFilterMatch(expected []string, actual []string) bool { return false } for _, e := range expected { - if !util.Contains(actual, strings.ToLower(e)) { + if !slices.Contains(actual, strings.ToLower(e)) { return false } } @@ -2570,7 +2569,7 @@ func compareUserBandwidthLimitFilters(expected sdk.BaseUserFilters, actual sdk.B return errors.New("bandwidth filters sources mismatch") } for _, source := range actual.BandwidthLimits[idx].Sources { - if !util.Contains(l.Sources, source) { + if !slices.Contains(l.Sources, source) { return errors.New("bandwidth filters source mismatch") } } @@ -2601,9 +2600,28 @@ func compareUserFilePatternsFilters(expected sdk.BaseUserFilters, actual sdk.Bas return nil } +func compareRenameConfigs(expected, actual []dataprovider.RenameConfig) error { + if len(expected) != len(actual) { + return errors.New("rename configs mismatch") + } + for _, ex := range expected { + found := false + for _, ac := range actual { + if ac.Key == ex.Key && ac.Value == ex.Value && ac.UpdateModTime == ex.UpdateModTime { + found = true + break + } + } + if !found { + return errors.New("rename configs mismatch") + } + } + return nil +} + func compareKeyValues(expected, actual []dataprovider.KeyValue) error { if len(expected) != len(actual) { - return errors.New("kay values mismatch") + return errors.New("key values mismatch") } for _, ex := range expected { found := false @@ -2614,7 +2632,7 @@ func compareKeyValues(expected, actual []dataprovider.KeyValue) error { } } if !found { - return errors.New("kay values mismatch") + return errors.New("key values mismatch") } } return nil @@ -2680,7 +2698,7 @@ func compareEventActionEmailConfigFields(expected, actual dataprovider.EventActi return errors.New("email recipients mismatch") } for _, v := range expected.Recipients { - if !util.Contains(actual.Recipients, v) { + if !slices.Contains(actual.Recipients, v) { return errors.New("email recipients content mismatch") } } @@ -2688,7 +2706,7 @@ func compareEventActionEmailConfigFields(expected, actual dataprovider.EventActi return errors.New("email bcc mismatch") } for _, v := range expected.Bcc { - if !util.Contains(actual.Bcc, v) { + if !slices.Contains(actual.Bcc, v) { return errors.New("email bcc content mismatch") } } @@ -2705,7 +2723,7 @@ func compareEventActionEmailConfigFields(expected, actual dataprovider.EventActi return errors.New("email attachments mismatch") } for _, v := range expected.Attachments { - if !util.Contains(actual.Attachments, v) { + if !slices.Contains(actual.Attachments, v) { return errors.New("email attachments content mismatch") } } @@ -2720,7 +2738,7 @@ func compareEventActionFsCompressFields(expected, actual dataprovider.EventActio return errors.New("fs compress paths mismatch") } for _, v := range expected.Paths { - if !util.Contains(actual.Paths, v) { + if !slices.Contains(actual.Paths, v) { return errors.New("fs compress paths content mismatch") } } @@ -2731,7 +2749,7 @@ func compareEventActionFsConfigFields(expected, actual dataprovider.EventActionF if expected.Type != actual.Type { return errors.New("fs type mismatch") } - if err := compareKeyValues(expected.Renames, actual.Renames); err != nil { + if err := compareRenameConfigs(expected.Renames, actual.Renames); err != nil { return errors.New("fs renames mismatch") } if err := compareKeyValues(expected.Copy, actual.Copy); err != nil { @@ -2741,7 +2759,7 @@ func compareEventActionFsConfigFields(expected, actual dataprovider.EventActionF return errors.New("fs deletes mismatch") } for _, v := range expected.Deletes { - if !util.Contains(actual.Deletes, v) { + if !slices.Contains(actual.Deletes, v) { return errors.New("fs deletes content mismatch") } } @@ -2749,7 +2767,7 @@ func compareEventActionFsConfigFields(expected, actual dataprovider.EventActionF return errors.New("fs mkdirs mismatch") } for _, v := range expected.MkDirs { - if !util.Contains(actual.MkDirs, v) { + if !slices.Contains(actual.MkDirs, v) { return errors.New("fs mkdir content mismatch") } } @@ -2757,7 +2775,7 @@ func compareEventActionFsConfigFields(expected, actual dataprovider.EventActionF return errors.New("fs exist mismatch") } for _, v := range expected.Exist { - if !util.Contains(actual.Exist, v) { + if !slices.Contains(actual.Exist, v) { return errors.New("fs exist content mismatch") } } @@ -2788,7 +2806,7 @@ func compareEventActionCmdConfigFields(expected, actual dataprovider.EventAction return errors.New("cmd args mismatch") } for _, v := range expected.Args { - if !util.Contains(actual.Args, v) { + if !slices.Contains(actual.Args, v) { return errors.New("cmd args content mismatch") } } diff --git a/internal/jwt/jwt.go b/internal/jwt/jwt.go new file mode 100644 index 00000000..01493bc4 --- /dev/null +++ b/internal/jwt/jwt.go @@ -0,0 +1,268 @@ +// Copyright (C) 2025 Nicola Murino +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, version 3. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Package jwt provides functionality for creating, parsing, and validating +// JSON Web Tokens (JWT) used in authentication and authorization workflows. +package jwt + +import ( + "context" + "errors" + "fmt" + "net/http" + "slices" + "strings" + "time" + + "github.com/go-jose/go-jose/v4" + "github.com/go-jose/go-jose/v4/jwt" + "github.com/rs/xid" +) + +const ( + CookieKey = "jwt" +) + +var ( + TokenCtxKey = &contextKey{"Token"} + ErrorCtxKey = &contextKey{"Error"} +) + +// contextKey is a value for use with context.WithValue. It's used as +// a pointer so it fits in an interface{} without allocation. This technique +// for defining context keys was copied from Go 1.7's new use of context in net/http. +type contextKey struct { + name string +} + +func (k *contextKey) String() string { + return "jwt context value " + k.name +} + +func NewClaims(audience, ip string, duration time.Duration) *Claims { + now := time.Now() + claims := &Claims{} + claims.IssuedAt = jwt.NewNumericDate(now) + claims.NotBefore = jwt.NewNumericDate(now.Add(-10 * time.Second)) + claims.Expiry = jwt.NewNumericDate(now.Add(duration)) + claims.Audience = []string{audience, ip} + return claims +} + +type Claims struct { + jwt.Claims + Username string `json:"username,omitempty"` + Permissions []string `json:"permissions,omitempty"` + Role string `json:"role,omitempty"` + APIKeyID string `json:"api_key,omitempty"` + NodeID string `json:"node_id,omitempty"` + MustSetTwoFactorAuth bool `json:"2fa_required,omitempty"` + MustChangePassword bool `json:"chpwd,omitempty"` + RequiredTwoFactorProtocols []string `json:"2fa_protos,omitempty"` + HideUserPageSections int `json:"hus,omitempty"` + Ref string `json:"ref,omitempty"` +} + +func (c *Claims) SetIssuedAt(t time.Time) { + c.IssuedAt = jwt.NewNumericDate(t) +} + +func (c *Claims) SetNotBefore(t time.Time) { + c.NotBefore = jwt.NewNumericDate(t) +} + +func (c *Claims) SetExpiry(t time.Time) { + c.Expiry = jwt.NewNumericDate(t) +} + +func (c *Claims) HasPerm(perm string) bool { + for _, p := range c.Permissions { + if p == "*" || p == perm { + return true + } + } + return false +} + +func (c *Claims) HasAnyAudience(audiences []string) bool { + for _, a := range c.Audience { + if slices.Contains(audiences, a) { + return true + } + } + return false +} + +func (c *Claims) GenerateTokenResponse(signer *Signer) (TokenResponse, error) { + token, err := signer.Sign(c) + if err != nil { + return TokenResponse{}, err + } + return c.BuildTokenResponse(token), nil +} + +func (c *Claims) BuildTokenResponse(token string) TokenResponse { + return TokenResponse{Token: token, Expiry: c.Expiry.Time().UTC().Format(time.RFC3339)} +} + +type TokenResponse struct { + Token string `json:"access_token"` + Expiry string `json:"expires_at"` +} + +func NewSigner(algo jose.SignatureAlgorithm, key any) (*Signer, error) { + opts := (&jose.SignerOptions{}).WithType("JWT") + signer, err := jose.NewSigner(jose.SigningKey{Algorithm: algo, Key: key}, opts) + if err != nil { + return nil, err + } + return &Signer{ + signer: signer, + algo: []jose.SignatureAlgorithm{algo}, + key: key, + }, nil +} + +type Signer struct { + algo []jose.SignatureAlgorithm + signer jose.Signer + key any +} + +func (s *Signer) Sign(claims *Claims) (string, error) { + if claims.ID == "" { + claims.ID = xid.New().String() + } + if claims.IssuedAt == nil { + claims.IssuedAt = jwt.NewNumericDate(time.Now()) + } + if claims.NotBefore == nil { + claims.NotBefore = jwt.NewNumericDate(time.Now().Add(-10 * time.Second)) + } + if claims.Expiry == nil { + return "", errors.New("expiration must be set") + } + if len(claims.Audience) == 0 { + return "", errors.New("audience must be set") + } + + return jwt.Signed(s.signer).Claims(claims).Serialize() +} + +func (s *Signer) Signer() jose.Signer { + return s.signer +} + +func (s *Signer) SetSigner(signer jose.Signer) { + s.signer = signer +} + +func (s *Signer) SignWithParams(claims *Claims, audience, ip string, duration time.Duration) (string, error) { + claims.Expiry = jwt.NewNumericDate(time.Now().Add(duration)) + claims.Audience = []string{audience, ip} + return s.Sign(claims) +} + +func NewContext(ctx context.Context, claims *Claims, err error) context.Context { + ctx = context.WithValue(ctx, TokenCtxKey, claims) + ctx = context.WithValue(ctx, ErrorCtxKey, err) + return ctx +} + +func FromContext(ctx context.Context) (*Claims, error) { + val := ctx.Value(TokenCtxKey) + token, ok := val.(*Claims) + if !ok && val != nil { + return nil, fmt.Errorf("invalid type for TokenCtxKey: %T", val) + } + + valErr := ctx.Value(ErrorCtxKey) + err, ok := valErr.(error) + if !ok && valErr != nil { + return nil, fmt.Errorf("invalid type for ErrorCtxKey: %T", valErr) + } + if token == nil { + return nil, errors.New("no token found") + } + + return token, err +} + +func Verify(s *Signer, findTokenFns ...func(r *http.Request) string) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + hfn := func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + token, err := VerifyRequest(s, r, findTokenFns...) + ctx = NewContext(ctx, token, err) + next.ServeHTTP(w, r.WithContext(ctx)) + } + return http.HandlerFunc(hfn) + } +} + +func VerifyRequest(s *Signer, r *http.Request, findTokenFns ...func(r *http.Request) string) (*Claims, error) { + var tokenString string + for _, fn := range findTokenFns { + tokenString = fn(r) + if tokenString != "" { + break + } + } + if tokenString == "" { + return nil, errors.New("no token found") + } + return VerifyToken(s, tokenString) +} + +func VerifyToken(s *Signer, payload string) (*Claims, error) { + return VerifyTokenWithKey(payload, s.algo, s.key) +} + +func VerifyTokenWithKey(payload string, algo []jose.SignatureAlgorithm, key any) (*Claims, error) { + token, err := jwt.ParseSigned(payload, algo) + if err != nil { + return nil, err + } + var claims Claims + err = token.Claims(key, &claims) + if err != nil { + return nil, err + } + if err := claims.ValidateWithLeeway(jwt.Expected{Time: time.Now()}, 30*time.Second); err != nil { + return nil, err + } + return &claims, nil +} + +// TokenFromCookie tries to retrieve the token string from a cookie named +// "jwt". +func TokenFromCookie(r *http.Request) string { + cookie, err := r.Cookie(CookieKey) + if err != nil { + return "" + } + return cookie.Value +} + +// TokenFromHeader tries to retrieve the token string from the +// "Authorization" request header: "Authorization: BEARER T". +func TokenFromHeader(r *http.Request) string { + // Get token from authorization header. + bearer := r.Header.Get("Authorization") + const prefix = "Bearer " + if len(bearer) >= len(prefix) && strings.EqualFold(bearer[:len(prefix)], prefix) { + return bearer[len(prefix):] + } + return "" +} diff --git a/internal/jwt/jwt_test.go b/internal/jwt/jwt_test.go new file mode 100644 index 00000000..cc7fcddb --- /dev/null +++ b/internal/jwt/jwt_test.go @@ -0,0 +1,255 @@ +package jwt + +import ( + "context" + "errors" + "fmt" + "io/fs" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/go-jose/go-jose/v4" + "github.com/go-jose/go-jose/v4/jwt" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/drakkan/sftpgo/v2/internal/util" +) + +type failingJoseSigner struct{} + +func (s *failingJoseSigner) Sign(payload []byte) (*jose.JSONWebSignature, error) { + return nil, errors.New("sign test error") +} + +func (s *failingJoseSigner) Options() jose.SignerOptions { + return jose.SignerOptions{} +} + +func TestJWTToken(t *testing.T) { + s, err := NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) + username := util.GenerateUniqueID() + claims := Claims{ + Username: username, + Claims: jwt.Claims{ + Audience: jwt.Audience{"test"}, + Expiry: jwt.NewNumericDate(time.Now().Add(5 * time.Minute)), + NotBefore: jwt.NewNumericDate(time.Now()), + IssuedAt: jwt.NewNumericDate(time.Now()), + }, + } + token, err := s.Sign(&claims) + require.NoError(t, err) + require.NotEmpty(t, token) + + parsed, err := VerifyToken(s, token) + require.NoError(t, err) + require.Equal(t, username, parsed.Username) + + ja1, err := NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) + + token, err = ja1.Sign(&claims) + require.NoError(t, err) + require.NotEmpty(t, token) + _, err = VerifyToken(s, token) + require.Error(t, err) + _, err = VerifyToken(ja1, token) + require.NoError(t, err) +} + +func TestClaims(t *testing.T) { + claims := NewClaims(util.GenerateUniqueID(), "", 10*time.Minute) + s, err := NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) + token, err := s.Sign(claims) + require.NoError(t, err) + assert.NotEmpty(t, token) + assert.NotNil(t, claims.Expiry) + assert.NotNil(t, claims.IssuedAt) + assert.NotNil(t, claims.NotBefore) + + claims = &Claims{ + Permissions: []string{"myperm"}, + } + claims.SetExpiry(time.Now().Add(1 * time.Minute)) + claims.Audience = []string{"testaudience"} + _, err = s.Sign(claims) + assert.NoError(t, err) + assert.NotNil(t, claims.IssuedAt) + assert.NotNil(t, claims.NotBefore) + assert.True(t, claims.HasAnyAudience([]string{util.GenerateUniqueID(), util.GenerateUniqueID(), "testaudience"})) + assert.False(t, claims.HasAnyAudience([]string{util.GenerateUniqueID()})) + assert.True(t, claims.HasPerm("myperm")) + assert.False(t, claims.HasPerm(util.GenerateUniqueID())) + resp, err := claims.GenerateTokenResponse(s) + require.NoError(t, err) + assert.NotEmpty(t, resp.Token) + assert.Equal(t, claims.Expiry.Time().UTC().Format(time.RFC3339), resp.Expiry) + claims.SetIssuedAt(time.Now()) + claims.SetNotBefore(time.Now().Add(10 * time.Minute)) + token, err = s.SignWithParams(claims, util.GenerateUniqueID(), "127.0.0.1", time.Minute) + assert.NoError(t, err) + _, err = VerifyToken(s, token) + assert.ErrorContains(t, err, "nbf") + claims = &Claims{} + _, err = s.Sign(claims) + assert.ErrorContains(t, err, "expiration must be set") + claims.SetExpiry(time.Now()) + _, err = s.Sign(claims) + assert.ErrorContains(t, err, "audience must be set") + claims = &Claims{} + _, err = s.SignWithParams(claims, util.GenerateUniqueID(), "", time.Minute) + assert.NoError(t, err) +} + +func TestClaimsPermissions(t *testing.T) { + c := Claims{ + Permissions: []string{"*"}, + } + assert.True(t, c.HasPerm(util.GenerateUniqueID())) + c.Permissions = []string{"list"} + assert.False(t, c.HasPerm(util.GenerateUniqueID())) + assert.True(t, c.HasPerm("list")) +} + +func TestErrors(t *testing.T) { + s, err := NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) + _, err = VerifyToken(s, util.GenerateUniqueID()) + assert.Error(t, err) + claims := &Claims{} + claims.SetExpiry(time.Now().Add(-1 * time.Minute)) + token, err := jwt.Signed(s.Signer()).Claims(claims).Serialize() + assert.NoError(t, err) + _, err = VerifyToken(s, token) + assert.ErrorContains(t, err, "exp") + claims.SetExpiry(time.Now().Add(2 * time.Minute)) + claims.SetIssuedAt(time.Now().Add(1 * time.Minute)) + token, err = jwt.Signed(s.Signer()).Claims(claims).Serialize() + assert.NoError(t, err) + _, err = VerifyToken(s, token) + assert.ErrorContains(t, err, "iat") + claims.SetIssuedAt(time.Now()) + claims.SetNotBefore(time.Now().Add(1 * time.Minute)) + token, err = jwt.Signed(s.Signer()).Claims(claims).Serialize() + assert.NoError(t, err) + _, err = VerifyToken(s, token) + assert.ErrorContains(t, err, "nbf") + + s.SetSigner(&failingJoseSigner{}) + claims = NewClaims(util.GenerateUniqueID(), "", time.Minute) + _, err = s.Sign(claims) + assert.Error(t, err) + _, err = claims.GenerateTokenResponse(s) + assert.Error(t, err) + // Wrong algorithm + _, err = NewSigner("PS256", util.GenerateRandomBytes(32)) + assert.Error(t, err) +} + +func TestTokenFromRequest(t *testing.T) { + claims := NewClaims(util.GenerateUniqueID(), "", 10*time.Minute) + s, err := NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) + token, err := s.Sign(claims) + require.NoError(t, err) + assert.NotEmpty(t, token) + req, err := http.NewRequest(http.MethodGet, "/", nil) + require.NoError(t, err) + req.Header.Set("Cookie", fmt.Sprintf("jwt=%s", token)) + cookie := TokenFromCookie(req) + assert.Equal(t, token, cookie) + req, err = http.NewRequest(http.MethodGet, "/", nil) + require.NoError(t, err) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) + _, err = VerifyRequest(s, req, TokenFromHeader) + assert.NoError(t, err) + req.Header.Set("Authorization", token) + assert.Empty(t, TokenFromHeader(req)) + assert.Empty(t, TokenFromCookie(req)) + _, err = VerifyRequest(s, req, TokenFromCookie) + assert.ErrorContains(t, err, "no token found") +} + +func TestContext(t *testing.T) { + claims := &Claims{ + Username: util.GenerateUniqueID(), + } + s, err := NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) + token, err := s.SignWithParams(claims, util.GenerateUniqueID(), "", time.Minute) + require.NoError(t, err) + + req, err := http.NewRequest(http.MethodGet, "/", nil) + require.NoError(t, err) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) + + h := Verify(s, TokenFromHeader) + wrapped := h(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + token, err := FromContext(r.Context()) + assert.Nil(t, err) + assert.Equal(t, claims.Username, token.Username) + w.WriteHeader(http.StatusOK) + })) + rr := httptest.NewRecorder() + wrapped.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code) + + _, err = FromContext(context.Background()) + assert.ErrorContains(t, err, "no token found") + + ctx := NewContext(context.Background(), &Claims{}, fs.ErrClosed) + _, err = FromContext(ctx) + assert.Equal(t, fs.ErrClosed, err) + + ctx = context.WithValue(context.Background(), TokenCtxKey, "1") + _, err = FromContext(ctx) + assert.ErrorContains(t, err, "invalid type for TokenCtxKey") + + ctx = context.WithValue(context.Background(), ErrorCtxKey, 2) + _, err = FromContext(ctx) + assert.ErrorContains(t, err, "invalid type for ErrorCtxKey") + claims = NewClaims(util.GenerateUniqueID(), "127.1.1.1", time.Minute) + _, err = s.Sign(claims) + require.NoError(t, err) + ctx = context.WithValue(context.Background(), TokenCtxKey, claims) + claimsFromContext, err := FromContext(ctx) + assert.NoError(t, err) + assert.Equal(t, claims, claimsFromContext) + + assert.Equal(t, "jwt context value Token", TokenCtxKey.String()) +} + +func TestValidationLeeway(t *testing.T) { + s, err := NewSigner(jose.HS256, util.GenerateRandomBytes(32)) + require.NoError(t, err) + claims := &Claims{} + claims.Audience = []string{util.GenerateUniqueID()} + claims.SetIssuedAt(time.Now().Add(10 * time.Second)) // issued at in the future + claims.SetExpiry(time.Now().Add(10 * time.Second)) + token, err := s.Sign(claims) + require.NoError(t, err) + _, err = VerifyToken(s, token) + assert.NoError(t, err) + + claims = &Claims{} + claims.Audience = []string{util.GenerateUniqueID()} + claims.SetExpiry(time.Now().Add(-10 * time.Second)) // expired + token, err = s.Sign(claims) + require.NoError(t, err) + _, err = VerifyToken(s, token) + assert.NoError(t, err) + + claims = &Claims{} + claims.Audience = []string{util.GenerateUniqueID()} + claims.SetExpiry(time.Now().Add(30 * time.Second)) + claims.SetNotBefore(time.Now().Add(10 * time.Second)) // not before in the future + token, err = s.Sign(claims) + require.NoError(t, err) + _, err = VerifyToken(s, token) + assert.NoError(t, err) +} diff --git a/internal/kms/kms.go b/internal/kms/kms.go index acd9f84e..914af4ea 100644 --- a/internal/kms/kms.go +++ b/internal/kms/kms.go @@ -73,7 +73,8 @@ var ( // ErrInvalidSecret defines the error to return if a secret is not valid ErrInvalidSecret = errors.New("invalid secret") validSecretStatuses = []string{sdkkms.SecretStatusPlain, sdkkms.SecretStatusAES256GCM, sdkkms.SecretStatusSecretBox, - sdkkms.SecretStatusVaultTransit, sdkkms.SecretStatusAWS, sdkkms.SecretStatusGCP, sdkkms.SecretStatusRedacted} + sdkkms.SecretStatusVaultTransit, sdkkms.SecretStatusAWS, sdkkms.SecretStatusGCP, sdkkms.SecretStatusAzureKeyVault, + sdkkms.SecretStatusOracleKeyVault, sdkkms.SecretStatusRedacted} config Configuration secretProviders = make(map[string]registeredSecretProvider) ) diff --git a/internal/logger/hclog.go b/internal/logger/hclog.go index 87216389..b05afe15 100644 --- a/internal/logger/hclog.go +++ b/internal/logger/hclog.go @@ -29,6 +29,11 @@ type HCLogAdapter struct { // Log emits a message and key/value pairs at a provided log level func (l *HCLogAdapter) Log(level hclog.Level, msg string, args ...any) { + // Workaround to avoid logging plugin arguments that may contain sensitive data. + // Check everytime we update go-plugin library. + if msg == "starting plugin" { + return + } var ev *zerolog.Event switch level { case hclog.Info: diff --git a/internal/logger/journald.go b/internal/logger/journald.go deleted file mode 100644 index fb63d0c2..00000000 --- a/internal/logger/journald.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (C) 2019 Nicola Murino -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, version 3. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -//go:build linux -// +build linux - -package logger - -import ( - "github.com/rs/zerolog" - "github.com/rs/zerolog/journald" -) - -// InitJournalDLogger configures the logger to write to journald -func InitJournalDLogger(level zerolog.Level) { - logger = zerolog.New(journald.NewJournalDWriter()).Level(level) - consoleLogger = zerolog.Nop() -} diff --git a/internal/logger/journald_nolinux.go b/internal/logger/journald_nolinux.go deleted file mode 100644 index 242b11d0..00000000 --- a/internal/logger/journald_nolinux.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (C) 2019 Nicola Murino -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, version 3. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -//go:build !linux -// +build !linux - -package logger - -import "github.com/rs/zerolog" - -// InitJournalDLogger configures the logger to write to journald -func InitJournalDLogger(level zerolog.Level) { - InitStdErrLogger(level) -} diff --git a/internal/logger/lego.go b/internal/logger/lego.go index 4827d022..0503e536 100644 --- a/internal/logger/lego.go +++ b/internal/logger/lego.go @@ -28,10 +28,10 @@ type LegoAdapter struct { // Fatal emits a log at Error level func (l *LegoAdapter) Fatal(args ...any) { if l.LogToConsole { - ErrorToConsole(fmt.Sprint(args...)) + ErrorToConsole("%s", fmt.Sprint(args...)) return } - Log(LevelError, legoLogSender, "", fmt.Sprint(args...)) + Log(LevelError, legoLogSender, "", "%s", fmt.Sprint(args...)) } // Fatalln is the same as Fatal @@ -51,10 +51,10 @@ func (l *LegoAdapter) Fatalf(format string, args ...any) { // Print emits a log at Info level func (l *LegoAdapter) Print(args ...any) { if l.LogToConsole { - InfoToConsole(fmt.Sprint(args...)) + InfoToConsole("%s", fmt.Sprint(args...)) return } - Log(LevelInfo, legoLogSender, "", fmt.Sprint(args...)) + Log(LevelInfo, legoLogSender, "", "%s", fmt.Sprint(args...)) } // Println is the same as Print diff --git a/internal/logger/logger.go b/internal/logger/logger.go index a5191ee1..59ff863f 100644 --- a/internal/logger/logger.go +++ b/internal/logger/logger.go @@ -29,9 +29,7 @@ import ( "os" "path/filepath" "time" - "unsafe" - ftpserverlog "github.com/fclairamb/go-log" "github.com/rs/zerolog" lumberjack "gopkg.in/natefinch/lumberjack.v2" ) @@ -203,9 +201,15 @@ func ErrorToConsole(format string, v ...any) { // TransferLog logs uploads or downloads func TransferLog(operation, path string, elapsed int64, size int64, user, connectionID, protocol, localAddr, - remoteAddr, ftpMode string, + remoteAddr, ftpMode string, err error, ) { - ev := logger.Info(). + var ev *zerolog.Event + if err != nil { + ev = logger.Error() + } else { + ev = logger.Info() + } + ev. Timestamp(). Str("sender", operation). Str("local_addr", localAddr). @@ -219,7 +223,7 @@ func TransferLog(operation, path string, elapsed int64, size int64, user, connec if ftpMode != "" { ev.Str("ftp_mode", ftpMode) } - ev.Send() + ev.AnErr("error", err).Send() } // CommandLog logs an SFTP/SCP/SSH command @@ -262,6 +266,26 @@ func ConnectionFailedLog(user, ip, loginType, protocol, errorString string) { Send() } +// LoginLog logs successful logins. +func LoginLog(user, ip, loginMethod, protocol, connectionID, clientVersion string, encrypted bool, info string) { + ev := logger.Info() + ev.Timestamp(). + Str("sender", "login"). + Str("ip", ip). + Str("username", user). + Str("method", loginMethod). + Str("protocol", protocol) + if connectionID != "" { + ev.Str("connection_id", connectionID) + } + ev.Str("client", clientVersion). + Bool("encrypted", encrypted) + if info != "" { + ev.Str("info", info) + } + ev.Send() +} + func isLogFilePathValid(logFilePath string) bool { cleanInput := filepath.Clean(logFilePath) if cleanInput == "." || cleanInput == ".." { @@ -284,7 +308,7 @@ func (l *StdLoggerWrapper) Write(p []byte) (n int, err error) { p = p[0 : n-1] } - Log(LevelError, l.Sender, "", bytesToString(p)) + Log(LevelError, l.Sender, "", "%s", p) return } @@ -356,20 +380,3 @@ func (l *LeveledLogger) Warn(msg string, keysAndValues ...any) { func (l *LeveledLogger) Panic(msg string, keysAndValues ...any) { l.Error(msg, keysAndValues...) } - -// With returns a LeveledLogger with additional context specific keyvals -func (l *LeveledLogger) With(keysAndValues ...any) ftpserverlog.Logger { - return &LeveledLogger{ - Sender: l.Sender, - additionalKeyVals: append(l.additionalKeyVals, keysAndValues...), - } -} - -func bytesToString(b []byte) string { - // unsafe.SliceData relies on cap whereas we want to rely on len - if len(b) == 0 { - return "" - } - // https://github.com/golang/go/blob/4ed358b57efdad9ed710be7f4fc51495a7620ce2/src/strings/builder.go#L41 - return unsafe.String(unsafe.SliceData(b), len(b)) -} diff --git a/internal/logger/request_logger.go b/internal/logger/request_logger.go index fa269d7e..325f44b9 100644 --- a/internal/logger/request_logger.go +++ b/internal/logger/request_logger.go @@ -15,6 +15,7 @@ package logger import ( + "crypto/tls" "fmt" "net" "net/http" @@ -50,17 +51,21 @@ func NewStructuredLogger(logger *zerolog.Logger) func(next http.Handler) http.Ha // NewLogEntry creates a new log entry for an HTTP request func (l *StructuredLogger) NewLogEntry(r *http.Request) middleware.LogEntry { scheme := "http" + cipherSuite := "" if r.TLS != nil { scheme = "https" + cipherSuite = tls.CipherSuiteName(r.TLS.CipherSuite) } fields := map[string]any{ - "local_addr": getLocalAddress(r), - "remote_addr": r.RemoteAddr, - "proto": r.Proto, - "method": r.Method, - "user_agent": r.UserAgent(), - "uri": fmt.Sprintf("%s://%s%s", scheme, r.Host, r.RequestURI)} + "local_addr": getLocalAddress(r), + "remote_addr": r.RemoteAddr, + "proto": r.Proto, + "method": r.Method, + "user_agent": r.UserAgent(), + "uri": fmt.Sprintf("%s://%s%s", scheme, r.Host, r.RequestURI), + "cipher_suite": cipherSuite, + } reqID := middleware.GetReqID(r.Context()) if reqID != "" { diff --git a/internal/logger/slog.go b/internal/logger/slog.go new file mode 100644 index 00000000..e9a544d0 --- /dev/null +++ b/internal/logger/slog.go @@ -0,0 +1,97 @@ +// Copyright (C) 2025 Nicola Murino +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, version 3. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package logger + +import ( + "context" + "log/slog" + "slices" + + "github.com/rs/zerolog" +) + +// slogAdapter is an adapter for slog.Handler +type slogAdapter struct { + sender string + attrs []slog.Attr +} + +// NewSlogAdapter creates a slog.Handler adapter +func NewSlogAdapter(sender string, attrs []slog.Attr) *slogAdapter { + return &slogAdapter{ + sender: sender, + attrs: attrs, + } +} + +func (l *slogAdapter) Enabled(ctx context.Context, level slog.Level) bool { + // Log level is handled by our implementation + return true +} + +func (l *slogAdapter) Handle(ctx context.Context, r slog.Record) error { + var ev *zerolog.Event + switch r.Level { + case slog.LevelDebug: + ev = logger.Debug() + case slog.LevelInfo: + ev = logger.Info() + case slog.LevelWarn: + ev = logger.Warn() + case slog.LevelError: + ev = logger.Error() + default: + ev = logger.Debug() + } + + ev.Timestamp() + if l.sender != "" { + ev.Str("sender", l.sender) + } + + addSlogAttr := func(a slog.Attr) { + if a.Key == "time" { + return + } + ev.Any(a.Key, a.Value.Any()) + } + + for _, a := range l.attrs { + addSlogAttr(a) + } + + r.Attrs(func(a slog.Attr) bool { + addSlogAttr(a) + return true + }) + + ev.Msg(r.Message) + + return nil +} + +func (l *slogAdapter) WithAttrs(attrs []slog.Attr) slog.Handler { + newHandler := *l + newHandler.attrs = slices.Concat(l.attrs, attrs) + return &newHandler +} + +func (l *slogAdapter) WithGroup(name string) slog.Handler { + newHandler := *l + if name != "" { + newHandler.sender = name + } + return &newHandler +} diff --git a/internal/metric/metric.go b/internal/metric/metric.go index f192225d..4e3e95d8 100644 --- a/internal/metric/metric.go +++ b/internal/metric/metric.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build !nometrics -// +build !nometrics // Package metric provides Prometheus metrics support package metric diff --git a/internal/metric/metric_disabled.go b/internal/metric/metric_disabled.go index 63369703..78bacfdd 100644 --- a/internal/metric/metric_disabled.go +++ b/internal/metric/metric_disabled.go @@ -1,5 +1,18 @@ +// Copyright (C) 2019 Nicola Murino +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, version 3. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + //go:build nometrics -// +build nometrics package metric diff --git a/internal/plugin/kms.go b/internal/plugin/kms.go index 964e0cdb..b4ed5be1 100644 --- a/internal/plugin/kms.go +++ b/internal/plugin/kms.go @@ -17,6 +17,7 @@ package plugin import ( "fmt" "path/filepath" + "slices" "github.com/hashicorp/go-hclog" "github.com/hashicorp/go-plugin" @@ -25,13 +26,13 @@ import ( "github.com/drakkan/sftpgo/v2/internal/kms" "github.com/drakkan/sftpgo/v2/internal/logger" - "github.com/drakkan/sftpgo/v2/internal/util" ) var ( - validKMSSchemes = []string{sdkkms.SchemeAWS, sdkkms.SchemeGCP, sdkkms.SchemeVaultTransit, sdkkms.SchemeAzureKeyVault} + validKMSSchemes = []string{sdkkms.SchemeAWS, sdkkms.SchemeGCP, sdkkms.SchemeVaultTransit, + sdkkms.SchemeAzureKeyVault, sdkkms.SchemeOracleKeyVault} validKMSEncryptedStatuses = []string{sdkkms.SecretStatusVaultTransit, sdkkms.SecretStatusAWS, sdkkms.SecretStatusGCP, - sdkkms.SecretStatusAzureKeyVault} + sdkkms.SecretStatusAzureKeyVault, sdkkms.SecretStatusOracleKeyVault} ) // KMSConfig defines configuration parameters for kms plugins @@ -41,10 +42,10 @@ type KMSConfig struct { } func (c *KMSConfig) validate() error { - if !util.Contains(validKMSSchemes, c.Scheme) { + if !slices.Contains(validKMSSchemes, c.Scheme) { return fmt.Errorf("invalid kms scheme: %v", c.Scheme) } - if !util.Contains(validKMSEncryptedStatuses, c.EncryptedStatus) { + if !slices.Contains(validKMSEncryptedStatuses, c.EncryptedStatus) { return fmt.Errorf("invalid kms encrypted status: %v", c.EncryptedStatus) } return nil diff --git a/internal/plugin/notifier.go b/internal/plugin/notifier.go index 0e9ac9ec..2a37c462 100644 --- a/internal/plugin/notifier.go +++ b/internal/plugin/notifier.go @@ -16,6 +16,7 @@ package plugin import ( "fmt" + "slices" "sync" "time" @@ -24,7 +25,6 @@ import ( "github.com/sftpgo/sdk/plugin/notifier" "github.com/drakkan/sftpgo/v2/internal/logger" - "github.com/drakkan/sftpgo/v2/internal/util" ) // NotifierConfig defines configuration parameters for notifiers plugins @@ -50,97 +50,19 @@ func (c *NotifierConfig) hasActions() bool { return false } -type eventsQueue struct { - sync.RWMutex +type notifierPlugin struct { + config Config + notifier notifier.Notifier + client *plugin.Client + mu sync.RWMutex fsEvents []*notifier.FsEvent providerEvents []*notifier.ProviderEvent logEvents []*notifier.LogEvent } -func (q *eventsQueue) addFsEvent(event *notifier.FsEvent) { - q.Lock() - defer q.Unlock() - - q.fsEvents = append(q.fsEvents, event) -} - -func (q *eventsQueue) addProviderEvent(event *notifier.ProviderEvent) { - q.Lock() - defer q.Unlock() - - q.providerEvents = append(q.providerEvents, event) -} - -func (q *eventsQueue) addLogEvent(event *notifier.LogEvent) { - q.Lock() - defer q.Unlock() - - q.logEvents = append(q.logEvents, event) -} - -func (q *eventsQueue) popFsEvent() *notifier.FsEvent { - q.Lock() - defer q.Unlock() - - if len(q.fsEvents) == 0 { - return nil - } - truncLen := len(q.fsEvents) - 1 - ev := q.fsEvents[truncLen] - q.fsEvents[truncLen] = nil - q.fsEvents = q.fsEvents[:truncLen] - - return ev -} - -func (q *eventsQueue) popProviderEvent() *notifier.ProviderEvent { - q.Lock() - defer q.Unlock() - - if len(q.providerEvents) == 0 { - return nil - } - truncLen := len(q.providerEvents) - 1 - ev := q.providerEvents[truncLen] - q.providerEvents[truncLen] = nil - q.providerEvents = q.providerEvents[:truncLen] - - return ev -} - -func (q *eventsQueue) popLogEvent() *notifier.LogEvent { - q.Lock() - defer q.Unlock() - - if len(q.logEvents) == 0 { - return nil - } - truncLen := len(q.logEvents) - 1 - ev := q.logEvents[truncLen] - q.logEvents[truncLen] = nil - q.logEvents = q.logEvents[:truncLen] - - return ev -} - -func (q *eventsQueue) getSize() int { - q.RLock() - defer q.RUnlock() - - return len(q.providerEvents) + len(q.fsEvents) + len(q.logEvents) -} - -type notifierPlugin struct { - config Config - notifier notifier.Notifier - client *plugin.Client - queue *eventsQueue -} - func newNotifierPlugin(config Config) (*notifierPlugin, error) { p := ¬ifierPlugin{ config: config, - queue: &eventsQueue{}, } if err := p.initialize(); err != nil { logger.Warn(logSender, "", "unable to create notifier plugin: %v, config %+v", err, config) @@ -180,7 +102,7 @@ func (p *notifierPlugin) initialize() error { Managed: false, Logger: &logger.HCLogAdapter{ Logger: hclog.New(&hclog.LoggerOptions{ - Name: fmt.Sprintf("%v.%v", logSender, notifier.PluginName), + Name: fmt.Sprintf("%s.%s", logSender, notifier.PluginName), Level: pluginsLogLevel, DisableTime: true, }), @@ -204,6 +126,34 @@ func (p *notifierPlugin) initialize() error { return nil } +func (p *notifierPlugin) queueSize() int { + p.mu.RLock() + defer p.mu.RUnlock() + + return len(p.providerEvents) + len(p.fsEvents) + len(p.logEvents) +} + +func (p *notifierPlugin) queueFsEvent(ev *notifier.FsEvent) { + p.mu.Lock() + defer p.mu.Unlock() + + p.fsEvents = append(p.fsEvents, ev) +} + +func (p *notifierPlugin) queueProviderEvent(ev *notifier.ProviderEvent) { + p.mu.Lock() + defer p.mu.Unlock() + + p.providerEvents = append(p.providerEvents, ev) +} + +func (p *notifierPlugin) queueLogEvent(ev *notifier.LogEvent) { + p.mu.Lock() + defer p.mu.Unlock() + + p.logEvents = append(p.logEvents, ev) +} + func (p *notifierPlugin) canQueueEvent(timestamp int64) bool { if p.config.NotifierOptions.RetryMaxTime == 0 { return false @@ -214,107 +164,105 @@ func (p *notifierPlugin) canQueueEvent(timestamp int64) bool { return false } if p.config.NotifierOptions.RetryQueueMaxSize > 0 { - return p.queue.getSize() < p.config.NotifierOptions.RetryQueueMaxSize + return p.queueSize() < p.config.NotifierOptions.RetryQueueMaxSize } return true } func (p *notifierPlugin) notifyFsAction(event *notifier.FsEvent) { - if !util.Contains(p.config.NotifierOptions.FsEvents, event.Action) { + if !slices.Contains(p.config.NotifierOptions.FsEvents, event.Action) { return } - - go func() { - Handler.addTask() - defer Handler.removeTask() - - p.sendFsEvent(event) - }() + p.sendFsEvent(event) } func (p *notifierPlugin) notifyProviderAction(event *notifier.ProviderEvent, object Renderer) { - if !util.Contains(p.config.NotifierOptions.ProviderEvents, event.Action) || - !util.Contains(p.config.NotifierOptions.ProviderObjects, event.ObjectType) { + if !slices.Contains(p.config.NotifierOptions.ProviderEvents, event.Action) || + !slices.Contains(p.config.NotifierOptions.ProviderObjects, event.ObjectType) { return } - - go func() { - Handler.addTask() - defer Handler.removeTask() - - objectAsJSON, err := object.RenderAsJSON(event.Action != "delete") - if err != nil { - logger.Warn(logSender, "", "unable to render user as json for action %v: %v", event.Action, err) - return - } - event.ObjectData = objectAsJSON - p.sendProviderEvent(event) - }() + p.sendProviderEvent(event, object) } func (p *notifierPlugin) notifyLogEvent(event *notifier.LogEvent) { - go func() { + p.sendLogEvent(event) +} + +func (p *notifierPlugin) sendFsEvent(ev *notifier.FsEvent) { + go func(event *notifier.FsEvent) { Handler.addTask() defer Handler.removeTask() - p.sendLogEvent(event) - }() + if err := p.notifier.NotifyFsEvent(event); err != nil { + logger.Warn(logSender, "", "unable to send fs action notification to plugin %v: %v", p.config.Cmd, err) + if p.canQueueEvent(event.Timestamp) { + p.queueFsEvent(event) + } + } + }(ev) } -func (p *notifierPlugin) sendFsEvent(event *notifier.FsEvent) { - if err := p.notifier.NotifyFsEvent(event); err != nil { - logger.Warn(logSender, "", "unable to send fs action notification to plugin %v: %v", p.config.Cmd, err) - if p.canQueueEvent(event.Timestamp) { - p.queue.addFsEvent(event) +func (p *notifierPlugin) sendProviderEvent(ev *notifier.ProviderEvent, object Renderer) { + go func(event *notifier.ProviderEvent) { + Handler.addTask() + defer Handler.removeTask() + + if object != nil { + objectAsJSON, err := object.RenderAsJSON(event.Action != "delete") + if err != nil { + logger.Error(logSender, "", "unable to render user as json for action %q: %v", event.Action, err) + } else { + event.ObjectData = objectAsJSON + } } - } + + if err := p.notifier.NotifyProviderEvent(event); err != nil { + logger.Warn(logSender, "", "unable to send user action notification to plugin %v: %v", p.config.Cmd, err) + if p.canQueueEvent(event.Timestamp) { + p.queueProviderEvent(event) + } + } + }(ev) } -func (p *notifierPlugin) sendProviderEvent(event *notifier.ProviderEvent) { - if err := p.notifier.NotifyProviderEvent(event); err != nil { - logger.Warn(logSender, "", "unable to send user action notification to plugin %v: %v", p.config.Cmd, err) - if p.canQueueEvent(event.Timestamp) { - p.queue.addProviderEvent(event) - } - } -} +func (p *notifierPlugin) sendLogEvent(ev *notifier.LogEvent) { + go func(event *notifier.LogEvent) { + Handler.addTask() + defer Handler.removeTask() -func (p *notifierPlugin) sendLogEvent(event *notifier.LogEvent) { - if err := p.notifier.NotifyLogEvent(event); err != nil { - logger.Warn(logSender, "", "unable to send log event to plugin %v: %v", p.config.Cmd, err) - if p.canQueueEvent(event.Timestamp) { - p.queue.addLogEvent(event) + if err := p.notifier.NotifyLogEvent(event); err != nil { + logger.Warn(logSender, "", "unable to send log event to plugin %v: %v", p.config.Cmd, err) + if p.canQueueEvent(event.Timestamp) { + p.queueLogEvent(event) + } } - } + }(ev) } func (p *notifierPlugin) sendQueuedEvents() { - queueSize := p.queue.getSize() + queueSize := p.queueSize() if queueSize == 0 { return } - logger.Debug(logSender, "", "check queued events for notifier %q, events size: %v", p.config.Cmd, queueSize) - fsEv := p.queue.popFsEvent() - for fsEv != nil { - go func(ev *notifier.FsEvent) { - p.sendFsEvent(ev) - }(fsEv) - fsEv = p.queue.popFsEvent() - } + p.mu.Lock() + defer p.mu.Unlock() - providerEv := p.queue.popProviderEvent() - for providerEv != nil { - go func(ev *notifier.ProviderEvent) { - p.sendProviderEvent(ev) - }(providerEv) - providerEv = p.queue.popProviderEvent() + logger.Debug(logSender, "", "send queued events for notifier %q, events size: %v", p.config.Cmd, queueSize) + + for _, ev := range p.fsEvents { + p.sendFsEvent(ev) } - logEv := p.queue.popLogEvent() - for logEv != nil { - go func(ev *notifier.LogEvent) { - p.sendLogEvent(ev) - }(logEv) - logEv = p.queue.popLogEvent() + p.fsEvents = nil + + for _, ev := range p.providerEvents { + p.sendProviderEvent(ev, nil) } - logger.Debug(logSender, "", "queued events sent for notifier %q, new events size: %v", p.config.Cmd, p.queue.getSize()) + p.providerEvents = nil + + for _, ev := range p.logEvents { + p.sendLogEvent(ev) + } + p.logEvents = nil + + logger.Debug(logSender, "", "%d queued events sent for notifier %q,", queueSize, p.config.Cmd) } diff --git a/internal/plugin/plugin.go b/internal/plugin/plugin.go index 91f65a8b..94479c81 100644 --- a/internal/plugin/plugin.go +++ b/internal/plugin/plugin.go @@ -24,6 +24,7 @@ import ( "os" "os/exec" "path/filepath" + "slices" "strings" "sync" "sync/atomic" @@ -118,7 +119,9 @@ func (c *Config) getEnvVarPrefix() string { return c.EnvPrefix } - prefix := strings.ToUpper(filepath.Base(c.Cmd)) + "_" + baseName := filepath.Base(c.Cmd) + name := strings.TrimSuffix(baseName, filepath.Ext(baseName)) + prefix := strings.ToUpper(name) + "_" return strings.ReplaceAll(prefix, "-", "_") } @@ -141,7 +144,7 @@ func (c *Config) getCommand() *exec.Cmd { } logger.Debug(logSender, "", "additional env vars for plugin %q: %+v", c.Cmd, c.EnvVars) for _, key := range c.EnvVars { - cmd.Env = append(cmd.Env, os.Getenv(key)) + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", key, os.Getenv(key))) } return cmd } @@ -225,7 +228,7 @@ func initializePlugins() error { kmsID++ kms.RegisterSecretProvider(config.KMSOptions.Scheme, config.KMSOptions.EncryptedStatus, Handler.Configs[idx].newKMSPluginSecretProvider) - logger.Info(logSender, "", "registered secret provider for scheme: %v, encrypted status: %v", + logger.Info(logSender, "", "registered secret provider for scheme %q, encrypted status %q", config.KMSOptions.Scheme, config.KMSOptions.EncryptedStatus) case auth.PluginName: plugin, err := newAuthPlugin(config) @@ -334,11 +337,11 @@ func (m *Manager) NotifyLogEvent(event notifier.LogEventType, protocol, username var e *notifier.LogEvent for _, n := range m.notifiers { - if util.Contains(n.config.NotifierOptions.LogEvents, int(event)) { + if slices.Contains(n.config.NotifierOptions.LogEvents, int(event)) { if e == nil { message := "" if err != nil { - message = err.Error() + message = strings.Trim(err.Error(), "\x00") } e = ¬ifier.LogEvent{ @@ -639,7 +642,9 @@ func (m *Manager) restartNotifierPlugin(config Config, idx int) { } m.notifLock.Lock() - plugin.queue = m.notifiers[idx].queue + plugin.fsEvents = m.notifiers[idx].fsEvents + plugin.providerEvents = m.notifiers[idx].providerEvents + plugin.logEvents = m.notifiers[idx].logEvents m.notifiers[idx] = plugin m.notifLock.Unlock() plugin.sendQueuedEvents() diff --git a/internal/service/awscontainer.go b/internal/service/awscontainer.go deleted file mode 100644 index 481085e4..00000000 --- a/internal/service/awscontainer.go +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright (C) 2019 Nicola Murino -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, version 3. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -//go:build awscontainer -// +build awscontainer - -package service - -import ( - "context" - "errors" - "fmt" - "time" - - "github.com/aws/aws-sdk-go-v2/aws" - awsconfig "github.com/aws/aws-sdk-go-v2/config" - "github.com/aws/aws-sdk-go-v2/feature/ec2/imds" - "github.com/aws/aws-sdk-go-v2/service/marketplacemetering" - "github.com/aws/aws-sdk-go-v2/service/secretsmanager" - "github.com/google/uuid" - - "github.com/drakkan/sftpgo/v2/internal/config" - "github.com/drakkan/sftpgo/v2/internal/dataprovider" - "github.com/drakkan/sftpgo/v2/internal/httpd" - "github.com/drakkan/sftpgo/v2/internal/logger" - "github.com/drakkan/sftpgo/v2/internal/util" -) - -const ( - installCodeName = "SFTPGo_Installation_Code" -) - -var ( - awsProductCode = "" -) - -func registerAWSContainer(disableAWSInstallationCode bool) error { - if awsProductCode == "" { - return errors.New("product code not set") - } - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - cfg, err := getAWSConfig(ctx) - if err != nil { - return fmt.Errorf("unable to get config to register AWS container: %w", err) - } - if !disableAWSInstallationCode { - if err := setInstallationCode(cfg); err != nil { - return err - } - } - requestNonce, err := uuid.NewRandom() - if err != nil { - return fmt.Errorf("unable to generate nonce for metering API: %w", err) - } - svc := marketplacemetering.NewFromConfig(cfg) - result, err := svc.RegisterUsage(ctx, &marketplacemetering.RegisterUsageInput{ - ProductCode: aws.String(awsProductCode), - PublicKeyVersion: aws.Int32(1), - Nonce: aws.String(requestNonce.String()), - }) - if err != nil { - return fmt.Errorf("unable to register API operation for AWSMarketplace Metering: %w", err) - } - logger.Debug(logSender, "", "API operation for AWSMarketplace Metering registered, token %q", - util.GetStringFromPointer(result.Signature)) - return nil -} - -func getAWSConfig(ctx context.Context) (aws.Config, error) { - cfg, err := awsconfig.LoadDefaultConfig(ctx) - if err != nil { - return cfg, fmt.Errorf("unable to get config to register AWS container: %w", err) - } - if cfg.Region == "" { - svc := imds.NewFromConfig(cfg) - region, err := svc.GetRegion(ctx, &imds.GetRegionInput{}) - if err == nil { - logger.Debug(logSender, "", "AWS region from imds %q", region.Region) - cfg.Region = region.Region - } else { - logger.Warn(logSender, "", "unable to get region from imds, continuing anyway, error: %v", err) - } - } - return cfg, nil -} - -func setInstallationCode(cfg aws.Config) error { - if dataprovider.HasAdmin() { - return nil - } - installationCode := util.GenerateUniqueID() - requestToken, err := uuid.NewRandom() - if err != nil { - return fmt.Errorf("unable to generate client request token: %w", err) - } - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - svc := secretsmanager.NewFromConfig(cfg) - _, err = svc.GetSecretValue(ctx, &secretsmanager.GetSecretValueInput{ - SecretId: aws.String(installCodeName), - }) - if err == nil { - // update existing secret - result, err := svc.UpdateSecret(ctx, &secretsmanager.UpdateSecretInput{ - SecretId: aws.String(installCodeName), - ClientRequestToken: aws.String(requestToken.String()), - SecretString: aws.String(installationCode), - }) - if err != nil { - return fmt.Errorf("unable to update installation code: %w", err) - } - logger.Debug(logSender, "", "installation code updated, secret name %q, arn %q, version id %q", - util.GetStringFromPointer(result.Name), util.GetStringFromPointer(result.ARN), - util.GetStringFromPointer(result.VersionId)) - } else { - // create new secret - logger.Debug(logSender, "", "unable to get the current installation secret, trying to create a new one, error: %v", err) - result, err := svc.CreateSecret(ctx, &secretsmanager.CreateSecretInput{ - Name: aws.String(installCodeName), - ClientRequestToken: aws.String(requestToken.String()), - SecretString: aws.String(installationCode), - }) - if err != nil { - return fmt.Errorf("unable to create installation code: %w", err) - } - logger.Debug(logSender, "", "installation code set, secret name %q, arn %q, version id %q", - util.GetStringFromPointer(result.Name), util.GetStringFromPointer(result.ARN), - util.GetStringFromPointer(result.VersionId)) - } - httpdConfig := config.GetHTTPDConfig() - httpdConfig.Setup.InstallationCode = installationCode - httpdConfig.Setup.InstallationCodeHint = "Installation code stored in Secrets Manager" - config.SetHTTPDConfig(httpdConfig) - httpd.SetInstallationCodeResolver(resolveInstallationCode) - - return nil -} - -// function called to validate the user provided secret -func resolveInstallationCode(defaultInstallationCode string) string { - logger.Debug(logSender, "", "resolving installation code") - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - cfg, err := getAWSConfig(ctx) - if err != nil { - logger.Error(logSender, "", "unable to get config to resolve installation code: %v", err) - return defaultInstallationCode - } - - svc := secretsmanager.NewFromConfig(cfg) - result, err := svc.GetSecretValue(ctx, &secretsmanager.GetSecretValueInput{ - SecretId: aws.String(installCodeName), - }) - if err != nil { - logger.Error(logSender, "", "unable to resolve installation code: %v", err) - return defaultInstallationCode - } - - resolvedCode := util.GetStringFromPointer(result.SecretString) - if resolvedCode == "" { - logger.Error(logSender, "", "resolved installation code is empty") - return defaultInstallationCode - } - logger.Debug(logSender, "", "installation code resolved") - return resolvedCode -} diff --git a/internal/service/awscontainer_disabled.go b/internal/service/awscontainer_disabled.go deleted file mode 100644 index 130fa775..00000000 --- a/internal/service/awscontainer_disabled.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (C) 2019 Nicola Murino -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, version 3. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -//go:build !awscontainer -// +build !awscontainer - -package service - -func registerAWSContainer(_ bool) error { - return nil -} diff --git a/internal/service/service.go b/internal/service/service.go index 62bc17df..6cb9db8b 100644 --- a/internal/service/service.go +++ b/internal/service/service.go @@ -39,7 +39,6 @@ const ( ) var ( - chars = []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") graceTime int ) @@ -89,7 +88,7 @@ func (s *Service) initLogger() { } // Start initializes and starts the service -func (s *Service) Start(disableAWSInstallationCode bool) error { +func (s *Service) Start() error { s.initLogger() logger.Info(logSender, "", "starting SFTPGo %s, config dir: %s, config file: %s, log max size: %d log max backups: %d "+ "log max age: %d log level: %s, log compress: %t, log utc time: %t, load data from: %q, grace time: %d secs", @@ -104,13 +103,13 @@ func (s *Service) Start(disableAWSInstallationCode bool) error { } } if !config.HasServicesToStart() { - infoString := "no service configured, nothing to do" + const infoString = "no service configured, nothing to do" logger.Info(logSender, "", infoString) logger.InfoToConsole(infoString) return errors.New(infoString) } - if err := s.initializeServices(disableAWSInstallationCode); err != nil { + if err := s.initializeServices(); err != nil { return err } @@ -120,7 +119,7 @@ func (s *Service) Start(disableAWSInstallationCode bool) error { return nil } -func (s *Service) initializeServices(disableAWSInstallationCode bool) error { +func (s *Service) initializeServices() error { providerConf := config.GetProviderConf() kmsConfig := config.GetKMSConfig() err := kmsConfig.Initialize() @@ -129,6 +128,13 @@ func (s *Service) initializeServices(disableAWSInstallationCode bool) error { logger.ErrorToConsole("unable to initialize KMS: %v", err) return err } + // We may have KMS plugins and their schema needs to be registered before + // initializing the data provider which may contain KMS secrets. + if err := plugin.Initialize(config.GetPluginsConfig(), s.LogLevel); err != nil { + logger.Error(logSender, "", "unable to initialize plugin system: %v", err) + logger.ErrorToConsole("unable to initialize plugin system: %v", err) + return err + } mfaConfig := config.GetMFAConfig() err = mfaConfig.Initialize() if err != nil { @@ -142,11 +148,6 @@ func (s *Service) initializeServices(disableAWSInstallationCode bool) error { logger.ErrorToConsole("error initializing data provider: %v", err) return err } - if err := plugin.Initialize(config.GetPluginsConfig(), s.LogLevel); err != nil { - logger.Error(logSender, "", "unable to initialize plugin system: %v", err) - logger.ErrorToConsole("unable to initialize plugin system: %v", err) - return err - } smtpConfig := config.GetSMTPConfig() err = smtpConfig.Initialize(s.ConfigDir, s.PortableMode != 1) if err != nil { @@ -178,12 +179,6 @@ func (s *Service) initializeServices(disableAWSInstallationCode bool) error { } } - if err := registerAWSContainer(disableAWSInstallationCode); err != nil { - logger.Error(logSender, "", "error registering AWS container: %v", err) - logger.ErrorToConsole("error registering AWS container: %v", err) - return err - } - httpConfig := config.GetHTTPConfig() err = httpConfig.Initialize(s.ConfigDir) if err != nil { diff --git a/internal/service/service_portable.go b/internal/service/service_portable.go index 06b05f7a..91d5fc79 100644 --- a/internal/service/service_portable.go +++ b/internal/service/service_portable.go @@ -13,13 +13,13 @@ // along with this program. If not, see . //go:build !noportable -// +build !noportable package service import ( "fmt" "math/rand" + "slices" "strings" "github.com/sftpgo/sdk" @@ -69,7 +69,7 @@ func (s *Service) StartPortableMode(sftpdPort, ftpPort, webdavPort, httpPort int configurePortableWebDAVService(webdavPort, webDavCert, webDavKey) configurePortableHTTPService(httpPort, httpsCert, httpsKey) - err = s.Start(true) + err = s.Start() if err != nil { return err } @@ -95,24 +95,24 @@ func (s *Service) StartPortableMode(sftpdPort, ftpPort, webdavPort, httpPort int func (s *Service) getServiceOptionalInfoString() string { var info strings.Builder if config.GetSFTPDConfig().Bindings[0].IsValid() { - info.WriteString(fmt.Sprintf("SFTP port: %v ", config.GetSFTPDConfig().Bindings[0].Port)) + fmt.Fprintf(&info, "SFTP port: %d ", config.GetSFTPDConfig().Bindings[0].Port) } if config.GetFTPDConfig().Bindings[0].IsValid() { - info.WriteString(fmt.Sprintf("FTP port: %v ", config.GetFTPDConfig().Bindings[0].Port)) + fmt.Fprintf(&info, "FTP port: %d ", config.GetFTPDConfig().Bindings[0].Port) } if config.GetWebDAVDConfig().Bindings[0].IsValid() { scheme := "http" if config.GetWebDAVDConfig().CertificateFile != "" && config.GetWebDAVDConfig().CertificateKeyFile != "" { scheme = "https" } - info.WriteString(fmt.Sprintf("WebDAV URL: %v://:%v/ ", scheme, config.GetWebDAVDConfig().Bindings[0].Port)) + fmt.Fprintf(&info, "WebDAV URL: %v://:%v/ ", scheme, config.GetWebDAVDConfig().Bindings[0].Port) } if config.GetHTTPDConfig().Bindings[0].IsValid() { scheme := "http" if config.GetHTTPDConfig().CertificateFile != "" && config.GetHTTPDConfig().CertificateKeyFile != "" { scheme = "https" } - info.WriteString(fmt.Sprintf("WebClient URL: %v://:%v/ ", scheme, config.GetHTTPDConfig().Bindings[0].Port)) + fmt.Fprintf(&info, "WebClient URL: %s://:%d/ ", scheme, config.GetHTTPDConfig().Bindings[0].Port) } return info.String() } @@ -144,16 +144,15 @@ func (s *Service) configurePortableUser() string { printablePassword = "[redacted]" } if len(s.PortableUser.PublicKeys) == 0 && s.PortableUser.Password == "" { - var b strings.Builder - for i := 0; i < 16; i++ { - b.WriteRune(chars[rand.Intn(len(chars))]) - } - s.PortableUser.Password = b.String() + s.PortableUser.Password = util.GenerateUniqueID() printablePassword = s.PortableUser.Password } s.PortableUser.Filters.WebClient = []string{sdk.WebClientSharesDisabled, sdk.WebClientInfoChangeDisabled, sdk.WebClientPubKeyChangeDisabled, sdk.WebClientPasswordChangeDisabled, sdk.WebClientAPIKeyAuthChangeDisabled, - sdk.WebClientMFADisabled, + sdk.WebClientMFADisabled, sdk.WebClientPasswordResetDisabled, sdk.WebClientTLSCertChangeDisabled, + } + if !s.PortableUser.HasAnyPerm([]string{dataprovider.PermUpload, dataprovider.PermOverwrite}, "/") { + s.PortableUser.Filters.WebClient = append(s.PortableUser.Filters.WebClient, sdk.WebClientWriteDisabled) } s.configurePortableSecrets() return printablePassword @@ -211,7 +210,7 @@ func configurePortableSFTPService(port int, enabledSSHCommands []string) { } else { sftpdConf.Bindings[0].Port = 0 } - if util.Contains(enabledSSHCommands, "*") { + if slices.Contains(enabledSSHCommands, "*") { sftpdConf.EnabledSSHCommands = sftpd.GetSupportedSSHCommands() } else { sftpdConf.EnabledSSHCommands = enabledSSHCommands diff --git a/internal/service/service_windows.go b/internal/service/service_windows.go index bb1f7627..16be97ae 100644 --- a/internal/service/service_windows.go +++ b/internal/service/service_windows.go @@ -108,7 +108,7 @@ func (s *WindowsService) Execute(args []string, r <-chan svc.ChangeRequest, chan changes <- svc.Status{State: svc.StartPending} go func() { - if err := s.Service.Start(false); err != nil { + if err := s.Service.Start(); err != nil { logger.Error(logSender, "", "Windows service failed to start, error: %v", err) s.Service.Error = err s.Service.Shutdown <- true diff --git a/internal/service/signals_unix.go b/internal/service/signals_unix.go index 22b0c3f1..cecbea9f 100644 --- a/internal/service/signals_unix.go +++ b/internal/service/signals_unix.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build !windows -// +build !windows package service diff --git a/internal/sftpd/cmd_windows.go b/internal/sftpd/cmd_windows.go deleted file mode 100644 index 825045bf..00000000 --- a/internal/sftpd/cmd_windows.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (C) 2019 Nicola Murino -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, version 3. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -package sftpd - -import ( - "os/exec" -) - -func wrapCmd(cmd *exec.Cmd, _, _ int) *exec.Cmd { - return cmd -} diff --git a/internal/sftpd/handler.go b/internal/sftpd/handler.go index c551da1b..ca8575f5 100644 --- a/internal/sftpd/handler.go +++ b/internal/sftpd/handler.go @@ -19,6 +19,7 @@ import ( "net" "os" "path" + "strings" "time" "github.com/pkg/sftp" @@ -37,11 +38,10 @@ type Connection struct { // client's version string ClientVersion string // Remote address for this connection - RemoteAddr net.Addr - LocalAddr net.Addr - channel io.ReadWriteCloser - command string - folderPrefix string + RemoteAddr net.Addr + LocalAddr net.Addr + channel io.ReadWriteCloser + command string } // GetClientVersion returns the connected client's version @@ -73,10 +73,15 @@ func (c *Connection) GetCommand() string { // Fileread creates a reader for a file on the system and returns the reader back. func (c *Connection) Fileread(request *sftp.Request) (io.ReaderAt, error) { c.UpdateLastActivity() + updateRequestPaths(request) if !c.User.HasPerm(dataprovider.PermDownload, path.Dir(request.Filepath)) { return nil, sftp.ErrSSHFxPermissionDenied } + if err := common.Connections.IsNewTransferAllowed(c.User.Username); err != nil { + c.Log(logger.LevelInfo, "denying file read due to transfer count limits") + return nil, c.GetPermissionDeniedError() + } transferQuota := c.GetTransferQuota() if !transferQuota.HasDownloadSpace() { c.Log(logger.LevelInfo, "denying file read due to quota limits") @@ -121,8 +126,14 @@ func (c *Connection) Filewrite(request *sftp.Request) (io.WriterAt, error) { return c.handleFilewrite(request) } -func (c *Connection) handleFilewrite(request *sftp.Request) (sftp.WriterAtReaderAt, error) { +func (c *Connection) handleFilewrite(request *sftp.Request) (sftp.WriterAtReaderAt, error) { //nolint:gocyclo c.UpdateLastActivity() + updateRequestPaths(request) + + if err := common.Connections.IsNewTransferAllowed(c.User.Username); err != nil { + c.Log(logger.LevelInfo, "denying file write due to transfer count limits") + return nil, c.GetPermissionDeniedError() + } if ok, _ := c.User.IsFileAllowed(request.Filepath); !ok { c.Log(logger.LevelWarn, "writing file %q is not allowed", request.Filepath) @@ -181,6 +192,7 @@ func (c *Connection) handleFilewrite(request *sftp.Request) (sftp.WriterAtReader // or writing to those files. func (c *Connection) Filecmd(request *sftp.Request) error { c.UpdateLastActivity() + updateRequestPaths(request) switch request.Method { case "Setstat": @@ -213,6 +225,7 @@ func (c *Connection) Filecmd(request *sftp.Request) error { // a directory as well as perform file/folder stat calls. func (c *Connection) Filelist(request *sftp.Request) (sftp.ListerAt, error) { c.UpdateLastActivity() + updateRequestPaths(request) switch request.Method { case "List": @@ -221,10 +234,10 @@ func (c *Connection) Filelist(request *sftp.Request) (sftp.ListerAt, error) { return nil, err } modTime := time.Unix(0, 0) - if request.Filepath != "/" || c.folderPrefix != "" { - lister.Add(vfs.NewFileInfo("..", true, 0, modTime, false)) + if request.Filepath != "/" { + lister.Prepend(vfs.NewFileInfo("..", true, 0, modTime, false)) } - lister.Add(vfs.NewFileInfo(".", true, 0, modTime, false)) + lister.Prepend(vfs.NewFileInfo(".", true, 0, modTime, false)) return lister, nil case "Stat": if !c.User.HasPerm(dataprovider.PermListItems, path.Dir(request.Filepath)) { @@ -244,6 +257,7 @@ func (c *Connection) Filelist(request *sftp.Request) (sftp.ListerAt, error) { // Readlink implements the ReadlinkFileLister interface func (c *Connection) Readlink(filePath string) (string, error) { + filePath = util.CleanPath(filePath) if err := c.canReadLink(filePath); err != nil { return "", err } @@ -268,6 +282,7 @@ func (c *Connection) Readlink(filePath string) (string, error) { // Lstat implements LstatFileLister interface func (c *Connection) Lstat(request *sftp.Request) (sftp.ListerAt, error) { c.UpdateLastActivity() + updateRequestPaths(request) if !c.User.HasPerm(dataprovider.PermListItems, path.Dir(request.Filepath)) { return nil, sftp.ErrSSHFxPermissionDenied @@ -283,15 +298,14 @@ func (c *Connection) Lstat(request *sftp.Request) (sftp.ListerAt, error) { // RealPath implements the RealPathFileLister interface func (c *Connection) RealPath(p string) (string, error) { - if !c.User.HasPerm(dataprovider.PermListItems, path.Dir(p)) { - return "", sftp.ErrSSHFxPermissionDenied - } - if c.User.Filters.StartDirectory == "" { p = util.CleanPath(p) } else { p = util.CleanPathWithBase(c.User.Filters.StartDirectory, p) } + if !c.User.HasPerm(dataprovider.PermListItems, path.Dir(p)) { + return "", sftp.ErrSSHFxPermissionDenied + } fs, fsPath, err := c.GetFsAndResolvedPath(p) if err != nil { return "", err @@ -309,6 +323,7 @@ func (c *Connection) RealPath(p string) (string, error) { // StatVFS implements StatVFSFileCmder interface func (c *Connection) StatVFS(r *sftp.Request) (*sftp.StatVFS, error) { c.UpdateLastActivity() + updateRequestPaths(r) // we are assuming that r.Filepath is a dir, this could be wrong but should // not produce any side effect here. @@ -458,7 +473,7 @@ func (c *Connection) handleSFTPUploadToExistingFile(fs vfs.Fs, pflags sftp.FileO } if common.Config.IsAtomicUploadEnabled() && fs.IsAtomicUploadSupported() { - _, _, err = fs.Rename(resolvedPath, filePath) + _, _, err = fs.Rename(resolvedPath, filePath, 0) if err != nil { c.Log(logger.LevelError, "error renaming existing file for atomic upload, source: %q, dest: %q, err: %+v", resolvedPath, filePath, err) @@ -560,13 +575,10 @@ func (c *Connection) getStatVFSFromQuotaResult(fs vfs.Fs, name string, quotaResu func (c *Connection) updateQuotaAfterTruncate(requestPath string, fileSize int64) { vfolder, err := c.User.GetVirtualFolderForPath(path.Dir(requestPath)) if err == nil { - dataprovider.UpdateVirtualFolderQuota(&vfolder.BaseVirtualFolder, 0, -fileSize, false) //nolint:errcheck - if vfolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&c.User, 0, -fileSize, false) //nolint:errcheck - } - } else { - dataprovider.UpdateUserQuota(&c.User, 0, -fileSize, false) //nolint:errcheck + dataprovider.UpdateUserFolderQuota(&vfolder, &c.User, 0, -fileSize, false) + return } + dataprovider.UpdateUserQuota(&c.User, 0, -fileSize, false) //nolint:errcheck } func getOSOpenFlags(requestFlags sftp.FileOpenFlags) (flags int) { @@ -591,3 +603,15 @@ func getOSOpenFlags(requestFlags sftp.FileOpenFlags) (flags int) { } return osFlags } + +func updateRequestPaths(request *sftp.Request) { + if request.Method == "Symlink" { + request.Filepath = path.Clean(strings.ReplaceAll(request.Filepath, "\\", "/")) + } else { + request.Filepath = util.CleanPath(request.Filepath) + } + + if request.Target != "" { + request.Target = util.CleanPath(request.Target) + } +} diff --git a/internal/sftpd/internal_test.go b/internal/sftpd/internal_test.go index bc96b68a..44e93faa 100644 --- a/internal/sftpd/internal_test.go +++ b/internal/sftpd/internal_test.go @@ -16,6 +16,7 @@ package sftpd import ( "bytes" + "context" "errors" "fmt" "io" @@ -24,6 +25,7 @@ import ( "os" "path/filepath" "runtime" + "slices" "testing" "time" @@ -145,7 +147,7 @@ func (fs MockOsFs) Remove(name string, _ bool) error { } // Rename renames (moves) source to target -func (fs MockOsFs) Rename(source, target string) (int, int64, error) { +func (fs MockOsFs) Rename(source, target string, _ int) (int, int64, error) { if fs.err != nil { return -1, -1, fs.err } @@ -269,6 +271,7 @@ func TestReadWriteErrors(t *testing.T) { err = os.Remove(testfile) assert.NoError(t, err) assert.Len(t, conn.GetTransfers(), 0) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func TestUnsupportedListOP(t *testing.T) { @@ -374,8 +377,9 @@ func TestWithInvalidHome(t *testing.T) { c := Connection{ BaseConnection: common.NewBaseConnection("", common.ProtocolSFTP, "", "", u), } - _, err = fs.ResolvePath("../upper_path") - assert.Error(t, err, "tested path is not a home subdir") + resolved, err := fs.ResolvePath("../upper_path") + assert.NoError(t, err) + assert.Equal(t, filepath.Join(u.HomeDir, "upper_path"), resolved) _, err = c.StatVFS(&sftp.Request{ Method: "StatVFS", Filepath: "../unresolvable-path", @@ -418,7 +422,7 @@ func TestSupportedSSHCommands(t *testing.T) { assert.Equal(t, len(supportedSSHCommands), len(cmds)) for _, c := range cmds { - assert.True(t, util.Contains(supportedSSHCommands, c)) + assert.True(t, slices.Contains(supportedSSHCommands, c)) } } @@ -525,14 +529,6 @@ func TestSSHCommandErrors(t *testing.T) { err = cmd.handle() assert.Error(t, err, "ssh command must fail, we are requesting an invalid path") - cmd = sshCommand{ - command: "git-receive-pack", - connection: &connection, - args: []string{"/../../testrepo"}, - } - err = cmd.handle() - assert.Error(t, err, "ssh command must fail, we are requesting an invalid path") - user = dataprovider.User{} user.Permissions = map[string][]string{ "/": {dataprovider.PermAny}, @@ -543,43 +539,6 @@ func TestSSHCommandErrors(t *testing.T) { cmd.connection.User = user _, err = cmd.connection.User.GetFilesystem("123") assert.NoError(t, err) - err = cmd.handle() - assert.EqualError(t, err, common.ErrQuotaExceeded.Error()) - - cmd.connection.User.QuotaFiles = 0 - cmd.connection.User.UsedQuotaFiles = 0 - cmd.connection.User.Permissions = make(map[string][]string) - cmd.connection.User.Permissions["/"] = []string{dataprovider.PermListItems} - err = cmd.handle() - assert.EqualError(t, err, common.ErrPermissionDenied.Error()) - - cmd.connection.User.Permissions["/"] = []string{dataprovider.PermAny} - cmd.command = "invalid_command" - command, err := cmd.getSystemCommand() - assert.NoError(t, err) - - err = cmd.executeSystemCommand(command) - assert.Error(t, err, "invalid command must fail") - - command, err = cmd.getSystemCommand() - assert.NoError(t, err) - - _, err = command.cmd.StderrPipe() - assert.NoError(t, err) - - err = cmd.executeSystemCommand(command) - assert.Error(t, err, "command must fail, pipe was already assigned") - - err = cmd.executeSystemCommand(command) - assert.Error(t, err, "command must fail, pipe was already assigned") - - command, err = cmd.getSystemCommand() - assert.NoError(t, err) - - _, err = command.cmd.StdoutPipe() - assert.NoError(t, err) - err = cmd.executeSystemCommand(command) - assert.Error(t, err, "command must fail, pipe was already assigned") cmd = sshCommand{ command: "sftpgo-remove", @@ -597,23 +556,6 @@ func TestSSHCommandErrors(t *testing.T) { err = cmd.handle() assert.Error(t, err, "ssh command must fail, we are requesting an invalid path") - cmd.connection.User.HomeDir = filepath.Clean(os.TempDir()) - - cmd = sshCommand{ - command: "sftpgo-copy", - connection: &connection, - args: []string{"src", "dst"}, - } - - cmd.connection.User.Permissions = make(map[string][]string) - cmd.connection.User.Permissions["/"] = []string{dataprovider.PermAny} - - common.WaitForTransfers(1) - _, err = cmd.getSystemCommand() - if assert.Error(t, err) { - assert.Contains(t, err.Error(), common.ErrShuttingDown.Error()) - } - err = common.Initialize(common.Config, 0) assert.NoError(t, err) } @@ -654,38 +596,6 @@ func TestCommandsWithExtensionsFilter(t *testing.T) { } err := cmd.handleHashCommands() assert.EqualError(t, err, common.ErrPermissionDenied.Error()) - - cmd = sshCommand{ - command: "rsync", - connection: connection, - args: []string{"--server", "-vlogDtprze.iLsfxC", ".", "/"}, - } - _, err = cmd.getSystemCommand() - assert.EqualError(t, err, errUnsupportedConfig.Error()) - - cmd = sshCommand{ - command: "git-receive-pack", - connection: connection, - args: []string{"/subdir"}, - } - _, err = cmd.getSystemCommand() - assert.EqualError(t, err, errUnsupportedConfig.Error()) - - cmd = sshCommand{ - command: "git-receive-pack", - connection: connection, - args: []string{"/subdir/dir"}, - } - _, err = cmd.getSystemCommand() - assert.EqualError(t, err, errUnsupportedConfig.Error()) - - cmd = sshCommand{ - command: "git-receive-pack", - connection: connection, - args: []string{"/adir/subdir"}, - } - _, err = cmd.getSystemCommand() - assert.NoError(t, err) } func TestSSHCommandsRemoteFs(t *testing.T) { @@ -716,17 +626,7 @@ func TestSSHCommandsRemoteFs(t *testing.T) { args: []string{}, } - command, err := cmd.getSystemCommand() - assert.NoError(t, err) - - err = cmd.executeSystemCommand(command) - assert.Error(t, err, "command must fail for a non local filesystem") - cmd = sshCommand{ - command: "sftpgo-copy", - connection: connection, - args: []string{}, - } - err = cmd.handleSFTPGoCopy() + err := cmd.handleSFTPGoCopy() assert.Error(t, err) cmd = sshCommand{ command: "sftpgo-remove", @@ -775,282 +675,12 @@ func TestSSHCmdGetFsErrors(t *testing.T) { assert.NoError(t, err) } -func TestGitVirtualFolders(t *testing.T) { - permissions := make(map[string][]string) - permissions["/"] = []string{dataprovider.PermAny} - user := dataprovider.User{ - BaseUser: sdk.BaseUser{ - Permissions: permissions, - HomeDir: os.TempDir(), - }, - } - conn := &Connection{ - BaseConnection: common.NewBaseConnection("", common.ProtocolSFTP, "", "", user), - } - cmd := sshCommand{ - command: "git-receive-pack", - connection: conn, - args: []string{"/vdir"}, - } - cmd.connection.User.VirtualFolders = append(cmd.connection.User.VirtualFolders, vfs.VirtualFolder{ - BaseVirtualFolder: vfs.BaseVirtualFolder{ - MappedPath: os.TempDir(), - }, - VirtualPath: "/vdir", - }) - _, err := cmd.getSystemCommand() - assert.NoError(t, err) - cmd.args = []string{"/"} - _, err = cmd.getSystemCommand() - assert.EqualError(t, err, errUnsupportedConfig.Error()) - cmd.args = []string{"/vdir1"} - _, err = cmd.getSystemCommand() - assert.NoError(t, err) - - cmd.connection.User.VirtualFolders = nil - cmd.connection.User.VirtualFolders = append(cmd.connection.User.VirtualFolders, vfs.VirtualFolder{ - BaseVirtualFolder: vfs.BaseVirtualFolder{ - MappedPath: os.TempDir(), - }, - VirtualPath: "/vdir", - }) - cmd.args = []string{"/vdir/subdir"} - _, err = cmd.getSystemCommand() - assert.NoError(t, err) - - cmd.args = []string{"/adir/subdir"} - _, err = cmd.getSystemCommand() - assert.NoError(t, err) -} - -func TestRsyncOptions(t *testing.T) { - permissions := make(map[string][]string) - permissions["/"] = []string{dataprovider.PermAny} - user := dataprovider.User{ - BaseUser: sdk.BaseUser{ - Permissions: permissions, - HomeDir: os.TempDir(), - }, - } - conn := &Connection{ - BaseConnection: common.NewBaseConnection("", common.ProtocolSFTP, "", "", user), - } - sshCmd := sshCommand{ - command: "rsync", - connection: conn, - args: []string{"--server", "-vlogDtprze.iLsfxC", ".", "/"}, - } - cmd, err := sshCmd.getSystemCommand() - assert.NoError(t, err) - assert.True(t, util.Contains(cmd.cmd.Args, "--safe-links"), - "--safe-links must be added if the user has the create symlinks permission") - - permissions["/"] = []string{dataprovider.PermDownload, dataprovider.PermUpload, dataprovider.PermCreateDirs, - dataprovider.PermListItems, dataprovider.PermOverwrite, dataprovider.PermDelete, dataprovider.PermRename} - user.Permissions = permissions - - conn = &Connection{ - BaseConnection: common.NewBaseConnection("", common.ProtocolSFTP, "", "", user), - } - sshCmd = sshCommand{ - command: "rsync", - connection: conn, - args: []string{"--server", "-vlogDtprze.iLsfxC", ".", "/"}, - } - cmd, err = sshCmd.getSystemCommand() - assert.NoError(t, err) - assert.True(t, util.Contains(cmd.cmd.Args, "--munge-links"), - "--munge-links must be added if the user has the create symlinks permission") - - sshCmd.connection.User.VirtualFolders = append(sshCmd.connection.User.VirtualFolders, vfs.VirtualFolder{ - BaseVirtualFolder: vfs.BaseVirtualFolder{ - MappedPath: os.TempDir(), - }, - VirtualPath: "/vdir", - }) - _, err = sshCmd.getSystemCommand() - assert.EqualError(t, err, errUnsupportedConfig.Error()) -} - -func TestSystemCommandSizeForPath(t *testing.T) { - permissions := make(map[string][]string) - permissions["/"] = []string{dataprovider.PermAny} - user := dataprovider.User{ - BaseUser: sdk.BaseUser{ - Permissions: permissions, - HomeDir: os.TempDir(), - }, - } - fs, err := user.GetFilesystem("123") - assert.NoError(t, err) - conn := &Connection{ - BaseConnection: common.NewBaseConnection("", common.ProtocolSFTP, "", "", user), - } - sshCmd := sshCommand{ - command: "rsync", - connection: conn, - args: []string{"--server", "-vlogDtprze.iLsfxC", ".", "/"}, - } - _, _, err = sshCmd.getSizeForPath(fs, "missing path") - assert.NoError(t, err) - testDir := filepath.Join(os.TempDir(), "dir") - err = os.MkdirAll(testDir, os.ModePerm) - assert.NoError(t, err) - testFile := filepath.Join(testDir, "testfile") - err = os.WriteFile(testFile, []byte("test content"), os.ModePerm) - assert.NoError(t, err) - err = os.Symlink(testFile, testFile+".link") - assert.NoError(t, err) - numFiles, size, err := sshCmd.getSizeForPath(fs, testFile+".link") - assert.NoError(t, err) - assert.Equal(t, 0, numFiles) - assert.Equal(t, int64(0), size) - numFiles, size, err = sshCmd.getSizeForPath(fs, testFile) - assert.NoError(t, err) - assert.Equal(t, 1, numFiles) - assert.Equal(t, int64(12), size) - if runtime.GOOS != osWindows { - err = os.Chmod(testDir, 0001) - assert.NoError(t, err) - _, _, err = sshCmd.getSizeForPath(fs, testFile) - assert.Error(t, err) - err = os.Chmod(testDir, os.ModePerm) - assert.NoError(t, err) - } - err = os.RemoveAll(testDir) - assert.NoError(t, err) -} - -func TestSystemCommandErrors(t *testing.T) { - buf := make([]byte, 65535) - stdErrBuf := make([]byte, 65535) - readErr := fmt.Errorf("test read error") - writeErr := fmt.Errorf("test write error") - mockSSHChannel := MockChannel{ - Buffer: bytes.NewBuffer(buf), - StdErrBuffer: bytes.NewBuffer(stdErrBuf), - ReadError: nil, - WriteError: writeErr, - } - permissions := make(map[string][]string) - permissions["/"] = []string{dataprovider.PermAny} - homeDir := filepath.Join(os.TempDir(), "adir") - err := os.MkdirAll(homeDir, os.ModePerm) - assert.NoError(t, err) - err = os.WriteFile(filepath.Join(homeDir, "afile"), []byte("content"), os.ModePerm) - assert.NoError(t, err) - user := dataprovider.User{ - BaseUser: sdk.BaseUser{ - Permissions: permissions, - HomeDir: homeDir, - }, - } - fs, err := user.GetFilesystem("123") - assert.NoError(t, err) - connection := &Connection{ - BaseConnection: common.NewBaseConnection("", common.ProtocolSFTP, "", "", user), - channel: &mockSSHChannel, - } - var sshCmd sshCommand - if runtime.GOOS == osWindows { - sshCmd = sshCommand{ - command: "dir", - connection: connection, - args: []string{"/"}, - } - } else { - sshCmd = sshCommand{ - command: "ls", - connection: connection, - args: []string{"/"}, - } - } - systemCmd, err := sshCmd.getSystemCommand() - assert.NoError(t, err) - - systemCmd.cmd.Dir = os.TempDir() - // FIXME: the command completes but the fake client is unable to read the response - // no error is reported in this case. We can see that the expected code is executed - // reading the test coverage - sshCmd.executeSystemCommand(systemCmd) //nolint:errcheck - - mockSSHChannel = MockChannel{ - Buffer: bytes.NewBuffer(buf), - StdErrBuffer: bytes.NewBuffer(stdErrBuf), - ReadError: readErr, - WriteError: nil, - } - sshCmd.connection.channel = &mockSSHChannel - baseTransfer := common.NewBaseTransfer(nil, sshCmd.connection.BaseConnection, nil, "", "", "", - common.TransferUpload, 0, 0, 0, 0, false, fs, dataprovider.TransferQuota{}) - transfer := newTransfer(baseTransfer, nil, nil, nil) - destBuff := make([]byte, 65535) - dst := bytes.NewBuffer(destBuff) - _, err = transfer.copyFromReaderToWriter(dst, sshCmd.connection.channel) - assert.EqualError(t, err, readErr.Error()) - - mockSSHChannel = MockChannel{ - Buffer: bytes.NewBuffer(buf), - StdErrBuffer: bytes.NewBuffer(stdErrBuf), - ReadError: nil, - WriteError: nil, - } - sshCmd.connection.channel = &mockSSHChannel - transfer.MaxWriteSize = 1 - _, err = transfer.copyFromReaderToWriter(dst, sshCmd.connection.channel) - assert.True(t, transfer.Connection.IsQuotaExceededError(err)) - - mockSSHChannel = MockChannel{ - Buffer: bytes.NewBuffer(buf), - StdErrBuffer: bytes.NewBuffer(stdErrBuf), - ReadError: nil, - WriteError: nil, - ShortWriteErr: true, - } - sshCmd.connection.channel = &mockSSHChannel - _, err = transfer.copyFromReaderToWriter(sshCmd.connection.channel, dst) - assert.EqualError(t, err, io.ErrShortWrite.Error()) - transfer.MaxWriteSize = -1 - _, err = transfer.copyFromReaderToWriter(sshCmd.connection.channel, dst) - assert.True(t, transfer.Connection.IsQuotaExceededError(err)) - - baseTransfer = common.NewBaseTransfer(nil, sshCmd.connection.BaseConnection, nil, "", "", "", - common.TransferDownload, 0, 0, 0, 0, false, fs, dataprovider.TransferQuota{ - AllowedDLSize: 1, - }) - transfer = newTransfer(baseTransfer, nil, nil, nil) - mockSSHChannel = MockChannel{ - Buffer: bytes.NewBuffer(buf), - StdErrBuffer: bytes.NewBuffer(stdErrBuf), - ReadError: nil, - WriteError: nil, - } - sshCmd.connection.channel = &mockSSHChannel - _, err = transfer.copyFromReaderToWriter(dst, sshCmd.connection.channel) - if assert.Error(t, err) { - assert.Contains(t, err.Error(), common.ErrReadQuotaExceeded.Error()) - } - - err = os.RemoveAll(homeDir) - assert.NoError(t, err) -} - func TestCommandGetFsError(t *testing.T) { user := dataprovider.User{ FsConfig: vfs.Filesystem{ Provider: sdk.CryptedFilesystemProvider, }, } - conn := &Connection{ - BaseConnection: common.NewBaseConnection("", common.ProtocolSFTP, "", "", user), - } - sshCmd := sshCommand{ - command: "rsync", - connection: conn, - args: []string{"--server", "-vlogDtprze.iLsfxC", ".", "/"}, - } - _, err := sshCmd.getSystemCommand() - assert.Error(t, err) buf := make([]byte, 65535) stdErrBuf := make([]byte, 65535) @@ -1059,7 +689,7 @@ func TestCommandGetFsError(t *testing.T) { StdErrBuffer: bytes.NewBuffer(stdErrBuf), ReadError: nil, } - conn = &Connection{ + conn := &Connection{ BaseConnection: common.NewBaseConnection("", common.ProtocolSCP, "", "", user), channel: &mockSSHChannel, } @@ -1071,7 +701,7 @@ func TestCommandGetFsError(t *testing.T) { }, } - err = scpCommand.handleRecursiveUpload() + err := scpCommand.handleRecursiveUpload() assert.Error(t, err) err = scpCommand.handleDownload("") assert.Error(t, err) @@ -1716,6 +1346,7 @@ func TestSCPUploadFiledata(t *testing.T) { if assert.Error(t, err) { assert.EqualError(t, err, common.ErrTransferClosed.Error()) } + transfer.Connection.RemoveTransfer(transfer) mockSSHChannel = MockChannel{ Buffer: bytes.NewBuffer(buf), @@ -1727,9 +1358,12 @@ func TestSCPUploadFiledata(t *testing.T) { transfer.Connection.AddTransfer(transfer) err = scpCommand.getUploadFileData(2, transfer) assert.ErrorContains(t, err, os.ErrClosed.Error()) + transfer.Connection.RemoveTransfer(transfer) err = os.Remove(testfile) assert.NoError(t, err) + + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func TestUploadError(t *testing.T) { @@ -1845,9 +1479,9 @@ func TestConfigsFromProvider(t *testing.T) { SFTPD: &dataprovider.SFTPDConfigs{ HostKeyAlgos: []string{ssh.KeyAlgoRSA}, KexAlgorithms: []string{ssh.InsecureKeyExchangeDHGEXSHA1}, - Ciphers: []string{ssh.InsecureCipherAES128CBC, ssh.InsecureCipherAES192CBC, ssh.InsecureCipherAES256CBC}, + Ciphers: []string{ssh.InsecureCipherAES128CBC}, MACs: []string{ssh.HMACSHA512ETM}, - PublicKeyAlgos: []string{ssh.InsecureKeyAlgoDSA}, + PublicKeyAlgos: []string{ssh.InsecureKeyAlgoDSA}, //nolint:staticcheck }, } err = dataprovider.UpdateConfigs(&configs, "", "", "") @@ -1878,7 +1512,7 @@ func TestSupportedSecurityOptions(t *testing.T) { var defaultKexs []string for _, k := range supportedKexAlgos { defaultKexs = append(defaultKexs, k) - if k == ssh.KeyExchangeCurve25519SHA256 { + if k == ssh.KeyExchangeCurve25519 { defaultKexs = append(defaultKexs, keyExchangeCurve25519SHA256LibSSH) } } @@ -1895,7 +1529,7 @@ func TestSupportedSecurityOptions(t *testing.T) { c.MACs = []string{ " hmac-sha2-256-etm@openssh.com ", " hmac-sha2-512-etm@openssh.com", "hmac-sha2-256", "hmac-sha2-512 ", - " hmac-sha1-96", "hmac-sha1 ", + "hmac-sha1 ", " hmac-sha1-96", } err = c.configureSecurityOptions(serverConfig) assert.NoError(t, err) @@ -1982,40 +1616,6 @@ func TestCertCheckerInitErrors(t *testing.T) { assert.NoError(t, err) } -func TestSFTPSubSystem(t *testing.T) { - permissions := make(map[string][]string) - permissions["/"] = []string{dataprovider.PermAny} - user := &dataprovider.User{ - BaseUser: sdk.BaseUser{ - Permissions: permissions, - HomeDir: os.TempDir(), - }, - } - user.FsConfig.Provider = sdk.AzureBlobFilesystemProvider - err := ServeSubSystemConnection(user, "connID", nil, nil) - assert.Error(t, err) - user.FsConfig.Provider = sdk.LocalFilesystemProvider - - buf := make([]byte, 0, 4096) - stdErrBuf := make([]byte, 0, 4096) - mockSSHChannel := &MockChannel{ - Buffer: bytes.NewBuffer(buf), - StdErrBuffer: bytes.NewBuffer(stdErrBuf), - } - // this is 327680 and it will result in packet too long error - _, err = mockSSHChannel.Write([]byte{0x00, 0x05, 0x00, 0x00, 0x00, 0x00}) - assert.NoError(t, err) - err = ServeSubSystemConnection(user, "id", mockSSHChannel, mockSSHChannel) - assert.EqualError(t, err, "packet too long") - - subsystemChannel := newSubsystemChannel(mockSSHChannel, mockSSHChannel) - n, err := subsystemChannel.Write([]byte{0x00}) - assert.NoError(t, err) - assert.Equal(t, n, 1) - err = subsystemChannel.Close() - assert.NoError(t, err) -} - func TestRecoverer(t *testing.T) { c := Configuration{} c.AcceptInboundConnection(nil, nil) @@ -2039,6 +1639,7 @@ func TestRecoverer(t *testing.T) { err = scpCmd.handle() assert.EqualError(t, err, common.ErrGenericFailure.Error()) assert.Len(t, common.Connections.GetStats(""), 0) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func TestListernerAcceptErrors(t *testing.T) { @@ -2145,9 +1746,27 @@ func TestMaxUserSessions(t *testing.T) { c := Configuration{} c.handleSftpConnection(nil, connection) + buf := make([]byte, 65535) + stdErrBuf := make([]byte, 65535) + mockSSHChannel := MockChannel{ + Buffer: bytes.NewBuffer(buf), + StdErrBuffer: bytes.NewBuffer(stdErrBuf), + } + + conn := &Connection{ + BaseConnection: common.NewBaseConnection(xid.New().String(), common.ProtocolSFTP, "", "", dataprovider.User{ + BaseUser: sdk.BaseUser{ + Username: "user_max_sessions", + HomeDir: filepath.Clean(os.TempDir()), + MaxSessions: 1, + }, + }), + channel: &mockSSHChannel, + } + sshCmd := sshCommand{ command: "cd", - connection: connection, + connection: conn, } err = sshCmd.handle() if assert.Error(t, err) { @@ -2156,19 +1775,17 @@ func TestMaxUserSessions(t *testing.T) { scpCmd := scpCommand{ sshCommand: sshCommand{ command: "scp", - connection: connection, + connection: conn, }, } err = scpCmd.handle() if assert.Error(t, err) { assert.Contains(t, err.Error(), "too many open sessions") } - err = ServeSubSystemConnection(&connection.User, connection.ID, nil, nil) - if assert.Error(t, err) { - assert.Contains(t, err.Error(), "too many open sessions") - } + common.Connections.Remove(connection.GetID()) assert.Len(t, common.Connections.GetStats(""), 0) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func TestCanReadSymlink(t *testing.T) { @@ -2203,6 +1820,7 @@ func TestCanReadSymlink(t *testing.T) { } func TestAuthenticationErrors(t *testing.T) { + sftpAuthError := newAuthenticationError(nil, "", "") loginMethod := dataprovider.SSHLoginMethodPassword username := "test user" err := newAuthenticationError(fmt.Errorf("cannot validate credentials: %w", util.NewRecordNotFoundError("not found")), @@ -2227,3 +1845,42 @@ func TestAuthenticationErrors(t *testing.T) { assert.ErrorIs(t, err, sftpAuthError) assert.NotErrorIs(t, err, util.ErrNotFound) } + +type mockCommandExecutor struct { + Output []byte + Err error +} + +func (f mockCommandExecutor) CombinedOutput(ctx context.Context, name string, args ...string) ([]byte, error) { + return f.Output, f.Err +} + +func TestVerifyWithOPKSSH(t *testing.T) { + sshCert := []byte(`ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAg4+hKHVPKv183MU/Q7XD/mzDBFSc2YY3eraltxLMGJo0AAAADAQABAAABAQCe6jMoy1xCQgiZkZJ7gi6NLj4uRqz2OaUGK/OJYZTfBqK+SlS9iymAluHu9K+cc4+0qxx0gn7dRTJWINSgzvca6ayYe995EKgD1hE5krh9BH0bRrXB+hGqyslcZOgLNO+v8jYojClQbRtET2tS+xb4k33GCuL5wgla2790ZgOQgs7huQUjG0S8c1W+EYt6fI4cWE/DeEBnv9sqryS8rOb0PbM6WUd7XBadwySFWYQUX0ei56GNt12Z4gADEGlFQV/OnV0PvnTcAMGUl0rfToPgJ4jgogWKoTVWuZ9wyA/x+2LRLRvgm2a969ig937/AH0i0Wq+FzqfK7EXQ99Yf5K/AAAAAAAAAAAAAAACAAAAFGhvc3QuZXhhbXBsZS5jb20ta2V5AAAAFAAAABBob3N0LmV4YW1wbGUuY29tAAAAAGXEzYAAAAAAd8sP4wAAAAAAAAAAAAAAAAAAARcAAAAHc3NoLXJzYQAAAAMBAAEAAAEBAL4PXUPSERufZWCW/hhEnylk3IeMgaa+2HcNY5Cur77a8fYy6OYZAPF+vhJUT0akwGUpTeXAZumAgHECDrJlw1J+jo9ZVT0AKDo0wU77IzNzYxob7+dpB02NJ7DLAXmPauQ07Zc5pWJFVKtmuh7YH9pjYtNXSMOXye7k06PBGzX+ztIt7nPWvD9fR2mZeTSoljeBCGZHwdlnV2ESQlQbBoEI93RPxqxJh/UCDatQPhpDbyverr2ZvB9Y45rqsx6ZVmu5RXl3MfBU1U21W/4ia2di3PybyD4rSmVoam0efcqxo6cBKSHe26OFoTuS9zgdH0iCWL37vqOFmJ7eH91M3nMAAAEUAAAADHJzYS1zaGEyLTI1NgAAAQA/ByIegNZYJRRl413S/8LxGvTZnbxsPwaluoJ/54niGZV9P28THz7d9jXfSHPjalhH93jNPfTYXvI4opnDC37ua1Nu8KKfk40IWXnnDdZLWraUxEidIzhmfVtz8kGdGoFQ8H0EzubL7zKNOTlfSfOoDlmQVOuxT/+eh2mEp4ri0/+8J1mLfLBr8tREX0/iaNjK+RKdcyTMicKursAYMCDdu8vlaphxea+ocyHM9izSX/l33t44V13ueTqIOh2Zbl2UE2k+jk+0dc1CmV0SEoiWiIyt8TRM4yQry1vPlQLsrf28sYM/QMwnhCVhyZO3vs5F25aQWrB9d51VEzBW9/fd host.example.com`) + key, _, _, _, err := ssh.ParseAuthorizedKey(sshCert) //nolint:dogsled + require.NoError(t, err) + cert, ok := key.(*ssh.Certificate) + require.True(t, ok) + c := Configuration{} + c.executor = mockCommandExecutor{ + Err: errors.New("test error"), + } + err = c.verifyWithOPKSSH("user", cert) + assert.Error(t, err) + + c.executor = mockCommandExecutor{} + err = c.verifyWithOPKSSH("", cert) + assert.Error(t, err) + + c.executor = mockCommandExecutor{ + Output: ssh.MarshalAuthorizedKey(cert), + } + err = c.verifyWithOPKSSH("", cert) + assert.Error(t, err) + + c.executor = mockCommandExecutor{ + Output: ssh.MarshalAuthorizedKey(cert.SignatureKey), + } + err = c.verifyWithOPKSSH("", cert) + assert.NoError(t, err) +} diff --git a/internal/sftpd/internal_unix_test.go b/internal/sftpd/internal_unix_test.go deleted file mode 100644 index 3bb0207f..00000000 --- a/internal/sftpd/internal_unix_test.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (C) 2019 Nicola Murino -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, version 3. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -//go:build !windows -// +build !windows - -package sftpd - -import ( - "os/exec" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestWrapCmd(t *testing.T) { - cmd := exec.Command("ls") - cmd = wrapCmd(cmd, 3001, 3002) - assert.Equal(t, uint32(3001), cmd.SysProcAttr.Credential.Uid) - assert.Equal(t, uint32(3002), cmd.SysProcAttr.Credential.Gid) - - cmd = exec.Command("cd") - cmd = wrapCmd(cmd, processUID, processGID) - assert.Nil(t, cmd.SysProcAttr) -} diff --git a/internal/sftpd/scp.go b/internal/sftpd/scp.go index be4079ed..2d91afe3 100644 --- a/internal/sftpd/scp.go +++ b/internal/sftpd/scp.go @@ -51,8 +51,9 @@ func (c *scpCommand) handle() (err error) { } }() if err := common.Connections.Add(c.connection); err != nil { + defer c.connection.CloseFS() //nolint:errcheck logger.Info(logSender, "", "unable to add SCP connection: %v", err) - return err + return c.sendErrorResponse(err) } defer common.Connections.Remove(c.connection.GetID()) @@ -227,6 +228,12 @@ func (c *scpCommand) getUploadFileData(sizeToRead int64, transfer *transfer) err } func (c *scpCommand) handleUploadFile(fs vfs.Fs, resolvedPath, filePath string, sizeToRead int64, isNewFile bool, fileSize int64, requestPath string) error { + if err := common.Connections.IsNewTransferAllowed(c.connection.User.Username); err != nil { + err := fmt.Errorf("denying file write due to transfer count limits") + c.connection.Log(logger.LevelInfo, "denying file write due to transfer count limits") + c.sendErrorMessage(nil, err) + return err + } diskQuota, transferQuota := c.connection.HasSpace(isNewFile, false, requestPath) if !diskQuota.HasSpace || !transferQuota.HasUploadSpace() { err := fmt.Errorf("denying file write due to quota limits") @@ -258,10 +265,7 @@ func (c *scpCommand) handleUploadFile(fs vfs.Fs, resolvedPath, filePath string, if vfs.HasTruncateSupport(fs) { vfolder, err := c.connection.User.GetVirtualFolderForPath(path.Dir(requestPath)) if err == nil { - dataprovider.UpdateVirtualFolderQuota(&vfolder.BaseVirtualFolder, 0, -fileSize, false) //nolint:errcheck - if vfolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&c.connection.User, 0, -fileSize, false) //nolint:errcheck - } + dataprovider.UpdateUserFolderQuota(&vfolder, &c.connection.User, 0, -fileSize, false) } else { dataprovider.UpdateUserQuota(&c.connection.User, 0, -fileSize, false) //nolint:errcheck } @@ -333,7 +337,7 @@ func (c *scpCommand) handleUpload(uploadFilePath string, sizeToRead int64) error } if common.Config.IsAtomicUploadEnabled() && fs.IsAtomicUploadSupported() { - _, _, err = fs.Rename(p, filePath) + _, _, err = fs.Rename(p, filePath, 0) if err != nil { c.connection.Log(logger.LevelError, "error renaming existing file for atomic upload, source: %q, dest: %q, err: %v", p, filePath, err) @@ -504,6 +508,13 @@ func (c *scpCommand) sendDownloadFileData(fs vfs.Fs, filePath string, stat os.Fi func (c *scpCommand) handleDownload(filePath string) error { c.connection.UpdateLastActivity() + + if err := common.Connections.IsNewTransferAllowed(c.connection.User.Username); err != nil { + err := fmt.Errorf("denying file read due to transfer count limits") + c.connection.Log(logger.LevelInfo, "denying file read due to transfer count limits") + c.sendErrorMessage(nil, err) + return err + } transferQuota := c.connection.GetTransferQuota() if !transferQuota.HasDownloadSpace() { c.connection.Log(logger.LevelInfo, "denying file read due to quota limits") diff --git a/internal/sftpd/server.go b/internal/sftpd/server.go index 5b4455a3..3bee040d 100644 --- a/internal/sftpd/server.go +++ b/internal/sftpd/server.go @@ -16,16 +16,21 @@ package sftpd import ( "bytes" + "context" + "crypto/sha256" "encoding/hex" "encoding/json" "errors" "fmt" "io" "io/fs" + "maps" "net" "os" + "os/exec" "path/filepath" "runtime/debug" + "slices" "strings" "sync" "time" @@ -50,6 +55,10 @@ const ( defaultPrivateEd25519KeyName = "id_ed25519" sourceAddressCriticalOption = "source-address" keyExchangeCurve25519SHA256LibSSH = "curve25519-sha256@libssh.org" + extraDataPartialSuccessErrKey = "partialSuccessErr" + extraDataUserKey = "user" + extraDataKeyIDKey = "keyID" + extraDataLoginMethodKey = "login_method" ) var ( @@ -76,10 +85,20 @@ var ( revokedCertManager = revokedCertificates{ certs: map[string]bool{}, } - - sftpAuthError = newAuthenticationError(nil, "", "") ) +type commandExecutor interface { + CombinedOutput(ctx context.Context, name string, args ...string) ([]byte, error) +} + +type defaultExecutor struct{} + +func (d defaultExecutor) CombinedOutput(ctx context.Context, name string, args ...string) ([]byte, error) { + cmd := exec.CommandContext(ctx, name, args...) + cmd.Env = []string{} + return cmd.CombinedOutput() +} + // Binding defines the configuration for a network listener type Binding struct { // The address to listen on. A blank value means listen on all available network interfaces. @@ -144,6 +163,10 @@ type Configuration struct { // Example content: // ["SHA256:bsBRHC/xgiqBJdSuvSTNpJNLTISP/G356jNMCRYC5Es","SHA256:119+8cL/HH+NLMawRsJx6CzPF1I3xC+jpM60bQHXGE8"] RevokedUserCertsFile string `json:"revoked_user_certs_file" mapstructure:"revoked_user_certs_file"` + // Absolute path to the opkssh binary used for OpenPubkey SSH integration + OPKSSHPath string `json:"opkssh_path" mapstructure:"opkssh_path"` + // Expected SHA256 checksum of the opkssh binary. It is verified at application startup + OPKSSHChecksum string `json:"opkssh_checksum" mapstructure:"opkssh_checksum"` // LoginBannerFile the contents of the specified file, if any, are sent to // the remote user before authentication is allowed. LoginBannerFile string `json:"login_banner_file" mapstructure:"login_banner_file"` @@ -179,6 +202,7 @@ type Configuration struct { PasswordAuthentication bool `json:"password_authentication" mapstructure:"password_authentication"` certChecker *ssh.CertChecker parsedUserCAKeys []ssh.PublicKey + executor commandExecutor } type authenticationError struct { @@ -231,10 +255,6 @@ func (c *Configuration) getServerConfig() *ssh.ServerConfig { MaxAuthTries: c.MaxAuthTries, PublicKeyCallback: func(conn ssh.ConnMetadata, pubKey ssh.PublicKey) (*ssh.Permissions, error) { sp, err := c.validatePublicKeyCredentials(conn, pubKey) - var partialSuccess *ssh.PartialSuccessError - if errors.As(err, &partialSuccess) { - return sp, err - } if err != nil { return nil, newAuthenticationError(fmt.Errorf("could not validate public key credentials: %w", err), dataprovider.SSHLoginMethodPublicKey, conn.User()) @@ -242,6 +262,35 @@ func (c *Configuration) getServerConfig() *ssh.ServerConfig { return sp, nil }, + VerifiedPublicKeyCallback: func(conn ssh.ConnMetadata, key ssh.PublicKey, permissions *ssh.Permissions, signatureAlgorithm string) (*ssh.Permissions, error) { + if partialErr, ok := permissions.ExtraData[extraDataPartialSuccessErrKey]; ok { + logger.Info(logSender, hex.EncodeToString(conn.SessionID()), "user %q authenticated with partial success, signature algorithm %q", + conn.User(), signatureAlgorithm) + return nil, partialErr.(error) + } + method := dataprovider.SSHLoginMethodPublicKey + user := permissions.ExtraData[extraDataUserKey].(dataprovider.User) + keyID := permissions.ExtraData[extraDataKeyIDKey].(string) + sshPerm, err := loginUser(&user, method, fmt.Sprintf("%s (%s)", keyID, signatureAlgorithm), conn) + if err == nil { + // if we have a SSH user cert we need to merge certificate permissions with our ones + // we only set Extensions, so CriticalOptions are always the ones from the certificate + sshPerm.CriticalOptions = permissions.CriticalOptions + if permissions.Extensions != nil { + if sshPerm.Extensions == nil { + sshPerm.Extensions = make(map[string]string) + } + maps.Copy(sshPerm.Extensions, permissions.Extensions) + } + if sshPerm.ExtraData == nil { + sshPerm.ExtraData = make(map[any]any) + } + } + user.Username = conn.User() + ipAddr := util.GetIPFromRemoteAddress(conn.RemoteAddr().String()) + updateLoginMetrics(&user, ipAddr, method, err) + return sshPerm, err + }, ServerVersion: fmt.Sprintf("SSH-2.0-%s", version.GetServerVersion("_", false)), } @@ -259,13 +308,13 @@ func (c *Configuration) getServerConfig() *ssh.ServerConfig { func (c *Configuration) updateSupportedAuthentications() { serviceStatus.Authentications = util.RemoveDuplicates(serviceStatus.Authentications, false) - if util.Contains(serviceStatus.Authentications, dataprovider.LoginMethodPassword) && - util.Contains(serviceStatus.Authentications, dataprovider.SSHLoginMethodPublicKey) { + if slices.Contains(serviceStatus.Authentications, dataprovider.LoginMethodPassword) && + slices.Contains(serviceStatus.Authentications, dataprovider.SSHLoginMethodPublicKey) { serviceStatus.Authentications = append(serviceStatus.Authentications, dataprovider.SSHLoginMethodKeyAndPassword) } - if util.Contains(serviceStatus.Authentications, dataprovider.SSHLoginMethodKeyboardInteractive) && - util.Contains(serviceStatus.Authentications, dataprovider.SSHLoginMethodPublicKey) { + if slices.Contains(serviceStatus.Authentications, dataprovider.SSHLoginMethodKeyboardInteractive) && + slices.Contains(serviceStatus.Authentications, dataprovider.SSHLoginMethodPublicKey) { serviceStatus.Authentications = append(serviceStatus.Authentications, dataprovider.SSHLoginMethodKeyAndKeyboardInt) } } @@ -311,6 +360,7 @@ func (c *Configuration) loadFromProvider() error { // Initialize the SFTP server and add a persistent listener to handle inbound SFTP connections. func (c *Configuration) Initialize(configDir string) error { + c.executor = defaultExecutor{} if err := c.loadFromProvider(); err != nil { return fmt.Errorf("unable to load configs from provider: %w", err) } @@ -322,7 +372,7 @@ func (c *Configuration) Initialize(configDir string) error { } sftp.SetSFTPExtensions(sftpExtensions...) //nolint:errcheck // we configure valid SFTP Extensions so we cannot get an error - sftp.MaxFilelist = vfs.ListerBatchSize + sftp.MaxFilelist = 250 if err := c.configureSecurityOptions(serverConfig); err != nil { return err @@ -334,6 +384,9 @@ func (c *Configuration) Initialize(configDir string) error { if err := c.initializeCertChecker(configDir); err != nil { return err } + if err := c.initializeOPKSSH(); err != nil { + return err + } c.configureKeyboardInteractiveAuth(serverConfig) c.configureLoginBanner(serverConfig, configDir) c.checkSSHCommands() @@ -392,8 +445,8 @@ func (c *Configuration) serve(listener net.Listener, serverConfig *ssh.ServerCon } else { tempDelay *= 2 } - if max := 1 * time.Second; tempDelay > max { - tempDelay = max + if maxDelay := 1 * time.Second; tempDelay > maxDelay { + tempDelay = maxDelay } logger.Warn(logSender, "", "accept error: %v; retrying in %v", err, tempDelay) time.Sleep(tempDelay) @@ -415,7 +468,7 @@ func (c *Configuration) configureKeyAlgos(serverConfig *ssh.ServerConfig) error c.HostKeyAlgorithms = util.RemoveDuplicates(c.HostKeyAlgorithms, true) } for _, hostKeyAlgo := range c.HostKeyAlgorithms { - if !util.Contains(supportedHostKeyAlgos, hostKeyAlgo) { + if !slices.Contains(supportedHostKeyAlgos, hostKeyAlgo) { return fmt.Errorf("unsupported host key algorithm %q", hostKeyAlgo) } } @@ -423,7 +476,7 @@ func (c *Configuration) configureKeyAlgos(serverConfig *ssh.ServerConfig) error if len(c.PublicKeyAlgorithms) > 0 { c.PublicKeyAlgorithms = util.RemoveDuplicates(c.PublicKeyAlgorithms, true) for _, algo := range c.PublicKeyAlgorithms { - if !util.Contains(supportedPublicKeyAlgos, algo) { + if !slices.Contains(supportedPublicKeyAlgos, algo) { return fmt.Errorf("unsupported public key authentication algorithm %q", algo) } } @@ -445,9 +498,9 @@ func (c *Configuration) checkKeyExchangeAlgorithms() { } kexs = append(kexs, k) if strings.TrimSpace(k) == keyExchangeCurve25519SHA256LibSSH { - kexs = append(kexs, ssh.KeyExchangeCurve25519SHA256) + kexs = append(kexs, ssh.KeyExchangeCurve25519) } - if strings.TrimSpace(k) == ssh.KeyExchangeCurve25519SHA256 { + if strings.TrimSpace(k) == ssh.KeyExchangeCurve25519 { kexs = append(kexs, keyExchangeCurve25519SHA256LibSSH) } } @@ -465,7 +518,7 @@ func (c *Configuration) configureSecurityOptions(serverConfig *ssh.ServerConfig) if kex == keyExchangeCurve25519SHA256LibSSH { continue } - if !util.Contains(supportedKexAlgos, kex) { + if !slices.Contains(supportedKexAlgos, kex) { return fmt.Errorf("unsupported key-exchange algorithm %q", kex) } } @@ -479,7 +532,10 @@ func (c *Configuration) configureSecurityOptions(serverConfig *ssh.ServerConfig) if len(c.Ciphers) > 0 { c.Ciphers = util.RemoveDuplicates(c.Ciphers, true) for _, cipher := range c.Ciphers { - if !util.Contains(supportedCiphers, cipher) { + if slices.Contains([]string{"aes192-cbc", "aes256-cbc"}, cipher) { + continue + } + if !slices.Contains(supportedCiphers, cipher) { return fmt.Errorf("unsupported cipher %q", cipher) } } @@ -492,7 +548,7 @@ func (c *Configuration) configureSecurityOptions(serverConfig *ssh.ServerConfig) if len(c.MACs) > 0 { c.MACs = util.RemoveDuplicates(c.MACs, true) for _, mac := range c.MACs { - if !util.Contains(supportedMACs, mac) { + if !slices.Contains(supportedMACs, mac) { return fmt.Errorf("unsupported MAC algorithm %q", mac) } } @@ -555,7 +611,7 @@ func (c *Configuration) configureKeyboardInteractiveAuth(serverConfig *ssh.Serve } // AcceptInboundConnection handles an inbound connection to the server instance and determines if the request should be served or not. -func (c *Configuration) AcceptInboundConnection(conn net.Conn, config *ssh.ServerConfig) { +func (c *Configuration) AcceptInboundConnection(conn net.Conn, config *ssh.ServerConfig) { //nolint:gocyclo defer func() { if r := recover(); r != nil { logger.Error(logSender, "", "panic in AcceptInboundConnection: %q stack trace: %v", r, string(debug.Stack())) @@ -584,14 +640,10 @@ func (c *Configuration) AcceptInboundConnection(conn net.Conn, config *ssh.Serve conn.SetDeadline(time.Time{}) //nolint:errcheck go ssh.DiscardRequests(reqs) - defer conn.Close() + defer sconn.Close() - var user dataprovider.User - - // Unmarshal cannot fails here and even if it fails we'll have a user with no permissions - json.Unmarshal(util.StringToBytes(sconn.Permissions.Extensions["sftpgo_user"]), &user) //nolint:errcheck - - loginType := sconn.Permissions.Extensions["sftpgo_login_method"] + user := sconn.Permissions.ExtraData[extraDataUserKey].(dataprovider.User) + loginType := sconn.Permissions.ExtraData[extraDataLoginMethodKey].(string) connectionID := hex.EncodeToString(sconn.SessionID()) defer user.CloseFs() //nolint:errcheck @@ -601,13 +653,13 @@ func (c *Configuration) AcceptInboundConnection(conn net.Conn, config *ssh.Serve return } - logger.Log(logger.LevelInfo, common.ProtocolSSH, connectionID, - "User %q logged in with %q, from ip %q, client version %q, negotiated algorithms: %+v", - user.Username, loginType, ipAddr, util.BytesToString(sconn.ClientVersion()), - sconn.Conn.(ssh.AlgorithmsConnMetadata).Algorithms()) + logger.LoginLog(user.Username, ipAddr, loginType, common.ProtocolSSH, connectionID, + util.BytesToString(sconn.ClientVersion()), true, + fmt.Sprintf("negotiated algorithms: %+v", sconn.Conn.(ssh.AlgorithmsConnMetadata).Algorithms())) + dataprovider.UpdateLastLogin(&user) - sshConnection := common.NewSSHConnection(connectionID, conn) + sshConnection := common.NewSSHConnection(connectionID, sconn) common.Connections.AddSSHConnection(sshConnection) defer common.Connections.RemoveSSHConnection(connectionID) @@ -630,7 +682,6 @@ func (c *Configuration) AcceptInboundConnection(conn net.Conn, config *ssh.Serve } channelCounter++ - sshConnection.UpdateLastActivity() // Channels have a type that is dependent on the protocol. For SFTP this is "subsystem" // with a payload that (should) be "sftp". Discard anything else we receive ("pty", "shell", etc) go func(in <-chan *ssh.Request, counter int64) { @@ -640,8 +691,9 @@ func (c *Configuration) AcceptInboundConnection(conn net.Conn, config *ssh.Serve switch req.Type { case "subsystem": - if util.BytesToString(req.Payload[4:]) == "sftp" { + if bytes.Equal(req.Payload[4:], []byte("sftp")) { ok = true + sshConnection.UpdateLastActivity() connection := &Connection{ BaseConnection: common.NewBaseConnection(connID, common.ProtocolSFTP, conn.LocalAddr().String(), conn.RemoteAddr().String(), user), @@ -663,6 +715,9 @@ func (c *Configuration) AcceptInboundConnection(conn net.Conn, config *ssh.Serve channel: channel, } ok = processSSHCommand(req.Payload, &connection, c.EnabledSSHCommands) + if ok { + sshConnection.UpdateLastActivity() + } } if req.WantReply { req.Reply(ok, nil) //nolint:errcheck @@ -679,6 +734,7 @@ func (c *Configuration) handleSftpConnection(channel ssh.Channel, connection *Co } }() if err := common.Connections.Add(connection); err != nil { + defer connection.CloseFS() //nolint:errcheck errClose := connection.Disconnect() logger.Info(logSender, "", "unable to add connection: %v, close err: %v", err, errClose) return @@ -686,7 +742,7 @@ func (c *Configuration) handleSftpConnection(channel ssh.Channel, connection *Co defer common.Connections.Remove(connection.GetID()) // Create the server instance for the channel using the handler we created above. - server := sftp.NewRequestServer(channel, c.createHandlers(connection), sftp.WithRSAllocator(), + server := sftp.NewRequestServer(channel, c.createHandlers(connection), sftp.WithStartDirectory(connection.User.Filters.StartDirectory)) defer server.Close() @@ -778,7 +834,7 @@ func loginUser(user *dataprovider.User, loginMethod, publicKey string, conn ssh. user.Username, user.HomeDir) return nil, fmt.Errorf("cannot login user with invalid home dir: %q", user.HomeDir) } - if util.Contains(user.Filters.DeniedProtocols, common.ProtocolSSH) { + if slices.Contains(user.Filters.DeniedProtocols, common.ProtocolSSH) { logger.Info(logSender, connectionID, "cannot login user %q, protocol SSH is not allowed", user.Username) return nil, fmt.Errorf("protocol SSH is not allowed for user %q", user.Username) } @@ -807,30 +863,25 @@ func loginUser(user *dataprovider.User, loginMethod, publicKey string, conn ssh. return nil, fmt.Errorf("login for user %q is not allowed from this address: %v", user.Username, remoteAddr) } - json, err := json.Marshal(user) - if err != nil { - logger.Warn(logSender, connectionID, "error serializing user info: %v, authentication rejected", err) - return nil, err - } if publicKey != "" { loginMethod = fmt.Sprintf("%v: %v", loginMethod, publicKey) } p := &ssh.Permissions{} - p.Extensions = make(map[string]string) - p.Extensions["sftpgo_user"] = util.BytesToString(json) - p.Extensions["sftpgo_login_method"] = loginMethod + p.ExtraData = make(map[any]any) + p.ExtraData[extraDataUserKey] = *user + p.ExtraData[extraDataLoginMethodKey] = loginMethod return p, nil } func (c *Configuration) checkSSHCommands() { - if util.Contains(c.EnabledSSHCommands, "*") { + if slices.Contains(c.EnabledSSHCommands, "*") { c.EnabledSSHCommands = GetSupportedSSHCommands() return } sshCommands := []string{} for _, command := range c.EnabledSSHCommands { command = strings.TrimSpace(command) - if util.Contains(supportedSSHCommands, command) { + if slices.Contains(supportedSSHCommands, command) { sshCommands = append(sshCommands, command) } else { logger.Warn(logSender, "", "unsupported ssh command: %q ignored", command) @@ -849,11 +900,12 @@ func (c *Configuration) generateDefaultHostKeys(configDir string) error { if _, err = os.Stat(autoFile); errors.Is(err, fs.ErrNotExist) { logger.Info(logSender, "", "No host keys configured and %q does not exist; try to create a new host key", autoFile) logger.InfoToConsole("No host keys configured and %q does not exist; try to create a new host key", autoFile) - if k == defaultPrivateRSAKeyName { + switch k { + case defaultPrivateRSAKeyName: err = util.GenerateRSAKeys(autoFile) - } else if k == defaultPrivateECDSAKeyName { + case defaultPrivateECDSAKeyName: err = util.GenerateECDSAKeys(autoFile) - } else { + default: err = util.GenerateEd25519Keys(autoFile) } if err != nil { @@ -920,7 +972,7 @@ func (c *Configuration) checkHostKeyAutoGeneration(configDir string) error { func (c *Configuration) getHostKeyAlgorithms(keyFormat string) []string { var algos []string for _, algo := range algorithmsForKeyFormat(keyFormat) { - if util.Contains(c.HostKeyAlgorithms, algo) { + if slices.Contains(c.HostKeyAlgorithms, algo) { algos = append(algos, algo) } } @@ -979,7 +1031,7 @@ func (c *Configuration) checkAndLoadHostKeys(configDir string, serverConfig *ssh var algos []string for _, algo := range algorithmsForKeyFormat(signer.PublicKey().Type()) { if underlyingAlgo, ok := certKeyAlgoNames[algo]; ok { - if util.Contains(mas.Algorithms(), underlyingAlgo) { + if slices.Contains(mas.Algorithms(), underlyingAlgo) { algos = append(algos, algo) } } @@ -1039,6 +1091,49 @@ func (c *Configuration) loadHostCertificates(configDir string) ([]hostCertificat return certs, nil } +func (c *Configuration) initializeOPKSSH() error { + if c.OPKSSHPath != "" { + if len(c.parsedUserCAKeys) > 0 { + return errors.New("opkssh and certificate authorities are mutually exclusive") + } + if !util.IsFileInputValid(c.OPKSSHPath) || !filepath.IsAbs(c.OPKSSHPath) { + return fmt.Errorf("opkssh path %q is not valid, it must be an absolute path", c.OPKSSHPath) + } + if c.OPKSSHChecksum == "" { + if _, err := os.Stat(c.OPKSSHPath); err != nil { + return fmt.Errorf("error validating opkssh path %q: %w", c.OPKSSHPath, err) + } + } else { + if err := util.VerifyFileChecksum(c.OPKSSHPath, sha256.New(), c.OPKSSHChecksum, 100*1024*1024); err != nil { + return fmt.Errorf("error validating opkssh checksum: %w", err) + } + } + } + + return nil +} + +func (c *Configuration) verifyWithOPKSSH(username string, cert *ssh.Certificate) error { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + args := []string{"verify", username, util.BytesToString(ssh.MarshalAuthorizedKey(cert)), cert.Type()} + out, err := c.executor.CombinedOutput(ctx, c.OPKSSHPath, args...) + if err != nil { + logger.Debug(logSender, "", "unable to execute opk verifier: %s", string(out)) + return fmt.Errorf("unable to execute opk verifier: %w", err) + } + pubKey, _, _, _, err := ssh.ParseAuthorizedKey(out) //nolint:dogsled + if err != nil { + logger.Debug(logSender, "", "unable to validate the opk verifier output: %s", string(out)) + return fmt.Errorf("unable to validate the opk verifier output: %w", err) + } + if !bytes.Equal(pubKey.Marshal(), cert.SignatureKey.Marshal()) { + return errors.New("unable to validate opk result") + } + return nil +} + func (c *Configuration) initializeCertChecker(configDir string) error { for _, keyPath := range c.TrustedUserCAKeys { keyPath = strings.TrimSpace(keyPath) @@ -1091,12 +1186,12 @@ func (c *Configuration) initializeCertChecker(configDir string) error { func (c *Configuration) getPartialSuccessError(nextAuthMethods []string) error { err := &ssh.PartialSuccessError{} - if c.PasswordAuthentication && util.Contains(nextAuthMethods, dataprovider.LoginMethodPassword) { + if c.PasswordAuthentication && slices.Contains(nextAuthMethods, dataprovider.LoginMethodPassword) { err.Next.PasswordCallback = func(conn ssh.ConnMetadata, password []byte) (*ssh.Permissions, error) { return c.validatePasswordCredentials(conn, password, dataprovider.SSHLoginMethodKeyAndPassword) } } - if c.KeyboardInteractiveAuthentication && util.Contains(nextAuthMethods, dataprovider.SSHLoginMethodKeyboardInteractive) { + if c.KeyboardInteractiveAuthentication && slices.Contains(nextAuthMethods, dataprovider.SSHLoginMethodKeyboardInteractive) { err.Next.KeyboardInteractiveCallback = func(conn ssh.ConnMetadata, client ssh.KeyboardInteractiveChallenge) (*ssh.Permissions, error) { return c.validateKeyboardInteractiveCredentials(conn, client, dataprovider.SSHLoginMethodKeyAndKeyboardInt, true) } @@ -1105,74 +1200,75 @@ func (c *Configuration) getPartialSuccessError(nextAuthMethods []string) error { } func (c *Configuration) validatePublicKeyCredentials(conn ssh.ConnMetadata, pubKey ssh.PublicKey) (*ssh.Permissions, error) { - var err error var user dataprovider.User - var keyID string - var sshPerm *ssh.Permissions var certPerm *ssh.Permissions - connectionID := hex.EncodeToString(conn.SessionID()) method := dataprovider.SSHLoginMethodPublicKey ipAddr := util.GetIPFromRemoteAddress(conn.RemoteAddr().String()) cert, ok := pubKey.(*ssh.Certificate) var certFingerprint string if ok { certFingerprint = ssh.FingerprintSHA256(cert.Key) - if cert.CertType != ssh.UserCert { - err = fmt.Errorf("ssh: cert has type %d", cert.CertType) - user.Username = conn.User() - updateLoginMetrics(&user, ipAddr, method, err) - return nil, err - } - if !c.certChecker.IsUserAuthority(cert.SignatureKey) { - err = errors.New("ssh: certificate signed by unrecognized authority") - user.Username = conn.User() - updateLoginMetrics(&user, ipAddr, method, err) - return nil, err - } - if len(cert.ValidPrincipals) == 0 { - err = fmt.Errorf("ssh: certificate %s has no valid principals, user: \"%s\"", certFingerprint, conn.User()) - user.Username = conn.User() - updateLoginMetrics(&user, ipAddr, method, err) - return nil, err - } - if revokedCertManager.isRevoked(certFingerprint) { - err = fmt.Errorf("ssh: certificate %s is revoked", certFingerprint) - user.Username = conn.User() - updateLoginMetrics(&user, ipAddr, method, err) - return nil, err - } - if err := c.certChecker.CheckCert(conn.User(), cert); err != nil { - user.Username = conn.User() - updateLoginMetrics(&user, ipAddr, method, err) - return nil, err + if c.OPKSSHPath != "" { + if err := c.verifyWithOPKSSH(conn.User(), cert); err != nil { + err := fmt.Errorf("ssh: verification with OPK failed: %v", err) + user.Username = conn.User() + updateLoginMetrics(&user, ipAddr, method, err) + return nil, err + } + } else { + if cert.CertType != ssh.UserCert { + err := fmt.Errorf("ssh: cert has type %d", cert.CertType) + user.Username = conn.User() + updateLoginMetrics(&user, ipAddr, method, err) + return nil, err + } + if !c.certChecker.IsUserAuthority(cert.SignatureKey) { + err := errors.New("ssh: certificate signed by unrecognized authority") + user.Username = conn.User() + updateLoginMetrics(&user, ipAddr, method, err) + return nil, err + } + if len(cert.ValidPrincipals) == 0 { + err := fmt.Errorf("ssh: certificate %s has no valid principals, user: \"%s\"", certFingerprint, conn.User()) + user.Username = conn.User() + updateLoginMetrics(&user, ipAddr, method, err) + return nil, err + } + if revokedCertManager.isRevoked(certFingerprint) { + err := fmt.Errorf("ssh: certificate %s is revoked", certFingerprint) + user.Username = conn.User() + updateLoginMetrics(&user, ipAddr, method, err) + return nil, err + } + if err := c.certChecker.CheckCert(conn.User(), cert); err != nil { + user.Username = conn.User() + updateLoginMetrics(&user, ipAddr, method, err) + return nil, err + } } certPerm = &cert.Permissions } - if user, keyID, err = dataprovider.CheckUserAndPubKey(conn.User(), pubKey.Marshal(), ipAddr, common.ProtocolSSH, ok); err == nil { - if ok { - keyID = fmt.Sprintf("%s: ID: %s, serial: %v, CA %s %s", certFingerprint, - cert.KeyId, cert.Serial, cert.Type(), ssh.FingerprintSHA256(cert.SignatureKey)) - } - if user.IsPartialAuth() { - logger.Debug(logSender, connectionID, "user %q authenticated with partial success", conn.User()) - return certPerm, c.getPartialSuccessError(user.GetNextAuthMethods()) - } - sshPerm, err = loginUser(&user, method, keyID, conn) - if err == nil && certPerm != nil { - // if we have a SSH user cert we need to merge certificate permissions with our ones - // we only set Extensions, so CriticalOptions are always the ones from the certificate - sshPerm.CriticalOptions = certPerm.CriticalOptions - if certPerm.Extensions != nil { - for k, v := range certPerm.Extensions { - sshPerm.Extensions[k] = v - } - } - } + user, keyID, err := dataprovider.CheckUserAndPubKey(conn.User(), pubKey.Marshal(), ipAddr, common.ProtocolSSH, ok) + if err != nil { + user.Username = conn.User() + updateLoginMetrics(&user, ipAddr, method, err) + return nil, err } - user.Username = conn.User() - updateLoginMetrics(&user, ipAddr, method, err) - return sshPerm, err + if ok { + keyID = fmt.Sprintf("%s: ID: %s, serial: %v, CA %s %s", certFingerprint, + cert.KeyId, cert.Serial, cert.Type(), ssh.FingerprintSHA256(cert.SignatureKey)) + } + if certPerm == nil { + certPerm = &ssh.Permissions{} + } + certPerm.ExtraData = make(map[any]any) + certPerm.ExtraData[extraDataKeyIDKey] = keyID + certPerm.ExtraData[extraDataUserKey] = user + if user.IsPartialAuth() { + certPerm.ExtraData[extraDataPartialSuccessErrKey] = c.getPartialSuccessError(user.GetNextAuthMethods()) + } + return certPerm, nil } func (c *Configuration) validatePasswordCredentials(conn ssh.ConnMetadata, pass []byte, method string) (*ssh.Permissions, error) { @@ -1216,6 +1312,7 @@ func updateLoginMetrics(user *dataprovider.User, ip, method string, err error) { metric.AddLoginAttempt(method) if err == nil { plugin.Handler.NotifyLogEvent(notifier.LogEventTypeLoginOK, common.ProtocolSSH, user.Username, ip, "", err) + common.DelayLogin(nil) } else { logger.ConnectionFailedLog(user.Username, ip, method, common.ProtocolSSH, err.Error()) if method != dataprovider.SSHLoginMethodPublicKey { @@ -1230,6 +1327,9 @@ func updateLoginMetrics(user *dataprovider.User, ip, method string, err error) { } common.AddDefenderEvent(ip, common.ProtocolSSH, event) plugin.Handler.NotifyLogEvent(logEv, common.ProtocolSSH, user.Username, ip, "", err) + if method != dataprovider.SSHLoginMethodPublicKey { + common.DelayLogin(err) + } } } metric.AddLoginResult(method, err) diff --git a/internal/sftpd/sftpd.go b/internal/sftpd/sftpd.go index 92f30460..3f69cdde 100644 --- a/internal/sftpd/sftpd.go +++ b/internal/sftpd/sftpd.go @@ -31,16 +31,15 @@ const ( var ( supportedSSHCommands = []string{"scp", "md5sum", "sha1sum", "sha256sum", "sha384sum", "sha512sum", "cd", "pwd", - "git-receive-pack", "git-upload-pack", "git-upload-archive", "rsync", "sftpgo-copy", "sftpgo-remove"} + "sftpgo-copy", "sftpgo-remove"} defaultSSHCommands = []string{"md5sum", "sha1sum", "sha256sum", "cd", "pwd", "scp"} sshHashCommands = []string{"md5sum", "sha1sum", "sha256sum", "sha384sum", "sha512sum"} - systemCommands = []string{"git-receive-pack", "git-upload-pack", "git-upload-archive", "rsync"} serviceStatus ServiceStatus certKeyAlgoNames = map[string]string{ ssh.CertAlgoRSAv01: ssh.KeyAlgoRSA, ssh.CertAlgoRSASHA256v01: ssh.KeyAlgoRSASHA256, ssh.CertAlgoRSASHA512v01: ssh.KeyAlgoRSASHA512, - ssh.InsecureCertAlgoDSAv01: ssh.InsecureKeyAlgoDSA, + ssh.InsecureCertAlgoDSAv01: ssh.InsecureKeyAlgoDSA, //nolint:staticcheck ssh.CertAlgoECDSA256v01: ssh.KeyAlgoECDSA256, ssh.CertAlgoECDSA384v01: ssh.KeyAlgoECDSA384, ssh.CertAlgoECDSA521v01: ssh.KeyAlgoECDSA521, diff --git a/internal/sftpd/sftpd_test.go b/internal/sftpd/sftpd_test.go index 59c2fdfc..44de3c31 100644 --- a/internal/sftpd/sftpd_test.go +++ b/internal/sftpd/sftpd_test.go @@ -23,6 +23,7 @@ import ( "crypto/sha512" "encoding/base64" "encoding/binary" + "encoding/hex" "encoding/json" "errors" "fmt" @@ -37,6 +38,7 @@ import ( "path" "path/filepath" "runtime" + "slices" "strconv" "strings" "sync" @@ -257,7 +259,7 @@ func TestMain(m *testing.M) { } sftpdConf.KexAlgorithms = []string{"curve25519-sha256@libssh.org", ssh.KeyExchangeECDHP256, ssh.KeyExchangeECDHP384} - sftpdConf.Ciphers = []string{ssh.CipherChacha20Poly1305, ssh.CipherAES128GCM, + sftpdConf.Ciphers = []string{ssh.CipherChaCha20Poly1305, ssh.CipherAES128GCM, ssh.CipherAES256CTR} sftpdConf.LoginBannerFile = loginBannerFileName // we need to test all supported ssh commands @@ -486,6 +488,17 @@ func TestInitialization(t *testing.T) { assert.NoError(t, err) sftpdConf.HostKeys = nil sftpdConf.HostCertificates = nil + sftpdConf.OPKSSHPath = "relative path" + err = sftpdConf.Initialize(configDir) + assert.Error(t, err) + sftpdConf.OPKSSHPath = filepath.Join(os.TempDir(), "missing path") + err = sftpdConf.Initialize(configDir) + assert.Error(t, err) + sftpdConf.OPKSSHChecksum = "invalid checksum" + err = sftpdConf.Initialize(configDir) + assert.Error(t, err) + sftpdConf.OPKSSHPath = "" + sftpdConf.OPKSSHChecksum = "" sftpdConf.RevokedUserCertsFile = "." err = sftpdConf.Initialize(configDir) assert.Error(t, err) @@ -782,6 +795,34 @@ func TestSFTPFsEscapeHomeDir(t *testing.T) { assert.NoError(t, err) } +func TestReadDirLongNames(t *testing.T) { + usePubKey := true + user, _, err := httpdtest.AddUser(getTestUser(usePubKey), http.StatusCreated) + assert.NoError(t, err) + + conn, client, err := getSftpClient(user, usePubKey) + if assert.NoError(t, err) { + defer conn.Close() + defer client.Close() + + numFiles := 1000 + for i := 0; i < 1000; i++ { + fPath := filepath.Join(user.GetHomeDir(), hex.EncodeToString(util.GenerateRandomBytes(127))) + err = os.WriteFile(fPath, util.GenerateRandomBytes(30), 0666) + assert.NoError(t, err) + } + + entries, err := client.ReadDir("/") + assert.NoError(t, err) + assert.Len(t, entries, numFiles) + } + + _, err = httpdtest.RemoveUser(user, http.StatusOK) + assert.NoError(t, err) + err = os.RemoveAll(user.GetHomeDir()) + assert.NoError(t, err) +} + func TestGroupSettingsOverride(t *testing.T) { usePubKey := true g := getTestGroup() @@ -1172,6 +1213,7 @@ func TestConcurrency(t *testing.T) { assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 50*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) err = os.Remove(testFilePath) assert.NoError(t, err) @@ -1196,11 +1238,8 @@ func TestProxyProtocol(t *testing.T) { defer client.Close() assert.NoError(t, checkBasicSFTP(client)) } - conn, client, err = getSftpClientWithAddr(user, usePubKey, "127.0.0.1:2224") - if !assert.Error(t, err) { - client.Close() - conn.Close() - } + _, _, err = getSftpClientWithAddr(user, usePubKey, "127.0.0.1:2224") + assert.Error(t, err) _, err = httpdtest.RemoveUser(user, http.StatusOK) assert.NoError(t, err) err = os.RemoveAll(user.GetHomeDir()) @@ -2446,7 +2485,7 @@ func TestLoginWithDatabaseCredentials(t *testing.T) { u := getTestUser(usePubKey) u.FsConfig.Provider = sdk.GCSFilesystemProvider u.FsConfig.GCSConfig.Bucket = "testbucket" - u.FsConfig.GCSConfig.Credentials = kms.NewPlainSecret(`{ "type": "service_account" }`) + u.FsConfig.GCSConfig.Credentials = kms.NewPlainSecret(`{ "type": "service_account", "private_key": " ", "client_email": "example@iam.gserviceaccount.com" }`) user, _, err := httpdtest.AddUser(u, http.StatusCreated) assert.NoError(t, err) assert.Equal(t, sdkkms.SecretStatusSecretBox, user.FsConfig.GCSConfig.Credentials.GetStatus()) @@ -2972,6 +3011,15 @@ func TestPreLoginScript(t *testing.T) { } usePubKey := true u := getTestUser(usePubKey) + mappedPath := filepath.Join(os.TempDir(), "vdir") + folderName := filepath.Base(mappedPath) + folderMountPath := "/vpath" + u.VirtualFolders = append(u.VirtualFolders, vfs.VirtualFolder{ + BaseVirtualFolder: vfs.BaseVirtualFolder{ + Name: folderName, + }, + VirtualPath: folderMountPath, + }) err := dataprovider.Close() assert.NoError(t, err) err = config.LoadConfig(configDir, "") @@ -2983,13 +3031,37 @@ func TestPreLoginScript(t *testing.T) { err = dataprovider.Initialize(providerConf, configDir, true) assert.NoError(t, err) + f := vfs.BaseVirtualFolder{ + Name: folderName, + MappedPath: mappedPath, + FsConfig: vfs.Filesystem{ + Provider: sdk.CryptedFilesystemProvider, + CryptConfig: vfs.CryptFsConfig{ + Passphrase: kms.NewPlainSecret(defaultPassword), + }, + }, + } + _, _, err = httpdtest.AddFolder(f, http.StatusCreated) + assert.NoError(t, err) + user, _, err := httpdtest.AddUser(u, http.StatusCreated) assert.NoError(t, err) conn, client, err := getSftpClient(u, usePubKey) if assert.NoError(t, err) { defer conn.Close() defer client.Close() + assert.NoError(t, checkBasicSFTP(client)) + testFilePath := filepath.Join(homeBasePath, testFileName) + testData := []byte("test data") + err = os.WriteFile(testFilePath, testData, 0666) + assert.NoError(t, err) + err = sftpUploadFile(testFilePath, path.Join(folderMountPath, testFileName), int64(len(testData)), client) + assert.NoError(t, err) + info, err := os.Stat(filepath.Join(mappedPath, testFileName)) + if assert.NoError(t, err) { + assert.Greater(t, info.Size(), int64(len(testData))) + } } err = os.WriteFile(preLoginPath, getPreLoginScriptContent(user, true), os.ModePerm) assert.NoError(t, err) @@ -3026,6 +3098,10 @@ func TestPreLoginScript(t *testing.T) { assert.NoError(t, err) err = os.RemoveAll(user.GetHomeDir()) assert.NoError(t, err) + _, err = httpdtest.RemoveFolder(vfs.BaseVirtualFolder{Name: folderName}, http.StatusOK) + assert.NoError(t, err) + err = os.RemoveAll(mappedPath) + assert.NoError(t, err) err = dataprovider.Close() assert.NoError(t, err) err = config.LoadConfig(configDir, "") @@ -3043,6 +3119,7 @@ func TestPreLoginUserCreation(t *testing.T) { } usePubKey := false u := getTestUser(usePubKey) + u.Permissions["/list"] = []string{"list", "download"} err := dataprovider.Close() assert.NoError(t, err) err = config.LoadConfig(configDir, "") @@ -3064,6 +3141,23 @@ func TestPreLoginUserCreation(t *testing.T) { } user, _, err := httpdtest.GetUserByUsername(defaultUsername, http.StatusOK) assert.NoError(t, err) + assert.Len(t, user.Permissions, 2) + assert.Empty(t, user.Description) + u.Description = "some desc" + delete(u.Permissions, "/list") + err = os.WriteFile(preLoginPath, getPreLoginScriptContent(u, false), os.ModePerm) + assert.NoError(t, err) + // The user should be updated and list permission removed + conn, client, err = getSftpClient(u, usePubKey) + if assert.NoError(t, err) { + defer conn.Close() + defer client.Close() + assert.NoError(t, checkBasicSFTP(client)) + } + user, _, err = httpdtest.GetUserByUsername(defaultUsername, http.StatusOK) + assert.NoError(t, err) + assert.Len(t, user.Permissions, 1) + assert.NotEmpty(t, user.Description) _, err = httpdtest.RemoveUser(user, http.StatusOK) assert.NoError(t, err) err = os.RemoveAll(user.GetHomeDir()) @@ -4364,6 +4458,78 @@ func TestMaxPerHostConnections(t *testing.T) { common.Config.MaxPerHostConnections = oldValue } +func TestMaxTransfers(t *testing.T) { + oldValue := common.Config.MaxPerHostConnections + common.Config.MaxPerHostConnections = 2 + + assert.Eventually(t, func() bool { + return common.Connections.GetClientConnections() == 0 + }, 1000*time.Millisecond, 50*time.Millisecond) + + usePubKey := true + user := getTestUser(usePubKey) + err := dataprovider.AddUser(&user, "", "", "") + assert.NoError(t, err) + user.Password = "" + conn, client, err := getSftpClient(user, usePubKey) + if assert.NoError(t, err) { + assert.NoError(t, checkBasicSFTP(client)) + + testFilePath := filepath.Join(homeBasePath, testFileName) + testFileSize := int64(65535) + err = createTestFile(testFilePath, testFileSize) + assert.NoError(t, err) + err = sftpUploadFile(testFilePath, testFileName, testFileSize, client) + assert.NoError(t, err) + + f1, err := client.Create("file1") + assert.NoError(t, err) + f2, err := client.Create("file2") + assert.NoError(t, err) + _, err = f1.Write([]byte(" ")) + assert.NoError(t, err) + _, err = f2.Write([]byte(" ")) + assert.NoError(t, err) + + err = sftpUploadFile(testFilePath, testFileName, testFileSize, client) + assert.ErrorContains(t, err, sftp.ErrSSHFxPermissionDenied.Error()) + + remoteUpPath := fmt.Sprintf("%v@127.0.0.1:%v", user.Username, "/") + err = scpUpload(testFilePath, remoteUpPath, false, false) + assert.Error(t, err) + + localDownloadPath := filepath.Join(homeBasePath, testDLFileName) + err = sftpDownloadFile(testFileName, localDownloadPath, testFileSize, client) + assert.ErrorContains(t, err, sftp.ErrSSHFxPermissionDenied.Error()) + + remoteDownPath := fmt.Sprintf("%v@127.0.0.1:%v", user.Username, path.Join("/", testFileName)) + err = scpDownload(localDownloadPath, remoteDownPath, false, false) + assert.Error(t, err) + + err = f1.Close() + assert.NoError(t, err) + err = f2.Close() + assert.NoError(t, err) + err = os.Remove(testFilePath) + assert.NoError(t, err) + err = os.Remove(localDownloadPath) + assert.NoError(t, err) + err = client.Close() + assert.NoError(t, err) + err = conn.Close() + assert.NoError(t, err) + } + err = dataprovider.DeleteUser(user.Username, "", "", "") + assert.NoError(t, err) + err = os.RemoveAll(user.GetHomeDir()) + assert.NoError(t, err) + assert.Eventually(t, func() bool { + return common.Connections.GetTotalTransfers() == 0 + }, 1000*time.Millisecond, 50*time.Millisecond) + + common.Config.MaxPerHostConnections = oldValue +} + func TestMaxSessions(t *testing.T) { usePubKey := false u := getTestUser(usePubKey) @@ -4913,6 +5079,7 @@ func TestBandwidthAndConnections(t *testing.T) { assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 10*time.Second, 200*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) err = os.Remove(testFilePath) assert.NoError(t, err) err = os.Remove(localDownloadPath) @@ -5496,13 +5663,13 @@ func TestNestedVirtualFolders(t *testing.T) { folderGet, _, err = httpdtest.GetFolderByName(folderName, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, int64(18769), folderGet.UsedQuotaSize) - assert.Equal(t, 1, folderGet.UsedQuotaFiles) + assert.Equal(t, int64(0), folderGet.UsedQuotaSize) + assert.Equal(t, 0, folderGet.UsedQuotaFiles) folderGet, _, err = httpdtest.GetFolderByName(folderNameNested, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, int64(27658), folderGet.UsedQuotaSize) - assert.Equal(t, 1, folderGet.UsedQuotaFiles) + assert.Equal(t, int64(0), folderGet.UsedQuotaSize) + assert.Equal(t, 0, folderGet.UsedQuotaFiles) files, err := client.ReadDir("/") if assert.NoError(t, err) { @@ -6169,8 +6336,8 @@ func TestVirtualFoldersQuotaValues(t *testing.T) { assert.Equal(t, expectedQuotaSize, user.UsedQuotaSize) f, _, err := httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize, f.UsedQuotaSize) @@ -6289,8 +6456,8 @@ func TestQuotaRenameInsideSameVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize+testFileSize1, user.UsedQuotaSize) f, _, err := httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 2, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) @@ -6314,8 +6481,8 @@ func TestQuotaRenameInsideSameVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize+testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 2, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) // rename a file inside vdir2, it isn't included inside user quota, so we have: // - vdir1/dir1/testFileName.rename // - vdir1/dir2/testFileName1 @@ -6333,8 +6500,8 @@ func TestQuotaRenameInsideSameVirtualFolder(t *testing.T) { assert.Equal(t, 2, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 2, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) // rename a file inside vdir2 overwriting an existing, we now have: // - vdir1/dir1/testFileName.rename // - vdir1/dir2/testFileName1 @@ -6351,8 +6518,8 @@ func TestQuotaRenameInsideSameVirtualFolder(t *testing.T) { assert.Equal(t, 1, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 2, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) // rename a file inside vdir1 overwriting an existing, we now have: // - vdir1/dir1/testFileName.rename (initial testFileName1) // - vdir2/dir1/testFileName.rename (initial testFileName1) @@ -6364,8 +6531,8 @@ func TestQuotaRenameInsideSameVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize1, f.UsedQuotaSize) @@ -6385,8 +6552,8 @@ func TestQuotaRenameInsideSameVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize1, f.UsedQuotaSize) @@ -6507,8 +6674,8 @@ func TestQuotaRenameBetweenVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize, user.UsedQuotaSize) f, _, err := httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize+testFileSize1+testFileSize1, f.UsedQuotaSize) @@ -6526,8 +6693,8 @@ func TestQuotaRenameBetweenVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize*2, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize*2, f.UsedQuotaSize) - assert.Equal(t, 2, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize1*2, f.UsedQuotaSize) @@ -6544,8 +6711,8 @@ func TestQuotaRenameBetweenVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize1+testFileSize, f.UsedQuotaSize) @@ -6561,8 +6728,8 @@ func TestQuotaRenameBetweenVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize, f.UsedQuotaSize) @@ -6592,8 +6759,8 @@ func TestQuotaRenameBetweenVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize1*3+testFileSize*2, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize1*3+testFileSize*2, f.UsedQuotaSize) - assert.Equal(t, 5, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, int64(0), f.UsedQuotaSize) @@ -6607,8 +6774,8 @@ func TestQuotaRenameBetweenVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize1*2+testFileSize, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize1*2+testFileSize, f.UsedQuotaSize) - assert.Equal(t, 3, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) @@ -6729,8 +6896,8 @@ func TestQuotaRenameFromVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize+testFileSize1, user.UsedQuotaSize) f, _, err := httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) @@ -6748,8 +6915,8 @@ func TestQuotaRenameFromVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize+testFileSize1+testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize, f.UsedQuotaSize) @@ -6812,8 +6979,8 @@ func TestQuotaRenameFromVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize*3+testFileSize1*3, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 2, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, int64(0), f.UsedQuotaSize) @@ -6946,8 +7113,8 @@ func TestQuotaRenameToVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize+testFileSize1, user.UsedQuotaSize) f, _, err := httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) // rename a file from user home dir to vdir2, vdir2 is not included in user quota so we have: // - /vdir2/dir1/testFileName // - /vdir1/dir1/testFileName1 @@ -6986,8 +7153,8 @@ func TestQuotaRenameToVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize+testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize, f.UsedQuotaSize) @@ -7003,8 +7170,8 @@ func TestQuotaRenameToVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize1, f.UsedQuotaSize) @@ -7026,8 +7193,8 @@ func TestQuotaRenameToVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize*2+testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize1, f.UsedQuotaSize) @@ -7044,8 +7211,8 @@ func TestQuotaRenameToVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize*2+testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize*2+testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 3, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize1, f.UsedQuotaSize) @@ -7070,8 +7237,8 @@ func TestQuotaRenameToVirtualFolder(t *testing.T) { assert.Equal(t, testFileSize*2+testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize*2+testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 3, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize1*2+testFileSize, f.UsedQuotaSize) @@ -7339,8 +7506,8 @@ func TestVFolderQuotaSize(t *testing.T) { f, _, err := httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, f.UsedQuotaSize) - assert.Equal(t, 1, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize, f.UsedQuotaSize) @@ -8417,18 +8584,12 @@ func TestResolvePaths(t *testing.T) { assert.Equal(t, fs.Join(user.GetHomeDir(), "/test/sub"), resolved) path = "../test/sub" resolved, err = fs.ResolvePath(filepath.ToSlash(path)) - if vfs.IsLocalOsFs(fs) { - assert.Error(t, err, "Unexpected resolved path: %v for: %v, fs: %v", resolved, path, fs.Name()) - } else { - assert.Equal(t, fs.Join(user.GetHomeDir(), "/test/sub"), resolved) - } + assert.NoError(t, err) + assert.Equal(t, fs.Join(user.GetHomeDir(), "/test/sub"), resolved) path = "../../../test/../sub" resolved, err = fs.ResolvePath(filepath.ToSlash(path)) - if vfs.IsLocalOsFs(fs) { - assert.Error(t, err, "Unexpected resolved path: %v for: %v, fs: %v", resolved, path, fs.Name()) - } else { - assert.Equal(t, fs.Join(user.GetHomeDir(), "/sub"), resolved) - } + assert.NoError(t, err) + assert.Equal(t, fs.Join(user.GetHomeDir(), "/sub"), resolved) } err = os.RemoveAll(user.GetHomeDir()) assert.NoError(t, err) @@ -8610,8 +8771,8 @@ func TestUserAllowedLoginMethods(t *testing.T) { allowedMethods = user.GetAllowedLoginMethods() assert.Equal(t, 4, len(allowedMethods)) - assert.True(t, util.Contains(allowedMethods, dataprovider.SSHLoginMethodKeyAndKeyboardInt)) - assert.True(t, util.Contains(allowedMethods, dataprovider.SSHLoginMethodKeyAndPassword)) + assert.True(t, slices.Contains(allowedMethods, dataprovider.SSHLoginMethodKeyAndKeyboardInt)) + assert.True(t, slices.Contains(allowedMethods, dataprovider.SSHLoginMethodKeyAndPassword)) } func TestUserPartialAuth(t *testing.T) { @@ -9118,8 +9279,8 @@ func TestSSHCopy(t *testing.T) { assert.Equal(t, 2*testFileSize+2*testFileSize1, user.UsedQuotaSize) f, _, err := httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 2, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, testFileSize+testFileSize1, f.UsedQuotaSize) @@ -9197,8 +9358,8 @@ func TestSSHCopy(t *testing.T) { assert.Equal(t, 5*testFileSize+4*testFileSize1, user.UsedQuotaSize) f, _, err = httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, 2*testFileSize+2*testFileSize1, f.UsedQuotaSize) - assert.Equal(t, 4, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) } // cross folder copy newDir := "newdir" @@ -9771,10 +9932,13 @@ func TestSSHRemoveCryptFs(t *testing.T) { assert.NoError(t, err) } -func TestBasicGitCommands(t *testing.T) { +func TestSSHCommandMaxTransfers(t *testing.T) { if len(gitPath) == 0 || len(sshPath) == 0 || runtime.GOOS == osWindows { t.Skip("git and/or ssh command not found or OS is windows, unable to execute this test") } + oldValue := common.Config.MaxPerHostConnections + common.Config.MaxPerHostConnections = 2 + usePubKey := true u := getTestUser(usePubKey) user, _, err := httpdtest.AddUser(u, http.StatusCreated) @@ -9786,224 +9950,41 @@ func TestBasicGitCommands(t *testing.T) { assert.NoError(t, err) err = os.RemoveAll(filepath.Join(homeBasePath, repoName)) assert.NoError(t, err) - out, err := initGitRepo(filepath.Join(user.HomeDir, repoName)) - assert.NoError(t, err, "unexpected error, out: %v", string(out)) - out, err = cloneGitRepo(homeBasePath, "/"+repoName, user.Username) - assert.NoError(t, err, "unexpected error, out: %v", string(out)) - - out, err = addFileToGitRepo(clonePath, 128) - assert.NoError(t, err, "unexpected error, out: %v", string(out)) - - user.QuotaFiles = 100000 - _, _, err = httpdtest.UpdateUser(user, http.StatusOK, "") - assert.NoError(t, err) - - out, err = pushToGitRepo(clonePath) - if !assert.NoError(t, err, "unexpected error, out: %v", string(out)) { - printLatestLogs(10) - } - - out, err = addFileToGitRepo(clonePath, 131072) - assert.NoError(t, err, "unexpected error, out: %v", string(out)) - - user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) - assert.NoError(t, err) - user.QuotaSize = user.UsedQuotaSize + 1 - _, _, err = httpdtest.UpdateUser(user, http.StatusOK, "") - assert.NoError(t, err) - out, err = pushToGitRepo(clonePath) - assert.Error(t, err, "git push must fail if quota is exceeded, out: %v", string(out)) - - aDir := filepath.Join(user.GetHomeDir(), repoName, "adir") - err = os.MkdirAll(aDir, 0001) - assert.NoError(t, err) - _, err = pushToGitRepo(clonePath) - assert.Error(t, err) - err = os.Chmod(aDir, os.ModePerm) - assert.NoError(t, err) - - _, err = httpdtest.RemoveUser(user, http.StatusOK) - assert.NoError(t, err) - - err = os.RemoveAll(user.GetHomeDir()) - assert.NoError(t, err) - err = os.RemoveAll(clonePath) - assert.NoError(t, err) -} - -func TestGitIncludedVirtualFolders(t *testing.T) { - if len(gitPath) == 0 || len(sshPath) == 0 || runtime.GOOS == osWindows { - t.Skip("git and/or ssh command not found or OS is windows, unable to execute this test") - } - usePubKey := true - repoName := "trepo" - u := getTestUser(usePubKey) - u.QuotaFiles = 10000 - mappedPath := filepath.Join(os.TempDir(), "repo") - folderName := filepath.Base(mappedPath) - u.VirtualFolders = append(u.VirtualFolders, vfs.VirtualFolder{ - BaseVirtualFolder: vfs.BaseVirtualFolder{ - Name: folderName, - }, - VirtualPath: "/" + repoName, - QuotaFiles: -1, - QuotaSize: -1, - }) - f := vfs.BaseVirtualFolder{ - Name: folderName, - MappedPath: mappedPath, - } - _, _, err := httpdtest.AddFolder(f, http.StatusCreated) - assert.NoError(t, err) - user, _, err := httpdtest.AddUser(u, http.StatusCreated) - assert.NoError(t, err) - - clonePath := filepath.Join(homeBasePath, repoName) - err = os.RemoveAll(user.GetHomeDir()) - assert.NoError(t, err) - err = os.RemoveAll(filepath.Join(homeBasePath, repoName)) - assert.NoError(t, err) - out, err := initGitRepo(mappedPath) - assert.NoError(t, err, "unexpected error, out: %v", string(out)) - - out, err = cloneGitRepo(homeBasePath, "/"+repoName, user.Username) - assert.NoError(t, err, "unexpected error, out: %v", string(out)) - - out, err = addFileToGitRepo(clonePath, 128) - assert.NoError(t, err, "unexpected error, out: %v", string(out)) - - out, err = pushToGitRepo(clonePath) - assert.NoError(t, err, "unexpected error, out: %v", string(out)) - - user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) - assert.NoError(t, err) - if user.UsedQuotaFiles == 0 { - assert.Eventually(t, func() bool { - user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) - if err != nil { - return false - } - return user.QuotaFiles > 0 - }, 1*time.Second, 100*time.Millisecond) - } - user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) - assert.NoError(t, err) - assert.Greater(t, user.UsedQuotaFiles, 0) - assert.Greater(t, user.UsedQuotaSize, int64(0)) - - folder, _, err := httpdtest.GetFolderByName(folderName, http.StatusOK) - assert.NoError(t, err) - assert.Equal(t, user.UsedQuotaFiles, folder.UsedQuotaFiles) - assert.Equal(t, user.UsedQuotaSize, folder.UsedQuotaSize) - - _, err = httpdtest.RemoveUser(user, http.StatusOK) - assert.NoError(t, err) - err = os.RemoveAll(user.GetHomeDir()) - assert.NoError(t, err) - _, err = httpdtest.RemoveFolder(vfs.BaseVirtualFolder{Name: folderName}, http.StatusOK) - assert.NoError(t, err) - err = os.RemoveAll(mappedPath) - assert.NoError(t, err) - err = os.RemoveAll(clonePath) - assert.NoError(t, err) -} - -func TestGitQuotaVirtualFolders(t *testing.T) { - if len(gitPath) == 0 || len(sshPath) == 0 || runtime.GOOS == osWindows { - t.Skip("git and/or ssh command not found or OS is windows, unable to execute this test") - } - usePubKey := true - repoName := "testrepo" - u := getTestUser(usePubKey) - u.QuotaFiles = 1 - u.QuotaSize = 131072 - mappedPath := filepath.Join(os.TempDir(), "repo") - folderName := filepath.Base(mappedPath) - u.VirtualFolders = append(u.VirtualFolders, vfs.VirtualFolder{ - BaseVirtualFolder: vfs.BaseVirtualFolder{ - Name: folderName, - }, - VirtualPath: "/" + repoName, - QuotaFiles: 0, - QuotaSize: 0, - }) - f := vfs.BaseVirtualFolder{ - Name: folderName, - MappedPath: mappedPath, - } - _, _, err := httpdtest.AddFolder(f, http.StatusCreated) - assert.NoError(t, err) - err = os.MkdirAll(mappedPath, os.ModePerm) - assert.NoError(t, err) - user, _, err := httpdtest.AddUser(u, http.StatusCreated) - assert.NoError(t, err) conn, client, err := getSftpClient(user, usePubKey) if assert.NoError(t, err) { - // we upload a file so the user is over quota - defer conn.Close() - defer client.Close() - testFilePath := filepath.Join(homeBasePath, testFileName) - err = createTestFile(testFilePath, u.QuotaSize) + f1, err := client.Create("file1") assert.NoError(t, err) - err = sftpUploadFile(testFilePath, testFileName, u.QuotaSize, client) + f2, err := client.Create("file2") assert.NoError(t, err) - err = os.Remove(testFilePath) + _, err = f1.Write([]byte(" ")) + assert.NoError(t, err) + _, err = f2.Write([]byte(" ")) + assert.NoError(t, err) + + _, err = client.Create("file3") + assert.Error(t, err) + + err = f1.Close() + assert.NoError(t, err) + err = f2.Close() + assert.NoError(t, err) + err = client.Close() + assert.NoError(t, err) + err = conn.Close() assert.NoError(t, err) } - clonePath := filepath.Join(homeBasePath, repoName) - err = os.RemoveAll(user.GetHomeDir()) - assert.NoError(t, err) - err = os.RemoveAll(filepath.Join(homeBasePath, repoName)) - assert.NoError(t, err) - out, err := initGitRepo(mappedPath) - assert.NoError(t, err, "unexpected error, out: %v", string(out)) - - out, err = cloneGitRepo(homeBasePath, "/"+repoName, user.Username) - assert.NoError(t, err, "unexpected error, out: %v", string(out)) - - out, err = addFileToGitRepo(clonePath, 128) - assert.NoError(t, err, "unexpected error, out: %v", string(out)) - - out, err = pushToGitRepo(clonePath) - assert.NoError(t, err, "unexpected error, out: %v", string(out)) - _, err = httpdtest.RemoveUser(user, http.StatusOK) assert.NoError(t, err) - err = os.RemoveAll(user.GetHomeDir()) - assert.NoError(t, err) - _, err = httpdtest.RemoveFolder(vfs.BaseVirtualFolder{Name: folderName}, http.StatusOK) - assert.NoError(t, err) - err = os.RemoveAll(mappedPath) - assert.NoError(t, err) - err = os.RemoveAll(clonePath) - assert.NoError(t, err) -} -func TestGitErrors(t *testing.T) { - if len(gitPath) == 0 || len(sshPath) == 0 || runtime.GOOS == osWindows { - t.Skip("git and/or ssh command not found or OS is windows, unable to execute this test") - } - usePubKey := true - u := getTestUser(usePubKey) - user, _, err := httpdtest.AddUser(u, http.StatusCreated) - assert.NoError(t, err) - repoName := "testrepo" - clonePath := filepath.Join(homeBasePath, repoName) - err = os.RemoveAll(user.GetHomeDir()) - assert.NoError(t, err) - err = os.RemoveAll(filepath.Join(homeBasePath, repoName)) - assert.NoError(t, err) - out, err := cloneGitRepo(homeBasePath, "/"+repoName, user.Username) - assert.Error(t, err, "cloning a missing repo must fail, out: %v", string(out)) - - _, err = httpdtest.RemoveUser(user, http.StatusOK) - assert.NoError(t, err) err = os.RemoveAll(user.GetHomeDir()) assert.NoError(t, err) err = os.RemoveAll(clonePath) assert.NoError(t, err) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) + + common.Config.MaxPerHostConnections = oldValue } // Start SCP tests @@ -10680,8 +10661,8 @@ func TestSCPVirtualFoldersQuota(t *testing.T) { assert.Equal(t, expectedQuotaSize, user.UsedQuotaSize) f, _, err := httpdtest.GetFolderByName(folderName1, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, expectedQuotaSize, f.UsedQuotaSize) - assert.Equal(t, expectedQuotaFiles, f.UsedQuotaFiles) + assert.Equal(t, int64(0), f.UsedQuotaSize) + assert.Equal(t, 0, f.UsedQuotaFiles) f, _, err = httpdtest.GetFolderByName(folderName2, http.StatusOK) assert.NoError(t, err) assert.Equal(t, expectedQuotaSize, f.UsedQuotaSize) @@ -11077,6 +11058,7 @@ func TestSCPErrors(t *testing.T) { err = cmd.Process.Kill() assert.NoError(t, err) assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 2*time.Second, 100*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) cmd = getScpUploadCommand(testFilePath, remoteUpPath, false, false) go func() { err := cmd.Run() @@ -11089,6 +11071,7 @@ func TestSCPErrors(t *testing.T) { err = cmd.Process.Kill() assert.NoError(t, err) assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 2*time.Second, 100*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) err = os.Remove(testFilePath) assert.NoError(t, err) os.Remove(localPath) @@ -11611,64 +11594,6 @@ func checkSystemCommands() { } } -func initGitRepo(path string) ([]byte, error) { - err := os.MkdirAll(path, os.ModePerm) - if err != nil { - return nil, err - } - args := []string{"init", "--bare"} - cmd := exec.Command(gitPath, args...) - cmd.Dir = path - return cmd.CombinedOutput() -} - -func pushToGitRepo(repoPath string) ([]byte, error) { - cmd := exec.Command(gitPath, "push") - cmd.Dir = repoPath - cmd.Env = append(os.Environ(), - fmt.Sprintf("GIT_SSH=%v", gitWrapPath)) - return cmd.CombinedOutput() -} - -func cloneGitRepo(basePath, remotePath, username string) ([]byte, error) { - remoteURL := fmt.Sprintf("ssh://%v@127.0.0.1:2022%v", username, remotePath) - args := []string{"clone", remoteURL} - cmd := exec.Command(gitPath, args...) - cmd.Dir = basePath - cmd.Env = append(os.Environ(), - fmt.Sprintf("GIT_SSH=%v", gitWrapPath)) - return cmd.CombinedOutput() -} - -func addFileToGitRepo(repoPath string, fileSize int64) ([]byte, error) { - path := filepath.Join(repoPath, "test") - err := createTestFile(path, fileSize) - if err != nil { - return []byte(""), err - } - cmd := exec.Command(gitPath, "config", "user.email", "testuser@example.com") - cmd.Dir = repoPath - out, err := cmd.CombinedOutput() - if err != nil { - return out, err - } - cmd = exec.Command(gitPath, "config", "user.name", "testuser") - cmd.Dir = repoPath - out, err = cmd.CombinedOutput() - if err != nil { - return out, err - } - cmd = exec.Command(gitPath, "add", "test") - cmd.Dir = repoPath - out, err = cmd.CombinedOutput() - if err != nil { - return out, err - } - cmd = exec.Command(gitPath, "commit", "-am", "test") - cmd.Dir = repoPath - return cmd.CombinedOutput() -} - func getKeyboardInteractiveScriptForBuiltinChecks(addPasscode bool, result int) []byte { content := []byte("#!/bin/sh\n\n") echos := []bool{false} @@ -11788,7 +11713,7 @@ func printLatestLogs(maxNumberOfLines int) { return } for _, line := range lines { - logger.DebugToConsole(line) + logger.DebugToConsole("%s", line) } } diff --git a/internal/sftpd/ssh_cmd.go b/internal/sftpd/ssh_cmd.go index 8a342e99..c82f3b89 100644 --- a/internal/sftpd/ssh_cmd.go +++ b/internal/sftpd/ssh_cmd.go @@ -23,16 +23,12 @@ import ( "fmt" "hash" "io" - "os" - "os/exec" - "path" "runtime/debug" + "slices" "strings" - "sync" "time" "github.com/google/shlex" - "github.com/sftpgo/sdk" "golang.org/x/crypto/ssh" "github.com/drakkan/sftpgo/v2/internal/common" @@ -48,10 +44,6 @@ const ( sshCommandLogSender = "SSHCommand" ) -var ( - errUnsupportedConfig = errors.New("command unsupported for this configuration") -) - type sshCommand struct { command string args []string @@ -59,39 +51,13 @@ type sshCommand struct { startTime time.Time } -type systemCommand struct { - cmd *exec.Cmd - fsPath string - quotaCheckPath string - fs vfs.Fs -} - -func (c *systemCommand) GetSTDs() (io.WriteCloser, io.ReadCloser, io.ReadCloser, error) { - stdin, err := c.cmd.StdinPipe() - if err != nil { - return nil, nil, nil, err - } - stdout, err := c.cmd.StdoutPipe() - if err != nil { - stdin.Close() - return nil, nil, nil, err - } - stderr, err := c.cmd.StderrPipe() - if err != nil { - stdin.Close() - stdout.Close() - return nil, nil, nil, err - } - return stdin, stdout, stderr, nil -} - func processSSHCommand(payload []byte, connection *Connection, enabledSSHCommands []string) bool { var msg sshSubsystemExecMsg if err := ssh.Unmarshal(payload, &msg); err == nil { name, args, err := parseCommandPayload(msg.Command) connection.Log(logger.LevelDebug, "new ssh command: %q args: %v num args: %d user: %s, error: %v", name, args, len(args), connection.User.Username, err) - if err == nil && util.Contains(enabledSSHCommands, name) { + if err == nil && slices.Contains(enabledSSHCommands, name) { connection.command = msg.Command if name == scpCmdName && len(args) >= 2 { connection.SetProtocol(common.ProtocolSCP) @@ -133,20 +99,15 @@ func (c *sshCommand) handle() (err error) { } }() if err := common.Connections.Add(c.connection); err != nil { + defer c.connection.CloseFS() //nolint:errcheck logger.Info(logSender, "", "unable to add SSH command connection: %v", err) - return err + return c.sendErrorResponse(err) } defer common.Connections.Remove(c.connection.GetID()) c.connection.UpdateLastActivity() - if util.Contains(sshHashCommands, c.command) { + if slices.Contains(sshHashCommands, c.command) { return c.handleHashCommands() - } else if util.Contains(systemCommands, c.command) { - command, err := c.getSystemCommand() - if err != nil { - return c.sendErrorResponse(err) - } - return c.executeSystemCommand(command) } else if c.command == "cd" { c.sendExitStatus(nil) } else if c.command == "pwd" { @@ -189,29 +150,18 @@ func (c *sshCommand) handleSFTPGoRemove() error { return nil } -func (c *sshCommand) updateQuota(sshDestPath string, filesNum int, filesSize int64) { - vfolder, err := c.connection.User.GetVirtualFolderForPath(sshDestPath) - if err == nil { - dataprovider.UpdateVirtualFolderQuota(&vfolder.BaseVirtualFolder, filesNum, filesSize, false) //nolint:errcheck - if vfolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&c.connection.User, filesNum, filesSize, false) //nolint:errcheck - } - } else { - dataprovider.UpdateUserQuota(&c.connection.User, filesNum, filesSize, false) //nolint:errcheck - } -} - func (c *sshCommand) handleHashCommands() error { var h hash.Hash - if c.command == "md5sum" { + switch c.command { + case "md5sum": h = md5.New() - } else if c.command == "sha1sum" { + case "sha1sum": h = sha1.New() - } else if c.command == "sha256sum" { + case "sha256sum": h = sha256.New() - } else if c.command == "sha384sum" { + case "sha384sum": h = sha512.New384() - } else { + default: h = sha512.New() } var response string @@ -248,212 +198,6 @@ func (c *sshCommand) handleHashCommands() error { return nil } -func (c *sshCommand) executeSystemCommand(command systemCommand) error { - sshDestPath := c.getDestPath() - if !c.isLocalPath(sshDestPath) { - return c.sendErrorResponse(errUnsupportedConfig) - } - diskQuota, transferQuota := c.connection.HasSpace(true, false, command.quotaCheckPath) - if !diskQuota.HasSpace || !transferQuota.HasUploadSpace() || !transferQuota.HasDownloadSpace() { - return c.sendErrorResponse(common.ErrQuotaExceeded) - } - perms := []string{dataprovider.PermDownload, dataprovider.PermUpload, dataprovider.PermCreateDirs, dataprovider.PermListItems, - dataprovider.PermOverwrite, dataprovider.PermDelete} - if !c.connection.User.HasPerms(perms, sshDestPath) { - return c.sendErrorResponse(c.connection.GetPermissionDeniedError()) - } - - initialFiles, initialSize, err := c.getSizeForPath(command.fs, command.fsPath) - if err != nil { - return c.sendErrorResponse(err) - } - - stdin, stdout, stderr, err := command.GetSTDs() - if err != nil { - return c.sendErrorResponse(err) - } - err = command.cmd.Start() - if err != nil { - return c.sendErrorResponse(err) - } - - closeCmdOnError := func() { - c.connection.Log(logger.LevelDebug, "kill cmd: %q and close ssh channel after read or write error", - c.connection.command) - killerr := command.cmd.Process.Kill() - closerr := c.connection.channel.Close() - c.connection.Log(logger.LevelDebug, "kill cmd error: %v close channel error: %v", killerr, closerr) - } - var once sync.Once - commandResponse := make(chan bool) - - remainingQuotaSize := diskQuota.GetRemainingSize() - - go func() { - defer stdin.Close() - baseTransfer := common.NewBaseTransfer(nil, c.connection.BaseConnection, nil, command.fsPath, command.fsPath, sshDestPath, - common.TransferUpload, 0, 0, remainingQuotaSize, 0, false, command.fs, transferQuota) - transfer := newTransfer(baseTransfer, nil, nil, nil) - - w, e := transfer.copyFromReaderToWriter(stdin, c.connection.channel) - c.connection.Log(logger.LevelDebug, "command: %q, copy from remote command to sdtin ended, written: %v, "+ - "initial remaining quota: %v, err: %v", c.connection.command, w, remainingQuotaSize, e) - if e != nil { - once.Do(closeCmdOnError) - } - }() - - go func() { - baseTransfer := common.NewBaseTransfer(nil, c.connection.BaseConnection, nil, command.fsPath, command.fsPath, sshDestPath, - common.TransferDownload, 0, 0, 0, 0, false, command.fs, transferQuota) - transfer := newTransfer(baseTransfer, nil, nil, nil) - - w, e := transfer.copyFromReaderToWriter(c.connection.channel, stdout) - c.connection.Log(logger.LevelDebug, "command: %q, copy from sdtout to remote command ended, written: %v err: %v", - c.connection.command, w, e) - if e != nil { - once.Do(closeCmdOnError) - } - commandResponse <- true - }() - - go func() { - baseTransfer := common.NewBaseTransfer(nil, c.connection.BaseConnection, nil, command.fsPath, command.fsPath, sshDestPath, - common.TransferDownload, 0, 0, 0, 0, false, command.fs, transferQuota) - transfer := newTransfer(baseTransfer, nil, nil, nil) - - w, e := transfer.copyFromReaderToWriter(c.connection.channel.(ssh.Channel).Stderr(), stderr) - c.connection.Log(logger.LevelDebug, "command: %q, copy from sdterr to remote command ended, written: %v err: %v", - c.connection.command, w, e) - // os.ErrClosed means that the command is finished so we don't need to do anything - if (e != nil && !errors.Is(e, os.ErrClosed)) || w > 0 { - once.Do(closeCmdOnError) - } - }() - - <-commandResponse - err = command.cmd.Wait() - c.sendExitStatus(err) - - numFiles, dirSize, errSize := c.getSizeForPath(command.fs, command.fsPath) - if errSize == nil { - c.updateQuota(sshDestPath, numFiles-initialFiles, dirSize-initialSize) - } - c.connection.Log(logger.LevelDebug, "command %q finished for path %q, initial files %v initial size %v "+ - "current files %v current size %v size err: %v", c.connection.command, command.fsPath, initialFiles, initialSize, - numFiles, dirSize, errSize) - return c.connection.GetFsError(command.fs, err) -} - -func (c *sshCommand) isSystemCommandAllowed() error { - sshDestPath := c.getDestPath() - if c.connection.User.IsVirtualFolder(sshDestPath) { - // overlapped virtual path are not allowed - return nil - } - if c.connection.User.HasVirtualFoldersInside(sshDestPath) { - c.connection.Log(logger.LevelDebug, "command %q is not allowed, path %q has virtual folders inside it, user %q", - c.command, sshDestPath, c.connection.User.Username) - return errUnsupportedConfig - } - for _, f := range c.connection.User.Filters.FilePatterns { - if f.Path == sshDestPath { - c.connection.Log(logger.LevelDebug, - "command %q is not allowed inside folders with file patterns filters %q user %q", - c.command, sshDestPath, c.connection.User.Username) - return errUnsupportedConfig - } - if len(sshDestPath) > len(f.Path) { - if strings.HasPrefix(sshDestPath, f.Path+"/") || f.Path == "/" { - c.connection.Log(logger.LevelDebug, - "command %q is not allowed it includes folders with file patterns filters %q user %q", - c.command, sshDestPath, c.connection.User.Username) - return errUnsupportedConfig - } - } - if len(sshDestPath) < len(f.Path) { - if strings.HasPrefix(sshDestPath+"/", f.Path) || sshDestPath == "/" { - c.connection.Log(logger.LevelDebug, - "command %q is not allowed inside folder with file patterns filters %q user %q", - c.command, sshDestPath, c.connection.User.Username) - return errUnsupportedConfig - } - } - } - return nil -} - -func (c *sshCommand) getSystemCommand() (systemCommand, error) { - command := systemCommand{ - cmd: nil, - fs: nil, - fsPath: "", - quotaCheckPath: "", - } - if err := common.CheckClosing(); err != nil { - return command, err - } - args := make([]string, len(c.args)) - copy(args, c.args) - var fsPath, quotaPath string - sshPath := c.getDestPath() - fs, err := c.connection.User.GetFilesystemForPath(sshPath, c.connection.ID) - if err != nil { - return command, err - } - if len(c.args) > 0 { - var err error - fsPath, err = fs.ResolvePath(sshPath) - if err != nil { - return command, c.connection.GetFsError(fs, err) - } - quotaPath = sshPath - fi, err := fs.Stat(fsPath) - if err == nil && fi.IsDir() { - // if the target is an existing dir the command will write inside this dir - // so we need to check the quota for this directory and not its parent dir - quotaPath = path.Join(sshPath, "fakecontent") - } - if strings.HasSuffix(sshPath, "/") && !strings.HasSuffix(fsPath, string(os.PathSeparator)) { - fsPath += string(os.PathSeparator) - c.connection.Log(logger.LevelDebug, "path separator added to fsPath %q", fsPath) - } - args = args[:len(args)-1] - args = append(args, fsPath) - } - if err := c.isSystemCommandAllowed(); err != nil { - return command, errUnsupportedConfig - } - if c.command == "rsync" { - // we cannot avoid that rsync creates symlinks so if the user has the permission - // to create symlinks we add the option --safe-links to the received rsync command if - // it is not already set. This should prevent to create symlinks that point outside - // the home dir. - // If the user cannot create symlinks we add the option --munge-links, if it is not - // already set. This should make symlinks unusable (but manually recoverable) - if c.connection.User.HasPerm(dataprovider.PermCreateSymlinks, c.getDestPath()) { - if !util.Contains(args, "--safe-links") { - args = append([]string{"--safe-links"}, args...) - } - } else { - if !util.Contains(args, "--munge-links") { - args = append([]string{"--munge-links"}, args...) - } - } - } - c.connection.Log(logger.LevelDebug, "new system command %q, with args: %+v fs path %q quota check path %q", - c.command, args, fsPath, quotaPath) - cmd := exec.Command(c.command, args...) - uid := c.connection.User.GetUID() - gid := c.connection.User.GetGID() - cmd = wrapCmd(cmd, uid, gid) - command.cmd = cmd - command.fsPath = fsPath - command.quotaCheckPath = quotaPath - command.fs = fs - return command, nil -} - // for the supported commands, the destination path, if any, is the last argument func (c *sshCommand) getDestPath() string { if len(c.args) == 0 { @@ -492,37 +236,6 @@ func (c *sshCommand) getRemovePath() (string, error) { return sshDestPath, nil } -func (c *sshCommand) isLocalPath(virtualPath string) bool { - folder, err := c.connection.User.GetVirtualFolderForPath(virtualPath) - if err != nil { - return c.connection.User.FsConfig.Provider == sdk.LocalFilesystemProvider - } - return folder.FsConfig.Provider == sdk.LocalFilesystemProvider -} - -func (c *sshCommand) getSizeForPath(fs vfs.Fs, name string) (int, int64, error) { - if dataprovider.GetQuotaTracking() > 0 { - fi, err := fs.Lstat(name) - if err != nil { - if fs.IsNotExist(err) { - return 0, 0, nil - } - c.connection.Log(logger.LevelDebug, "unable to stat %q error: %v", name, err) - return 0, 0, err - } - if fi.IsDir() { - files, size, err := fs.GetDirSize(name) - if err != nil { - c.connection.Log(logger.LevelDebug, "unable to get size for dir %q error: %v", name, err) - } - return files, size, err - } else if fi.Mode().IsRegular() { - return 1, fi.Size(), nil - } - } - return 0, 0, nil -} - func (c *sshCommand) sendErrorResponse(err error) error { errorString := fmt.Sprintf("%v: %v %v\n", c.command, c.getDestPath(), err) c.connection.channel.Write([]byte(errorString)) //nolint:errcheck diff --git a/internal/sftpd/subsystem.go b/internal/sftpd/subsystem.go deleted file mode 100644 index cda0ecdc..00000000 --- a/internal/sftpd/subsystem.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (C) 2019 Nicola Murino -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, version 3. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -package sftpd - -import ( - "io" - "net" - - "github.com/pkg/sftp" - - "github.com/drakkan/sftpgo/v2/internal/common" - "github.com/drakkan/sftpgo/v2/internal/dataprovider" - "github.com/drakkan/sftpgo/v2/internal/logger" -) - -type subsystemChannel struct { - reader io.Reader - writer io.Writer -} - -func (s *subsystemChannel) Read(p []byte) (int, error) { - return s.reader.Read(p) -} - -func (s *subsystemChannel) Write(p []byte) (int, error) { - return s.writer.Write(p) -} - -func (s *subsystemChannel) Close() error { - return nil -} - -func newSubsystemChannel(reader io.Reader, writer io.Writer) *subsystemChannel { - return &subsystemChannel{ - reader: reader, - writer: writer, - } -} - -// ServeSubSystemConnection handles a connection as SSH subsystem -func ServeSubSystemConnection(user *dataprovider.User, connectionID string, reader io.Reader, writer io.Writer) error { - err := user.CheckFsRoot(connectionID) - if err != nil { - errClose := user.CloseFs() - logger.Warn(logSender, connectionID, "unable to check fs root: %v close fs error: %v", err, errClose) - return err - } - - connection := &Connection{ - BaseConnection: common.NewBaseConnection(connectionID, common.ProtocolSFTP, "", "", *user), - ClientVersion: "", - RemoteAddr: &net.IPAddr{}, - LocalAddr: &net.IPAddr{}, - channel: newSubsystemChannel(reader, writer), - } - err = common.Connections.Add(connection) - if err != nil { - errClose := user.CloseFs() - logger.Warn(logSender, connectionID, "unable to add connection: %v close fs error: %v", err, errClose) - return err - } - defer common.Connections.Remove(connection.GetID()) - - dataprovider.UpdateLastLogin(user) - sftp.SetSFTPExtensions(sftpExtensions...) //nolint:errcheck - server := sftp.NewRequestServer(connection.channel, sftp.Handlers{ - FileGet: connection, - FilePut: connection, - FileCmd: connection, - FileList: connection, - }, sftp.WithRSAllocator()) - - defer server.Close() - return server.Serve() -} diff --git a/internal/sftpd/transfer.go b/internal/sftpd/transfer.go index d3acc202..465ad8c3 100644 --- a/internal/sftpd/transfer.go +++ b/internal/sftpd/transfer.go @@ -19,7 +19,6 @@ import ( "io" "github.com/drakkan/sftpgo/v2/internal/common" - "github.com/drakkan/sftpgo/v2/internal/metric" "github.com/drakkan/sftpgo/v2/internal/vfs" ) @@ -177,7 +176,7 @@ func (t *transfer) closeIO() error { } else if t.readerAt != nil { err = t.readerAt.Close() if metadater, ok := t.readerAt.(vfs.Metadater); ok { - t.BaseTransfer.SetMetadata(metadater.Metadata()) + t.SetMetadata(metadater.Metadata()) } } return err @@ -192,63 +191,3 @@ func (t *transfer) setFinished() error { t.isFinished = true return nil } - -// used for ssh commands. -// It reads from src until EOF so it does not treat an EOF from Read as an error to be reported. -// EOF from Write is reported as error -func (t *transfer) copyFromReaderToWriter(dst io.Writer, src io.Reader) (int64, error) { - defer t.Connection.RemoveTransfer(t) - - var written int64 - var err error - - if t.MaxWriteSize < 0 { - return 0, common.ErrQuotaExceeded - } - isDownload := t.GetType() == common.TransferDownload - buf := make([]byte, 32768) - for { - t.Connection.UpdateLastActivity() - nr, er := src.Read(buf) - if nr > 0 { - nw, ew := dst.Write(buf[0:nr]) - if nw > 0 { - written += int64(nw) - if isDownload { - t.BytesSent.Store(written) - if errCheck := t.CheckRead(); errCheck != nil { - err = errCheck - break - } - } else { - t.BytesReceived.Store(written) - if errCheck := t.CheckWrite(); errCheck != nil { - err = errCheck - break - } - } - } - if ew != nil { - err = ew - break - } - if nr != nw { - err = io.ErrShortWrite - break - } - } - if er != nil { - if er != io.EOF { - err = er - } - break - } - t.HandleThrottle() - } - t.ErrTransfer = err - if written > 0 || err != nil { - metric.TransferCompleted(t.BytesSent.Load(), t.BytesReceived.Load(), t.GetType(), - t.ErrTransfer, vfs.IsSFTPFs(t.Fs)) - } - return written, err -} diff --git a/internal/smtp/oauth2.go b/internal/smtp/oauth2.go index 5fea89f5..87997947 100644 --- a/internal/smtp/oauth2.go +++ b/internal/smtp/oauth2.go @@ -19,6 +19,7 @@ import ( "context" "errors" "fmt" + "slices" "sync" "time" @@ -27,7 +28,6 @@ import ( "golang.org/x/oauth2/microsoft" "github.com/drakkan/sftpgo/v2/internal/logger" - "github.com/drakkan/sftpgo/v2/internal/util" ) // Supported OAuth2 providers @@ -56,7 +56,7 @@ type OAuth2Config struct { // Validate validates and initializes the configuration func (c *OAuth2Config) Validate() error { - if !util.Contains(supportedOAuth2Providers, c.Provider) { + if !slices.Contains(supportedOAuth2Providers, c.Provider) { return fmt.Errorf("smtp oauth2: unsupported provider %d", c.Provider) } if c.ClientID == "" { diff --git a/internal/smtp/smtp.go b/internal/smtp/smtp.go index 308721bb..94984249 100644 --- a/internal/smtp/smtp.go +++ b/internal/smtp/smtp.go @@ -279,15 +279,15 @@ func (c *Config) Initialize(configDir string, isService bool) error { } func (c *Config) getMailClientOptions() []mail.Option { - options := []mail.Option{mail.WithoutNoop()} + options := []mail.Option{mail.WithPort(c.Port), mail.WithoutNoop()} switch c.Encryption { case 1: - options = append(options, mail.WithSSLPort(false)) + options = append(options, mail.WithSSL()) case 2: - options = append(options, mail.WithTLSPortPolicy(mail.TLSMandatory)) + options = append(options, mail.WithTLSPolicy(mail.TLSMandatory)) default: - options = append(options, mail.WithTLSPortPolicy(mail.NoTLS)) + options = append(options, mail.WithTLSPolicy(mail.NoTLS)) } if c.User != "" { options = append(options, mail.WithUsername(c.User)) @@ -317,14 +317,13 @@ func (c *Config) getMailClientOptions() []mail.Option { }), mail.WithDebugLog()) } - options = append(options, mail.WithPort(c.Port)) return options } func (c *Config) getSMTPClientAndMsg(to, bcc []string, subject, body string, contentType EmailContentType, attachments ...*mail.File) (*mail.Client, *mail.Msg, error) { msg := mail.NewMsg() - msg.SetUserAgent(version.GetServerVersion(" ", true)) + msg.SetUserAgent(version.GetServerVersion(" ", false)) var from string if c.From != "" { @@ -346,7 +345,7 @@ func (c *Config) getSMTPClientAndMsg(to, bcc []string, subject, body string, con msg.Subject(subject) msg.SetDate() msg.SetMessageID() - msg.SetAttachements(attachments) + msg.SetAttachments(attachments) switch contentType { case EmailContentTypeTextPlain: @@ -416,12 +415,6 @@ func SendEmail(to, bcc []string, subject, body string, contentType EmailContentT return config.sendEmail(to, bcc, subject, body, contentType, attachments...) } -// ReloadProviderConf reloads the configuration from the provider -// and apply it if different from the active one -func ReloadProviderConf() { - loadConfigFromProvider() //nolint:errcheck -} - func loadConfigFromProvider() error { configs, err := dataprovider.GetConfigs() if err != nil { diff --git a/internal/telemetry/telemetry.go b/internal/telemetry/telemetry.go index dad7e869..233636aa 100644 --- a/internal/telemetry/telemetry.go +++ b/internal/telemetry/telemetry.go @@ -135,9 +135,9 @@ func (c Conf) Initialize(configDir string) error { } logger.Debug(logSender, "", "configured TLS cipher suites: %v", config.CipherSuites) httpServer.TLSConfig = config - return util.HTTPListenAndServe(httpServer, c.BindAddress, c.BindPort, true, logSender) + return util.HTTPListenAndServe(httpServer, c.BindAddress, c.BindPort, true, nil, logSender) } - return util.HTTPListenAndServe(httpServer, c.BindAddress, c.BindPort, false, logSender) + return util.HTTPListenAndServe(httpServer, c.BindAddress, c.BindPort, false, nil, logSender) } // ReloadCertificateMgr reloads the certificate manager diff --git a/internal/util/errors.go b/internal/util/errors.go index c2bdfbce..79e54265 100644 --- a/internal/util/errors.go +++ b/internal/util/errors.go @@ -59,9 +59,9 @@ func (e *ValidationError) Is(target error) bool { } // NewValidationError returns a validation errors -func NewValidationError(error string) *ValidationError { +func NewValidationError(errorString string) *ValidationError { return &ValidationError{ - err: error, + err: errorString, } } @@ -81,9 +81,9 @@ func (e *RecordNotFoundError) Is(target error) bool { } // NewRecordNotFoundError returns a not found error -func NewRecordNotFoundError(error string) *RecordNotFoundError { +func NewRecordNotFoundError(errorString string) *RecordNotFoundError { return &RecordNotFoundError{ - err: error, + err: errorString, } } @@ -106,9 +106,9 @@ func (e *MethodDisabledError) Is(target error) bool { } // NewMethodDisabledError returns a method disabled error -func NewMethodDisabledError(error string) *MethodDisabledError { +func NewMethodDisabledError(errorString string) *MethodDisabledError { return &MethodDisabledError{ - err: error, + err: errorString, } } @@ -128,8 +128,8 @@ func (e *GenericError) Is(target error) bool { } // NewGenericError returns a generic error -func NewGenericError(error string) *GenericError { +func NewGenericError(errorString string) *GenericError { return &GenericError{ - err: error, + err: errorString, } } diff --git a/internal/util/i18n.go b/internal/util/i18n.go index fd8dba70..2b318310 100644 --- a/internal/util/i18n.go +++ b/internal/util/i18n.go @@ -114,6 +114,7 @@ const ( I18nErrorConnectionForbidden = "general.connection_forbidden" I18nErrorReservedUsername = "user.username_reserved" I18nErrorInvalidEmail = "general.email_invalid" + I18nErrorInvalidInput = "general.invalid_input" I18nErrorInvalidUser = "user.username_invalid" I18nErrorInvalidName = "general.name_invalid" I18nErrorHomeRequired = "user.home_required" @@ -121,6 +122,7 @@ const ( I18nErrorPubKeyInvalid = "user.pub_key_invalid" I18nErrorPrivKeyInvalid = "user.priv_key_invalid" I18nErrorKeySizeInvalid = "user.key_invalid_size" + I18nErrorKeyInsecure = "user.key_insecure" I18nErrorPrimaryGroup = "user.err_primary_group" I18nErrorDuplicateGroup = "user.err_duplicate_group" I18nErrorNoPermission = "user.no_permissions" @@ -240,9 +242,9 @@ const ( I18nErrorRestore = "maintenance.restore_error" I18nErrorACMEGeneric = "acme.generic_error" I18nErrorSMTPRequiredFields = "smtp.err_required_fields" - I18nErrorSMTPClientIDRequired = "smtp.client_id_required" - I18nErrorSMTPClientSecretRequired = "smtp.client_secret_required" - I18nErrorSMTPRefreshTokenRequired = "smtp.refresh_token_required" + I18nErrorClientIDRequired = "oauth2.client_id_required" + I18nErrorClientSecretRequired = "oauth2.client_secret_required" + I18nErrorRefreshTokenRequired = "oauth2.refresh_token_required" I18nErrorURLRequired = "actions.http_url_required" I18nErrorURLInvalid = "actions.http_url_invalid" I18nErrorHTTPPartNameRequired = "actions.http_part_name_required" @@ -274,6 +276,7 @@ const ( I18nActionTypeUserInactivityCheck = "actions.types.user_inactivity_check" I18nActionTypeIDPCheck = "actions.types.idp_check" I18nActionTypeCommand = "actions.types.command" + I18nActionTypeRotateLogs = "actions.types.rotate_logs" I18nActionFsTypeRename = "actions.fs_types.rename" I18nActionFsTypeDelete = "actions.fs_types.delete" I18nActionFsTypePathExists = "actions.fs_types.path_exists" @@ -302,6 +305,9 @@ const ( I18nErrorEvSyncUnsupportedFs = "rules.sync_unsupported_fs_event" I18nErrorRuleFailureActionsOnly = "rules.only_failure_actions" I18nErrorRuleSyncActionRequired = "rules.sync_action_required" + I18nErrorInvalidPNG = "branding.invalid_png" + I18nErrorInvalidPNGSize = "branding.invalid_png_size" + I18nErrorInvalidDisclaimerURL = "branding.invalid_disclaimer_url" ) // NewI18nError returns a I18nError wrappring the provided error diff --git a/internal/util/resources.go b/internal/util/resources.go index 9d1a360c..8cddd946 100644 --- a/internal/util/resources.go +++ b/internal/util/resources.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build !bundle -// +build !bundle package util diff --git a/internal/util/resources_embedded.go b/internal/util/resources_embedded.go index 0512cc70..685eaf72 100644 --- a/internal/util/resources_embedded.go +++ b/internal/util/resources_embedded.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build bundle -// +build bundle package util diff --git a/internal/util/timeoutlistener.go b/internal/util/timeoutlistener.go deleted file mode 100644 index 643f7799..00000000 --- a/internal/util/timeoutlistener.go +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (C) 2019 Nicola Murino -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, version 3. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -package util - -import ( - "net" - "sync/atomic" - "time" -) - -type listener struct { - net.Listener - ReadTimeout time.Duration - WriteTimeout time.Duration -} - -func (l *listener) Accept() (net.Conn, error) { - c, err := l.Listener.Accept() - if err != nil { - return nil, err - } - tc := &Conn{ - Conn: c, - ReadTimeout: l.ReadTimeout, - WriteTimeout: l.WriteTimeout, - ReadThreshold: int32((l.ReadTimeout * 1024) / time.Second), - WriteThreshold: int32((l.WriteTimeout * 1024) / time.Second), - } - tc.BytesReadFromDeadline.Store(0) - tc.BytesWrittenFromDeadline.Store(0) - return tc, nil -} - -// Conn wraps a net.Conn, and sets a deadline for every read -// and write operation. -type Conn struct { - net.Conn - ReadTimeout time.Duration - WriteTimeout time.Duration - ReadThreshold int32 - WriteThreshold int32 - BytesReadFromDeadline atomic.Int32 - BytesWrittenFromDeadline atomic.Int32 -} - -func (c *Conn) Read(b []byte) (n int, err error) { - if c.BytesReadFromDeadline.Load() > c.ReadThreshold { - c.BytesReadFromDeadline.Store(0) - // we set both read and write deadlines here otherwise after the request - // is read writing the response fails with an i/o timeout error - err = c.Conn.SetDeadline(time.Now().Add(c.ReadTimeout)) - if err != nil { - return 0, err - } - } - n, err = c.Conn.Read(b) - c.BytesReadFromDeadline.Add(int32(n)) - return -} - -func (c *Conn) Write(b []byte) (n int, err error) { - if c.BytesWrittenFromDeadline.Load() > c.WriteThreshold { - c.BytesWrittenFromDeadline.Store(0) - // we extend the read deadline too, not sure it's necessary, - // but it doesn't hurt - err = c.Conn.SetDeadline(time.Now().Add(c.WriteTimeout)) - if err != nil { - return - } - } - n, err = c.Conn.Write(b) - c.BytesWrittenFromDeadline.Add(int32(n)) - return -} - -func newListener(network, addr string, readTimeout, writeTimeout time.Duration) (net.Listener, error) { - l, err := net.Listen(network, addr) - if err != nil { - return nil, err - } - - tl := &listener{ - Listener: l, - ReadTimeout: readTimeout, - WriteTimeout: writeTimeout, - } - return tl, nil -} diff --git a/internal/util/util.go b/internal/util/util.go index 3014db55..82cbbba2 100644 --- a/internal/util/util.go +++ b/internal/util/util.go @@ -22,12 +22,16 @@ import ( "crypto/elliptic" "crypto/rand" "crypto/rsa" + "crypto/sha256" + "crypto/subtle" "crypto/tls" "crypto/x509" + "encoding/hex" "encoding/json" "encoding/pem" "errors" "fmt" + "hash" "io" "io/fs" "math" @@ -40,6 +44,7 @@ import ( "path/filepath" "regexp" "runtime" + "slices" "strconv" "strings" "time" @@ -47,8 +52,7 @@ import ( "unsafe" "github.com/google/uuid" - "github.com/lithammer/shortuuid/v3" - "github.com/rs/xid" + "github.com/lithammer/shortuuid/v4" "golang.org/x/crypto/ssh" "github.com/drakkan/sftpgo/v2/internal/logger" @@ -128,28 +132,6 @@ var bytesSizeTable = map[string]uint64{ "e": eByte, } -// Contains reports whether v is present in elems. -func Contains[T comparable](elems []T, v T) bool { - for _, s := range elems { - if v == s { - return true - } - } - return false -} - -// Remove removes an element from a string slice and -// returns the modified slice -func Remove(elems []string, val string) []string { - for idx, v := range elems { - if v == val { - elems[idx] = elems[len(elems)-1] - return elems[:len(elems)-1] - } - } - return elems -} - // IsStringPrefixInSlice searches a string prefix in a slice and returns true // if a matching prefix is found func IsStringPrefixInSlice(obj string, list []string) bool { @@ -181,6 +163,48 @@ func RemoveDuplicates(obj []string, trim bool) []string { return obj[:validIdx] } +// IsNameValid validates that a name/username contains only safe characters. +func IsNameValid(name string) bool { + if name == "" { + return false + } + if len(name) > 255 { + return false + } + for _, r := range name { + if unicode.IsControl(r) { + return false + } + + switch r { + case '/', '\\': + return false + case ':', '*', '?', '"', '<', '>', '|': + return false + } + } + + if name == "." || name == ".." { + return false + } + + upperName := strings.ToUpper(name) + baseName := strings.Split(upperName, ".")[0] + + switch baseName { + case "CON", "PRN", "AUX", "NUL", + "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", + "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9": + return false + } + + if strings.HasSuffix(name, " ") || strings.HasSuffix(name, ".") { + return false + } + + return true +} + // GetTimeAsMsSinceEpoch returns unix timestamp as milliseconds from a time struct func GetTimeAsMsSinceEpoch(t time.Time) int64 { return t.UnixMilli() @@ -255,7 +279,7 @@ func ParseBytes(s string) (int64, error) { lastDigit := 0 hasComma := false for _, r := range s { - if !(unicode.IsDigit(r) || r == '.' || r == ',') { + if !unicode.IsDigit(r) && r != '.' && r != ',' { break } if r == ',' { @@ -266,7 +290,7 @@ func ParseBytes(s string) (int64, error) { num := s[:lastDigit] if hasComma { - num = strings.Replace(num, ",", "", -1) + num = strings.ReplaceAll(num, ",", "") } f, err := strconv.ParseFloat(num, 64) @@ -380,7 +404,7 @@ func GenerateRSAKeys(file string) error { if err := createDirPathIfMissing(file, 0700); err != nil { return err } - key, err := rsa.GenerateKey(rand.Reader, 4096) + key, err := rsa.GenerateKey(rand.Reader, 3072) if err != nil { return err } @@ -509,10 +533,7 @@ func GetDirsForVirtualPath(virtualPath string) []string { } } dirsForPath := []string{virtualPath} - for { - if virtualPath == "/" { - break - } + for virtualPath != "/" { virtualPath = path.Dir(virtualPath) dirsForPath = append(dirsForPath, virtualPath) } @@ -527,7 +548,7 @@ func CleanPath(p string) string { // CleanPathWithBase returns a clean POSIX (/) absolute path to work with. // The specified base will be used if the provided path is not absolute func CleanPathWithBase(base, p string) string { - p = filepath.ToSlash(p) + p = strings.ReplaceAll(p, "\\", "/") if !path.IsAbs(p) { p = path.Join(base, p) } @@ -572,34 +593,37 @@ func createDirPathIfMissing(file string, perm os.FileMode) error { return nil } -// GenerateRandomBytes generates the secret to use for JWT auth +// GenerateRandomBytes generates random bytes with the specified length func GenerateRandomBytes(length int) []byte { b := make([]byte, length) _, err := io.ReadFull(rand.Reader, b) - if err == nil { - return b + if err != nil { + PanicOnError(fmt.Errorf("failed to read random data (see https://go.dev/issue/66821): %w", err)) } - - b = xid.New().Bytes() - for len(b) < length { - b = append(b, xid.New().Bytes()...) - } - - return b[:length] + return b } -// GenerateUniqueID retuens an unique ID +// GenerateOpaqueString generates a cryptographically secure opaque string +func GenerateOpaqueString() string { + randomBytes := sha256.Sum256(GenerateRandomBytes(32)) + return hex.EncodeToString(randomBytes[:]) +} + +// GenerateUniqueID returns an unique ID func GenerateUniqueID() string { u, err := uuid.NewRandom() if err != nil { - return xid.New().String() + PanicOnError(fmt.Errorf("failed to read random data (see https://go.dev/issue/66821): %w", err)) } return shortuuid.DefaultEncoder.Encode(u) } // HTTPListenAndServe is a wrapper for ListenAndServe that support both tcp // and Unix-domain sockets -func HTTPListenAndServe(srv *http.Server, address string, port int, isTLS bool, logSender string) error { +func HTTPListenAndServe(srv *http.Server, address string, port int, isTLS bool, + listenerWrapper func(net.Listener) (net.Listener, error), + logSender string, +) error { var listener net.Listener var err error @@ -613,7 +637,7 @@ func HTTPListenAndServe(srv *http.Server, address string, port int, isTLS bool, logger.Error(logSender, "", "error creating Unix-domain socket parent dir: %v", err) } os.Remove(address) - listener, err = newListener("unix", address, srv.ReadTimeout, srv.WriteTimeout) + listener, err = net.Listen("unix", address) if err == nil { // should a chmod err be fatal? if errChmod := os.Chmod(address, 0770); errChmod != nil { @@ -622,12 +646,17 @@ func HTTPListenAndServe(srv *http.Server, address string, port int, isTLS bool, } } else { CheckTCP4Port(port) - listener, err = newListener("tcp", fmt.Sprintf("%s:%d", address, port), srv.ReadTimeout, srv.WriteTimeout) + listener, err = net.Listen("tcp", fmt.Sprintf("%s:%d", address, port)) } if err != nil { return err } - + if listenerWrapper != nil { + listener, err = listenerWrapper(listener) + if err != nil { + return err + } + } logger.Info(logSender, "", "server listener registered, address: %s TLS enabled: %t", listener.Addr().String(), isTLS) defer listener.Close() @@ -648,6 +677,11 @@ func GetTLSCiphersFromNames(cipherNames []string) []uint16 { ciphers = append(ciphers, c.ID) } } + for _, c := range tls.InsecureCipherSuites() { + if c.Name == strings.TrimSpace(name) { + ciphers = append(ciphers, c.ID) + } + } } if len(ciphers) == 0 { @@ -741,7 +775,7 @@ func GetRealIP(r *http.Request, header string, depth int) string { var ipAddresses []string for _, h := range r.Header.Values(header) { - for _, ipStr := range strings.Split(h, ",") { + for ipStr := range strings.SplitSeq(h, ",") { ipStr = strings.TrimSpace(ipStr) ipAddresses = append(ipAddresses, ipStr) } @@ -809,16 +843,9 @@ func GetRedactedURL(rawurl string) string { return u.Redacted() } -// PrependFileInfo prepends a file info to a slice in an efficient way. -// We, optimistically, assume that the slice has enough capacity -func PrependFileInfo(files []os.FileInfo, info os.FileInfo) []os.FileInfo { - files = append(files, nil) - copy(files[1:], files) - files[0] = info - return files -} - -// GetTLSVersion returns the TLS version for integer: +// GetTLSVersion returns the TLS version from an integer value: +// - 10 means TLS 1.0 +// - 11 means TLS 1.1 // - 12 means TLS 1.2 // - 13 means TLS 1.3 // default is TLS 1.2 @@ -826,6 +853,10 @@ func GetTLSVersion(val int) uint16 { switch val { case 13: return tls.VersionTLS13 + case 11: + return tls.VersionTLS11 + case 10: + return tls.VersionTLS10 default: return tls.VersionTLS12 } @@ -928,3 +959,55 @@ func ReadConfigFromFile(name, configDir string) (string, error) { } return strings.TrimSpace(BytesToString(val)), nil } + +// SlicesEqual checks if the provided slices contain the same elements, +// also in different order. +func SlicesEqual(s1, s2 []string) bool { + if len(s1) != len(s2) { + return false + } + for _, v := range s1 { + if !slices.Contains(s2, v) { + return false + } + } + + return true +} + +// VerifyFileChecksum computes the hash of the given file using the provided +// hash algorithm and compares it against the expected checksum (in hex format). +// It returns an error if the checksum does not match or if the operation fails. +func VerifyFileChecksum(filePath string, h hash.Hash, expectedHex string, maxSize int64) error { + expected, err := hex.DecodeString(expectedHex) + if err != nil { + return fmt.Errorf("invalid checksum %q: %w", expectedHex, err) + } + + f, err := os.Open(filePath) + if err != nil { + return err + } + defer f.Close() + + if maxSize > 0 { + fi, err := f.Stat() + if err != nil { + return err + } + if fi.Size() > maxSize { + return fmt.Errorf("file too large: %s", ByteCountIEC(fi.Size())) + } + } + + if _, err := io.Copy(h, f); err != nil { + return err + } + + actual := h.Sum(nil) + if subtle.ConstantTimeCompare(actual, expected) != 1 { + return errors.New("checksum mismatch") + } + + return nil +} diff --git a/internal/version/version.go b/internal/version/version.go index d0c46d01..c9e066ea 100644 --- a/internal/version/version.go +++ b/internal/version/version.go @@ -18,7 +18,7 @@ package version import "strings" const ( - version = "2.6.0" + version = "2.7.99-dev" appName = "SFTPGo" ) diff --git a/internal/vfs/azblobfs.go b/internal/vfs/azblobfs.go index 067d612c..46b7ae78 100644 --- a/internal/vfs/azblobfs.go +++ b/internal/vfs/azblobfs.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build !noazblob -// +build !noazblob package vfs @@ -39,10 +38,10 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" + "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container" - "github.com/eikenb/pipeat" "github.com/google/uuid" "github.com/pkg/sftp" @@ -104,10 +103,6 @@ func NewAzBlobFs(connectionID, localTempDir, mountPath string, config AzBlobFsCo return fs.initFromSASURL() } - credential, err := blob.NewSharedKeyCredential(fs.config.AccountName, fs.config.AccountKey.GetPayload()) - if err != nil { - return fs, fmt.Errorf("invalid credentials: %v", err) - } var endpoint string if fs.config.UseEmulator { endpoint = fmt.Sprintf("%s/%s", fs.config.Endpoint, fs.config.AccountName) @@ -115,9 +110,25 @@ func NewAzBlobFs(connectionID, localTempDir, mountPath string, config AzBlobFsCo endpoint = fmt.Sprintf("https://%s.%s/", fs.config.AccountName, fs.config.Endpoint) } containerURL := runtime.JoinPaths(endpoint, fs.config.Container) - svc, err := container.NewClientWithSharedKeyCredential(containerURL, credential, getAzContainerClientOptions()) + if fs.config.AccountKey.GetPayload() != "" { + credential, err := blob.NewSharedKeyCredential(fs.config.AccountName, fs.config.AccountKey.GetPayload()) + if err != nil { + return fs, fmt.Errorf("invalid credentials: %v", err) + } + svc, err := container.NewClientWithSharedKeyCredential(containerURL, credential, getAzContainerClientOptions()) + if err != nil { + return fs, fmt.Errorf("unable to create the storage client using shared key credentials: %v", err) + } + fs.containerClient = svc + return fs, err + } + credential, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { - return fs, fmt.Errorf("invalid credentials: %v", err) + return fs, fmt.Errorf("invalid default azure credentials: %v", err) + } + svc, err := container.NewClient(containerURL, credential, getAzContainerClientOptions()) + if err != nil { + return fs, fmt.Errorf("unable to create the storage client using azure credentials: %v", err) } fs.containerClient = svc return fs, err @@ -186,7 +197,11 @@ func (fs *AzureBlobFs) Stat(name string) (os.FileInfo, error) { if val := getAzureLastModified(attrs.Metadata); val > 0 { lastModified = util.GetTimeFromMsecSinceEpoch(val) } - return NewFileInfo(name, isDir, util.GetIntFromPointer(attrs.ContentLength), lastModified, false), nil + info := NewFileInfo(name, isDir, util.GetIntFromPointer(attrs.ContentLength), lastModified, false) + if !isDir { + info.setMetadataFromPointerVal(attrs.Metadata) + } + return info, nil } if !fs.IsNotExist(err) { return nil, err @@ -209,7 +224,7 @@ func (fs *AzureBlobFs) Lstat(name string) (os.FileInfo, error) { // Open opens the named file for reading func (fs *AzureBlobFs) Open(name string, offset int64) (File, PipeReader, func(), error) { - r, w, err := pipeat.PipeInDir(fs.localTempDir) + r, w, err := createPipeFn(fs.localTempDir, fs.config.DownloadPartSize*int64(fs.config.DownloadConcurrency)+1) if err != nil { return nil, nil, nil, err } @@ -237,7 +252,7 @@ func (fs *AzureBlobFs) Create(name string, flag, checks int) (File, PipeWriter, return nil, nil, nil, err } } - r, w, err := pipeat.PipeInDir(fs.localTempDir) + r, w, err := createPipeFn(fs.localTempDir, fs.config.UploadPartSize+1024*1024) if err != nil { return nil, nil, nil, err } @@ -302,19 +317,21 @@ func (fs *AzureBlobFs) Create(name string, flag, checks int) (File, PipeWriter, } // Rename renames (moves) source to target. -func (fs *AzureBlobFs) Rename(source, target string) (int, int64, error) { +func (fs *AzureBlobFs) Rename(source, target string, checks int) (int, int64, error) { if source == target { return -1, -1, nil } - _, err := fs.Stat(path.Dir(target)) - if err != nil { - return -1, -1, err + if checks&CheckParentDir != 0 { + _, err := fs.Stat(path.Dir(target)) + if err != nil { + return -1, -1, err + } } fi, err := fs.Stat(source) if err != nil { return -1, -1, err } - return fs.renameInternal(source, target, fi, 0) + return fs.renameInternal(source, target, fi, 0, checks&CheckUpdateModTime != 0) } // Remove removes the named file or (empty) directory. @@ -394,7 +411,17 @@ func (fs *AzureBlobFs) Chtimes(name string, _, mtime time.Time, isUploading bool if metadata == nil { metadata = make(map[string]*string) } - metadata[lastModifiedField] = to.Ptr(strconv.FormatInt(mtime.UnixMilli(), 10)) + found := false + for k := range metadata { + if strings.EqualFold(k, lastModifiedField) { + metadata[k] = to.Ptr(strconv.FormatInt(mtime.UnixMilli(), 10)) + found = true + break + } + } + if !found { + metadata[lastModifiedField] = to.Ptr(strconv.FormatInt(mtime.UnixMilli(), 10)) + } ctx, cancelFn := context.WithDeadline(context.Background(), time.Now().Add(fs.ctxTimeout)) defer cancelFn() @@ -533,7 +560,7 @@ func (fs *AzureBlobFs) GetDirSize(dirname string) (int, int64, error) { metric.AZListObjectsCompleted(err) return numFiles, size, err } - for _, blobItem := range resp.ListBlobsFlatSegmentResponse.Segment.BlobItems { + for _, blobItem := range resp.Segment.BlobItems { if blobItem.Properties != nil { contentType := util.GetStringFromPointer(blobItem.Properties.ContentType) isDir := checkDirectoryMarkers(contentType, blobItem.Metadata) @@ -601,7 +628,7 @@ func (fs *AzureBlobFs) Walk(root string, walkFn filepath.WalkFunc) error { metric.AZListObjectsCompleted(err) return err } - for _, blobItem := range resp.ListBlobsFlatSegmentResponse.Segment.BlobItems { + for _, blobItem := range resp.Segment.BlobItems { name := util.GetStringFromPointer(blobItem.Name) if fs.isEqual(name, prefix) { continue @@ -642,18 +669,18 @@ func (*AzureBlobFs) HasVirtualFolders() bool { // ResolvePath returns the matching filesystem path for the specified sftp path func (fs *AzureBlobFs) ResolvePath(virtualPath string) (string, error) { if fs.mountPath != "" { - virtualPath = strings.TrimPrefix(virtualPath, fs.mountPath) - } - if !path.IsAbs(virtualPath) { - virtualPath = path.Clean("/" + virtualPath) + if after, found := strings.CutPrefix(virtualPath, fs.mountPath); found { + virtualPath = after + } } + virtualPath = path.Clean("/" + virtualPath) return fs.Join(fs.config.KeyPrefix, strings.TrimPrefix(virtualPath, "/")), nil } // CopyFile implements the FsFileCopier interface -func (fs *AzureBlobFs) CopyFile(source, target string, srcSize int64) (int, int64, error) { +func (fs *AzureBlobFs) CopyFile(source, target string, srcInfo os.FileInfo) (int, int64, error) { numFiles := 1 - sizeDiff := srcSize + sizeDiff := srcInfo.Size() attrs, err := fs.headObject(target) if err == nil { sizeDiff -= util.GetIntFromPointer(attrs.ContentLength) @@ -663,7 +690,7 @@ func (fs *AzureBlobFs) CopyFile(source, target string, srcSize int64) (int, int6 return 0, 0, err } } - if err := fs.copyFileInternal(source, target); err != nil { + if err := fs.copyFileInternal(source, target, srcInfo, true); err != nil { return 0, 0, err } return numFiles, sizeDiff, nil @@ -746,13 +773,13 @@ func (fs *AzureBlobFs) setConfigDefaults() { } } -func (fs *AzureBlobFs) copyFileInternal(source, target string) error { +func (fs *AzureBlobFs) copyFileInternal(source, target string, srcInfo os.FileInfo, updateModTime bool) error { ctx, cancelFn := context.WithDeadline(context.Background(), time.Now().Add(fs.ctxLongTimeout)) defer cancelFn() srcBlob := fs.containerClient.NewBlockBlobClient(source) dstBlob := fs.containerClient.NewBlockBlobClient(target) - resp, err := dstBlob.StartCopyFromURL(ctx, srcBlob.URL(), fs.getCopyOptions()) + resp, err := dstBlob.StartCopyFromURL(ctx, srcBlob.URL(), fs.getCopyOptions(srcInfo, updateModTime)) if err != nil { metric.AZCopyObjectCompleted(err) return err @@ -785,11 +812,13 @@ func (fs *AzureBlobFs) copyFileInternal(source, target string) error { return nil } -func (fs *AzureBlobFs) renameInternal(source, target string, fi os.FileInfo, recursion int) (int, int64, error) { +func (fs *AzureBlobFs) renameInternal(source, target string, srcInfo os.FileInfo, recursion int, + updateModTime bool, +) (int, int64, error) { var numFiles int var filesSize int64 - if fi.IsDir() { + if srcInfo.IsDir() { if renameMode == 0 { hasContents, err := fs.hasContents(source) if err != nil { @@ -803,7 +832,7 @@ func (fs *AzureBlobFs) renameInternal(source, target string, fi os.FileInfo, rec return numFiles, filesSize, err } if renameMode == 1 { - files, size, err := doRecursiveRename(fs, source, target, fs.renameInternal, recursion) + files, size, err := doRecursiveRename(fs, source, target, fs.renameInternal, recursion, updateModTime) numFiles += files filesSize += size if err != nil { @@ -811,13 +840,13 @@ func (fs *AzureBlobFs) renameInternal(source, target string, fi os.FileInfo, rec } } } else { - if err := fs.copyFileInternal(source, target); err != nil { + if err := fs.copyFileInternal(source, target, srcInfo, updateModTime); err != nil { return numFiles, filesSize, err } numFiles++ - filesSize += fi.Size() + filesSize += srcInfo.Size() } - err := fs.skipNotExistErr(fs.Remove(source, fi.IsDir())) + err := fs.skipNotExistErr(fs.Remove(source, srcInfo.IsDir())) return numFiles, filesSize, err } @@ -856,7 +885,7 @@ func (fs *AzureBlobFs) hasContents(name string) (bool, error) { return result, err } - result = len(resp.ListBlobsFlatSegmentResponse.Segment.BlobItems) > 0 + result = len(resp.Segment.BlobItems) > 0 } metric.AZListObjectsCompleted(nil) @@ -879,15 +908,14 @@ func (fs *AzureBlobFs) downloadPart(ctx context.Context, blockBlob *blockblob.Cl if err != nil { return err } - defer resp.DownloadResponse.Body.Close() + defer resp.Body.Close() - _, err = io.ReadAtLeast(resp.DownloadResponse.Body, buf, int(count)) + _, err = io.ReadAtLeast(resp.Body, buf, int(count)) if err != nil { return err } - _, err = fs.writeAtFull(w, buf, writeOffset, int(count)) - return err + return writeAtFull(w, buf, writeOffset, int(count)) } func (fs *AzureBlobFs) handleMultipartDownload(ctx context.Context, blockBlob *blockblob.Client, @@ -917,6 +945,8 @@ func (fs *AzureBlobFs) handleMultipartDownload(ctx context.Context, blockBlob *b guard := make(chan struct{}, fs.config.DownloadConcurrency) blockCtxTimeout := time.Duration(fs.config.DownloadPartSize/(1024*1024)) * time.Minute pool := newBufferAllocator(int(partSize)) + defer pool.free() + finished := false var wg sync.WaitGroup var errOnce sync.Once @@ -970,7 +1000,6 @@ func (fs *AzureBlobFs) handleMultipartDownload(ctx context.Context, blockBlob *b wg.Wait() close(guard) - pool.free() return poolError } @@ -985,6 +1014,8 @@ func (fs *AzureBlobFs) handleMultipartUpload(ctx context.Context, reader io.Read // sync.Pool seems to use a lot of memory so prefer our own, very simple, allocator // we only need to recycle few byte slices pool := newBufferAllocator(int(partSize)) + defer pool.free() + finished := false var blocks []string var wg sync.WaitGroup @@ -995,10 +1026,17 @@ func (fs *AzureBlobFs) handleMultipartUpload(ctx context.Context, reader io.Read poolCtx, poolCancel := context.WithCancel(ctx) defer poolCancel() + finalizeFailedUpload := func(err error) { + fsLog(fs, logger.LevelDebug, "multipart upload error: %+v", err) + hasError.Store(true) + poolError = fmt.Errorf("multipart upload error: %w", err) + poolCancel() + } + for part := 0; !finished; part++ { buf := pool.getBuffer() - n, err := fs.readFill(reader, buf) + n, err := readFill(reader, buf) if err == io.EOF { // read finished, if n > 0 we need to process the last data chunck if n == 0 { @@ -1008,8 +1046,10 @@ func (fs *AzureBlobFs) handleMultipartUpload(ctx context.Context, reader io.Read finished = true } else if err != nil { pool.releaseBuffer(buf) - pool.free() - return err + errOnce.Do(func() { + finalizeFailedUpload(err) + }) + break } // Block IDs are unique values to avoid issue if 2+ clients are uploading blocks @@ -1017,8 +1057,10 @@ func (fs *AzureBlobFs) handleMultipartUpload(ctx context.Context, reader io.Read generatedUUID, err := uuid.NewRandom() if err != nil { pool.releaseBuffer(buf) - pool.free() - return fmt.Errorf("unable to generate block ID: %w", err) + errOnce.Do(func() { + finalizeFailedUpload(err) + }) + break } blockID := base64.StdEncoding.EncodeToString([]byte(generatedUUID.String())) blocks = append(blocks, blockID) @@ -1048,9 +1090,7 @@ func (fs *AzureBlobFs) handleMultipartUpload(ctx context.Context, reader io.Read if err != nil { errOnce.Do(func() { fsLog(fs, logger.LevelDebug, "multipart upload error: %+v", err) - hasError.Store(true) - poolError = fmt.Errorf("multipart upload error: %w", err) - poolCancel() + finalizeFailedUpload(err) }) } }(blockID, buf, n) @@ -1058,7 +1098,6 @@ func (fs *AzureBlobFs) handleMultipartUpload(ctx context.Context, reader io.Read wg.Wait() close(guard) - pool.free() if poolError != nil { return poolError @@ -1076,33 +1115,27 @@ func (fs *AzureBlobFs) handleMultipartUpload(ctx context.Context, reader io.Read return err } -func (*AzureBlobFs) writeAtFull(w io.WriterAt, buf []byte, offset int64, count int) (int, error) { - written := 0 - for written < count { - n, err := w.WriteAt(buf[written:count], offset+int64(written)) - written += n - if err != nil { - return written, err - } - } - return written, nil -} - -// copied from rclone -func (*AzureBlobFs) readFill(r io.Reader, buf []byte) (n int, err error) { - var nn int - for n < len(buf) && err == nil { - nn, err = r.Read(buf[n:]) - n += nn - } - return n, err -} - -func (fs *AzureBlobFs) getCopyOptions() *blob.StartCopyFromURLOptions { +func (fs *AzureBlobFs) getCopyOptions(srcInfo os.FileInfo, updateModTime bool) *blob.StartCopyFromURLOptions { copyOptions := &blob.StartCopyFromURLOptions{} if fs.config.AccessTier != "" { copyOptions.Tier = (*blob.AccessTier)(&fs.config.AccessTier) } + if updateModTime { + metadata := make(map[string]*string) + for k, v := range getMetadata(srcInfo) { + if v != "" { + if strings.EqualFold(k, lastModifiedField) { + metadata[k] = to.Ptr("0") + } else { + metadata[k] = to.Ptr(v) + } + } + } + if len(metadata) > 0 { + copyOptions.Metadata = metadata + } + } + return copyOptions } @@ -1125,8 +1158,8 @@ func checkDirectoryMarkers(contentType string, metadata map[string]*string) bool return true } for k, v := range metadata { - if strings.ToLower(k) == azFolderKey { - return strings.ToLower(util.GetStringFromPointer(v)) == "true" + if strings.EqualFold(k, azFolderKey) { + return strings.EqualFold(util.GetStringFromPointer(v), "true") } } return false @@ -1142,66 +1175,6 @@ func getAzContainerClientOptions() *container.ClientOptions { } } -type bytesReaderWrapper struct { - *bytes.Reader -} - -func (b *bytesReaderWrapper) Close() error { - return nil -} - -type bufferAllocator struct { - sync.Mutex - available [][]byte - bufferSize int - finalized bool -} - -func newBufferAllocator(size int) *bufferAllocator { - return &bufferAllocator{ - bufferSize: size, - finalized: false, - } -} - -func (b *bufferAllocator) getBuffer() []byte { - b.Lock() - defer b.Unlock() - - if len(b.available) > 0 { - var result []byte - - truncLength := len(b.available) - 1 - result = b.available[truncLength] - - b.available[truncLength] = nil - b.available = b.available[:truncLength] - - return result - } - - return make([]byte, b.bufferSize) -} - -func (b *bufferAllocator) releaseBuffer(buf []byte) { - b.Lock() - defer b.Unlock() - - if b.finalized || len(buf) != b.bufferSize { - return - } - - b.available = append(b.available, buf) -} - -func (b *bufferAllocator) free() { - b.Lock() - defer b.Unlock() - - b.available = nil - b.finalized = true -} - type azureBlobDirLister struct { baseDirLister paginator *runtime.Pager[container.ListBlobsHierarchyResponse] @@ -1234,7 +1207,7 @@ func (l *azureBlobDirLister) Next(limit int) ([]os.FileInfo, error) { return l.cache, err } - for _, blobPrefix := range page.ListBlobsHierarchySegmentResponse.Segment.BlobPrefixes { + for _, blobPrefix := range page.Segment.BlobPrefixes { name := util.GetStringFromPointer(blobPrefix.Name) // we don't support prefixes == "/" this will be sent if a key starts with "/" if name == "" || name == "/" { @@ -1249,11 +1222,12 @@ func (l *azureBlobDirLister) Next(limit int) ([]os.FileInfo, error) { l.prefixes[strings.TrimSuffix(name, "/")] = true } - for _, blobItem := range page.ListBlobsHierarchySegmentResponse.Segment.BlobItems { + for _, blobItem := range page.Segment.BlobItems { name := util.GetStringFromPointer(blobItem.Name) name = strings.TrimPrefix(name, l.prefix) size := int64(0) isDir := false + var metadata map[string]*string modTime := time.Unix(0, 0) if blobItem.Properties != nil { size = util.GetIntFromPointer(blobItem.Properties.ContentLength) @@ -1266,12 +1240,16 @@ func (l *azureBlobDirLister) Next(limit int) ([]os.FileInfo, error) { continue } l.prefixes[name] = true + } else { + metadata = blobItem.Metadata } if val := getAzureLastModified(blobItem.Metadata); val > 0 { modTime = util.GetTimeFromMsecSinceEpoch(val) } } - l.cache = append(l.cache, NewFileInfo(name, isDir, size, modTime, false)) + info := NewFileInfo(name, isDir, size, modTime, false) + info.setMetadataFromPointerVal(metadata) + l.cache = append(l.cache, info) } return l.returnFromCache(limit), nil diff --git a/internal/vfs/azblobfs_disabled.go b/internal/vfs/azblobfs_disabled.go index 34639d3d..35b83e2b 100644 --- a/internal/vfs/azblobfs_disabled.go +++ b/internal/vfs/azblobfs_disabled.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build noazblob -// +build noazblob package vfs diff --git a/internal/vfs/cryptfs.go b/internal/vfs/cryptfs.go index 3f20fb37..8e76da30 100644 --- a/internal/vfs/cryptfs.go +++ b/internal/vfs/cryptfs.go @@ -24,7 +24,6 @@ import ( "net/http" "os" - "github.com/eikenb/pipeat" "github.com/minio/sio" "golang.org/x/crypto/hkdf" @@ -60,8 +59,8 @@ func NewCryptFs(connectionID, rootDir, mountPath string, config CryptFsConfig) ( connectionID: connectionID, rootDir: rootDir, mountPath: getMountPath(mountPath), - readBufferSize: config.OSFsConfig.ReadBufferSize * 1024 * 1024, - writeBufferSize: config.OSFsConfig.WriteBufferSize * 1024 * 1024, + readBufferSize: config.ReadBufferSize * 1024 * 1024, + writeBufferSize: config.WriteBufferSize * 1024 * 1024, }, masterKey: []byte(config.Passphrase.GetPayload()), } @@ -89,7 +88,7 @@ func (fs *CryptFs) Open(name string, offset int64) (File, PipeReader, func(), er f.Close() return nil, nil, nil, err } - r, w, err := pipeat.PipeInDir(fs.localTempDir) + r, w, err := createPipeFn(fs.localTempDir, 0) if err != nil { f.Close() return nil, nil, nil, err @@ -175,7 +174,7 @@ func (fs *CryptFs) Create(name string, _, _ int) (File, PipeWriter, func(), erro f.Close() return nil, nil, nil, err } - r, w, err := pipeat.PipeInDir(fs.localTempDir) + r, w, err := createPipeFn(fs.localTempDir, 0) if err != nil { f.Close() return nil, nil, nil, err diff --git a/internal/vfs/fileinfo.go b/internal/vfs/fileinfo.go index a6079443..c27fbf79 100644 --- a/internal/vfs/fileinfo.go +++ b/internal/vfs/fileinfo.go @@ -18,6 +18,8 @@ import ( "os" "path" "time" + + "github.com/drakkan/sftpgo/v2/internal/util" ) // FileInfo implements os.FileInfo for a Cloud Storage file. @@ -26,6 +28,7 @@ type FileInfo struct { sizeInBytes int64 modTime time.Time mode os.FileMode + metadata map[string]string } // NewFileInfo creates file info. @@ -79,5 +82,36 @@ func (fi *FileInfo) SetMode(mode os.FileMode) { // Sys provides the underlying data source (can return nil) func (fi *FileInfo) Sys() any { + return fi.metadata +} + +func (fi *FileInfo) setMetadata(value map[string]string) { + fi.metadata = value +} + +func (fi *FileInfo) setMetadataFromPointerVal(value map[string]*string) { + if len(value) == 0 { + fi.metadata = nil + return + } + + fi.metadata = map[string]string{} + for k, v := range value { + val := util.GetStringFromPointer(v) + if val != "" { + fi.metadata[k] = val + } + } +} + +func getMetadata(fi os.FileInfo) map[string]string { + if fi.Sys() == nil { + return nil + } + if val, ok := fi.Sys().(map[string]string); ok { + if len(val) > 0 { + return val + } + } return nil } diff --git a/internal/vfs/filesystem.go b/internal/vfs/filesystem.go index 95b3df40..59ce47dd 100644 --- a/internal/vfs/filesystem.go +++ b/internal/vfs/filesystem.go @@ -20,6 +20,7 @@ import ( "github.com/sftpgo/sdk" "github.com/drakkan/sftpgo/v2/internal/kms" + "github.com/drakkan/sftpgo/v2/internal/util" ) // Filesystem defines filesystem details @@ -38,6 +39,7 @@ type Filesystem struct { // SetEmptySecrets sets the secrets to empty func (f *Filesystem) SetEmptySecrets() { f.S3Config.AccessSecret = kms.NewEmptySecret() + f.S3Config.SSECustomerKey = kms.NewEmptySecret() f.GCSConfig.Credentials = kms.NewEmptySecret() f.AzBlobConfig.AccountKey = kms.NewEmptySecret() f.AzBlobConfig.SASURL = kms.NewEmptySecret() @@ -54,6 +56,9 @@ func (f *Filesystem) SetEmptySecretsIfNil() { if f.S3Config.AccessSecret == nil { f.S3Config.AccessSecret = kms.NewEmptySecret() } + if f.S3Config.SSECustomerKey == nil { + f.S3Config.SSECustomerKey = kms.NewEmptySecret() + } if f.GCSConfig.Credentials == nil { f.GCSConfig.Credentials = kms.NewEmptySecret() } @@ -90,6 +95,9 @@ func (f *Filesystem) SetNilSecretsIfEmpty() { if f.S3Config.AccessSecret != nil && f.S3Config.AccessSecret.IsEmpty() { f.S3Config.AccessSecret = nil } + if f.S3Config.SSECustomerKey != nil && f.S3Config.SSECustomerKey.IsEmpty() { + f.S3Config.SSECustomerKey = nil + } if f.GCSConfig.Credentials != nil && f.GCSConfig.Credentials.IsEmpty() { f.GCSConfig.Credentials = nil } @@ -232,8 +240,7 @@ func (f *Filesystem) Validate(additionalData string) error { f.CryptConfig = CryptFsConfig{} f.SFTPConfig = SFTPFsConfig{} return nil - default: - f.Provider = sdk.LocalFilesystemProvider + case sdk.LocalFilesystemProvider: f.S3Config = S3FsConfig{} f.GCSConfig = GCSFsConfig{} f.AzBlobConfig = AzBlobFsConfig{} @@ -241,6 +248,11 @@ func (f *Filesystem) Validate(additionalData string) error { f.SFTPConfig = SFTPFsConfig{} f.HTTPConfig = HTTPFsConfig{} return validateOSFsConfig(&f.OSConfig) + default: + return util.NewI18nError( + util.NewValidationError("invalid filesystem provider"), + util.I18nErrorFsValidation, + ) } } @@ -249,6 +261,9 @@ func (f *Filesystem) HasRedactedSecret() bool { // TODO move vfs specific code into each *FsConfig struct switch f.Provider { case sdk.S3FilesystemProvider: + if f.S3Config.SSECustomerKey.IsRedacted() { + return true + } return f.S3Config.AccessSecret.IsRedacted() case sdk.GCSFilesystemProvider: return f.GCSConfig.Credentials.IsRedacted() @@ -323,7 +338,8 @@ func (f *Filesystem) GetACopy() Filesystem { ForcePathStyle: f.S3Config.ForcePathStyle, SkipTLSVerify: f.S3Config.SkipTLSVerify, }, - AccessSecret: f.S3Config.AccessSecret.Clone(), + AccessSecret: f.S3Config.AccessSecret.Clone(), + SSECustomerKey: f.S3Config.SSECustomerKey.Clone(), }, GCSConfig: GCSFsConfig{ BaseGCSFsConfig: sdk.BaseGCSFsConfig{ diff --git a/internal/vfs/folder.go b/internal/vfs/folder.go index b85d82ff..5fcee524 100644 --- a/internal/vfs/folder.go +++ b/internal/vfs/folder.go @@ -107,18 +107,24 @@ func (v *BaseVirtualFolder) HasRedactedSecret() bool { // hasPathPlaceholder returns true if the folder has a path placeholder func (v *BaseVirtualFolder) hasPathPlaceholder() bool { - placeholder := "%username%" + placeholders := []string{"%username%", "%role%"} + var config string switch v.FsConfig.Provider { case sdk.S3FilesystemProvider: - return strings.Contains(v.FsConfig.S3Config.KeyPrefix, placeholder) + config = v.FsConfig.S3Config.KeyPrefix case sdk.GCSFilesystemProvider: - return strings.Contains(v.FsConfig.GCSConfig.KeyPrefix, placeholder) + config = v.FsConfig.GCSConfig.KeyPrefix case sdk.AzureBlobFilesystemProvider: - return strings.Contains(v.FsConfig.AzBlobConfig.KeyPrefix, placeholder) + config = v.FsConfig.AzBlobConfig.KeyPrefix case sdk.SFTPFilesystemProvider: - return strings.Contains(v.FsConfig.SFTPConfig.Prefix, placeholder) + config = v.FsConfig.SFTPConfig.Prefix case sdk.LocalFilesystemProvider, sdk.CryptedFilesystemProvider: - return strings.Contains(v.MappedPath, placeholder) + config = v.MappedPath + } + for _, placeholder := range placeholders { + if strings.Contains(config, placeholder) { + return true + } } return false } diff --git a/internal/vfs/gcsfs.go b/internal/vfs/gcsfs.go index 613e67ff..b3cfa6c2 100644 --- a/internal/vfs/gcsfs.go +++ b/internal/vfs/gcsfs.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build !nogcs -// +build !nogcs package vfs @@ -32,7 +31,6 @@ import ( "time" "cloud.google.com/go/storage" - "github.com/eikenb/pipeat" "github.com/pkg/sftp" "github.com/rs/xid" "google.golang.org/api/googleapi" @@ -89,13 +87,20 @@ func NewGCSFs(connectionID, localTempDir, mountPath string, config GCSFsConfig) } ctx := context.Background() if fs.config.AutomaticCredentials > 0 { - fs.svc, err = storage.NewClient(ctx) + fs.svc, err = storage.NewClient(ctx, + storage.WithJSONReads(), + option.WithUserAgent(version.GetVersionHash()), + ) } else { err = fs.config.Credentials.TryDecrypt() if err != nil { return fs, err } - fs.svc, err = storage.NewClient(ctx, option.WithCredentialsJSON([]byte(fs.config.Credentials.GetPayload()))) + fs.svc, err = storage.NewClient(ctx, + storage.WithJSONReads(), + option.WithUserAgent(version.GetVersionHash()), + option.WithAuthCredentialsJSON(option.ServiceAccount, []byte(fs.config.Credentials.GetPayload())), + ) } return fs, err } @@ -128,7 +133,7 @@ func (fs *GCSFs) Lstat(name string) (os.FileInfo, error) { // Open opens the named file for reading func (fs *GCSFs) Open(name string, offset int64) (File, PipeReader, func(), error) { - r, w, err := pipeat.PipeInDir(fs.localTempDir) + r, w, err := createPipeFn(fs.localTempDir, 0) if err != nil { return nil, nil, nil, err } @@ -176,7 +181,11 @@ func (fs *GCSFs) Create(name string, flag, checks int) (File, PipeWriter, func() return nil, nil, nil, err } } - r, w, err := pipeat.PipeInDir(fs.localTempDir) + chunkSize := googleapi.DefaultUploadChunkSize + if fs.config.UploadPartSize > 0 { + chunkSize = int(fs.config.UploadPartSize) * 1024 * 1024 + } + r, w, err := createPipeFn(fs.localTempDir, int64(chunkSize+1024*1024)) if err != nil { return nil, nil, nil, err } @@ -220,9 +229,7 @@ func (fs *GCSFs) Create(name string, flag, checks int) (File, PipeWriter, func() objectWriter = obj.NewWriter(ctx) } - if fs.config.UploadPartSize > 0 { - objectWriter.ChunkSize = int(fs.config.UploadPartSize) * 1024 * 1024 - } + objectWriter.ChunkSize = chunkSize if fs.config.UploadPartMaxTime > 0 { objectWriter.ChunkRetryDeadline = time.Duration(fs.config.UploadPartMaxTime) * time.Second } @@ -255,19 +262,21 @@ func (fs *GCSFs) Create(name string, flag, checks int) (File, PipeWriter, func() } // Rename renames (moves) source to target. -func (fs *GCSFs) Rename(source, target string) (int, int64, error) { +func (fs *GCSFs) Rename(source, target string, checks int) (int, int64, error) { if source == target { return -1, -1, nil } - _, err := fs.Stat(path.Dir(target)) - if err != nil { - return -1, -1, err + if checks&CheckParentDir != 0 { + _, err := fs.Stat(path.Dir(target)) + if err != nil { + return -1, -1, err + } } fi, err := fs.getObjectStat(source) if err != nil { return -1, -1, err } - return fs.renameInternal(source, target, fi, 0) + return fs.renameInternal(source, target, fi, 0, checks&CheckUpdateModTime != 0) } // Remove removes the named file or (empty) directory. @@ -419,11 +428,12 @@ func (*GCSFs) IsNotExist(err error) bool { if err == nil { return false } - if err == storage.ErrObjectNotExist || err == storage.ErrBucketNotExist { + if errors.Is(err, storage.ErrObjectNotExist) { return true } - if e, ok := err.(*googleapi.Error); ok { - if e.Code == http.StatusNotFound { + var apiErr *googleapi.Error + if errors.As(err, &apiErr) { + if apiErr.Code == http.StatusNotFound { return true } } @@ -436,8 +446,9 @@ func (*GCSFs) IsPermission(err error) bool { if err == nil { return false } - if e, ok := err.(*googleapi.Error); ok { - if e.Code == http.StatusForbidden || e.Code == http.StatusUnauthorized { + var apiErr *googleapi.Error + if errors.As(err, &apiErr) { + if apiErr.Code == http.StatusForbidden || apiErr.Code == http.StatusUnauthorized { return true } } @@ -620,25 +631,25 @@ func (*GCSFs) Join(elem ...string) string { } // HasVirtualFolders returns true if folders are emulated -func (GCSFs) HasVirtualFolders() bool { +func (*GCSFs) HasVirtualFolders() bool { return true } // ResolvePath returns the matching filesystem path for the specified virtual path func (fs *GCSFs) ResolvePath(virtualPath string) (string, error) { if fs.mountPath != "" { - virtualPath = strings.TrimPrefix(virtualPath, fs.mountPath) - } - if !path.IsAbs(virtualPath) { - virtualPath = path.Clean("/" + virtualPath) + if after, found := strings.CutPrefix(virtualPath, fs.mountPath); found { + virtualPath = after + } } + virtualPath = path.Clean("/" + virtualPath) return fs.Join(fs.config.KeyPrefix, strings.TrimPrefix(virtualPath, "/")), nil } // CopyFile implements the FsFileCopier interface -func (fs *GCSFs) CopyFile(source, target string, srcSize int64) (int, int64, error) { +func (fs *GCSFs) CopyFile(source, target string, srcInfo os.FileInfo) (int, int64, error) { numFiles := 1 - sizeDiff := srcSize + sizeDiff := srcInfo.Size() var conditions *storage.Conditions attrs, err := fs.headObject(target) if err == nil { @@ -651,7 +662,7 @@ func (fs *GCSFs) CopyFile(source, target string, srcSize int64) (int, int64, err } conditions = &storage.Conditions{DoesNotExist: true} } - if err := fs.copyFileInternal(source, target, conditions); err != nil { + if err := fs.copyFileInternal(source, target, conditions, srcInfo, true); err != nil { return 0, 0, err } return numFiles, sizeDiff, nil @@ -679,7 +690,11 @@ func (fs *GCSFs) getObjectStat(name string) (os.FileInfo, error) { objectModTime = util.GetTimeFromMsecSinceEpoch(val) } isDir := attrs.ContentType == dirMimeType || strings.HasSuffix(attrs.Name, "/") - return NewFileInfo(name, isDir, objSize, objectModTime, false), nil + info := NewFileInfo(name, isDir, objSize, objectModTime, false) + if !isDir { + info.setMetadata(attrs.Metadata) + } + return info, nil } if !fs.IsNotExist(err) { return nil, err @@ -712,10 +727,10 @@ func (fs *GCSFs) setWriterAttrs(objectWriter *storage.Writer, flag int, name str contentType = mime.TypeByExtension(path.Ext(name)) } if contentType != "" { - objectWriter.ObjectAttrs.ContentType = contentType + objectWriter.ContentType = contentType } if fs.config.StorageClass != "" { - objectWriter.ObjectAttrs.StorageClass = fs.config.StorageClass + objectWriter.StorageClass = fs.config.StorageClass } if fs.config.ACL != "" { objectWriter.PredefinedACL = fs.config.ACL @@ -749,7 +764,9 @@ func (fs *GCSFs) composeObjects(ctx context.Context, dst, partialObject *storage return err } -func (fs *GCSFs) copyFileInternal(source, target string, conditions *storage.Conditions) error { +func (fs *GCSFs) copyFileInternal(source, target string, conditions *storage.Conditions, + srcInfo os.FileInfo, updateModTime bool, +) error { src := fs.svc.Bucket(fs.config.Bucket).Object(source) dst := fs.svc.Bucket(fs.config.Bucket).Object(target) if conditions != nil { @@ -780,16 +797,25 @@ func (fs *GCSFs) copyFileInternal(source, target string, conditions *storage.Con if contentType != "" { copier.ContentType = contentType } + metadata := getMetadata(srcInfo) + if updateModTime && len(metadata) > 0 { + delete(metadata, lastModifiedField) + } + if len(metadata) > 0 { + copier.Metadata = metadata + } _, err := copier.Run(ctx) metric.GCSCopyObjectCompleted(err) return err } -func (fs *GCSFs) renameInternal(source, target string, fi os.FileInfo, recursion int) (int, int64, error) { +func (fs *GCSFs) renameInternal(source, target string, srcInfo os.FileInfo, recursion int, + updateModTime bool, +) (int, int64, error) { var numFiles int var filesSize int64 - if fi.IsDir() { + if srcInfo.IsDir() { if renameMode == 0 { hasContents, err := fs.hasContents(source) if err != nil { @@ -803,7 +829,7 @@ func (fs *GCSFs) renameInternal(source, target string, fi os.FileInfo, recursion return numFiles, filesSize, err } if renameMode == 1 { - files, size, err := doRecursiveRename(fs, source, target, fs.renameInternal, recursion) + files, size, err := doRecursiveRename(fs, source, target, fs.renameInternal, recursion, updateModTime) numFiles += files filesSize += size if err != nil { @@ -811,13 +837,13 @@ func (fs *GCSFs) renameInternal(source, target string, fi os.FileInfo, recursion } } } else { - if err := fs.copyFileInternal(source, target, nil); err != nil { + if err := fs.copyFileInternal(source, target, nil, srcInfo, updateModTime); err != nil { return numFiles, filesSize, err } numFiles++ - filesSize += fi.Size() + filesSize += srcInfo.Size() } - err := fs.Remove(source, fi.IsDir()) + err := fs.Remove(source, srcInfo.IsDir()) if fs.IsNotExist(err) { err = nil } @@ -1002,7 +1028,9 @@ func (l *gcsDirLister) Next(limit int) ([]os.FileInfo, error) { if val := getLastModified(attrs.Metadata); val > 0 { modTime = util.GetTimeFromMsecSinceEpoch(val) } - l.cache = append(l.cache, NewFileInfo(name, isDir, attrs.Size, modTime, false)) + info := NewFileInfo(name, isDir, attrs.Size, modTime, false) + info.setMetadata(attrs.Metadata) + l.cache = append(l.cache, info) } } diff --git a/internal/vfs/gcsfs_disabled.go b/internal/vfs/gcsfs_disabled.go index edc0143f..cac24e60 100644 --- a/internal/vfs/gcsfs_disabled.go +++ b/internal/vfs/gcsfs_disabled.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build nogcs -// +build nogcs package vfs diff --git a/internal/vfs/httpfs.go b/internal/vfs/httpfs.go index 331f72dc..76aa940c 100644 --- a/internal/vfs/httpfs.go +++ b/internal/vfs/httpfs.go @@ -32,7 +32,6 @@ import ( "strings" "time" - "github.com/eikenb/pipeat" "github.com/pkg/sftp" "github.com/sftpgo/sdk" @@ -317,7 +316,7 @@ func (fs *HTTPFs) Lstat(name string) (os.FileInfo, error) { // Open opens the named file for reading func (fs *HTTPFs) Open(name string, offset int64) (File, PipeReader, func(), error) { - r, w, err := pipeat.PipeInDir(fs.localTempDir) + r, w, err := createPipeFn(fs.localTempDir, 0) if err != nil { return nil, nil, nil, err } @@ -351,7 +350,7 @@ func (fs *HTTPFs) Open(name string, offset int64) (File, PipeReader, func(), err // Create creates or opens the named file for writing func (fs *HTTPFs) Create(name string, flag, checks int) (File, PipeWriter, func(), error) { - r, w, err := pipeat.PipeInDir(fs.localTempDir) + r, w, err := createPipeFn(fs.localTempDir, 0) if err != nil { return nil, nil, nil, err } @@ -384,7 +383,7 @@ func (fs *HTTPFs) Create(name string, flag, checks int) (File, PipeWriter, func( } // Rename renames (moves) source to target. -func (fs *HTTPFs) Rename(source, target string) (int, int64, error) { +func (fs *HTTPFs) Rename(source, target string, checks int) (int, int64, error) { if source == target { return -1, -1, nil } @@ -397,6 +396,9 @@ func (fs *HTTPFs) Rename(source, target string) (int, int64, error) { return -1, -1, err } defer resp.Body.Close() + if checks&CheckUpdateModTime != 0 { + fs.Chtimes(target, time.Now(), time.Now(), false) //nolint:errcheck + } return -1, -1, nil } @@ -636,12 +638,11 @@ func (*HTTPFs) HasVirtualFolders() bool { // ResolvePath returns the matching filesystem path for the specified virtual path func (fs *HTTPFs) ResolvePath(virtualPath string) (string, error) { if fs.mountPath != "" { - virtualPath = strings.TrimPrefix(virtualPath, fs.mountPath) + if after, found := strings.CutPrefix(virtualPath, fs.mountPath); found { + virtualPath = after + } } - if !path.IsAbs(virtualPath) { - virtualPath = path.Clean("/" + virtualPath) - } - return virtualPath, nil + return path.Clean("/" + virtualPath), nil } // GetMimeType returns the content type diff --git a/internal/vfs/osfs.go b/internal/vfs/osfs.go index affc44f4..1f0a502f 100644 --- a/internal/vfs/osfs.go +++ b/internal/vfs/osfs.go @@ -24,17 +24,16 @@ import ( "os" "path" "path/filepath" + "slices" "strings" "time" - "github.com/eikenb/pipeat" fscopy "github.com/otiai10/copy" "github.com/pkg/sftp" "github.com/rs/xid" "github.com/sftpgo/sdk" "github.com/drakkan/sftpgo/v2/internal/logger" - "github.com/drakkan/sftpgo/v2/internal/util" ) const ( @@ -116,7 +115,7 @@ func (fs *OsFs) Open(name string, offset int64) (File, PipeReader, func(), error if fs.readBufferSize <= 0 { return f, nil, nil, err } - r, w, err := pipeat.PipeInDir(fs.localTempDir) + r, w, err := createPipeFn(fs.localTempDir, 0) if err != nil { f.Close() return nil, nil, nil, err @@ -149,7 +148,7 @@ func (fs *OsFs) Create(name string, flag, _ int) (File, PipeWriter, func(), erro if err != nil { return nil, nil, nil, err } - r, w, err := pipeat.PipeInDir(fs.localTempDir) + r, w, err := createPipeFn(fs.localTempDir, 0) if err != nil { f.Close() return nil, nil, nil, err @@ -176,7 +175,7 @@ func (fs *OsFs) Create(name string, flag, _ int) (File, PipeWriter, func(), erro } // Rename renames (moves) source to target -func (fs *OsFs) Rename(source, target string) (int, int64, error) { +func (fs *OsFs) Rename(source, target string, checks int) (int, int64, error) { if source == target { return -1, -1, nil } @@ -199,9 +198,15 @@ func (fs *OsFs) Rename(source, target string) (int, int64, error) { fsLog(fs, logger.LevelError, "cross device copy error: %v", err) return -1, -1, err } + if checks&CheckUpdateModTime != 0 { + fs.Chtimes(target, time.Now(), time.Now(), false) //nolint:errcheck + } err = os.RemoveAll(source) return -1, -1, err } + if checks&CheckUpdateModTime != 0 && err == nil { + fs.Chtimes(target, time.Now(), time.Now(), false) //nolint:errcheck + } return -1, -1, err } @@ -352,12 +357,16 @@ func (fs *OsFs) GetRelativePath(name string) string { } rel, err := filepath.Rel(fs.rootDir, filepath.Clean(name)) if err != nil { - return "" + return virtualPath } - if rel == "." || strings.HasPrefix(rel, "..") { + rel = filepath.ToSlash(rel) + if rel == ".." || strings.HasPrefix(rel, "../") { + return virtualPath + } + if rel == "." { rel = "" } - return path.Join(virtualPath, filepath.ToSlash(rel)) + return path.Join(virtualPath, rel) } // Walk walks the file tree rooted at root, calling walkFn for each file or @@ -377,8 +386,11 @@ func (fs *OsFs) ResolvePath(virtualPath string) (string, error) { return "", fmt.Errorf("invalid root path %q", fs.rootDir) } if fs.mountPath != "" { - virtualPath = strings.TrimPrefix(virtualPath, fs.mountPath) + if after, found := strings.CutPrefix(virtualPath, fs.mountPath); found { + virtualPath = after + } } + virtualPath = path.Clean("/" + virtualPath) r := filepath.Clean(filepath.Join(fs.rootDir, virtualPath)) p, err := filepath.EvalSymlinks(r) if isInvalidNameError(err) { @@ -475,7 +487,7 @@ func (fs *OsFs) findNonexistentDirs(filePath string) ([]string, error) { for fs.IsNotExist(err) { results = append(results, parent) parent = filepath.Dir(parent) - if util.Contains(results, parent) { + if slices.Contains(results, parent) { break } _, err = os.Stat(parent) diff --git a/internal/vfs/s3fs.go b/internal/vfs/s3fs.go index b74d2877..f0e9c093 100644 --- a/internal/vfs/s3fs.go +++ b/internal/vfs/s3fs.go @@ -13,13 +13,16 @@ // along with this program. If not, see . //go:build !nos3 -// +build !nos3 package vfs import ( + "bytes" "context" + "crypto/md5" + "crypto/sha256" "crypto/tls" + "encoding/base64" "errors" "fmt" "io" @@ -30,6 +33,7 @@ import ( "os" "path" "path/filepath" + "slices" "sort" "strings" "sync" @@ -41,11 +45,9 @@ import ( "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/credentials" "github.com/aws/aws-sdk-go-v2/credentials/stscreds" - "github.com/aws/aws-sdk-go-v2/feature/s3/manager" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/aws-sdk-go-v2/service/sts" - "github.com/eikenb/pipeat" "github.com/pkg/sftp" "github.com/drakkan/sftpgo/v2/internal/logger" @@ -71,10 +73,13 @@ type S3Fs struct { connectionID string localTempDir string // if not empty this fs is mouted as virtual folder in the specified path - mountPath string - config *S3FsConfig - svc *s3.Client - ctxTimeout time.Duration + mountPath string + config *S3FsConfig + svc *s3.Client + ctxTimeout time.Duration + sseCustomerKey string + sseCustomerKeyMD5 string + sseCustomerAlgo string } func init() { @@ -120,6 +125,23 @@ func NewS3Fs(connectionID, localTempDir, mountPath string, s3Config S3FsConfig) fs.config.SessionToken), ) } + if !fs.config.SSECustomerKey.IsEmpty() { + if err := fs.config.SSECustomerKey.TryDecrypt(); err != nil { + return fs, err + } + key := fs.config.SSECustomerKey.GetPayload() + if len(key) == 32 { + md5sumBinary := md5.Sum([]byte(key)) + fs.sseCustomerKey = base64.StdEncoding.EncodeToString([]byte(key)) + fs.sseCustomerKeyMD5 = base64.StdEncoding.EncodeToString(md5sumBinary[:]) + } else { + keyHash := sha256.Sum256([]byte(key)) + md5sumBinary := md5.Sum(keyHash[:]) + fs.sseCustomerKey = base64.StdEncoding.EncodeToString(keyHash[:]) + fs.sseCustomerKeyMD5 = base64.StdEncoding.EncodeToString(md5sumBinary[:]) + } + fs.sseCustomerAlgo = "AES256" + } fs.setConfigDefaults() @@ -131,6 +153,8 @@ func NewS3Fs(connectionID, localTempDir, mountPath string, s3Config S3FsConfig) fs.svc = s3.NewFromConfig(awsConfig, func(o *s3.Options) { o.AppID = version.GetVersionHash() o.UsePathStyle = fs.config.ForcePathStyle + o.RequestChecksumCalculation = aws.RequestChecksumCalculationWhenRequired + o.ResponseChecksumValidation = aws.ResponseChecksumValidationWhenRequired if fs.config.Endpoint != "" { o.BaseEndpoint = aws.String(fs.config.Endpoint) } @@ -161,12 +185,13 @@ func (fs *S3Fs) Stat(name string) (os.FileInfo, error) { if err == nil { // Some S3 providers (like SeaweedFS) remove the trailing '/' from object keys. // So we check some common content types to detect if this is a "directory". - isDir := util.Contains(s3DirMimeTypes, util.GetStringFromPointer(obj.ContentType)) + isDir := slices.Contains(s3DirMimeTypes, util.GetStringFromPointer(obj.ContentType)) if util.GetIntFromPointer(obj.ContentLength) == 0 && !isDir { _, err = fs.headObject(name + "/") isDir = err == nil } - return NewFileInfo(name, isDir, util.GetIntFromPointer(obj.ContentLength), util.GetTimeFromPointer(obj.LastModified), false), nil + info := NewFileInfo(name, isDir, util.GetIntFromPointer(obj.ContentLength), util.GetTimeFromPointer(obj.LastModified), false) + return info, nil } if !fs.IsNotExist(err) { return result, err @@ -201,50 +226,29 @@ func (fs *S3Fs) Lstat(name string) (os.FileInfo, error) { // Open opens the named file for reading func (fs *S3Fs) Open(name string, offset int64) (File, PipeReader, func(), error) { - r, w, err := pipeat.PipeInDir(fs.localTempDir) + attrs, err := fs.headObject(name) + if err != nil { + return nil, nil, nil, err + } + r, w, err := createPipeFn(fs.localTempDir, fs.config.DownloadPartSize*int64(fs.config.DownloadConcurrency)+1) if err != nil { return nil, nil, nil, err } p := NewPipeReader(r) if readMetadata > 0 { - attrs, err := fs.headObject(name) - if err != nil { - r.Close() - w.Close() - return nil, nil, nil, err - } p.setMetadata(attrs.Metadata) } - ctx, cancelFn := context.WithCancel(context.Background()) - downloader := manager.NewDownloader(fs.svc, func(d *manager.Downloader) { - d.Concurrency = fs.config.DownloadConcurrency - d.PartSize = fs.config.DownloadPartSize - if offset == 0 && fs.config.DownloadPartMaxTime > 0 { - d.ClientOptions = append(d.ClientOptions, func(o *s3.Options) { - o.HTTPClient = getAWSHTTPClient(fs.config.DownloadPartMaxTime, 100*time.Millisecond, - fs.config.SkipTLSVerify) - }) - } - }) - - var streamRange *string - if offset > 0 { - streamRange = aws.String(fmt.Sprintf("bytes=%v-", offset)) - } go func() { defer cancelFn() - n, err := downloader.Download(ctx, w, &s3.GetObjectInput{ - Bucket: aws.String(fs.config.Bucket), - Key: aws.String(name), - Range: streamRange, - }) + err := fs.handleDownload(ctx, name, offset, w, attrs) w.CloseWithError(err) //nolint:errcheck - fsLog(fs, logger.LevelDebug, "download completed, path: %q size: %v, err: %+v", name, n, err) - metric.S3TransferCompleted(n, 1, err) + fsLog(fs, logger.LevelDebug, "download completed, path: %q size: %d, err: %+v", name, w.GetWrittenBytes(), err) + metric.S3TransferCompleted(w.GetWrittenBytes(), 1, err) }() + return nil, p, cancelFn, nil } @@ -256,7 +260,7 @@ func (fs *S3Fs) Create(name string, flag, checks int) (File, PipeWriter, func(), return nil, nil, nil, err } } - r, w, err := pipeat.PipeInDir(fs.localTempDir) + r, w, err := createPipeFn(fs.localTempDir, fs.config.UploadPartSize+1024*1024) if err != nil { return nil, nil, nil, err } @@ -267,16 +271,6 @@ func (fs *S3Fs) Create(name string, flag, checks int) (File, PipeWriter, func(), p = NewPipeWriter(w) } ctx, cancelFn := context.WithCancel(context.Background()) - uploader := manager.NewUploader(fs.svc, func(u *manager.Uploader) { - u.Concurrency = fs.config.UploadConcurrency - u.PartSize = fs.config.UploadPartSize - if fs.config.UploadPartMaxTime > 0 { - u.ClientOptions = append(u.ClientOptions, func(o *s3.Options) { - o.HTTPClient = getAWSHTTPClient(fs.config.UploadPartMaxTime, 100*time.Millisecond, - fs.config.SkipTLSVerify) - }) - } - }) go func() { defer cancelFn() @@ -287,14 +281,7 @@ func (fs *S3Fs) Create(name string, flag, checks int) (File, PipeWriter, func(), } else { contentType = mime.TypeByExtension(path.Ext(name)) } - _, err := uploader.Upload(ctx, &s3.PutObjectInput{ - Bucket: aws.String(fs.config.Bucket), - Key: aws.String(name), - Body: r, - ACL: types.ObjectCannedACL(fs.config.ACL), - StorageClass: types.StorageClass(fs.config.StorageClass), - ContentType: util.NilIfEmpty(contentType), - }) + err := fs.handleUpload(ctx, r, name, contentType) r.CloseWithError(err) //nolint:errcheck p.Done(err) fsLog(fs, logger.LevelDebug, "upload completed, path: %q, acl: %q, readed bytes: %d, err: %+v", @@ -329,19 +316,21 @@ func (fs *S3Fs) Create(name string, flag, checks int) (File, PipeWriter, func(), } // Rename renames (moves) source to target. -func (fs *S3Fs) Rename(source, target string) (int, int64, error) { +func (fs *S3Fs) Rename(source, target string, checks int) (int, int64, error) { if source == target { return -1, -1, nil } - _, err := fs.Stat(path.Dir(target)) - if err != nil { - return -1, -1, err + if checks&CheckParentDir != 0 { + _, err := fs.Stat(path.Dir(target)) + if err != nil { + return -1, -1, err + } } fi, err := fs.Stat(source) if err != nil { return -1, -1, err } - return fs.renameInternal(source, target, fi, 0) + return fs.renameInternal(source, target, fi, 0, checks&CheckUpdateModTime != 0) } // Remove removes the named file or (empty) directory. @@ -622,18 +611,18 @@ func (*S3Fs) HasVirtualFolders() bool { // ResolvePath returns the matching filesystem path for the specified virtual path func (fs *S3Fs) ResolvePath(virtualPath string) (string, error) { if fs.mountPath != "" { - virtualPath = strings.TrimPrefix(virtualPath, fs.mountPath) - } - if !path.IsAbs(virtualPath) { - virtualPath = path.Clean("/" + virtualPath) + if after, found := strings.CutPrefix(virtualPath, fs.mountPath); found { + virtualPath = after + } } + virtualPath = path.Clean("/" + virtualPath) return fs.Join(fs.config.KeyPrefix, strings.TrimPrefix(virtualPath, "/")), nil } // CopyFile implements the FsFileCopier interface -func (fs *S3Fs) CopyFile(source, target string, srcSize int64) (int, int64, error) { +func (fs *S3Fs) CopyFile(source, target string, srcInfo os.FileInfo) (int, int64, error) { numFiles := 1 - sizeDiff := srcSize + sizeDiff := srcInfo.Size() attrs, err := fs.headObject(target) if err == nil { sizeDiff -= util.GetIntFromPointer(attrs.ContentLength) @@ -643,7 +632,7 @@ func (fs *S3Fs) CopyFile(source, target string, srcSize int64) (int, int64, erro return 0, 0, err } } - if err := fs.copyFileInternal(source, target, srcSize); err != nil { + if err := fs.copyFileInternal(source, target, srcInfo); err != nil { return 0, 0, err } return numFiles, sizeDiff, nil @@ -659,60 +648,73 @@ func (fs *S3Fs) resolve(name *string, prefix string) (string, bool) { } func (fs *S3Fs) setConfigDefaults() { + const defaultPartSize = 1024 * 1024 * 5 + const defaultConcurrency = 5 + if fs.config.UploadPartSize == 0 { - fs.config.UploadPartSize = manager.DefaultUploadPartSize + fs.config.UploadPartSize = defaultPartSize } else { if fs.config.UploadPartSize < 1024*1024 { fs.config.UploadPartSize *= 1024 * 1024 } } if fs.config.UploadConcurrency == 0 { - fs.config.UploadConcurrency = manager.DefaultUploadConcurrency + fs.config.UploadConcurrency = defaultConcurrency } if fs.config.DownloadPartSize == 0 { - fs.config.DownloadPartSize = manager.DefaultDownloadPartSize + fs.config.DownloadPartSize = defaultPartSize } else { if fs.config.DownloadPartSize < 1024*1024 { fs.config.DownloadPartSize *= 1024 * 1024 } } if fs.config.DownloadConcurrency == 0 { - fs.config.DownloadConcurrency = manager.DefaultDownloadConcurrency + fs.config.DownloadConcurrency = defaultConcurrency } } -func (fs *S3Fs) copyFileInternal(source, target string, fileSize int64) error { +func (fs *S3Fs) copyFileInternal(source, target string, srcInfo os.FileInfo) error { contentType := mime.TypeByExtension(path.Ext(source)) copySource := pathEscape(fs.Join(fs.config.Bucket, source)) - if fileSize > s3CopyObjectThreshold { + if srcInfo.Size() > s3CopyObjectThreshold { fsLog(fs, logger.LevelDebug, "renaming file %q with size %d using multipart copy", - source, fileSize) - err := fs.doMultipartCopy(copySource, target, contentType, fileSize) + source, srcInfo.Size()) + err := fs.doMultipartCopy(copySource, target, contentType, srcInfo.Size()) metric.S3CopyObjectCompleted(err) return err } ctx, cancelFn := context.WithDeadline(context.Background(), time.Now().Add(fs.ctxTimeout)) defer cancelFn() - _, err := fs.svc.CopyObject(ctx, &s3.CopyObjectInput{ - Bucket: aws.String(fs.config.Bucket), - CopySource: aws.String(copySource), - Key: aws.String(target), - StorageClass: types.StorageClass(fs.config.StorageClass), - ACL: types.ObjectCannedACL(fs.config.ACL), - ContentType: util.NilIfEmpty(contentType), - }) + copyObject := &s3.CopyObjectInput{ + Bucket: aws.String(fs.config.Bucket), + CopySource: aws.String(copySource), + Key: aws.String(target), + StorageClass: types.StorageClass(fs.config.StorageClass), + ACL: types.ObjectCannedACL(fs.config.ACL), + ContentType: util.NilIfEmpty(contentType), + CopySourceSSECustomerKey: util.NilIfEmpty(fs.sseCustomerKey), + CopySourceSSECustomerAlgorithm: util.NilIfEmpty(fs.sseCustomerAlgo), + CopySourceSSECustomerKeyMD5: util.NilIfEmpty(fs.sseCustomerKeyMD5), + SSECustomerKey: util.NilIfEmpty(fs.sseCustomerKey), + SSECustomerAlgorithm: util.NilIfEmpty(fs.sseCustomerAlgo), + SSECustomerKeyMD5: util.NilIfEmpty(fs.sseCustomerKeyMD5), + } + + _, err := fs.svc.CopyObject(ctx, copyObject) metric.S3CopyObjectCompleted(err) return err } -func (fs *S3Fs) renameInternal(source, target string, fi os.FileInfo, recursion int) (int, int64, error) { +func (fs *S3Fs) renameInternal(source, target string, srcInfo os.FileInfo, recursion int, + updateModTime bool, +) (int, int64, error) { var numFiles int var filesSize int64 - if fi.IsDir() { + if srcInfo.IsDir() { if renameMode == 0 { hasContents, err := fs.hasContents(source) if err != nil { @@ -726,7 +728,7 @@ func (fs *S3Fs) renameInternal(source, target string, fi os.FileInfo, recursion return numFiles, filesSize, err } if renameMode == 1 { - files, size, err := doRecursiveRename(fs, source, target, fs.renameInternal, recursion) + files, size, err := doRecursiveRename(fs, source, target, fs.renameInternal, recursion, updateModTime) numFiles += files filesSize += size if err != nil { @@ -734,13 +736,13 @@ func (fs *S3Fs) renameInternal(source, target string, fi os.FileInfo, recursion } } } else { - if err := fs.copyFileInternal(source, target, fi.Size()); err != nil { + if err := fs.copyFileInternal(source, target, srcInfo); err != nil { return numFiles, filesSize, err } numFiles++ - filesSize += fi.Size() + filesSize += srcInfo.Size() } - err := fs.Remove(source, fi.IsDir()) + err := fs.Remove(source, srcInfo.IsDir()) if fs.IsNotExist(err) { err = nil } @@ -791,16 +793,340 @@ func (fs *S3Fs) hasContents(name string) (bool, error) { return false, nil } +func (fs *S3Fs) downloadPart(ctx context.Context, name string, buf []byte, w io.WriterAt, start, count, writeOffset int64) error { + if count == 0 { + return nil + } + rangeHeader := fmt.Sprintf("bytes=%d-%d", start, start+count-1) + + resp, err := fs.svc.GetObject(ctx, &s3.GetObjectInput{ + Bucket: aws.String(fs.config.Bucket), + Key: aws.String(name), + Range: &rangeHeader, + SSECustomerKey: util.NilIfEmpty(fs.sseCustomerKey), + SSECustomerAlgorithm: util.NilIfEmpty(fs.sseCustomerAlgo), + SSECustomerKeyMD5: util.NilIfEmpty(fs.sseCustomerKeyMD5), + }) + if err != nil { + return err + } + defer resp.Body.Close() + + _, err = io.ReadAtLeast(resp.Body, buf, int(count)) + if err != nil { + return err + } + + return writeAtFull(w, buf, writeOffset, int(count)) +} + +func (fs *S3Fs) handleDownload(ctx context.Context, name string, offset int64, writer io.WriterAt, attrs *s3.HeadObjectOutput) error { + contentLength := util.GetIntFromPointer(attrs.ContentLength) + sizeToDownload := contentLength - offset + if sizeToDownload < 0 { + fsLog(fs, logger.LevelError, "invalid multipart download size or offset, size: %d, offset: %d, size to download: %d", + contentLength, offset, sizeToDownload) + return errors.New("the requested offset exceeds the file size") + } + if sizeToDownload == 0 { + fsLog(fs, logger.LevelDebug, "nothing to download, offset %d, content length %d", offset, contentLength) + return nil + } + partSize := fs.config.DownloadPartSize + guard := make(chan struct{}, fs.config.DownloadConcurrency) + var blockCtxTimeout time.Duration + if fs.config.DownloadPartMaxTime > 0 { + blockCtxTimeout = time.Duration(fs.config.DownloadPartMaxTime) * time.Second + } else { + blockCtxTimeout = time.Duration(fs.config.DownloadPartSize/(1024*1024)) * time.Minute + } + pool := newBufferAllocator(int(partSize)) + defer pool.free() + + finished := false + var wg sync.WaitGroup + var errOnce sync.Once + var hasError atomic.Bool + var poolError error + + poolCtx, poolCancel := context.WithCancel(ctx) + defer poolCancel() + + for part := 0; !finished; part++ { + start := offset + end := offset + partSize + if end >= contentLength { + end = contentLength + finished = true + } + writeOffset := int64(part) * partSize + offset = end + + guard <- struct{}{} + if hasError.Load() { + fsLog(fs, logger.LevelDebug, "pool error, download for part %d not started", part) + break + } + + buf := pool.getBuffer() + wg.Add(1) + go func(start, end, writeOffset int64, buf []byte) { + defer func() { + pool.releaseBuffer(buf) + <-guard + wg.Done() + }() + + innerCtx, cancelFn := context.WithDeadline(poolCtx, time.Now().Add(blockCtxTimeout)) + defer cancelFn() + + err := fs.downloadPart(innerCtx, name, buf, writer, start, end-start, writeOffset) + if err != nil { + errOnce.Do(func() { + fsLog(fs, logger.LevelError, "multipart download error: %+v", err) + hasError.Store(true) + poolError = fmt.Errorf("multipart download error: %w", err) + poolCancel() + }) + } + }(start, end, writeOffset, buf) + } + + wg.Wait() + close(guard) + + return poolError +} + +func (fs *S3Fs) initiateMultipartUpload(ctx context.Context, name, contentType string) (string, error) { + ctx, cancelFn := context.WithDeadline(ctx, time.Now().Add(fs.ctxTimeout)) + defer cancelFn() + + res, err := fs.svc.CreateMultipartUpload(ctx, &s3.CreateMultipartUploadInput{ + Bucket: aws.String(fs.config.Bucket), + Key: aws.String(name), + StorageClass: types.StorageClass(fs.config.StorageClass), + ACL: types.ObjectCannedACL(fs.config.ACL), + ContentType: util.NilIfEmpty(contentType), + SSECustomerKey: util.NilIfEmpty(fs.sseCustomerKey), + SSECustomerAlgorithm: util.NilIfEmpty(fs.sseCustomerAlgo), + SSECustomerKeyMD5: util.NilIfEmpty(fs.sseCustomerKeyMD5), + }) + if err != nil { + return "", fmt.Errorf("unable to create multipart upload request: %w", err) + } + uploadID := util.GetStringFromPointer(res.UploadId) + if uploadID == "" { + return "", errors.New("unable to get multipart upload ID") + } + return uploadID, nil +} + +func (fs *S3Fs) uploadPart(ctx context.Context, name, uploadID string, partNumber int32, data []byte) (*string, error) { + timeout := time.Duration(fs.config.UploadPartSize/(1024*1024)) * time.Minute + if fs.config.UploadPartMaxTime > 0 { + timeout = time.Duration(fs.config.UploadPartMaxTime) * time.Second + } + ctx, cancelFn := context.WithDeadline(ctx, time.Now().Add(timeout)) + defer cancelFn() + + resp, err := fs.svc.UploadPart(ctx, &s3.UploadPartInput{ + Bucket: aws.String(fs.config.Bucket), + Key: aws.String(name), + PartNumber: &partNumber, + UploadId: aws.String(uploadID), + Body: bytes.NewReader(data), + SSECustomerKey: util.NilIfEmpty(fs.sseCustomerKey), + SSECustomerAlgorithm: util.NilIfEmpty(fs.sseCustomerAlgo), + SSECustomerKeyMD5: util.NilIfEmpty(fs.sseCustomerKeyMD5), + }) + if err != nil { + return nil, fmt.Errorf("unable to upload part number %d: %w", partNumber, err) + } + return resp.ETag, nil +} + +func (fs *S3Fs) completeMultipartUpload(ctx context.Context, name, uploadID string, completedParts []types.CompletedPart) error { + ctx, cancelFn := context.WithDeadline(ctx, time.Now().Add(fs.ctxTimeout)) + defer cancelFn() + + _, err := fs.svc.CompleteMultipartUpload(ctx, &s3.CompleteMultipartUploadInput{ + Bucket: aws.String(fs.config.Bucket), + Key: aws.String(name), + UploadId: aws.String(uploadID), + MultipartUpload: &types.CompletedMultipartUpload{ + Parts: completedParts, + }, + }) + return err +} + +func (fs *S3Fs) abortMultipartUpload(name, uploadID string) error { + ctx, cancelFn := context.WithDeadline(context.Background(), time.Now().Add(fs.ctxTimeout)) + defer cancelFn() + + _, err := fs.svc.AbortMultipartUpload(ctx, &s3.AbortMultipartUploadInput{ + Bucket: aws.String(fs.config.Bucket), + Key: aws.String(name), + UploadId: aws.String(uploadID), + }) + return err +} + +func (fs *S3Fs) singlePartUpload(ctx context.Context, name, contentType string, data []byte) error { + timeout := time.Duration(fs.config.UploadPartSize/(1024*1024)) * time.Minute + if fs.config.UploadPartMaxTime > 0 { + timeout = time.Duration(fs.config.UploadPartMaxTime) * time.Second + } + ctx, cancelFn := context.WithDeadline(ctx, time.Now().Add(timeout)) + defer cancelFn() + + contentLength := int64(len(data)) + _, err := fs.svc.PutObject(ctx, &s3.PutObjectInput{ + Bucket: aws.String(fs.config.Bucket), + Key: aws.String(name), + ACL: types.ObjectCannedACL(fs.config.ACL), + Body: bytes.NewReader(data), + ContentType: util.NilIfEmpty(contentType), + ContentLength: &contentLength, + SSECustomerKey: util.NilIfEmpty(fs.sseCustomerKey), + SSECustomerAlgorithm: util.NilIfEmpty(fs.sseCustomerAlgo), + SSECustomerKeyMD5: util.NilIfEmpty(fs.sseCustomerKeyMD5), + StorageClass: types.StorageClass(fs.config.StorageClass), + }) + return err +} + +func (fs *S3Fs) handleUpload(ctx context.Context, reader io.Reader, name, contentType string) error { + pool := newBufferAllocator(int(fs.config.UploadPartSize)) + defer pool.free() + + firstBuf := pool.getBuffer() + firstReadSize, err := readFill(reader, firstBuf) + if err == io.EOF { + return fs.singlePartUpload(ctx, name, contentType, firstBuf[:firstReadSize]) + } + if err != nil { + return err + } + + uploadID, err := fs.initiateMultipartUpload(ctx, name, contentType) + if err != nil { + return err + } + guard := make(chan struct{}, fs.config.UploadConcurrency) + finished := false + var partMutex sync.Mutex + var completedParts []types.CompletedPart + var wg sync.WaitGroup + var hasError atomic.Bool + var poolErr error + var errOnce sync.Once + var partNumber int32 + + poolCtx, poolCancel := context.WithCancel(ctx) + defer poolCancel() + + finalizeFailedUpload := func(err error) { + fsLog(fs, logger.LevelError, "finalize failed multipart upload after error: %v", err) + hasError.Store(true) + poolErr = err + poolCancel() + if abortErr := fs.abortMultipartUpload(name, uploadID); abortErr != nil { + fsLog(fs, logger.LevelError, "unable to abort multipart upload: %+v", abortErr) + } + } + + uploadPart := func(partNum int32, buf []byte, bytesRead int) { + defer func() { + pool.releaseBuffer(buf) + <-guard + wg.Done() + }() + + etag, err := fs.uploadPart(poolCtx, name, uploadID, partNum, buf[:bytesRead]) + if err != nil { + errOnce.Do(func() { + finalizeFailedUpload(err) + }) + return + } + partMutex.Lock() + completedParts = append(completedParts, types.CompletedPart{ + PartNumber: &partNum, + ETag: etag, + }) + partMutex.Unlock() + } + + partNumber = 1 + guard <- struct{}{} + + wg.Add(1) + go uploadPart(partNumber, firstBuf, firstReadSize) + + for partNumber = 2; !finished; partNumber++ { + buf := pool.getBuffer() + + n, err := readFill(reader, buf) + if err == io.EOF { + if n == 0 { + pool.releaseBuffer(buf) + break + } + finished = true + } else if err != nil { + pool.releaseBuffer(buf) + errOnce.Do(func() { + finalizeFailedUpload(err) + }) + break + } + guard <- struct{}{} + if hasError.Load() { + fsLog(fs, logger.LevelError, "pool error, upload for part %d not started", partNumber) + pool.releaseBuffer(buf) + break + } + + wg.Add(1) + go uploadPart(partNumber, buf, n) + } + + wg.Wait() + close(guard) + + if poolErr != nil { + return poolErr + } + + sort.Slice(completedParts, func(i, j int) bool { + getPartNumber := func(number *int32) int32 { + if number == nil { + return 0 + } + return *number + } + + return getPartNumber(completedParts[i].PartNumber) < getPartNumber(completedParts[j].PartNumber) + }) + + return fs.completeMultipartUpload(ctx, name, uploadID, completedParts) +} + func (fs *S3Fs) doMultipartCopy(source, target, contentType string, fileSize int64) error { ctx, cancelFn := context.WithDeadline(context.Background(), time.Now().Add(fs.ctxTimeout)) defer cancelFn() res, err := fs.svc.CreateMultipartUpload(ctx, &s3.CreateMultipartUploadInput{ - Bucket: aws.String(fs.config.Bucket), - Key: aws.String(target), - StorageClass: types.StorageClass(fs.config.StorageClass), - ACL: types.ObjectCannedACL(fs.config.ACL), - ContentType: util.NilIfEmpty(contentType), + Bucket: aws.String(fs.config.Bucket), + Key: aws.String(target), + StorageClass: types.StorageClass(fs.config.StorageClass), + ACL: types.ObjectCannedACL(fs.config.ACL), + ContentType: util.NilIfEmpty(contentType), + SSECustomerKey: util.NilIfEmpty(fs.sseCustomerKey), + SSECustomerAlgorithm: util.NilIfEmpty(fs.sseCustomerAlgo), + SSECustomerKeyMD5: util.NilIfEmpty(fs.sseCustomerKeyMD5), }) if err != nil { return fmt.Errorf("unable to create multipart copy request: %w", err) @@ -855,12 +1181,18 @@ func (fs *S3Fs) doMultipartCopy(source, target, contentType string, fileSize int defer innerCancelFn() partResp, err := fs.svc.UploadPartCopy(innerCtx, &s3.UploadPartCopyInput{ - Bucket: aws.String(fs.config.Bucket), - CopySource: aws.String(source), - Key: aws.String(target), - PartNumber: &partNum, - UploadId: aws.String(uploadID), - CopySourceRange: aws.String(fmt.Sprintf("bytes=%d-%d", partStart, partEnd-1)), + Bucket: aws.String(fs.config.Bucket), + CopySource: aws.String(source), + Key: aws.String(target), + PartNumber: &partNum, + UploadId: aws.String(uploadID), + CopySourceRange: aws.String(fmt.Sprintf("bytes=%d-%d", partStart, partEnd-1)), + CopySourceSSECustomerKey: util.NilIfEmpty(fs.sseCustomerKey), + CopySourceSSECustomerAlgorithm: util.NilIfEmpty(fs.sseCustomerAlgo), + CopySourceSSECustomerKeyMD5: util.NilIfEmpty(fs.sseCustomerKeyMD5), + SSECustomerKey: util.NilIfEmpty(fs.sseCustomerKey), + SSECustomerAlgorithm: util.NilIfEmpty(fs.sseCustomerAlgo), + SSECustomerKeyMD5: util.NilIfEmpty(fs.sseCustomerKeyMD5), }) if err != nil { errOnce.Do(func() { @@ -869,15 +1201,7 @@ func (fs *S3Fs) doMultipartCopy(source, target, contentType string, fileSize int copyError = fmt.Errorf("error copying part number %d: %w", partNum, err) opCancel() - abortCtx, abortCancelFn := context.WithDeadline(context.Background(), time.Now().Add(fs.ctxTimeout)) - defer abortCancelFn() - - _, errAbort := fs.svc.AbortMultipartUpload(abortCtx, &s3.AbortMultipartUploadInput{ - Bucket: aws.String(fs.config.Bucket), - Key: aws.String(target), - UploadId: aws.String(uploadID), - }) - if errAbort != nil { + if errAbort := fs.abortMultipartUpload(target, uploadID); errAbort != nil { fsLog(fs, logger.LevelError, "unable to abort multipart copy: %+v", errAbort) } }) @@ -943,8 +1267,11 @@ func (fs *S3Fs) headObject(name string) (*s3.HeadObjectOutput, error) { defer cancelFn() obj, err := fs.svc.HeadObject(ctx, &s3.HeadObjectInput{ - Bucket: aws.String(fs.config.Bucket), - Key: aws.String(name), + Bucket: aws.String(fs.config.Bucket), + Key: aws.String(name), + SSECustomerKey: util.NilIfEmpty(fs.sseCustomerKey), + SSECustomerAlgorithm: util.NilIfEmpty(fs.sseCustomerAlgo), + SSECustomerKeyMD5: util.NilIfEmpty(fs.sseCustomerKeyMD5), }) metric.S3HeadObjectCompleted(err) return obj, err @@ -971,28 +1298,18 @@ func (*S3Fs) GetAvailableDiskSize(_ string) (*sftp.StatVFS, error) { func (fs *S3Fs) downloadToWriter(name string, w PipeWriter) (int64, error) { fsLog(fs, logger.LevelDebug, "starting download before resuming upload, path %q", name) + attrs, err := fs.headObject(name) + if err != nil { + return 0, err + } ctx, cancelFn := context.WithTimeout(context.Background(), preResumeTimeout) defer cancelFn() - downloader := manager.NewDownloader(fs.svc, func(d *manager.Downloader) { - d.Concurrency = fs.config.DownloadConcurrency - d.PartSize = fs.config.DownloadPartSize - if fs.config.DownloadPartMaxTime > 0 { - d.ClientOptions = append(d.ClientOptions, func(o *s3.Options) { - o.HTTPClient = getAWSHTTPClient(fs.config.DownloadPartMaxTime, 100*time.Millisecond, - fs.config.SkipTLSVerify) - }) - } - }) - - n, err := downloader.Download(ctx, w, &s3.GetObjectInput{ - Bucket: aws.String(fs.config.Bucket), - Key: aws.String(name), - }) + err = fs.handleDownload(ctx, name, 0, w, attrs) fsLog(fs, logger.LevelDebug, "download before resuming upload completed, path %q size: %d, err: %+v", - name, n, err) - metric.S3TransferCompleted(n, 1, err) - return n, err + name, w.GetWrittenBytes(), err) + metric.S3TransferCompleted(w.GetWrittenBytes(), 1, err) + return w.GetWrittenBytes(), err } type s3DirLister struct { diff --git a/internal/vfs/s3fs_disabled.go b/internal/vfs/s3fs_disabled.go index 8f71384a..5c1f1b53 100644 --- a/internal/vfs/s3fs_disabled.go +++ b/internal/vfs/s3fs_disabled.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build nos3 -// +build nos3 package vfs diff --git a/internal/vfs/sftpfs.go b/internal/vfs/sftpfs.go index 869c315e..2f263dd3 100644 --- a/internal/vfs/sftpfs.go +++ b/internal/vfs/sftpfs.go @@ -18,9 +18,10 @@ import ( "bufio" "bytes" "crypto/rsa" + "crypto/sha256" + "encoding/hex" "errors" "fmt" - "hash/fnv" "io" "io/fs" "net" @@ -28,13 +29,13 @@ import ( "os" "path" "path/filepath" + "slices" "strconv" "strings" "sync" "sync/atomic" "time" - "github.com/eikenb/pipeat" "github.com/pkg/sftp" "github.com/robfig/cron/v3" "github.com/rs/xid" @@ -69,6 +70,17 @@ type SFTPFsConfig struct { forbiddenSelfUsernames []string `json:"-"` } +func (c *SFTPFsConfig) getKeySigner() (ssh.Signer, error) { + privPayload := c.PrivateKey.GetPayload() + if privPayload == "" { + return nil, nil + } + if key := c.KeyPassphrase.GetPayload(); key != "" { + return ssh.ParsePrivateKeyWithPassphrase([]byte(privPayload), []byte(key)) + } + return ssh.ParsePrivateKey([]byte(privPayload)) +} + // HideConfidentialData hides confidential data func (c *SFTPFsConfig) HideConfidentialData() { if c.Password != nil { @@ -114,7 +126,7 @@ func (c *SFTPFsConfig) isEqual(other SFTPFsConfig) bool { return false } for _, fp := range c.Fingerprints { - if !util.Contains(other.Fingerprints, fp) { + if !slices.Contains(other.Fingerprints, fp) { return false } } @@ -185,25 +197,20 @@ func (c *SFTPFsConfig) validate() error { func (c *SFTPFsConfig) validatePrivateKey() error { if c.PrivateKey.IsPlain() { - var signer ssh.Signer - var err error - if c.KeyPassphrase.IsPlain() { - signer, err = ssh.ParsePrivateKeyWithPassphrase([]byte(c.PrivateKey.GetPayload()), - []byte(c.KeyPassphrase.GetPayload())) - } else { - signer, err = ssh.ParsePrivateKey([]byte(c.PrivateKey.GetPayload())) - } + signer, err := c.getKeySigner() if err != nil { return util.NewI18nError(fmt.Errorf("invalid private key: %w", err), util.I18nErrorPrivKeyInvalid) } - if key, ok := signer.PublicKey().(ssh.CryptoPublicKey); ok { - cryptoKey := key.CryptoPublicKey() - if rsaKey, ok := cryptoKey.(*rsa.PublicKey); ok { - if size := rsaKey.N.BitLen(); size < 2048 { - return util.NewI18nError( - fmt.Errorf("rsa key with size %d not accepted, minimum 2048", size), - util.I18nErrorKeySizeInvalid, - ) + if signer != nil { + if key, ok := signer.PublicKey().(ssh.CryptoPublicKey); ok { + cryptoKey := key.CryptoPublicKey() + if rsaKey, ok := cryptoKey.(*rsa.PublicKey); ok { + if size := rsaKey.N.BitLen(); size < 2048 { + return util.NewI18nError( + fmt.Errorf("rsa key with size %d not accepted, minimum 2048", size), + util.I18nErrorKeySizeInvalid, + ) + } } } } @@ -277,8 +284,8 @@ func (c *SFTPFsConfig) ValidateAndEncryptCredentials(additionalData string) erro } // getUniqueID returns an hash of the settings used to connect to the SFTP server -func (c *SFTPFsConfig) getUniqueID(partition int) uint64 { - h := fnv.New64a() +func (c *SFTPFsConfig) getUniqueID(partition int) string { + h := sha256.New() var b bytes.Buffer b.WriteString(c.Endpoint) @@ -295,7 +302,7 @@ func (c *SFTPFsConfig) getUniqueID(partition int) uint64 { b.WriteString(strconv.Itoa(partition)) h.Write(b.Bytes()) - return h.Sum64() + return hex.EncodeToString(h.Sum(nil)) } // SFTPFs is a Fs implementation for SFTP backends @@ -331,15 +338,19 @@ func NewSFTPFs(connectionID, mountPath, localTempDir string, forbiddenSelfUserna return nil, err } } + conn, err := sftpConnsCache.Get(&config, connectionID) + if err != nil { + return nil, err + } config.forbiddenSelfUsernames = forbiddenSelfUsernames sftpFs := &SFTPFs{ connectionID: connectionID, mountPath: getMountPath(mountPath), localTempDir: localTempDir, config: &config, - conn: sftpConnsCache.Get(&config, connectionID), + conn: conn, } - err := sftpFs.createConnection() + err = sftpFs.createConnection() if err != nil { sftpFs.Close() //nolint:errcheck } @@ -394,7 +405,7 @@ func (fs *SFTPFs) Open(name string, offset int64) (File, PipeReader, func(), err if fs.config.BufferSize == 0 { return f, nil, nil, nil } - r, w, err := pipeat.PipeInDir(fs.localTempDir) + r, w, err := createPipeFn(fs.localTempDir, 0) if err != nil { f.Close() return nil, nil, nil, err @@ -434,7 +445,7 @@ func (fs *SFTPFs) Create(name string, flag, _ int) (File, PipeWriter, func(), er if err != nil { return nil, nil, nil, err } - r, w, err := pipeat.PipeInDir(fs.localTempDir) + r, w, err := createPipeFn(fs.localTempDir, 0) if err != nil { f.Close() return nil, nil, nil, err @@ -468,7 +479,7 @@ func (fs *SFTPFs) Create(name string, flag, _ int) (File, PipeWriter, func(), er } // Rename renames (moves) source to target. -func (fs *SFTPFs) Rename(source, target string) (int, int64, error) { +func (fs *SFTPFs) Rename(source, target string, checks int) (int, int64, error) { if source == target { return -1, -1, nil } @@ -478,9 +489,15 @@ func (fs *SFTPFs) Rename(source, target string) (int, int64, error) { } if _, ok := client.HasExtension("posix-rename@openssh.com"); ok { err := client.PosixRename(source, target) + if checks&CheckUpdateModTime != 0 && err == nil { + fs.Chtimes(target, time.Now(), time.Now(), false) //nolint:errcheck + } return -1, -1, err } err = client.Rename(source, target) + if checks&CheckUpdateModTime != 0 && err == nil { + fs.Chtimes(target, time.Now(), time.Now(), false) //nolint:errcheck + } return -1, -1, err } @@ -524,7 +541,7 @@ func (fs *SFTPFs) Readlink(name string) (string, error) { if err != nil { return resolved, err } - resolved = path.Clean(resolved) + resolved = path.Clean(strings.ReplaceAll(resolved, "\\", "/")) if !path.IsAbs(resolved) { // we assume that multiple links are not followed resolved = path.Join(path.Dir(name), resolved) @@ -666,13 +683,23 @@ func (fs *SFTPFs) GetRelativePath(name string) string { rel = "" } if !path.IsAbs(rel) { - return "/" + rel - } - if fs.config.Prefix != "/" { - if !strings.HasPrefix(rel, fs.config.Prefix) { + // If we have a relative path we assume it is already relative to the virtual root + rel = "/" + rel + } else if fs.config.Prefix != "/" { + prefixDir := fs.config.Prefix + if !strings.HasSuffix(prefixDir, "/") { + prefixDir += "/" + } + + if rel == fs.config.Prefix { + rel = "/" + } else if after, found := strings.CutPrefix(rel, prefixDir); found { + rel = path.Clean("/" + after) + } else { + // Absolute path outside of the configured prefix + fsLog(fs, logger.LevelWarn, "path %q is an absolute path outside %q", name, fs.config.Prefix) rel = "/" } - rel = path.Clean("/" + strings.TrimPrefix(rel, fs.config.Prefix)) } if fs.mountPath != "" { rel = path.Join(fs.mountPath, rel) @@ -714,11 +741,11 @@ func (*SFTPFs) HasVirtualFolders() bool { // ResolvePath returns the matching filesystem path for the specified virtual path func (fs *SFTPFs) ResolvePath(virtualPath string) (string, error) { if fs.mountPath != "" { - virtualPath = strings.TrimPrefix(virtualPath, fs.mountPath) - } - if !path.IsAbs(virtualPath) { - virtualPath = path.Clean("/" + virtualPath) + if after, found := strings.CutPrefix(virtualPath, fs.mountPath); found { + virtualPath = after + } } + virtualPath = path.Clean("/" + virtualPath) fsPath := fs.Join(fs.config.Prefix, virtualPath) if fs.config.Prefix != "/" && fsPath != "/" { // we need to check if this path is a symlink outside the given prefix @@ -765,6 +792,7 @@ func (fs *SFTPFs) RealPath(p string) (string, error) { if err != nil { return "", err } + resolved = path.Clean(strings.ReplaceAll(resolved, "\\", "/")) if fs.config.Prefix != "/" { if err := fs.isSubDir(resolved); err != nil { fsLog(fs, logger.LevelError, "Invalid real path resolution, original path %q resolved %q err: %v", @@ -794,6 +822,7 @@ func (fs *SFTPFs) getRealPath(name string) (string, error) { if err != nil { return name, fmt.Errorf("unable to resolve link to %q: %w", name, err) } + resolvedLink = strings.ReplaceAll(resolvedLink, "\\", "/") resolvedLink = path.Clean(resolvedLink) if path.IsAbs(resolvedLink) { name = resolvedLink @@ -910,6 +939,7 @@ type sftpConnection struct { isConnected bool sessions map[string]bool lastActivity time.Time + signer ssh.Signer } func newSFTPConnection(config *SFTPFsConfig, sessionID string) *sftpConnection { @@ -919,6 +949,7 @@ func newSFTPConnection(config *SFTPFsConfig, sessionID string) *sftpConnection { isConnected: false, sessions: map[string]bool{}, lastActivity: time.Now().UTC(), + signer: nil, } c.sessions[sessionID] = true return c @@ -931,17 +962,6 @@ func (c *sftpConnection) OpenConnection() error { return c.openConnNoLock() } -func (c *sftpConnection) getKeySigner() (ssh.Signer, error) { - privPayload := c.config.PrivateKey.GetPayload() - if privPayload == "" { - return nil, nil - } - if key := c.config.KeyPassphrase.GetPayload(); key != "" { - return ssh.ParsePrivateKeyWithPassphrase([]byte(privPayload), []byte(key)) - } - return ssh.ParsePrivateKey([]byte(privPayload)) -} - func (c *sftpConnection) openConnNoLock() error { if c.isConnected { logger.Debug(c.logSender, "", "reusing connection") @@ -953,12 +973,12 @@ func (c *sftpConnection) openConnNoLock() error { User: c.config.Username, HostKeyCallback: func(_ string, _ net.Addr, key ssh.PublicKey) error { fp := ssh.FingerprintSHA256(key) - if util.Contains(sftpFingerprints, fp) { + if slices.Contains(sftpFingerprints, fp) { if allowSelfConnections == 0 { logger.Log(logger.LevelError, c.logSender, "", "SFTP self connections not allowed") return ErrSFTPLoop } - if util.Contains(c.config.forbiddenSelfUsernames, c.config.Username) { + if slices.Contains(c.config.forbiddenSelfUsernames, c.config.Username) { logger.Log(logger.LevelError, c.logSender, "", "SFTP loop or nested local SFTP folders detected, username %q, forbidden usernames: %+v", c.config.Username, c.config.forbiddenSelfUsernames) @@ -979,12 +999,8 @@ func (c *sftpConnection) openConnNoLock() error { Timeout: 15 * time.Second, ClientVersion: fmt.Sprintf("SSH-2.0-%s", version.GetServerVersion("_", false)), } - signer, err := c.getKeySigner() - if err != nil { - return fmt.Errorf("sftpfs: unable to parse the private key: %w", err) - } - if signer != nil { - clientConfig.Auth = append(clientConfig.Auth, ssh.PublicKeys(signer)) + if c.signer != nil { + clientConfig.Auth = append(clientConfig.Auth, ssh.PublicKeys(c.signer)) } if pwd := c.config.Password.GetPayload(); pwd != "" { clientConfig.Auth = append(clientConfig.Auth, ssh.Password(pwd)) @@ -992,8 +1008,7 @@ func (c *sftpConnection) openConnNoLock() error { supportedAlgos := ssh.SupportedAlgorithms() insecureAlgos := ssh.InsecureAlgorithms() // add all available ciphers, KEXs and MACs, they are negotiated according to the order - clientConfig.Ciphers = append(supportedAlgos.Ciphers, ssh.InsecureCipherAES128CBC, - ssh.InsecureCipherAES192CBC, ssh.InsecureCipherAES256CBC) + clientConfig.Ciphers = append(supportedAlgos.Ciphers, ssh.InsecureCipherAES128CBC) clientConfig.KeyExchanges = append(supportedAlgos.KeyExchanges, insecureAlgos.KeyExchanges...) clientConfig.MACs = append(supportedAlgos.MACs, insecureAlgos.MACs...) sshClient, err := ssh.Dial("tcp", c.config.Endpoint, clientConfig) @@ -1141,14 +1156,14 @@ func (c *sftpConnection) GetLastActivity() time.Time { type sftpConnectionsCache struct { scheduler *cron.Cron - sync.RWMutex - items map[uint64]*sftpConnection + sync.Mutex + items map[string]*sftpConnection } func newSFTPConnectionCache() *sftpConnectionsCache { c := &sftpConnectionsCache{ scheduler: cron.New(cron.WithLocation(time.UTC), cron.WithLogger(cron.DiscardLogger)), - items: make(map[uint64]*sftpConnection), + items: make(map[string]*sftpConnection), } _, err := c.scheduler.AddFunc("@every 1m", c.Cleanup) util.PanicOnError(err) @@ -1156,65 +1171,62 @@ func newSFTPConnectionCache() *sftpConnectionsCache { return c } -func (c *sftpConnectionsCache) Get(config *SFTPFsConfig, sessionID string) *sftpConnection { +func (c *sftpConnectionsCache) Get(config *SFTPFsConfig, sessionID string) (*sftpConnection, error) { partition := 0 key := config.getUniqueID(partition) c.Lock() defer c.Unlock() - var oldKey uint64 for { if val, ok := c.items[key]; ok { activeSessions := val.ActiveSessions() - if activeSessions < maxSessionsPerConnection || key == oldKey { + if activeSessions < maxSessionsPerConnection { logger.Debug(logSenderSFTPCache, "", - "reusing connection for session ID %q, key: %d, active sessions %d, active connections: %d", + "reusing connection for session ID %q, key %s, active sessions %d, active connections: %d", sessionID, key, activeSessions+1, len(c.items)) val.AddSession(sessionID) - return val + return val, nil } partition++ - oldKey = key key = config.getUniqueID(partition) logger.Debug(logSenderSFTPCache, "", - "connection full, generated new key for partition: %d, active sessions: %d, key: %d, old key: %d", - partition, activeSessions, oldKey, key) + "connection full, generated new key for partition: %d, active sessions: %d, key: %s", + partition, activeSessions, key) } else { conn := newSFTPConnection(config, sessionID) + signer, err := config.getKeySigner() + if err != nil { + return nil, fmt.Errorf("sftpfs: unable to parse the private key: %w", err) + } + conn.signer = signer c.items[key] = conn logger.Debug(logSenderSFTPCache, "", - "adding new connection for session ID %q, partition: %d, key: %d, active connections: %d", + "adding new connection for session ID %q, partition: %d, key: %s, active connections: %d", sessionID, partition, key, len(c.items)) - return conn + return conn, nil } } } -func (c *sftpConnectionsCache) Remove(key uint64) { - c.Lock() - defer c.Unlock() - - if conn, ok := c.items[key]; ok { - delete(c.items, key) - logger.Debug(logSenderSFTPCache, "", "removed connection with key %d, active connections: %d", key, len(c.items)) - - defer conn.Close() - } -} - func (c *sftpConnectionsCache) Cleanup() { - c.RLock() + c.Lock() + + var connectionsToClose []*sftpConnection for k, conn := range c.items { if val := conn.GetLastActivity(); val.Before(time.Now().Add(-30 * time.Second)) { - logger.Debug(conn.logSender, "", "removing inactive connection, last activity %s", val) - - defer func(key uint64) { - c.Remove(key) - }(k) + delete(c.items, k) + logger.Debug(logSenderSFTPCache, "", "removed connection with key %s, last activity %s, active connections: %d", + k, val, len(c.items)) + connectionsToClose = append(connectionsToClose, conn) } } - c.RUnlock() + c.Unlock() + + for _, conn := range connectionsToClose { + err := conn.Close() + logger.Debug(logSenderSFTPCache, "", "connection closed, err: %v", err) + } } diff --git a/internal/vfs/statvfs_fallback.go b/internal/vfs/statvfs_fallback.go index f857ffbe..19d8e2c3 100644 --- a/internal/vfs/statvfs_fallback.go +++ b/internal/vfs/statvfs_fallback.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build !darwin && !linux && !freebsd -// +build !darwin,!linux,!freebsd package vfs diff --git a/internal/vfs/statvfs_linux.go b/internal/vfs/statvfs_linux.go index 03b71459..772265fc 100644 --- a/internal/vfs/statvfs_linux.go +++ b/internal/vfs/statvfs_linux.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build linux -// +build linux package vfs diff --git a/internal/vfs/statvfs_unix.go b/internal/vfs/statvfs_unix.go index 26482b1a..53f43202 100644 --- a/internal/vfs/statvfs_unix.go +++ b/internal/vfs/statvfs_unix.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build freebsd || darwin -// +build freebsd darwin package vfs diff --git a/internal/vfs/sys_unix.go b/internal/vfs/sys_unix.go index e2e01e13..427792f8 100644 --- a/internal/vfs/sys_unix.go +++ b/internal/vfs/sys_unix.go @@ -13,7 +13,6 @@ // along with this program. If not, see . //go:build !windows -// +build !windows package vfs diff --git a/internal/vfs/vfs.go b/internal/vfs/vfs.go index b8edcb34..6f883e6a 100644 --- a/internal/vfs/vfs.go +++ b/internal/vfs/vfs.go @@ -16,6 +16,7 @@ package vfs import ( + "bytes" "errors" "fmt" "io" @@ -24,6 +25,7 @@ import ( "path" "path/filepath" "runtime" + "slices" "strconv" "strings" "sync" @@ -51,8 +53,9 @@ const ( // Additional checks for files const ( - CheckParentDir = 1 - CheckResume = 2 + CheckParentDir = 1 + CheckResume = 2 + CheckUpdateModTime = 4 ) var ( @@ -71,6 +74,12 @@ var ( uploadMode int ) +var ( + createPipeFn = func(dirPath string, _ int64) (pipeReaderAt, pipeWriterAt, error) { + return pipeat.PipeInDir(dirPath) + } +) + // SetAllowSelfConnections sets the desired behaviour for self connections func SetAllowSelfConnections(value int) { allowSelfConnections = value @@ -120,7 +129,7 @@ type Fs interface { Lstat(name string) (os.FileInfo, error) Open(name string, offset int64) (File, PipeReader, func(), error) Create(name string, flag, checks int) (File, PipeWriter, func(), error) - Rename(source, target string) (int, int64, error) + Rename(source, target string, checks int) (int, int64, error) Remove(name string, isDir bool) error Mkdir(name string) error Symlink(source, target string) error @@ -159,7 +168,7 @@ type FsRealPather interface { // FsFileCopier is a Fs that implements the CopyFile method. type FsFileCopier interface { Fs - CopyFile(source, target string, srcSize int64) (int, int64, error) + CopyFile(source, target string, srcInfo os.FileInfo) (int, int64, error) } // File defines an interface representing a SFTPGo file @@ -194,6 +203,22 @@ type PipeReader interface { Metadata() map[string]string } +type pipeReaderAt interface { + Read(p []byte) (int, error) + ReadAt(p []byte, offset int64) (int, error) + GetReadedBytes() int64 + Close() error + CloseWithError(err error) error +} + +type pipeWriterAt interface { + Write(p []byte) (int, error) + WriteAt(p []byte, offset int64) (int, error) + GetWrittenBytes() int64 + Close() error + CloseWithError(err error) error +} + // DirLister defines an interface for a directory lister type DirLister interface { Next(limit int) ([]os.FileInfo, error) @@ -265,7 +290,8 @@ func (q *QuotaCheckResult) GetRemainingFiles() int { // S3FsConfig defines the configuration for S3 based filesystem type S3FsConfig struct { sdk.BaseS3FsConfig - AccessSecret *kms.Secret `json:"access_secret,omitempty"` + AccessSecret *kms.Secret `json:"access_secret,omitempty"` + SSECustomerKey *kms.Secret `json:"sse_customer_key,omitempty"` } // HideConfidentialData hides confidential data @@ -273,6 +299,9 @@ func (c *S3FsConfig) HideConfidentialData() { if c.AccessSecret != nil { c.AccessSecret.Hide() } + if c.SSECustomerKey != nil { + c.SSECustomerKey.Hide() + } } func (c *S3FsConfig) isEqual(other S3FsConfig) bool { @@ -335,6 +364,15 @@ func (c *S3FsConfig) areMultipartFieldsEqual(other S3FsConfig) bool { } func (c *S3FsConfig) isSecretEqual(other S3FsConfig) bool { + if c.SSECustomerKey == nil { + c.SSECustomerKey = kms.NewEmptySecret() + } + if other.SSECustomerKey == nil { + other.SSECustomerKey = kms.NewEmptySecret() + } + if !c.SSECustomerKey.IsEqual(other.SSECustomerKey) { + return false + } if c.AccessSecret == nil { c.AccessSecret = kms.NewEmptySecret() } @@ -363,6 +401,12 @@ func (c *S3FsConfig) checkCredentials() error { if !c.AccessSecret.IsEmpty() && !c.AccessSecret.IsValidInput() { return errors.New("invalid access_secret") } + if c.SSECustomerKey.IsEncrypted() && !c.SSECustomerKey.IsValid() { + return errors.New("invalid encrypted sse_customer_key") + } + if !c.SSECustomerKey.IsEmpty() && !c.SSECustomerKey.IsValidInput() { + return errors.New("invalid sse_customer_key") + } return nil } @@ -386,13 +430,23 @@ func (c *S3FsConfig) ValidateAndEncryptCredentials(additionalData string) error ) } } + if c.SSECustomerKey.IsPlain() { + c.SSECustomerKey.SetAdditionalData(additionalData) + err := c.SSECustomerKey.Encrypt() + if err != nil { + return util.NewI18nError( + util.NewValidationError(fmt.Sprintf("could not encrypt s3 SSE customer key: %v", err)), + util.I18nErrorFsValidation, + ) + } + } return nil } func (c *S3FsConfig) checkPartSizeAndConcurrency() error { - if c.UploadPartSize != 0 && (c.UploadPartSize < 5 || c.UploadPartSize > 5000) { + if c.UploadPartSize != 0 && (c.UploadPartSize < 5 || c.UploadPartSize > 2000) { return util.NewI18nError( - errors.New("upload_part_size cannot be != 0, lower than 5 (MB) or greater than 5000 (MB)"), + errors.New("upload_part_size cannot be != 0, lower than 5 (MB) or greater than 2000 (MB)"), util.I18nErrorULPartSizeInvalid, ) } @@ -402,9 +456,9 @@ func (c *S3FsConfig) checkPartSizeAndConcurrency() error { util.I18nErrorULConcurrencyInvalid, ) } - if c.DownloadPartSize != 0 && (c.DownloadPartSize < 5 || c.DownloadPartSize > 5000) { + if c.DownloadPartSize != 0 && (c.DownloadPartSize < 5 || c.DownloadPartSize > 2000) { return util.NewI18nError( - errors.New("download_part_size cannot be != 0, lower than 5 (MB) or greater than 5000 (MB)"), + errors.New("download_part_size cannot be != 0, lower than 5 (MB) or greater than 2000 (MB)"), util.I18nErrorDLPartSizeInvalid, ) } @@ -432,6 +486,9 @@ func (c *S3FsConfig) validate() error { if c.AccessSecret == nil { c.AccessSecret = kms.NewEmptySecret() } + if c.SSECustomerKey == nil { + c.SSECustomerKey = kms.NewEmptySecret() + } if c.Bucket == "" { return util.NewI18nError(errors.New("bucket cannot be empty"), util.I18nErrorBucketRequired) } @@ -529,7 +586,7 @@ func (c *GCSFsConfig) isSameResource(other GCSFsConfig) bool { } // validate returns an error if the configuration is not valid -func (c *GCSFsConfig) validate() error { +func (c *GCSFsConfig) validate() error { //nolint:gocyclo if c.Credentials == nil || c.AutomaticCredentials == 1 { c.Credentials = kms.NewEmptySecret() } @@ -553,7 +610,7 @@ func (c *GCSFsConfig) validate() error { } c.StorageClass = strings.TrimSpace(c.StorageClass) c.ACL = strings.TrimSpace(c.ACL) - if c.UploadPartSize < 0 { + if c.UploadPartSize < 0 || c.UploadPartSize > 2000 { c.UploadPartSize = 0 } if c.UploadPartMaxTime < 0 { @@ -680,8 +737,8 @@ func (c *AzBlobFsConfig) checkCredentials() error { if !c.SASURL.IsEmpty() { return nil } - if c.AccountName == "" || !c.AccountKey.IsValidInput() { - return util.NewI18nError(errors.New("credentials cannot be empty or invalid"), util.I18nErrorAccountNameRequired) + if c.AccountName == "" { + return util.NewI18nError(errors.New("account name is required"), util.I18nErrorAccountNameRequired) } if c.AccountKey.IsEncrypted() && !c.AccountKey.IsValid() { return errors.New("invalid encrypted account_key") @@ -690,7 +747,7 @@ func (c *AzBlobFsConfig) checkCredentials() error { } func (c *AzBlobFsConfig) checkPartSizeAndConcurrency() error { - if c.UploadPartSize < 0 || c.UploadPartSize > 100 { + if c.UploadPartSize < 0 || c.UploadPartSize > 2000 { return util.NewI18nError( fmt.Errorf("invalid upload part size: %v", c.UploadPartSize), util.I18nErrorULPartSizeInvalid, @@ -702,7 +759,7 @@ func (c *AzBlobFsConfig) checkPartSizeAndConcurrency() error { util.I18nErrorULConcurrencyInvalid, ) } - if c.DownloadPartSize < 0 || c.DownloadPartSize > 100 { + if c.DownloadPartSize < 0 || c.DownloadPartSize > 2000 { return util.NewI18nError( fmt.Errorf("invalid download part size: %v", c.DownloadPartSize), util.I18nErrorDLPartSizeInvalid, @@ -734,6 +791,12 @@ func (c *AzBlobFsConfig) isSameResource(other AzBlobFsConfig) bool { if c.Endpoint != other.Endpoint { return false } + if c.SASURL == nil { + c.SASURL = kms.NewEmptySecret() + } + if other.SASURL == nil { + other.SASURL = kms.NewEmptySecret() + } return c.SASURL.GetPayload() == other.SASURL.GetPayload() } @@ -764,7 +827,7 @@ func (c *AzBlobFsConfig) validate() error { if err := c.checkPartSizeAndConcurrency(); err != nil { return err } - if !util.Contains(validAzAccessTier, c.AccessTier) { + if !slices.Contains(validAzAccessTier, c.AccessTier) { return fmt.Errorf("invalid access tier %q, valid values: \"''%v\"", c.AccessTier, strings.Join(validAzAccessTier, ", ")) } return nil @@ -833,25 +896,25 @@ func (c *CryptFsConfig) validate() error { return nil } -// pipeWriter defines a wrapper for pipeat.PipeWriterAt. +// pipeWriter defines a wrapper for a pipeWriterAt. type pipeWriter struct { - *pipeat.PipeWriterAt + pipeWriterAt err error done chan bool } // NewPipeWriter initializes a new PipeWriter -func NewPipeWriter(w *pipeat.PipeWriterAt) PipeWriter { +func NewPipeWriter(w pipeWriterAt) PipeWriter { return &pipeWriter{ - PipeWriterAt: w, + pipeWriterAt: w, err: nil, done: make(chan bool), } } -// Close waits for the upload to end, closes the pipeat.PipeWriterAt and returns an error if any. +// Close waits for the upload to end, closes the pipeWriterAt and returns an error if any. func (p *pipeWriter) Close() error { - p.PipeWriterAt.Close() //nolint:errcheck // the returned error is always null + p.pipeWriterAt.Close() //nolint:errcheck // the returned error is always null <-p.done return p.err } @@ -863,10 +926,10 @@ func (p *pipeWriter) Done(err error) { p.done <- true } -func newPipeWriterAtOffset(w *pipeat.PipeWriterAt, offset int64) PipeWriter { +func newPipeWriterAtOffset(w pipeWriterAt, offset int64) PipeWriter { return &pipeWriterAtOffset{ pipeWriter: &pipeWriter{ - PipeWriterAt: w, + pipeWriterAt: w, err: nil, done: make(chan bool), }, @@ -895,15 +958,15 @@ func (p *pipeWriterAtOffset) Write(buf []byte) (int, error) { } // NewPipeReader initializes a new PipeReader -func NewPipeReader(r *pipeat.PipeReaderAt) PipeReader { +func NewPipeReader(r pipeReaderAt) PipeReader { return &pipeReader{ - PipeReaderAt: r, + pipeReaderAt: r, } } // pipeReader defines a wrapper for pipeat.PipeReaderAt. type pipeReader struct { - *pipeat.PipeReaderAt + pipeReaderAt mu sync.RWMutex metadata map[string]string } @@ -1083,7 +1146,7 @@ func IsUploadResumeSupported(fs Fs, size int64) bool { } func getLastModified(metadata map[string]string) int64 { - if val, ok := metadata[lastModifiedField]; ok { + if val, ok := metadata[lastModifiedField]; ok && val != "" { lastModified, err := strconv.ParseInt(val, 10, 64) if err == nil { return lastModified @@ -1094,7 +1157,7 @@ func getLastModified(metadata map[string]string) int64 { func getAzureLastModified(metadata map[string]*string) int64 { for k, v := range metadata { - if strings.ToLower(k) == lastModifiedField { + if strings.EqualFold(k, lastModifiedField) { if val := util.GetStringFromPointer(v); val != "" { lastModified, err := strconv.ParseInt(val, 10, 64) if err == nil { @@ -1166,8 +1229,8 @@ func getLocalTempDir() string { } func doRecursiveRename(fs Fs, source, target string, - renameFn func(string, string, os.FileInfo, int) (int, int64, error), - recursion int, + renameFn func(string, string, os.FileInfo, int, bool) (int, int64, error), + recursion int, updateModTime bool, ) (int, int64, error) { var numFiles int var filesSize int64 @@ -1192,7 +1255,7 @@ func doRecursiveRename(fs Fs, source, target string, for _, info := range entries { sourceEntry := fs.Join(source, info.Name()) targetEntry := fs.Join(target, info.Name()) - files, size, err := renameFn(sourceEntry, targetEntry, info, recursion) + files, size, err := renameFn(sourceEntry, targetEntry, info, recursion, updateModTime) if err != nil { if fs.IsNotExist(err) { fsLog(fs, logger.LevelInfo, "skipping rename for %q: %v", sourceEntry, err) @@ -1209,6 +1272,88 @@ func doRecursiveRename(fs Fs, source, target string, } } +// copied from rclone +func readFill(r io.Reader, buf []byte) (n int, err error) { + var nn int + for n < len(buf) && err == nil { + nn, err = r.Read(buf[n:]) + n += nn + } + return n, err +} + +func writeAtFull(w io.WriterAt, buf []byte, offset int64, count int) error { + written := 0 + for written < count { + n, err := w.WriteAt(buf[written:count], offset+int64(written)) + written += n + if err != nil { + return err + } + } + return nil +} + +type bytesReaderWrapper struct { + *bytes.Reader +} + +func (b *bytesReaderWrapper) Close() error { + return nil +} + +type bufferAllocator struct { + sync.Mutex + available [][]byte + bufferSize int + finalized bool +} + +func newBufferAllocator(size int) *bufferAllocator { + return &bufferAllocator{ + bufferSize: size, + finalized: false, + } +} + +func (b *bufferAllocator) getBuffer() []byte { + b.Lock() + defer b.Unlock() + + if len(b.available) > 0 { + var result []byte + + truncLength := len(b.available) - 1 + result = b.available[truncLength] + + b.available[truncLength] = nil + b.available = b.available[:truncLength] + + return result + } + + return make([]byte, b.bufferSize) +} + +func (b *bufferAllocator) releaseBuffer(buf []byte) { + b.Lock() + defer b.Unlock() + + if b.finalized || len(buf) != b.bufferSize { + return + } + + b.available = append(b.available, buf) +} + +func (b *bufferAllocator) free() { + b.Lock() + defer b.Unlock() + + b.available = nil + b.finalized = true +} + func fsLog(fs Fs, level logger.LogLevel, format string, v ...any) { logger.Log(level, fs.Name(), fs.ConnectionID(), format, v...) } diff --git a/internal/webdavd/file.go b/internal/webdavd/file.go index 345c2714..88cc6bde 100644 --- a/internal/webdavd/file.go +++ b/internal/webdavd/file.go @@ -23,11 +23,11 @@ import ( "net/http" "os" "path" + "slices" "sync/atomic" "time" "github.com/drakkan/webdav" - "github.com/eikenb/pipeat" "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/dataprovider" @@ -51,7 +51,7 @@ type webDavFile struct { readTried atomic.Bool } -func newWebDavFile(baseTransfer *common.BaseTransfer, pipeWriter vfs.PipeWriter, pipeReader *pipeat.PipeReaderAt) *webDavFile { +func newWebDavFile(baseTransfer *common.BaseTransfer, pipeWriter vfs.PipeWriter, pipeReader vfs.PipeReader) *webDavFile { var writer io.WriteCloser var reader io.ReadCloser if baseTransfer.File != nil { @@ -165,7 +165,7 @@ func (f *webDavFile) checkFirstRead() error { if !f.Connection.User.HasPerm(dataprovider.PermDownload, path.Dir(f.GetVirtualPath())) { return f.Connection.GetPermissionDeniedError() } - transferQuota := f.BaseTransfer.GetTransferQuota() + transferQuota := f.GetTransferQuota() if !transferQuota.HasDownloadSpace() { f.Connection.Log(logger.LevelInfo, "denying file read due to quota limits") return f.Connection.GetReadQuotaExceededError() @@ -212,7 +212,7 @@ func (f *webDavFile) Read(p []byte) (n int, err error) { } else if r != nil { f.reader = r } - f.BaseTransfer.SetCancelFn(cancelFn) + f.SetCancelFn(cancelFn) } f.ErrTransfer = e f.startOffset = 0 @@ -322,9 +322,10 @@ func (f *webDavFile) Seek(offset int64, whence int) (int64, error) { if f.GetType() == common.TransferDownload { readOffset := f.startOffset + f.BytesSent.Load() if offset == 0 && readOffset == 0 { - if whence == io.SeekStart { + switch whence { + case io.SeekStart: return 0, nil - } else if whence == io.SeekEnd { + case io.SeekEnd: if err := f.updateStatInfo(); err != nil { return 0, err } @@ -363,7 +364,7 @@ func (f *webDavFile) Seek(offset int64, whence int) (int64, error) { f.reader = r } f.ErrTransfer = err - f.BaseTransfer.SetCancelFn(cancelFn) + f.SetCancelFn(cancelFn) f.Unlock() return startByte, err @@ -403,7 +404,7 @@ func (f *webDavFile) closeIO() error { } else if f.reader != nil { err = f.reader.Close() if metadater, ok := f.reader.(vfs.Metadater); ok { - f.BaseTransfer.SetMetadata(metadater.Metadata()) + f.SetMetadata(metadater.Metadata()) } } return err @@ -447,11 +448,11 @@ func (f *webDavFile) Patch(patches []webdav.Proppatch) ([]webdav.Propstat, error pstat := webdav.Propstat{} for _, p := range patch.Props { if status == http.StatusForbidden && !hasError { - if !patch.Remove && util.Contains(lastModifiedProps, p.XMLName.Local) { + if !patch.Remove && slices.Contains(lastModifiedProps, p.XMLName.Local) { parsed, err := parseTime(util.BytesToString(p.InnerXML)) if err != nil { f.Connection.Log(logger.LevelWarn, "unsupported last modification time: %q, err: %v", - util.BytesToString(p.InnerXML), err) + p.InnerXML, err) hasError = true continue } diff --git a/internal/webdavd/handler.go b/internal/webdavd/handler.go index 674b5b72..2fc3ca1b 100644 --- a/internal/webdavd/handler.go +++ b/internal/webdavd/handler.go @@ -36,6 +36,17 @@ import ( type Connection struct { *common.BaseConnection request *http.Request + rc *http.ResponseController +} + +func newConnection(conn *common.BaseConnection, w http.ResponseWriter, r *http.Request) *Connection { + rc := http.NewResponseController(w) + responseControllerDeadlines(rc, time.Time{}, time.Time{}) + return &Connection{ + BaseConnection: conn, + request: r, + rc: rc, + } } func (c *Connection) getModificationTime() time.Time { @@ -73,6 +84,9 @@ func (c *Connection) GetRemoteAddress() string { // Disconnect closes the active transfer func (c *Connection) Disconnect() error { + if c.rc != nil { + responseControllerDeadlines(c.rc, time.Now().Add(5*time.Second), time.Now().Add(5*time.Second)) + } return c.SignalTransfersAbort() } @@ -145,6 +159,11 @@ func (c *Connection) RemoveAll(_ context.Context, name string) error { func (c *Connection) OpenFile(_ context.Context, name string, flag int, _ os.FileMode) (webdav.File, error) { c.UpdateLastActivity() + if err := common.Connections.IsNewTransferAllowed(c.User.Username); err != nil { + c.Log(logger.LevelInfo, "denying transfer due to count limits") + return nil, c.GetPermissionDeniedError() + } + name = util.CleanPath(name) fs, p, err := c.GetFsAndResolvedPath(name) if err != nil { @@ -254,7 +273,7 @@ func (c *Connection) handleUploadToExistingFile(fs vfs.Fs, resolvedPath, filePat maxWriteSize, _ := c.GetMaxWriteSize(diskQuota, false, fileSize, fs.IsUploadResumeSupported()) if common.Config.IsAtomicUploadEnabled() && fs.IsAtomicUploadSupported() { - _, _, err = fs.Rename(resolvedPath, filePath) + _, _, err = fs.Rename(resolvedPath, filePath, 0) if err != nil { c.Log(logger.LevelError, "error renaming existing file for atomic upload, source: %q, dest: %q, err: %+v", resolvedPath, filePath, err) @@ -272,10 +291,7 @@ func (c *Connection) handleUploadToExistingFile(fs vfs.Fs, resolvedPath, filePat if vfs.HasTruncateSupport(fs) { vfolder, err := c.User.GetVirtualFolderForPath(path.Dir(requestPath)) if err == nil { - dataprovider.UpdateVirtualFolderQuota(&vfolder.BaseVirtualFolder, 0, -fileSize, false) //nolint:errcheck - if vfolder.IsIncludedInUserQuota() { - dataprovider.UpdateUserQuota(&c.User, 0, -fileSize, false) //nolint:errcheck - } + dataprovider.UpdateUserFolderQuota(&vfolder, &c.User, 0, -fileSize, false) } else { dataprovider.UpdateUserQuota(&c.User, 0, -fileSize, false) //nolint:errcheck } diff --git a/internal/webdavd/internal_test.go b/internal/webdavd/internal_test.go index 0366c7d2..35f71035 100644 --- a/internal/webdavd/internal_test.go +++ b/internal/webdavd/internal_test.go @@ -270,6 +270,7 @@ Ap157PUHTriSnxyMF2Sb3EhX/rQkmbnbCqqygHC14iBy8MrKzLG00X6BelZV5n0D RKjnkiEZeG4+G91Xu7+HmcBLwV86k5I+tXK9O1Okomr6Zry8oqVcxU5TB6VRS+rA ubwF00Drdvk2+kDZfxIM137nBiy7wgCJi2Ksm5ihN3dUF6Q0oNPl -----END RSA PRIVATE KEY-----` + osWindows = "windows" ) // MockOsFs mockable OsFs @@ -312,7 +313,7 @@ func (fs *MockOsFs) Remove(name string, _ bool) error { } // Rename renames (moves) source to target -func (fs *MockOsFs) Rename(source, target string) (int, int64, error) { +func (fs *MockOsFs) Rename(source, target string, _ int) (int, int64, error) { err := os.Rename(source, target) return -1, -1, err } @@ -378,6 +379,15 @@ func TestAllowedProxyUnixDomainSocket(t *testing.T) { } } +func TestProxyListenerWrapper(t *testing.T) { + b := Binding{ + ProxyMode: 0, + } + require.Nil(t, b.listenerWrapper()) + b.ProxyMode = 1 + require.NotNil(t, b.listenerWrapper()) +} + func TestRemoteAddress(t *testing.T) { remoteAddr1 := "100.100.100.100" remoteAddr2 := "172.172.172.172" @@ -514,7 +524,7 @@ func TestResolvePathErrors(t *testing.T) { assert.EqualError(t, err, common.ErrGenericFailure.Error()) } - if runtime.GOOS != "windows" { + if runtime.GOOS != osWindows { user.HomeDir = filepath.Clean(os.TempDir()) connection.User = user fs := vfs.NewOsFs("connID", connection.User.HomeDir, "", nil) @@ -751,6 +761,8 @@ func TestContentType(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "application/sftpgo", ctype) } + err = davFile.Close() + assert.NoError(t, err) baseTransfer = common.NewBaseTransfer(nil, connection.BaseConnection, nil, testFilePath, testFilePath, testFile+".unknown2", common.TransferDownload, 0, 0, 0, 0, false, fs, dataprovider.TransferQuota{}) @@ -797,7 +809,7 @@ func TestTransferReadWriteErrors(t *testing.T) { r, w, err := pipeat.Pipe() assert.NoError(t, err) - davFile = newWebDavFile(baseTransfer, nil, r) + davFile = newWebDavFile(baseTransfer, nil, vfs.NewPipeReader(r)) davFile.Connection.RemoveTransfer(davFile.BaseTransfer) davFile = newWebDavFile(baseTransfer, vfs.NewPipeWriter(w), nil) davFile.Connection.RemoveTransfer(davFile.BaseTransfer) @@ -805,6 +817,8 @@ func TestTransferReadWriteErrors(t *testing.T) { assert.NoError(t, err) err = w.Close() assert.NoError(t, err) + err = davFile.BaseTransfer.Close() + assert.Error(t, err) baseTransfer = common.NewBaseTransfer(nil, connection.BaseConnection, nil, testFilePath, testFilePath, testFile, common.TransferDownload, 0, 0, 0, 0, false, fs, dataprovider.TransferQuota{}) @@ -813,6 +827,8 @@ func TestTransferReadWriteErrors(t *testing.T) { assert.True(t, fs.IsNotExist(err)) _, err = davFile.Stat() assert.True(t, fs.IsNotExist(err)) + err = davFile.Close() + assert.Error(t, err) baseTransfer = common.NewBaseTransfer(nil, connection.BaseConnection, nil, testFilePath, testFilePath, testFile, common.TransferDownload, 0, 0, 0, 0, false, fs, dataprovider.TransferQuota{}) @@ -835,6 +851,8 @@ func TestTransferReadWriteErrors(t *testing.T) { if assert.NoError(t, err) { assert.Equal(t, int64(0), info.Size()) } + err = davFile.Close() + assert.Error(t, err) r, w, err = pipeat.Pipe() assert.NoError(t, err) @@ -978,8 +996,11 @@ func TestTransferSeek(t *testing.T) { res, err = davFile.Seek(2, io.SeekEnd) assert.True(t, fs.IsNotExist(err)) assert.Equal(t, int64(0), res) + err = davFile.Close() + assert.NoError(t, err) assert.Len(t, common.Connections.GetStats(""), 0) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) err = os.Remove(testFilePath) assert.NoError(t, err) @@ -1476,8 +1497,11 @@ func TestUserCacheIsolation(t *testing.T) { LockSystem: webdav.NewMemLS(), } cachedUser.User.FsConfig.S3Config.AccessSecret = kms.NewPlainSecret("test secret") + cachedUser.User.FsConfig.S3Config.SSECustomerKey = kms.NewPlainSecret("test key") err = cachedUser.User.FsConfig.S3Config.AccessSecret.Encrypt() assert.NoError(t, err) + err = cachedUser.User.FsConfig.S3Config.SSECustomerKey.Encrypt() + assert.NoError(t, err) dataprovider.CacheWebDAVUser(cachedUser) cachedUser, ok := dataprovider.GetCachedWebDAVUser(username) @@ -1491,6 +1515,9 @@ func TestUserCacheIsolation(t *testing.T) { assert.True(t, cachedUser.User.FsConfig.S3Config.AccessSecret.IsEncrypted()) err = cachedUser.User.FsConfig.S3Config.AccessSecret.Decrypt() assert.NoError(t, err) + assert.True(t, cachedUser.User.FsConfig.S3Config.SSECustomerKey.IsEncrypted()) + err = cachedUser.User.FsConfig.S3Config.SSECustomerKey.Decrypt() + assert.NoError(t, err) cachedUser.User.FsConfig.Provider = sdk.S3FilesystemProvider _, err = cachedUser.User.GetFilesystem("") assert.Error(t, err, "we don't have to get the previously cached filesystem!") @@ -1499,6 +1526,7 @@ func TestUserCacheIsolation(t *testing.T) { if assert.True(t, ok) { assert.Equal(t, sdk.LocalFilesystemProvider, cachedUser.User.FsConfig.Provider) assert.False(t, cachedUser.User.FsConfig.S3Config.AccessSecret.IsEncrypted()) + assert.False(t, cachedUser.User.FsConfig.S3Config.SSECustomerKey.IsEncrypted()) } err = dataprovider.DeleteUser(username, "", "", "") @@ -1713,3 +1741,68 @@ func TestGetCacheExpirationTime(t *testing.T) { c.ExpirationTime = 1 assert.False(t, c.getExpirationTime().IsZero()) } + +func TestBindingGetAddress(t *testing.T) { + tests := []struct { + name string + binding Binding + want string + }{ + { + name: "IP address with port", + binding: Binding{Address: "127.0.0.1", Port: 8080}, + want: "127.0.0.1:8080", + }, + { + name: "Unix socket path (no port)", + binding: Binding{Address: "/tmp/app.sock", Port: 0}, + want: "/tmp/app.sock", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.binding.GetAddress(); got != tt.want { + t.Errorf("GetAddress() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestBindingIsValid(t *testing.T) { + tests := []struct { + name string + binding Binding + want bool + }{ + { + name: "Valid: Positive port", + binding: Binding{Address: "127.0.0.1", Port: 10080}, + want: true, + }, + { + name: "Valid: Absolute path on Unix (non-Windows)", + binding: Binding{Address: "/var/run/app.sock", Port: 0}, + // This test outcome is dynamic based on the OS + want: runtime.GOOS != osWindows, + }, + { + name: "Invalid: Port 0 and relative path", + binding: Binding{Address: "relative/path", Port: 0}, + want: false, + }, + { + name: "Invalid: Empty address and port 0", + binding: Binding{Address: "", Port: 0}, + want: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.binding.IsValid(); got != tt.want { + t.Errorf("IsValid() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/internal/webdavd/server.go b/internal/webdavd/server.go index 88ba6a08..06533320 100644 --- a/internal/webdavd/server.go +++ b/internal/webdavd/server.go @@ -26,6 +26,7 @@ import ( "path" "path/filepath" "runtime/debug" + "slices" "strings" "time" @@ -33,6 +34,7 @@ import ( "github.com/go-chi/chi/v5/middleware" "github.com/rs/cors" "github.com/rs/xid" + "github.com/rs/zerolog" "github.com/sftpgo/sdk/plugin/notifier" "github.com/drakkan/sftpgo/v2/internal/common" @@ -53,8 +55,6 @@ func (s *webDavServer) listenAndServe(compressor *middleware.Compressor) error { handler := compressor.Handler(s) httpServer := &http.Server{ ReadHeaderTimeout: 30 * time.Second, - ReadTimeout: 60 * time.Second, - WriteTimeout: 60 * time.Second, IdleTimeout: 60 * time.Second, MaxHeaderBytes: 1 << 16, // 64KB ErrorLog: log.New(&logger.StdLoggerWrapper{Sender: logSender}, "", 0), @@ -98,11 +98,13 @@ func (s *webDavServer) listenAndServe(compressor *middleware.Compressor) error { httpServer.TLSConfig.ClientAuth = tls.VerifyClientCertIfGiven } } - return util.HTTPListenAndServe(httpServer, s.binding.Address, s.binding.Port, true, logSender) + return util.HTTPListenAndServe(httpServer, s.binding.Address, s.binding.Port, true, + s.binding.listenerWrapper(), logSender) } s.binding.EnableHTTPS = false serviceStatus.Bindings = append(serviceStatus.Bindings, s.binding) - return util.HTTPListenAndServe(httpServer, s.binding.Address, s.binding.Port, false, logSender) + return util.HTTPListenAndServe(httpServer, s.binding.Address, s.binding.Port, false, + s.binding.listenerWrapper(), logSender) } func (s *webDavServer) verifyTLSConnection(state tls.ConnectionState) error { @@ -166,6 +168,11 @@ func (s *webDavServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { } }() + responseControllerDeadlines( + http.NewResponseController(w), + time.Now().Add(60*time.Second), + time.Now().Add(60*time.Second), + ) w.Header().Set("Server", version.GetServerVersion("/", false)) ipAddr := s.checkRemoteAddress(r) @@ -206,7 +213,7 @@ func (s *webDavServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { if err != nil { // remove the cached user, we have not yet validated its filesystem dataprovider.RemoveCachedWebDAVUser(user.Username) - updateLoginMetrics(&user, ipAddr, loginMethod, err) + updateLoginMetrics(&user, ipAddr, loginMethod, err, r) http.Error(w, err.Error(), http.StatusForbidden) return } @@ -219,26 +226,24 @@ func (s *webDavServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { if err != nil { errClose := user.CloseFs() logger.Warn(logSender, connectionID, "unable to check fs root: %v close fs error: %v", err, errClose) - updateLoginMetrics(&user, ipAddr, loginMethod, common.ErrInternalFailure) + updateLoginMetrics(&user, ipAddr, loginMethod, common.ErrInternalFailure, r) http.Error(w, err.Error(), http.StatusInternalServerError) return } - connection := &Connection{ - BaseConnection: common.NewBaseConnection(connectionID, common.ProtocolWebDAV, util.GetHTTPLocalAddress(r), - r.RemoteAddr, user), - request: r, - } + baseConn := common.NewBaseConnection(connectionID, common.ProtocolWebDAV, util.GetHTTPLocalAddress(r), + r.RemoteAddr, user) + connection := newConnection(baseConn, w, r) if err = common.Connections.Add(connection); err != nil { errClose := user.CloseFs() logger.Warn(logSender, connectionID, "unable add connection: %v close fs error: %v", err, errClose) - updateLoginMetrics(&user, ipAddr, loginMethod, err) + updateLoginMetrics(&user, ipAddr, loginMethod, err, r) http.Error(w, err.Error(), http.StatusTooManyRequests) return } defer common.Connections.Remove(connection.GetID()) - updateLoginMetrics(&user, ipAddr, loginMethod, err) + updateLoginMetrics(&user, ipAddr, loginMethod, err, r) ctx := context.WithValue(r.Context(), requestIDKey, connectionID) ctx = context.WithValue(ctx, requestStartKey, time.Now()) @@ -315,7 +320,7 @@ func (s *webDavServer) authenticate(r *http.Request, ip string) (dataprovider.Us dataprovider.CacheWebDAVUser(cachedUser) return cachedUser.User, false, cachedUser.LockSystem, loginMethod, nil } - updateLoginMetrics(&cachedUser.User, ip, loginMethod, dataprovider.ErrInvalidCredentials) + updateLoginMetrics(&cachedUser.User, ip, loginMethod, dataprovider.ErrInvalidCredentials, r) return user, false, nil, loginMethod, dataprovider.ErrInvalidCredentials } } @@ -323,7 +328,7 @@ func (s *webDavServer) authenticate(r *http.Request, ip string) (dataprovider.Us common.ProtocolWebDAV, tlsCert) if err != nil { user.Username = username - updateLoginMetrics(&user, ip, loginMethod, err) + updateLoginMetrics(&user, ip, loginMethod, err, r) return user, false, nil, loginMethod, dataprovider.ErrInvalidCredentials } lockSystem := webdav.NewMemLS() @@ -346,7 +351,7 @@ func (s *webDavServer) validateUser(user *dataprovider.User, r *http.Request, lo user.Username, user.HomeDir) return connID, fmt.Errorf("cannot login user with invalid home dir: %q", user.HomeDir) } - if util.Contains(user.Filters.DeniedProtocols, common.ProtocolWebDAV) { + if slices.Contains(user.Filters.DeniedProtocols, common.ProtocolWebDAV) { logger.Info(logSender, connectionID, "cannot login user %q, protocol DAV is not allowed", user.Username) return connID, fmt.Errorf("protocol DAV is not allowed for user %q", user.Username) } @@ -385,17 +390,30 @@ func (s *webDavServer) checkRemoteAddress(r *http.Request) string { return ipAddr } +func responseControllerDeadlines(rc *http.ResponseController, read, write time.Time) { + if err := rc.SetReadDeadline(read); err != nil { + logger.Error(logSender, "", "unable to set read timeout to %s: %v", read, err) + } + if err := rc.SetWriteDeadline(write); err != nil { + logger.Error(logSender, "", "unable to set write timeout to %s: %v", write, err) + } +} + func writeLog(r *http.Request, status int, err error) { scheme := "http" + cipherSuite := "" if r.TLS != nil { scheme = "https" + cipherSuite = tls.CipherSuiteName(r.TLS.CipherSuite) } fields := map[string]any{ - "remote_addr": r.RemoteAddr, - "proto": r.Proto, - "method": r.Method, - "user_agent": r.UserAgent(), - "uri": fmt.Sprintf("%s://%s%s", scheme, r.Host, r.RequestURI)} + "remote_addr": r.RemoteAddr, + "proto": r.Proto, + "method": r.Method, + "user_agent": r.UserAgent(), + "uri": fmt.Sprintf("%s://%s%s", scheme, r.Host, r.RequestURI), + "cipher_suite": cipherSuite, + } if reqID, ok := r.Context().Value(requestIDKey).(string); ok { fields["request_id"] = reqID } @@ -414,7 +432,15 @@ func writeLog(r *http.Request, status int, err error) { if status != 0 { fields["resp_status"] = status } - logger.GetLogger().Info(). + var ev *zerolog.Event + if status >= http.StatusInternalServerError { + ev = logger.GetLogger().Error() + } else if status >= http.StatusBadRequest { + ev = logger.GetLogger().Warn() + } else { + ev = logger.GetLogger().Debug() + } + ev. Timestamp(). Str("sender", logSender). Fields(fields). @@ -422,10 +448,12 @@ func writeLog(r *http.Request, status int, err error) { Send() } -func updateLoginMetrics(user *dataprovider.User, ip, loginMethod string, err error) { +func updateLoginMetrics(user *dataprovider.User, ip, loginMethod string, err error, r *http.Request) { metric.AddLoginAttempt(loginMethod) if err == nil { + logger.LoginLog(user.Username, ip, loginMethod, common.ProtocolWebDAV, "", r.UserAgent(), r.TLS != nil, "") plugin.Handler.NotifyLogEvent(notifier.LogEventTypeLoginOK, common.ProtocolWebDAV, user.Username, ip, "", nil) + common.DelayLogin(nil) } else if err != common.ErrInternalFailure && err != common.ErrNoCredentials { logger.ConnectionFailedLog(user.Username, ip, loginMethod, common.ProtocolWebDAV, err.Error()) event := common.HostEventLoginFailed @@ -436,6 +464,9 @@ func updateLoginMetrics(user *dataprovider.User, ip, loginMethod string, err err } common.AddDefenderEvent(ip, common.ProtocolWebDAV, event) plugin.Handler.NotifyLogEvent(logEv, common.ProtocolWebDAV, user.Username, ip, "", err) + if loginMethod != dataprovider.LoginMethodTLSCertificate { + common.DelayLogin(err) + } } metric.AddLoginResult(loginMethod, err) dataprovider.ExecutePostLoginHook(user, loginMethod, ip, common.ProtocolWebDAV, err) diff --git a/internal/webdavd/webdavd.go b/internal/webdavd/webdavd.go index 62d37568..36b3b33c 100644 --- a/internal/webdavd/webdavd.go +++ b/internal/webdavd/webdavd.go @@ -21,6 +21,7 @@ import ( "net/http" "os" "path/filepath" + "runtime" "time" "github.com/go-chi/chi/v5/middleware" @@ -138,6 +139,9 @@ type Binding struct { // Prefix for WebDAV resources, if empty WebDAV resources will be available at the // root ("/") URI. If defined it must be an absolute URI. Prefix string `json:"prefix" mapstructure:"prefix"` + // Defines whether to use the common proxy protocol configuration or the + // binding-specific proxy header configuration. + ProxyMode int `json:"proxy_mode" mapstructure:"proxy_mode"` // List of IP addresses and IP ranges allowed to set client IP proxy headers ProxyAllowed []string `json:"proxy_allowed" mapstructure:"proxy_allowed"` // Allowed client IP proxy header such as "X-Forwarded-For", "X-Real-IP" @@ -173,12 +177,28 @@ func (b *Binding) isMutualTLSEnabled() bool { // GetAddress returns the binding address func (b *Binding) GetAddress() string { - return fmt.Sprintf("%s:%d", b.Address, b.Port) + if b.Port > 0 { + return fmt.Sprintf("%s:%d", b.Address, b.Port) + } + return b.Address } -// IsValid returns true if the binding port is > 0 +// IsValid returns true if the binding is valid func (b *Binding) IsValid() bool { - return b.Port > 0 + if b.Port > 0 { + return true + } + if filepath.IsAbs(b.Address) && runtime.GOOS != "windows" { + return true + } + return false +} + +func (b *Binding) listenerWrapper() func(net.Listener) (net.Listener, error) { + if b.ProxyMode == 1 { + return common.Config.GetProxyListener + } + return nil } // Configuration defines the configuration for the WevDAV server diff --git a/internal/webdavd/webdavd_test.go b/internal/webdavd/webdavd_test.go index b6b2bbdb..f7985c34 100644 --- a/internal/webdavd/webdavd_test.go +++ b/internal/webdavd/webdavd_test.go @@ -38,11 +38,13 @@ import ( "time" "github.com/minio/sio" + "github.com/pkg/sftp" "github.com/rs/zerolog" "github.com/sftpgo/sdk" sdkkms "github.com/sftpgo/sdk/kms" "github.com/stretchr/testify/assert" "github.com/studio-b12/gowebdav" + "golang.org/x/crypto/ssh" "github.com/drakkan/sftpgo/v2/internal/common" "github.com/drakkan/sftpgo/v2/internal/config" @@ -637,6 +639,7 @@ func TestBasicHandling(t *testing.T) { assert.NoError(t, err) assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 100*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) status := webdavd.GetStatus() assert.True(t, status.IsActive) } @@ -667,6 +670,8 @@ func TestBasicHandlingCryptFs(t *testing.T) { localDownloadPath := filepath.Join(homeBasePath, testDLFileName) err = downloadFile(testFileName, localDownloadPath, testFileSize, client) assert.NoError(t, err) + assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, + 1*time.Second, 100*time.Millisecond) user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) assert.NoError(t, err) assert.Equal(t, expectedQuotaFiles, user.UsedQuotaFiles) @@ -719,6 +724,7 @@ func TestBasicHandlingCryptFs(t *testing.T) { assert.NoError(t, err) assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 100*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func TestBufferedUser(t *testing.T) { @@ -1008,6 +1014,8 @@ func TestRenameWithLock(t *testing.T) { err = resp.Body.Close() assert.NoError(t, err) + err = os.Remove(testFilePath) + assert.NoError(t, err) _, err = httpdtest.RemoveUser(user, http.StatusOK) assert.NoError(t, err) err = os.RemoveAll(user.GetHomeDir()) @@ -1075,6 +1083,7 @@ func TestPropPatch(t *testing.T) { assert.NoError(t, err) assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 100*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func TestLoginInvalidPwd(t *testing.T) { @@ -1518,6 +1527,7 @@ func TestPreDownloadHook(t *testing.T) { assert.NoError(t, err) assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 100*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) common.Config.Actions.ExecuteOn = []string{common.OperationPreDownload} common.Config.Actions.Hook = preDownloadPath @@ -1568,6 +1578,7 @@ func TestPreUploadHook(t *testing.T) { assert.NoError(t, err) assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 100*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) common.Config.Actions.ExecuteOn = oldExecuteOn common.Config.Actions.Hook = oldHook @@ -1631,6 +1642,7 @@ func TestMaxConnections(t *testing.T) { assert.NoError(t, err) assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 100*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) common.Config.MaxTotalConnections = oldValue } @@ -1663,6 +1675,61 @@ func TestMaxPerHostConnections(t *testing.T) { assert.NoError(t, err) assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 100*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) + + common.Config.MaxPerHostConnections = oldValue +} + +func TestMaxTransfers(t *testing.T) { + oldValue := common.Config.MaxPerHostConnections + common.Config.MaxPerHostConnections = 2 + + assert.Eventually(t, func() bool { + return common.Connections.GetClientConnections() == 0 + }, 1000*time.Millisecond, 50*time.Millisecond) + + user, _, err := httpdtest.AddUser(getTestUser(), http.StatusCreated) + assert.NoError(t, err) + client := getWebDavClient(user, true, nil) + assert.NoError(t, checkBasicFunc(client)) + + conn, sftpClient, err := getSftpClient(user) + assert.NoError(t, err) + defer conn.Close() + defer sftpClient.Close() + + f1, err := sftpClient.Create("file1") + assert.NoError(t, err) + f2, err := sftpClient.Create("file2") + assert.NoError(t, err) + _, err = f1.Write([]byte(" ")) + assert.NoError(t, err) + _, err = f2.Write([]byte(" ")) + assert.NoError(t, err) + + testFilePath := filepath.Join(homeBasePath, testFileName) + testFileSize := int64(65535) + err = createTestFile(testFilePath, testFileSize) + assert.NoError(t, err) + err = uploadFileWithRawClient(testFilePath, testFileName, user.Username, defaultPassword, + false, testFileSize, client) + assert.Error(t, err) + + err = os.Remove(testFilePath) + assert.NoError(t, err) + + err = f1.Close() + assert.NoError(t, err) + err = f2.Close() + assert.NoError(t, err) + + _, err = httpdtest.RemoveUser(user, http.StatusOK) + assert.NoError(t, err) + err = os.RemoveAll(user.GetHomeDir()) + assert.NoError(t, err) + assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, + 1*time.Second, 100*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) common.Config.MaxPerHostConnections = oldValue } @@ -1710,6 +1777,7 @@ func TestMaxSessions(t *testing.T) { assert.NoError(t, err) assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 100*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func TestLoginWithIPilters(t *testing.T) { @@ -2169,6 +2237,7 @@ func TestClientClose(t *testing.T) { wg.Wait() assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 100*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) err = os.Remove(localDownloadPath) assert.NoError(t, err) @@ -2186,7 +2255,7 @@ func TestLoginWithDatabaseCredentials(t *testing.T) { u := getTestUser() u.FsConfig.Provider = sdk.GCSFilesystemProvider u.FsConfig.GCSConfig.Bucket = "test" - u.FsConfig.GCSConfig.Credentials = kms.NewPlainSecret(`{ "type": "service_account" }`) + u.FsConfig.GCSConfig.Credentials = kms.NewPlainSecret(`{ "type": "service_account", "private_key": " ", "client_email": "example@iam.gserviceaccount.com" }`) user, _, err := httpdtest.AddUser(u, http.StatusCreated) assert.NoError(t, err) assert.Equal(t, sdkkms.SecretStatusSecretBox, user.FsConfig.GCSConfig.Credentials.GetStatus()) @@ -2537,6 +2606,7 @@ func TestStat(t *testing.T) { func TestUploadOverwriteVfolder(t *testing.T) { u := getTestUser() + u.QuotaFiles = 1000 vdir := "/vdir" mappedPath := filepath.Join(os.TempDir(), "mappedDir") folderName := filepath.Base(mappedPath) @@ -2583,15 +2653,25 @@ func TestUploadOverwriteVfolder(t *testing.T) { assert.NoError(t, err) folder, _, err := httpdtest.GetFolderByName(folderName, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, folder.UsedQuotaSize) - assert.Equal(t, 1, folder.UsedQuotaFiles) + assert.Equal(t, int64(0), folder.UsedQuotaSize) + assert.Equal(t, 0, folder.UsedQuotaFiles) + user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) + assert.NoError(t, err) + assert.Equal(t, testFileSize, user.UsedQuotaSize) + assert.Equal(t, 1, user.UsedQuotaFiles) + err = uploadFileWithRawClient(testFilePath, path.Join(vdir, testFileName), user.Username, defaultPassword, true, testFileSize, client) assert.NoError(t, err) folder, _, err = httpdtest.GetFolderByName(folderName, http.StatusOK) assert.NoError(t, err) - assert.Equal(t, testFileSize, folder.UsedQuotaSize) - assert.Equal(t, 1, folder.UsedQuotaFiles) + assert.Equal(t, int64(0), folder.UsedQuotaSize) + assert.Equal(t, 0, folder.UsedQuotaFiles) + user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK) + assert.NoError(t, err) + assert.Equal(t, testFileSize, user.UsedQuotaSize) + assert.Equal(t, 1, user.UsedQuotaFiles) + err = os.Remove(testFilePath) assert.NoError(t, err) _, err = httpdtest.RemoveUser(user, http.StatusOK) @@ -3263,6 +3343,7 @@ func TestNestedVirtualFolders(t *testing.T) { assert.NoError(t, err) assert.Eventually(t, func() bool { return len(common.Connections.GetStats("")) == 0 }, 1*time.Second, 100*time.Millisecond) + assert.Equal(t, int32(0), common.Connections.GetTotalTransfers()) } func checkBasicFunc(client *gowebdav.Client) error { @@ -3459,6 +3540,30 @@ func getTestUserWithCryptFs() dataprovider.User { return user } +func getSftpClient(user dataprovider.User) (*ssh.Client, *sftp.Client, error) { + var sftpClient *sftp.Client + config := &ssh.ClientConfig{ + User: user.Username, + HostKeyCallback: ssh.InsecureIgnoreHostKey(), + Timeout: 5 * time.Second, + } + if user.Password != "" { + config.Auth = []ssh.AuthMethod{ssh.Password(user.Password)} + } else { + config.Auth = []ssh.AuthMethod{ssh.Password(defaultPassword)} + } + + conn, err := ssh.Dial("tcp", sftpServerAddr, config) + if err != nil { + return conn, sftpClient, err + } + sftpClient, err = sftp.NewClient(conn) + if err != nil { + conn.Close() + } + return conn, sftpClient, err +} + func getEncryptedFileSize(size int64) (int64, error) { encSize, err := sio.EncryptedSize(uint64(size)) return int64(encSize) + 33, err @@ -3545,6 +3650,6 @@ func printLatestLogs(maxNumberOfLines int) { return } for _, line := range lines { - logger.DebugToConsole(line) + logger.DebugToConsole("%s", line) } } diff --git a/main.go b/main.go index f147eb47..1d9cf48e 100644 --- a/main.go +++ b/main.go @@ -20,17 +20,9 @@ package main // import "github.com/drakkan/sftpgo" import ( - "fmt" - - "go.uber.org/automaxprocs/maxprocs" - "github.com/drakkan/sftpgo/v2/internal/cmd" ) func main() { - if undo, err := maxprocs.Set(); err != nil { - fmt.Printf("error setting max procs: %v\n", err) - undo() - } cmd.Execute() } diff --git a/openapi/openapi.yaml b/openapi/openapi.yaml index 94c1fbb6..32dc3dc7 100644 --- a/openapi/openapi.yaml +++ b/openapi/openapi.yaml @@ -29,7 +29,7 @@ info: SFTPGo supports groups to simplify the administration of multiple accounts by letting you assign settings once to a group, instead of multiple times to each individual user. The SFTPGo WebClient allows end users to change their credentials, browse and manage their files in the browser and setup two-factor authentication which works with Authy, Google Authenticator and other compatible apps. From the WebClient each authorized user can also create HTTP/S links to externally share files and folders securely, by setting limits to the number of downloads/uploads, protecting the share with a password, limiting access by source IP address, setting an automatic expiration date. - version: 2.6.0 + version: v2.7.0 contact: name: API support url: 'https://github.com/drakkan/sftpgo' @@ -1088,60 +1088,6 @@ paths: $ref: '#/components/responses/InternalServerError' default: $ref: '#/components/responses/DefaultResponse' - /retention/users/{username}/check: - parameters: - - name: username - in: path - description: the username - required: true - schema: - type: string - - name: notifications - in: query - description: 'specify how to notify results' - explode: false - schema: - type: array - items: - $ref: '#/components/schemas/RetentionCheckNotification' - post: - tags: - - data retention - summary: Start a retention check - description: 'Starts a new retention check for the given user. If a retention check for this user is already active a 409 status code is returned' - operationId: start_user_retention_check - requestBody: - required: true - description: 'Defines virtual paths to check and their retention time in hours' - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/FolderRetention' - responses: - '202': - description: successful operation - content: - application/json: - schema: - $ref: '#/components/schemas/ApiResponse' - example: - message: Check started - '400': - $ref: '#/components/responses/BadRequest' - '401': - $ref: '#/components/responses/Unauthorized' - '403': - $ref: '#/components/responses/Forbidden' - '404': - $ref: '#/components/responses/NotFound' - '409': - $ref: '#/components/responses/Conflict' - '500': - $ref: '#/components/responses/InternalServerError' - default: - $ref: '#/components/responses/DefaultResponse' /quotas/users/scans: get: tags: @@ -1517,7 +1463,7 @@ paths: name: confidential_data schema: type: integer - description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the manage_system permission is not granted.' + description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the * permission is not granted.' requestBody: required: true content: @@ -1565,7 +1511,7 @@ paths: name: confidential_data schema: type: integer - description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the manage_system permission is not granted.' + description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the * permission is not granted.' responses: '200': description: successful operation @@ -1709,7 +1655,7 @@ paths: name: confidential_data schema: type: integer - description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the manage_system permission is not granted.' + description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the * permission is not granted.' requestBody: required: true content: @@ -1757,7 +1703,7 @@ paths: name: confidential_data schema: type: integer - description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the manage_system permission is not granted.' + description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the * permission is not granted.' responses: '200': description: successful operation @@ -2081,7 +2027,7 @@ paths: name: confidential_data schema: type: integer - description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the manage_system permission is not granted.' + description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the * permission is not granted.' requestBody: required: true content: @@ -2129,7 +2075,7 @@ paths: name: confidential_data schema: type: integer - description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the manage_system permission is not granted.' + description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the * permission is not granted.' responses: '200': description: successful operation @@ -2273,7 +2219,7 @@ paths: name: confidential_data schema: type: integer - description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the manage_system permission is not granted.' + description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the * permission is not granted.' requestBody: required: true content: @@ -2321,7 +2267,7 @@ paths: name: confidential_data schema: type: integer - description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the manage_system permission is not granted.' + description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the * permission is not granted.' responses: '200': description: successful operation @@ -2732,7 +2678,7 @@ paths: $ref: '#/components/responses/InternalServerError' default: $ref: '#/components/responses/DefaultResponse' - /events/log: + /events/logs: get: tags: - events @@ -3416,7 +3362,7 @@ paths: name: confidential_data schema: type: integer - description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the hash of the password and the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the manage_system permission is not granted.' + description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the hash of the password and the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the * permission is not granted.' requestBody: required: true content: @@ -3464,7 +3410,7 @@ paths: name: confidential_data schema: type: integer - description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the hash of the password and the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the manage_system permission is not granted.' + description: 'If set to 1 confidential data will not be hidden. This means that the response will contain the hash of the password and the key and additional data for secrets. If a master key is not set or an external KMS is used, the data returned are enough to get the secrets in cleartext. Ignored if the * permission is not granted.' responses: '200': description: successful operation @@ -4935,23 +4881,16 @@ components: - view_conns - close_conns - view_status - - manage_admins - manage_folders - manage_groups - - manage_apikeys - quota_scans - - manage_system - manage_defender - view_defender - - retention_checks - view_events - - manage_event_rules - - manage_roles - - manage_ip_lists - disable_mfa description: | Admin permissions: - * `*` - all permissions are granted + * `*` - super admin permissions are granted * `add_users` - add new users is allowed * `edit_users` - change existing users is allowed * `del_users` - remove users is allowed @@ -4959,19 +4898,12 @@ components: * `view_conns` - list active connections is allowed * `close_conns` - close active connections is allowed * `view_status` - view the server status is allowed - * `manage_admins` - manage other admins is allowed * `manage_folders` - manage folders is allowed * `manage_groups` - manage groups is allowed - * `manage_apikeys` - manage API keys is allowed * `quota_scans` - view and start quota scans is allowed - * `manage_system` - backups and restores are allowed * `manage_defender` - remove ip from the dynamic blocklist is allowed * `view_defender` - list the dynamic blocklist is allowed - * `retention_checks` - view and start retention checks is allowed * `view_events` - view and search filesystem and provider events is allowed - * `manage_event_rules` - manage event actions and rules is allowed - * `manage_roles` - manage roles is allowed - * `manage_ip_lists` - manage global and ratelimter allow lists and defender block and safe lists is allowed * `disable_mfa` - allow to disable two-factor authentication for users and admins FsProviders: type: integer @@ -5008,6 +4940,7 @@ components: - 12 - 13 - 14 + - 15 description: | Supported event action types: * `1` - HTTP @@ -5023,6 +4956,7 @@ components: * `12` - User expiration check * `13` - Identity Provider account check * `14` - User inactivity check + * `15` - Rotate log file FilesystemActionTypes: type: integer enum: @@ -5154,15 +5088,6 @@ components: * `shares-disabled` - sharing files and directories with external users is not allowed * `password-reset-disabled` - resetting the password is not allowed * `shares-without-password-disabled` - creating shares without password protection is not allowed - RetentionCheckNotification: - type: string - enum: - - Hook - - Email - description: | - Options: - * `Hook` - notify result using the defined hook. A "data_retention_hook" must be defined in your configuration file for this to work - * `Email` - notify results by email. The admin starting the retention check must have an associated email address and the SMTP server must be configured for this to work APIKeyScope: type: integer enum: @@ -5460,14 +5385,10 @@ components: max_upload_file_size: type: integer format: int64 - description: 'maximum allowed size, as bytes, for a single file upload. The upload will be aborted if/when the size of the file being sent exceeds this limit. 0 means unlimited. This restriction does not apply for SSH system commands such as `git` and `rsync`' + description: 'maximum allowed size, as bytes, for a single file upload. The upload will be aborted if/when the size of the file being sent exceeds this limit. 0 means unlimited' tls_username: type: string description: 'defines the TLS certificate field to use as username. For FTP clients it must match the name provided using the "USER" command. For WebDAV, if no username is provided, the CN will be used as username. For WebDAV clients it must match the implicit or provided username. Ignored if mutual TLS is disabled. Currently the only supported value is `CommonName`' - tls_certs: - type: array - items: - type: string hooks: $ref: '#/components/schemas/HooksFilter' disable_fs_checks: @@ -5517,6 +5438,9 @@ components: password_expiration: type: integer description: 'The password expires after the defined number of days. 0 means no expiration' + password_strength: + type: integer + description: 'Defines the minimum password strength. 0 means disabled, any password will be accepted. Values in the 50-70 range are suggested for common use cases' access_time: type: array items: @@ -5536,6 +5460,15 @@ components: type: array items: $ref: '#/components/schemas/RecoveryCode' + tls_certs: + type: array + items: + type: string + additional_emails: + type: array + items: + type: string + format: email Secret: type: object properties: @@ -5574,6 +5507,8 @@ components: type: string access_secret: $ref: '#/components/schemas/Secret' + sse_customer_key: + $ref: '#/components/schemas/Secret' role_arn: type: string description: 'Optional IAM Role ARN to assume' @@ -6106,7 +6041,7 @@ components: description: Last user login as unix timestamp in milliseconds. It is saved at most once every 10 minutes role: type: string - description: 'If set the admin can only administer users with the same role. Role admins cannot have the following permissions: "manage_admins", "manage_apikeys", "manage_system", "manage_event_rules", "manage_roles", "manage_ip_lists"' + description: 'If set the admin can only administer users with the same role. Role admins cannot have the "*" permission' AdminProfile: type: object properties: @@ -6273,9 +6208,6 @@ components: delete_empty_dirs: type: boolean description: if enabled, empty directories will be deleted - ignore_user_permissions: - type: boolean - description: 'if enabled, files will be deleted even if the user does not have the delete permission. The default is "false" which means that files will be skipped if the user does not have permission to delete them. File patterns filters will always be silently ignored' RetentionCheck: type: object properties: @@ -6290,14 +6222,6 @@ components: type: integer format: int64 description: check start time as unix timestamp in milliseconds - notifications: - type: array - items: - $ref: '#/components/schemas/RetentionCheckNotification' - email: - type: string - format: email - description: 'if the notification method is set to "Email", this is the e-mail address that receives the retention check report. This field is automatically set to the email address associated with the administrator starting the check' QuotaScan: type: object properties: @@ -6971,6 +6895,14 @@ components: type: string value: type: string + RenameConfig: + allOf: + - $ref: '#/components/schemas/KeyValue' + - type: object + properties: + update_modtime: + type: boolean + description: 'Update modification time. This setting is not recursive and only applies to storage providers that support changing modification times' HTTPPart: type: object properties: @@ -7103,7 +7035,7 @@ components: renames: type: array items: - $ref: '#/components/schemas/KeyValue' + $ref: '#/components/schemas/RenameConfig' mkdirs: type: array items: @@ -7282,6 +7214,19 @@ components: max_size: type: integer format: int64 + event_statuses: + type: array + items: + type: integer + enum: + - 1 + - 2 + - 3 + description: | + Event status: + - `1` OK + - `2` Failed + - `3` Quota exceeded concurrent_execution: type: boolean description: allow concurrent execution from multiple nodes diff --git a/openapi/swagger-ui/swagger-ui-bundle.js b/openapi/swagger-ui/swagger-ui-bundle.js index 7c6f45b8..64a04935 100644 --- a/openapi/swagger-ui/swagger-ui-bundle.js +++ b/openapi/swagger-ui/swagger-ui-bundle.js @@ -1,2 +1,2 @@ /*! For license information please see swagger-ui-bundle.js.LICENSE.txt */ -!function webpackUniversalModuleDefinition(s,i){"object"==typeof exports&&"object"==typeof module?module.exports=i():"function"==typeof define&&define.amd?define([],i):"object"==typeof exports?exports.SwaggerUIBundle=i():s.SwaggerUIBundle=i()}(this,(()=>(()=>{var s,i,u={69119:(s,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0}),i.BLANK_URL=i.relativeFirstCharacters=i.urlSchemeRegex=i.ctrlCharactersRegex=i.htmlCtrlEntityRegex=i.htmlEntitiesRegex=i.invalidProtocolRegex=void 0,i.invalidProtocolRegex=/^([^\w]*)(javascript|data|vbscript)/im,i.htmlEntitiesRegex=/&#(\w+)(^\w|;)?/g,i.htmlCtrlEntityRegex=/&(newline|tab);/gi,i.ctrlCharactersRegex=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,i.urlSchemeRegex=/^.+(:|:)/gim,i.relativeFirstCharacters=[".","/"],i.BLANK_URL="about:blank"},16750:(s,i,u)=>{"use strict";i.J=void 0;var _=u(69119);i.J=function sanitizeUrl(s){if(!s)return _.BLANK_URL;var i,u,w=s;do{i=(w=(u=w,u.replace(_.ctrlCharactersRegex,"").replace(_.htmlEntitiesRegex,(function(s,i){return String.fromCharCode(i)}))).replace(_.htmlCtrlEntityRegex,"").replace(_.ctrlCharactersRegex,"").trim()).match(_.ctrlCharactersRegex)||w.match(_.htmlEntitiesRegex)||w.match(_.htmlCtrlEntityRegex)}while(i&&i.length>0);var x=w;if(!x)return _.BLANK_URL;if(function isRelativeUrlWithoutProtocol(s){return _.relativeFirstCharacters.indexOf(s[0])>-1}(x))return x;var j=x.match(_.urlSchemeRegex);if(!j)return x;var B=j[0];return _.invalidProtocolRegex.test(B)?_.BLANK_URL:x}},67526:(s,i)=>{"use strict";i.byteLength=function byteLength(s){var i=getLens(s),u=i[0],_=i[1];return 3*(u+_)/4-_},i.toByteArray=function toByteArray(s){var i,u,x=getLens(s),j=x[0],B=x[1],L=new w(function _byteLength(s,i,u){return 3*(i+u)/4-u}(0,j,B)),$=0,U=B>0?j-4:j;for(u=0;u>16&255,L[$++]=i>>8&255,L[$++]=255&i;2===B&&(i=_[s.charCodeAt(u)]<<2|_[s.charCodeAt(u+1)]>>4,L[$++]=255&i);1===B&&(i=_[s.charCodeAt(u)]<<10|_[s.charCodeAt(u+1)]<<4|_[s.charCodeAt(u+2)]>>2,L[$++]=i>>8&255,L[$++]=255&i);return L},i.fromByteArray=function fromByteArray(s){for(var i,_=s.length,w=_%3,x=[],j=16383,B=0,L=_-w;BL?L:B+j));1===w?(i=s[_-1],x.push(u[i>>2]+u[i<<4&63]+"==")):2===w&&(i=(s[_-2]<<8)+s[_-1],x.push(u[i>>10]+u[i>>4&63]+u[i<<2&63]+"="));return x.join("")};for(var u=[],_=[],w="undefined"!=typeof Uint8Array?Uint8Array:Array,x="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",j=0;j<64;++j)u[j]=x[j],_[x.charCodeAt(j)]=j;function getLens(s){var i=s.length;if(i%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var u=s.indexOf("=");return-1===u&&(u=i),[u,u===i?0:4-u%4]}function encodeChunk(s,i,_){for(var w,x,j=[],B=i;B<_;B+=3)w=(s[B]<<16&16711680)+(s[B+1]<<8&65280)+(255&s[B+2]),j.push(u[(x=w)>>18&63]+u[x>>12&63]+u[x>>6&63]+u[63&x]);return j.join("")}_["-".charCodeAt(0)]=62,_["_".charCodeAt(0)]=63},48287:(s,i,u)=>{"use strict";const _=u(67526),w=u(251),x="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;i.Buffer=Buffer,i.SlowBuffer=function SlowBuffer(s){+s!=s&&(s=0);return Buffer.alloc(+s)},i.INSPECT_MAX_BYTES=50;const j=2147483647;function createBuffer(s){if(s>j)throw new RangeError('The value "'+s+'" is invalid for option "size"');const i=new Uint8Array(s);return Object.setPrototypeOf(i,Buffer.prototype),i}function Buffer(s,i,u){if("number"==typeof s){if("string"==typeof i)throw new TypeError('The "string" argument must be of type string. Received type number');return allocUnsafe(s)}return from(s,i,u)}function from(s,i,u){if("string"==typeof s)return function fromString(s,i){"string"==typeof i&&""!==i||(i="utf8");if(!Buffer.isEncoding(i))throw new TypeError("Unknown encoding: "+i);const u=0|byteLength(s,i);let _=createBuffer(u);const w=_.write(s,i);w!==u&&(_=_.slice(0,w));return _}(s,i);if(ArrayBuffer.isView(s))return function fromArrayView(s){if(isInstance(s,Uint8Array)){const i=new Uint8Array(s);return fromArrayBuffer(i.buffer,i.byteOffset,i.byteLength)}return fromArrayLike(s)}(s);if(null==s)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof s);if(isInstance(s,ArrayBuffer)||s&&isInstance(s.buffer,ArrayBuffer))return fromArrayBuffer(s,i,u);if("undefined"!=typeof SharedArrayBuffer&&(isInstance(s,SharedArrayBuffer)||s&&isInstance(s.buffer,SharedArrayBuffer)))return fromArrayBuffer(s,i,u);if("number"==typeof s)throw new TypeError('The "value" argument must not be of type number. Received type number');const _=s.valueOf&&s.valueOf();if(null!=_&&_!==s)return Buffer.from(_,i,u);const w=function fromObject(s){if(Buffer.isBuffer(s)){const i=0|checked(s.length),u=createBuffer(i);return 0===u.length||s.copy(u,0,0,i),u}if(void 0!==s.length)return"number"!=typeof s.length||numberIsNaN(s.length)?createBuffer(0):fromArrayLike(s);if("Buffer"===s.type&&Array.isArray(s.data))return fromArrayLike(s.data)}(s);if(w)return w;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof s[Symbol.toPrimitive])return Buffer.from(s[Symbol.toPrimitive]("string"),i,u);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof s)}function assertSize(s){if("number"!=typeof s)throw new TypeError('"size" argument must be of type number');if(s<0)throw new RangeError('The value "'+s+'" is invalid for option "size"')}function allocUnsafe(s){return assertSize(s),createBuffer(s<0?0:0|checked(s))}function fromArrayLike(s){const i=s.length<0?0:0|checked(s.length),u=createBuffer(i);for(let _=0;_=j)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+j.toString(16)+" bytes");return 0|s}function byteLength(s,i){if(Buffer.isBuffer(s))return s.length;if(ArrayBuffer.isView(s)||isInstance(s,ArrayBuffer))return s.byteLength;if("string"!=typeof s)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof s);const u=s.length,_=arguments.length>2&&!0===arguments[2];if(!_&&0===u)return 0;let w=!1;for(;;)switch(i){case"ascii":case"latin1":case"binary":return u;case"utf8":case"utf-8":return utf8ToBytes(s).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*u;case"hex":return u>>>1;case"base64":return base64ToBytes(s).length;default:if(w)return _?-1:utf8ToBytes(s).length;i=(""+i).toLowerCase(),w=!0}}function slowToString(s,i,u){let _=!1;if((void 0===i||i<0)&&(i=0),i>this.length)return"";if((void 0===u||u>this.length)&&(u=this.length),u<=0)return"";if((u>>>=0)<=(i>>>=0))return"";for(s||(s="utf8");;)switch(s){case"hex":return hexSlice(this,i,u);case"utf8":case"utf-8":return utf8Slice(this,i,u);case"ascii":return asciiSlice(this,i,u);case"latin1":case"binary":return latin1Slice(this,i,u);case"base64":return base64Slice(this,i,u);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,i,u);default:if(_)throw new TypeError("Unknown encoding: "+s);s=(s+"").toLowerCase(),_=!0}}function swap(s,i,u){const _=s[i];s[i]=s[u],s[u]=_}function bidirectionalIndexOf(s,i,u,_,w){if(0===s.length)return-1;if("string"==typeof u?(_=u,u=0):u>2147483647?u=2147483647:u<-2147483648&&(u=-2147483648),numberIsNaN(u=+u)&&(u=w?0:s.length-1),u<0&&(u=s.length+u),u>=s.length){if(w)return-1;u=s.length-1}else if(u<0){if(!w)return-1;u=0}if("string"==typeof i&&(i=Buffer.from(i,_)),Buffer.isBuffer(i))return 0===i.length?-1:arrayIndexOf(s,i,u,_,w);if("number"==typeof i)return i&=255,"function"==typeof Uint8Array.prototype.indexOf?w?Uint8Array.prototype.indexOf.call(s,i,u):Uint8Array.prototype.lastIndexOf.call(s,i,u):arrayIndexOf(s,[i],u,_,w);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(s,i,u,_,w){let x,j=1,B=s.length,L=i.length;if(void 0!==_&&("ucs2"===(_=String(_).toLowerCase())||"ucs-2"===_||"utf16le"===_||"utf-16le"===_)){if(s.length<2||i.length<2)return-1;j=2,B/=2,L/=2,u/=2}function read(s,i){return 1===j?s[i]:s.readUInt16BE(i*j)}if(w){let _=-1;for(x=u;xB&&(u=B-L),x=u;x>=0;x--){let u=!0;for(let _=0;_w&&(_=w):_=w;const x=i.length;let j;for(_>x/2&&(_=x/2),j=0;j<_;++j){const _=parseInt(i.substr(2*j,2),16);if(numberIsNaN(_))return j;s[u+j]=_}return j}function utf8Write(s,i,u,_){return blitBuffer(utf8ToBytes(i,s.length-u),s,u,_)}function asciiWrite(s,i,u,_){return blitBuffer(function asciiToBytes(s){const i=[];for(let u=0;u>8,w=u%256,x.push(w),x.push(_);return x}(i,s.length-u),s,u,_)}function base64Slice(s,i,u){return 0===i&&u===s.length?_.fromByteArray(s):_.fromByteArray(s.slice(i,u))}function utf8Slice(s,i,u){u=Math.min(s.length,u);const _=[];let w=i;for(;w239?4:i>223?3:i>191?2:1;if(w+j<=u){let u,_,B,L;switch(j){case 1:i<128&&(x=i);break;case 2:u=s[w+1],128==(192&u)&&(L=(31&i)<<6|63&u,L>127&&(x=L));break;case 3:u=s[w+1],_=s[w+2],128==(192&u)&&128==(192&_)&&(L=(15&i)<<12|(63&u)<<6|63&_,L>2047&&(L<55296||L>57343)&&(x=L));break;case 4:u=s[w+1],_=s[w+2],B=s[w+3],128==(192&u)&&128==(192&_)&&128==(192&B)&&(L=(15&i)<<18|(63&u)<<12|(63&_)<<6|63&B,L>65535&&L<1114112&&(x=L))}}null===x?(x=65533,j=1):x>65535&&(x-=65536,_.push(x>>>10&1023|55296),x=56320|1023&x),_.push(x),w+=j}return function decodeCodePointsArray(s){const i=s.length;if(i<=B)return String.fromCharCode.apply(String,s);let u="",_=0;for(;__.length?(Buffer.isBuffer(i)||(i=Buffer.from(i)),i.copy(_,w)):Uint8Array.prototype.set.call(_,i,w);else{if(!Buffer.isBuffer(i))throw new TypeError('"list" argument must be an Array of Buffers');i.copy(_,w)}w+=i.length}return _},Buffer.byteLength=byteLength,Buffer.prototype._isBuffer=!0,Buffer.prototype.swap16=function swap16(){const s=this.length;if(s%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let i=0;iu&&(s+=" ... "),""},x&&(Buffer.prototype[x]=Buffer.prototype.inspect),Buffer.prototype.compare=function compare(s,i,u,_,w){if(isInstance(s,Uint8Array)&&(s=Buffer.from(s,s.offset,s.byteLength)),!Buffer.isBuffer(s))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof s);if(void 0===i&&(i=0),void 0===u&&(u=s?s.length:0),void 0===_&&(_=0),void 0===w&&(w=this.length),i<0||u>s.length||_<0||w>this.length)throw new RangeError("out of range index");if(_>=w&&i>=u)return 0;if(_>=w)return-1;if(i>=u)return 1;if(this===s)return 0;let x=(w>>>=0)-(_>>>=0),j=(u>>>=0)-(i>>>=0);const B=Math.min(x,j),L=this.slice(_,w),$=s.slice(i,u);for(let s=0;s>>=0,isFinite(u)?(u>>>=0,void 0===_&&(_="utf8")):(_=u,u=void 0)}const w=this.length-i;if((void 0===u||u>w)&&(u=w),s.length>0&&(u<0||i<0)||i>this.length)throw new RangeError("Attempt to write outside buffer bounds");_||(_="utf8");let x=!1;for(;;)switch(_){case"hex":return hexWrite(this,s,i,u);case"utf8":case"utf-8":return utf8Write(this,s,i,u);case"ascii":case"latin1":case"binary":return asciiWrite(this,s,i,u);case"base64":return base64Write(this,s,i,u);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,s,i,u);default:if(x)throw new TypeError("Unknown encoding: "+_);_=(""+_).toLowerCase(),x=!0}},Buffer.prototype.toJSON=function toJSON(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const B=4096;function asciiSlice(s,i,u){let _="";u=Math.min(s.length,u);for(let w=i;w_)&&(u=_);let w="";for(let _=i;_u)throw new RangeError("Trying to access beyond buffer length")}function checkInt(s,i,u,_,w,x){if(!Buffer.isBuffer(s))throw new TypeError('"buffer" argument must be a Buffer instance');if(i>w||is.length)throw new RangeError("Index out of range")}function wrtBigUInt64LE(s,i,u,_,w){checkIntBI(i,_,w,s,u,7);let x=Number(i&BigInt(4294967295));s[u++]=x,x>>=8,s[u++]=x,x>>=8,s[u++]=x,x>>=8,s[u++]=x;let j=Number(i>>BigInt(32)&BigInt(4294967295));return s[u++]=j,j>>=8,s[u++]=j,j>>=8,s[u++]=j,j>>=8,s[u++]=j,u}function wrtBigUInt64BE(s,i,u,_,w){checkIntBI(i,_,w,s,u,7);let x=Number(i&BigInt(4294967295));s[u+7]=x,x>>=8,s[u+6]=x,x>>=8,s[u+5]=x,x>>=8,s[u+4]=x;let j=Number(i>>BigInt(32)&BigInt(4294967295));return s[u+3]=j,j>>=8,s[u+2]=j,j>>=8,s[u+1]=j,j>>=8,s[u]=j,u+8}function checkIEEE754(s,i,u,_,w,x){if(u+_>s.length)throw new RangeError("Index out of range");if(u<0)throw new RangeError("Index out of range")}function writeFloat(s,i,u,_,x){return i=+i,u>>>=0,x||checkIEEE754(s,0,u,4),w.write(s,i,u,_,23,4),u+4}function writeDouble(s,i,u,_,x){return i=+i,u>>>=0,x||checkIEEE754(s,0,u,8),w.write(s,i,u,_,52,8),u+8}Buffer.prototype.slice=function slice(s,i){const u=this.length;(s=~~s)<0?(s+=u)<0&&(s=0):s>u&&(s=u),(i=void 0===i?u:~~i)<0?(i+=u)<0&&(i=0):i>u&&(i=u),i>>=0,i>>>=0,u||checkOffset(s,i,this.length);let _=this[s],w=1,x=0;for(;++x>>=0,i>>>=0,u||checkOffset(s,i,this.length);let _=this[s+--i],w=1;for(;i>0&&(w*=256);)_+=this[s+--i]*w;return _},Buffer.prototype.readUint8=Buffer.prototype.readUInt8=function readUInt8(s,i){return s>>>=0,i||checkOffset(s,1,this.length),this[s]},Buffer.prototype.readUint16LE=Buffer.prototype.readUInt16LE=function readUInt16LE(s,i){return s>>>=0,i||checkOffset(s,2,this.length),this[s]|this[s+1]<<8},Buffer.prototype.readUint16BE=Buffer.prototype.readUInt16BE=function readUInt16BE(s,i){return s>>>=0,i||checkOffset(s,2,this.length),this[s]<<8|this[s+1]},Buffer.prototype.readUint32LE=Buffer.prototype.readUInt32LE=function readUInt32LE(s,i){return s>>>=0,i||checkOffset(s,4,this.length),(this[s]|this[s+1]<<8|this[s+2]<<16)+16777216*this[s+3]},Buffer.prototype.readUint32BE=Buffer.prototype.readUInt32BE=function readUInt32BE(s,i){return s>>>=0,i||checkOffset(s,4,this.length),16777216*this[s]+(this[s+1]<<16|this[s+2]<<8|this[s+3])},Buffer.prototype.readBigUInt64LE=defineBigIntMethod((function readBigUInt64LE(s){validateNumber(s>>>=0,"offset");const i=this[s],u=this[s+7];void 0!==i&&void 0!==u||boundsError(s,this.length-8);const _=i+256*this[++s]+65536*this[++s]+this[++s]*2**24,w=this[++s]+256*this[++s]+65536*this[++s]+u*2**24;return BigInt(_)+(BigInt(w)<>>=0,"offset");const i=this[s],u=this[s+7];void 0!==i&&void 0!==u||boundsError(s,this.length-8);const _=i*2**24+65536*this[++s]+256*this[++s]+this[++s],w=this[++s]*2**24+65536*this[++s]+256*this[++s]+u;return(BigInt(_)<>>=0,i>>>=0,u||checkOffset(s,i,this.length);let _=this[s],w=1,x=0;for(;++x=w&&(_-=Math.pow(2,8*i)),_},Buffer.prototype.readIntBE=function readIntBE(s,i,u){s>>>=0,i>>>=0,u||checkOffset(s,i,this.length);let _=i,w=1,x=this[s+--_];for(;_>0&&(w*=256);)x+=this[s+--_]*w;return w*=128,x>=w&&(x-=Math.pow(2,8*i)),x},Buffer.prototype.readInt8=function readInt8(s,i){return s>>>=0,i||checkOffset(s,1,this.length),128&this[s]?-1*(255-this[s]+1):this[s]},Buffer.prototype.readInt16LE=function readInt16LE(s,i){s>>>=0,i||checkOffset(s,2,this.length);const u=this[s]|this[s+1]<<8;return 32768&u?4294901760|u:u},Buffer.prototype.readInt16BE=function readInt16BE(s,i){s>>>=0,i||checkOffset(s,2,this.length);const u=this[s+1]|this[s]<<8;return 32768&u?4294901760|u:u},Buffer.prototype.readInt32LE=function readInt32LE(s,i){return s>>>=0,i||checkOffset(s,4,this.length),this[s]|this[s+1]<<8|this[s+2]<<16|this[s+3]<<24},Buffer.prototype.readInt32BE=function readInt32BE(s,i){return s>>>=0,i||checkOffset(s,4,this.length),this[s]<<24|this[s+1]<<16|this[s+2]<<8|this[s+3]},Buffer.prototype.readBigInt64LE=defineBigIntMethod((function readBigInt64LE(s){validateNumber(s>>>=0,"offset");const i=this[s],u=this[s+7];void 0!==i&&void 0!==u||boundsError(s,this.length-8);const _=this[s+4]+256*this[s+5]+65536*this[s+6]+(u<<24);return(BigInt(_)<>>=0,"offset");const i=this[s],u=this[s+7];void 0!==i&&void 0!==u||boundsError(s,this.length-8);const _=(i<<24)+65536*this[++s]+256*this[++s]+this[++s];return(BigInt(_)<>>=0,i||checkOffset(s,4,this.length),w.read(this,s,!0,23,4)},Buffer.prototype.readFloatBE=function readFloatBE(s,i){return s>>>=0,i||checkOffset(s,4,this.length),w.read(this,s,!1,23,4)},Buffer.prototype.readDoubleLE=function readDoubleLE(s,i){return s>>>=0,i||checkOffset(s,8,this.length),w.read(this,s,!0,52,8)},Buffer.prototype.readDoubleBE=function readDoubleBE(s,i){return s>>>=0,i||checkOffset(s,8,this.length),w.read(this,s,!1,52,8)},Buffer.prototype.writeUintLE=Buffer.prototype.writeUIntLE=function writeUIntLE(s,i,u,_){if(s=+s,i>>>=0,u>>>=0,!_){checkInt(this,s,i,u,Math.pow(2,8*u)-1,0)}let w=1,x=0;for(this[i]=255&s;++x>>=0,u>>>=0,!_){checkInt(this,s,i,u,Math.pow(2,8*u)-1,0)}let w=u-1,x=1;for(this[i+w]=255&s;--w>=0&&(x*=256);)this[i+w]=s/x&255;return i+u},Buffer.prototype.writeUint8=Buffer.prototype.writeUInt8=function writeUInt8(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,1,255,0),this[i]=255&s,i+1},Buffer.prototype.writeUint16LE=Buffer.prototype.writeUInt16LE=function writeUInt16LE(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,2,65535,0),this[i]=255&s,this[i+1]=s>>>8,i+2},Buffer.prototype.writeUint16BE=Buffer.prototype.writeUInt16BE=function writeUInt16BE(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,2,65535,0),this[i]=s>>>8,this[i+1]=255&s,i+2},Buffer.prototype.writeUint32LE=Buffer.prototype.writeUInt32LE=function writeUInt32LE(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,4,4294967295,0),this[i+3]=s>>>24,this[i+2]=s>>>16,this[i+1]=s>>>8,this[i]=255&s,i+4},Buffer.prototype.writeUint32BE=Buffer.prototype.writeUInt32BE=function writeUInt32BE(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,4,4294967295,0),this[i]=s>>>24,this[i+1]=s>>>16,this[i+2]=s>>>8,this[i+3]=255&s,i+4},Buffer.prototype.writeBigUInt64LE=defineBigIntMethod((function writeBigUInt64LE(s,i=0){return wrtBigUInt64LE(this,s,i,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeBigUInt64BE=defineBigIntMethod((function writeBigUInt64BE(s,i=0){return wrtBigUInt64BE(this,s,i,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeIntLE=function writeIntLE(s,i,u,_){if(s=+s,i>>>=0,!_){const _=Math.pow(2,8*u-1);checkInt(this,s,i,u,_-1,-_)}let w=0,x=1,j=0;for(this[i]=255&s;++w>0)-j&255;return i+u},Buffer.prototype.writeIntBE=function writeIntBE(s,i,u,_){if(s=+s,i>>>=0,!_){const _=Math.pow(2,8*u-1);checkInt(this,s,i,u,_-1,-_)}let w=u-1,x=1,j=0;for(this[i+w]=255&s;--w>=0&&(x*=256);)s<0&&0===j&&0!==this[i+w+1]&&(j=1),this[i+w]=(s/x>>0)-j&255;return i+u},Buffer.prototype.writeInt8=function writeInt8(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,1,127,-128),s<0&&(s=255+s+1),this[i]=255&s,i+1},Buffer.prototype.writeInt16LE=function writeInt16LE(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,2,32767,-32768),this[i]=255&s,this[i+1]=s>>>8,i+2},Buffer.prototype.writeInt16BE=function writeInt16BE(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,2,32767,-32768),this[i]=s>>>8,this[i+1]=255&s,i+2},Buffer.prototype.writeInt32LE=function writeInt32LE(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,4,2147483647,-2147483648),this[i]=255&s,this[i+1]=s>>>8,this[i+2]=s>>>16,this[i+3]=s>>>24,i+4},Buffer.prototype.writeInt32BE=function writeInt32BE(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,4,2147483647,-2147483648),s<0&&(s=4294967295+s+1),this[i]=s>>>24,this[i+1]=s>>>16,this[i+2]=s>>>8,this[i+3]=255&s,i+4},Buffer.prototype.writeBigInt64LE=defineBigIntMethod((function writeBigInt64LE(s,i=0){return wrtBigUInt64LE(this,s,i,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeBigInt64BE=defineBigIntMethod((function writeBigInt64BE(s,i=0){return wrtBigUInt64BE(this,s,i,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeFloatLE=function writeFloatLE(s,i,u){return writeFloat(this,s,i,!0,u)},Buffer.prototype.writeFloatBE=function writeFloatBE(s,i,u){return writeFloat(this,s,i,!1,u)},Buffer.prototype.writeDoubleLE=function writeDoubleLE(s,i,u){return writeDouble(this,s,i,!0,u)},Buffer.prototype.writeDoubleBE=function writeDoubleBE(s,i,u){return writeDouble(this,s,i,!1,u)},Buffer.prototype.copy=function copy(s,i,u,_){if(!Buffer.isBuffer(s))throw new TypeError("argument should be a Buffer");if(u||(u=0),_||0===_||(_=this.length),i>=s.length&&(i=s.length),i||(i=0),_>0&&_=this.length)throw new RangeError("Index out of range");if(_<0)throw new RangeError("sourceEnd out of bounds");_>this.length&&(_=this.length),s.length-i<_-u&&(_=s.length-i+u);const w=_-u;return this===s&&"function"==typeof Uint8Array.prototype.copyWithin?this.copyWithin(i,u,_):Uint8Array.prototype.set.call(s,this.subarray(u,_),i),w},Buffer.prototype.fill=function fill(s,i,u,_){if("string"==typeof s){if("string"==typeof i?(_=i,i=0,u=this.length):"string"==typeof u&&(_=u,u=this.length),void 0!==_&&"string"!=typeof _)throw new TypeError("encoding must be a string");if("string"==typeof _&&!Buffer.isEncoding(_))throw new TypeError("Unknown encoding: "+_);if(1===s.length){const i=s.charCodeAt(0);("utf8"===_&&i<128||"latin1"===_)&&(s=i)}}else"number"==typeof s?s&=255:"boolean"==typeof s&&(s=Number(s));if(i<0||this.length>>=0,u=void 0===u?this.length:u>>>0,s||(s=0),"number"==typeof s)for(w=i;w=_+4;u-=3)i=`_${s.slice(u-3,u)}${i}`;return`${s.slice(0,u)}${i}`}function checkIntBI(s,i,u,_,w,x){if(s>u||s3?0===i||i===BigInt(0)?`>= 0${_} and < 2${_} ** ${8*(x+1)}${_}`:`>= -(2${_} ** ${8*(x+1)-1}${_}) and < 2 ** ${8*(x+1)-1}${_}`:`>= ${i}${_} and <= ${u}${_}`,new L.ERR_OUT_OF_RANGE("value",w,s)}!function checkBounds(s,i,u){validateNumber(i,"offset"),void 0!==s[i]&&void 0!==s[i+u]||boundsError(i,s.length-(u+1))}(_,w,x)}function validateNumber(s,i){if("number"!=typeof s)throw new L.ERR_INVALID_ARG_TYPE(i,"number",s)}function boundsError(s,i,u){if(Math.floor(s)!==s)throw validateNumber(s,u),new L.ERR_OUT_OF_RANGE(u||"offset","an integer",s);if(i<0)throw new L.ERR_BUFFER_OUT_OF_BOUNDS;throw new L.ERR_OUT_OF_RANGE(u||"offset",`>= ${u?1:0} and <= ${i}`,s)}E("ERR_BUFFER_OUT_OF_BOUNDS",(function(s){return s?`${s} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),E("ERR_INVALID_ARG_TYPE",(function(s,i){return`The "${s}" argument must be of type number. Received type ${typeof i}`}),TypeError),E("ERR_OUT_OF_RANGE",(function(s,i,u){let _=`The value of "${s}" is out of range.`,w=u;return Number.isInteger(u)&&Math.abs(u)>2**32?w=addNumericalSeparator(String(u)):"bigint"==typeof u&&(w=String(u),(u>BigInt(2)**BigInt(32)||u<-(BigInt(2)**BigInt(32)))&&(w=addNumericalSeparator(w)),w+="n"),_+=` It must be ${i}. Received ${w}`,_}),RangeError);const $=/[^+/0-9A-Za-z-_]/g;function utf8ToBytes(s,i){let u;i=i||1/0;const _=s.length;let w=null;const x=[];for(let j=0;j<_;++j){if(u=s.charCodeAt(j),u>55295&&u<57344){if(!w){if(u>56319){(i-=3)>-1&&x.push(239,191,189);continue}if(j+1===_){(i-=3)>-1&&x.push(239,191,189);continue}w=u;continue}if(u<56320){(i-=3)>-1&&x.push(239,191,189),w=u;continue}u=65536+(w-55296<<10|u-56320)}else w&&(i-=3)>-1&&x.push(239,191,189);if(w=null,u<128){if((i-=1)<0)break;x.push(u)}else if(u<2048){if((i-=2)<0)break;x.push(u>>6|192,63&u|128)}else if(u<65536){if((i-=3)<0)break;x.push(u>>12|224,u>>6&63|128,63&u|128)}else{if(!(u<1114112))throw new Error("Invalid code point");if((i-=4)<0)break;x.push(u>>18|240,u>>12&63|128,u>>6&63|128,63&u|128)}}return x}function base64ToBytes(s){return _.toByteArray(function base64clean(s){if((s=(s=s.split("=")[0]).trim().replace($,"")).length<2)return"";for(;s.length%4!=0;)s+="=";return s}(s))}function blitBuffer(s,i,u,_){let w;for(w=0;w<_&&!(w+u>=i.length||w>=s.length);++w)i[w+u]=s[w];return w}function isInstance(s,i){return s instanceof i||null!=s&&null!=s.constructor&&null!=s.constructor.name&&s.constructor.name===i.name}function numberIsNaN(s){return s!=s}const U=function(){const s="0123456789abcdef",i=new Array(256);for(let u=0;u<16;++u){const _=16*u;for(let w=0;w<16;++w)i[_+w]=s[u]+s[w]}return i}();function defineBigIntMethod(s){return"undefined"==typeof BigInt?BufferBigIntNotDefined:s}function BufferBigIntNotDefined(){throw new Error("BigInt not supported")}},38075:(s,i,u)=>{"use strict";var _=u(70453),w=u(10487),x=w(_("String.prototype.indexOf"));s.exports=function callBoundIntrinsic(s,i){var u=_(s,!!i);return"function"==typeof u&&x(s,".prototype.")>-1?w(u):u}},10487:(s,i,u)=>{"use strict";var _=u(66743),w=u(70453),x=u(96897),j=u(69675),B=w("%Function.prototype.apply%"),L=w("%Function.prototype.call%"),$=w("%Reflect.apply%",!0)||_.call(L,B),U=u(30655),Y=w("%Math.max%");s.exports=function callBind(s){if("function"!=typeof s)throw new j("a function is required");var i=$(_,L,arguments);return x(i,1+Y(0,s.length-(arguments.length-1)),!0)};var Z=function applyBind(){return $(_,B,arguments)};U?U(s.exports,"apply",{value:Z}):s.exports.apply=Z},57427:(s,i)=>{"use strict";i.parse=function parse(s,i){if("string"!=typeof s)throw new TypeError("argument str must be a string");var u={},_=(i||{}).decode||decode,w=0;for(;w{"use strict";var _=u(16426),w={"text/plain":"Text","text/html":"Url",default:"Text"};s.exports=function copy(s,i){var u,x,j,B,L,$,U=!1;i||(i={}),u=i.debug||!1;try{if(j=_(),B=document.createRange(),L=document.getSelection(),($=document.createElement("span")).textContent=s,$.ariaHidden="true",$.style.all="unset",$.style.position="fixed",$.style.top=0,$.style.clip="rect(0, 0, 0, 0)",$.style.whiteSpace="pre",$.style.webkitUserSelect="text",$.style.MozUserSelect="text",$.style.msUserSelect="text",$.style.userSelect="text",$.addEventListener("copy",(function(_){if(_.stopPropagation(),i.format)if(_.preventDefault(),void 0===_.clipboardData){u&&console.warn("unable to use e.clipboardData"),u&&console.warn("trying IE specific stuff"),window.clipboardData.clearData();var x=w[i.format]||w.default;window.clipboardData.setData(x,s)}else _.clipboardData.clearData(),_.clipboardData.setData(i.format,s);i.onCopy&&(_.preventDefault(),i.onCopy(_.clipboardData))})),document.body.appendChild($),B.selectNodeContents($),L.addRange(B),!document.execCommand("copy"))throw new Error("copy command was unsuccessful");U=!0}catch(_){u&&console.error("unable to copy using execCommand: ",_),u&&console.warn("trying IE specific stuff");try{window.clipboardData.setData(i.format||"text",s),i.onCopy&&i.onCopy(window.clipboardData),U=!0}catch(_){u&&console.error("unable to copy using clipboardData: ",_),u&&console.error("falling back to prompt"),x=function format(s){var i=(/mac os x/i.test(navigator.userAgent)?"⌘":"Ctrl")+"+C";return s.replace(/#{\s*key\s*}/g,i)}("message"in i?i.message:"Copy to clipboard: #{key}, Enter"),window.prompt(x,s)}}finally{L&&("function"==typeof L.removeRange?L.removeRange(B):L.removeAllRanges()),$&&document.body.removeChild($),j()}return U}},2205:function(s,i,u){var _;_=void 0!==u.g?u.g:this,s.exports=function(s){if(s.CSS&&s.CSS.escape)return s.CSS.escape;var cssEscape=function(s){if(0==arguments.length)throw new TypeError("`CSS.escape` requires an argument.");for(var i,u=String(s),_=u.length,w=-1,x="",j=u.charCodeAt(0);++w<_;)0!=(i=u.charCodeAt(w))?x+=i>=1&&i<=31||127==i||0==w&&i>=48&&i<=57||1==w&&i>=48&&i<=57&&45==j?"\\"+i.toString(16)+" ":0==w&&1==_&&45==i||!(i>=128||45==i||95==i||i>=48&&i<=57||i>=65&&i<=90||i>=97&&i<=122)?"\\"+u.charAt(w):u.charAt(w):x+="�";return x};return s.CSS||(s.CSS={}),s.CSS.escape=cssEscape,cssEscape}(_)},81919:(s,i,u)=>{"use strict";var _=u(48287).Buffer;function isSpecificValue(s){return s instanceof _||s instanceof Date||s instanceof RegExp}function cloneSpecificValue(s){if(s instanceof _){var i=_.alloc?_.alloc(s.length):new _(s.length);return s.copy(i),i}if(s instanceof Date)return new Date(s.getTime());if(s instanceof RegExp)return new RegExp(s);throw new Error("Unexpected situation")}function deepCloneArray(s){var i=[];return s.forEach((function(s,u){"object"==typeof s&&null!==s?Array.isArray(s)?i[u]=deepCloneArray(s):isSpecificValue(s)?i[u]=cloneSpecificValue(s):i[u]=w({},s):i[u]=s})),i}function safeGetProperty(s,i){return"__proto__"===i?void 0:s[i]}var w=s.exports=function(){if(arguments.length<1||"object"!=typeof arguments[0])return!1;if(arguments.length<2)return arguments[0];var s,i,u=arguments[0];return Array.prototype.slice.call(arguments,1).forEach((function(_){"object"!=typeof _||null===_||Array.isArray(_)||Object.keys(_).forEach((function(x){return i=safeGetProperty(u,x),(s=safeGetProperty(_,x))===u?void 0:"object"!=typeof s||null===s?void(u[x]=s):Array.isArray(s)?void(u[x]=deepCloneArray(s)):isSpecificValue(s)?void(u[x]=cloneSpecificValue(s)):"object"!=typeof i||null===i||Array.isArray(i)?void(u[x]=w({},s)):void(u[x]=w(i,s))}))})),u}},14744:s=>{"use strict";var i=function isMergeableObject(s){return function isNonNullObject(s){return!!s&&"object"==typeof s}(s)&&!function isSpecial(s){var i=Object.prototype.toString.call(s);return"[object RegExp]"===i||"[object Date]"===i||function isReactElement(s){return s.$$typeof===u}(s)}(s)};var u="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function cloneUnlessOtherwiseSpecified(s,i){return!1!==i.clone&&i.isMergeableObject(s)?deepmerge(function emptyTarget(s){return Array.isArray(s)?[]:{}}(s),s,i):s}function defaultArrayMerge(s,i,u){return s.concat(i).map((function(s){return cloneUnlessOtherwiseSpecified(s,u)}))}function getKeys(s){return Object.keys(s).concat(function getEnumerableOwnPropertySymbols(s){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(s).filter((function(i){return Object.propertyIsEnumerable.call(s,i)})):[]}(s))}function propertyIsOnObject(s,i){try{return i in s}catch(s){return!1}}function mergeObject(s,i,u){var _={};return u.isMergeableObject(s)&&getKeys(s).forEach((function(i){_[i]=cloneUnlessOtherwiseSpecified(s[i],u)})),getKeys(i).forEach((function(w){(function propertyIsUnsafe(s,i){return propertyIsOnObject(s,i)&&!(Object.hasOwnProperty.call(s,i)&&Object.propertyIsEnumerable.call(s,i))})(s,w)||(propertyIsOnObject(s,w)&&u.isMergeableObject(i[w])?_[w]=function getMergeFunction(s,i){if(!i.customMerge)return deepmerge;var u=i.customMerge(s);return"function"==typeof u?u:deepmerge}(w,u)(s[w],i[w],u):_[w]=cloneUnlessOtherwiseSpecified(i[w],u))})),_}function deepmerge(s,u,_){(_=_||{}).arrayMerge=_.arrayMerge||defaultArrayMerge,_.isMergeableObject=_.isMergeableObject||i,_.cloneUnlessOtherwiseSpecified=cloneUnlessOtherwiseSpecified;var w=Array.isArray(u);return w===Array.isArray(s)?w?_.arrayMerge(s,u,_):mergeObject(s,u,_):cloneUnlessOtherwiseSpecified(u,_)}deepmerge.all=function deepmergeAll(s,i){if(!Array.isArray(s))throw new Error("first argument should be an array");return s.reduce((function(s,u){return deepmerge(s,u,i)}),{})};var _=deepmerge;s.exports=_},30041:(s,i,u)=>{"use strict";var _=u(30655),w=u(58068),x=u(69675),j=u(75795);s.exports=function defineDataProperty(s,i,u){if(!s||"object"!=typeof s&&"function"!=typeof s)throw new x("`obj` must be an object or a function`");if("string"!=typeof i&&"symbol"!=typeof i)throw new x("`property` must be a string or a symbol`");if(arguments.length>3&&"boolean"!=typeof arguments[3]&&null!==arguments[3])throw new x("`nonEnumerable`, if provided, must be a boolean or null");if(arguments.length>4&&"boolean"!=typeof arguments[4]&&null!==arguments[4])throw new x("`nonWritable`, if provided, must be a boolean or null");if(arguments.length>5&&"boolean"!=typeof arguments[5]&&null!==arguments[5])throw new x("`nonConfigurable`, if provided, must be a boolean or null");if(arguments.length>6&&"boolean"!=typeof arguments[6])throw new x("`loose`, if provided, must be a boolean");var B=arguments.length>3?arguments[3]:null,L=arguments.length>4?arguments[4]:null,$=arguments.length>5?arguments[5]:null,U=arguments.length>6&&arguments[6],Y=!!j&&j(s,i);if(_)_(s,i,{configurable:null===$&&Y?Y.configurable:!$,enumerable:null===B&&Y?Y.enumerable:!B,value:u,writable:null===L&&Y?Y.writable:!L});else{if(!U&&(B||L||$))throw new w("This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.");s[i]=u}}},42838:function(s){s.exports=function(){"use strict";const{entries:s,setPrototypeOf:i,isFrozen:u,getPrototypeOf:_,getOwnPropertyDescriptor:w}=Object;let{freeze:x,seal:j,create:B}=Object,{apply:L,construct:$}="undefined"!=typeof Reflect&&Reflect;x||(x=function freeze(s){return s}),j||(j=function seal(s){return s}),L||(L=function apply(s,i,u){return s.apply(i,u)}),$||($=function construct(s,i){return new s(...i)});const U=unapply(Array.prototype.forEach),Y=unapply(Array.prototype.pop),Z=unapply(Array.prototype.push),ee=unapply(String.prototype.toLowerCase),ie=unapply(String.prototype.toString),ae=unapply(String.prototype.match),le=unapply(String.prototype.replace),ce=unapply(String.prototype.indexOf),pe=unapply(String.prototype.trim),de=unapply(Object.prototype.hasOwnProperty),fe=unapply(RegExp.prototype.test),ye=unconstruct(TypeError);function unapply(s){return function(i){for(var u=arguments.length,_=new Array(u>1?u-1:0),w=1;w2&&void 0!==arguments[2]?arguments[2]:ee;i&&i(s,null);let x=_.length;for(;x--;){let i=_[x];if("string"==typeof i){const s=w(i);s!==i&&(u(_)||(_[x]=s),i=s)}s[i]=!0}return s}function cleanArray(s){for(let i=0;i/gm),Xe=j(/\${[\w\W]*}/gm),Ye=j(/^data-[\-\w.\u00B7-\uFFFF]/),Qe=j(/^aria-[\-\w]+$/),et=j(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),tt=j(/^(?:\w+script|data):/i),rt=j(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),nt=j(/^html$/i),ot=j(/^[a-z][.\w]*(-[.\w]+)+$/i);var st=Object.freeze({__proto__:null,MUSTACHE_EXPR:We,ERB_EXPR:He,TMPLIT_EXPR:Xe,DATA_ATTR:Ye,ARIA_ATTR:Qe,IS_ALLOWED_URI:et,IS_SCRIPT_OR_DATA:tt,ATTR_WHITESPACE:rt,DOCTYPE_NAME:nt,CUSTOM_ELEMENT:ot});const it=function getGlobal(){return"undefined"==typeof window?null:window},at=function _createTrustedTypesPolicy(s,i){if("object"!=typeof s||"function"!=typeof s.createPolicy)return null;let u=null;const _="data-tt-policy-suffix";i&&i.hasAttribute(_)&&(u=i.getAttribute(_));const w="dompurify"+(u?"#"+u:"");try{return s.createPolicy(w,{createHTML:s=>s,createScriptURL:s=>s})}catch(s){return console.warn("TrustedTypes policy "+w+" could not be created."),null}};function createDOMPurify(){let i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:it();const DOMPurify=s=>createDOMPurify(s);if(DOMPurify.version="3.1.1",DOMPurify.removed=[],!i||!i.document||9!==i.document.nodeType)return DOMPurify.isSupported=!1,DOMPurify;let{document:u}=i;const _=u,w=_.currentScript,{DocumentFragment:j,HTMLTemplateElement:L,Node:$,Element:We,NodeFilter:He,NamedNodeMap:Xe=i.NamedNodeMap||i.MozNamedAttrMap,HTMLFormElement:Ye,DOMParser:Qe,trustedTypes:tt}=i,rt=We.prototype,ot=lookupGetter(rt,"cloneNode"),lt=lookupGetter(rt,"nextSibling"),ct=lookupGetter(rt,"childNodes"),ut=lookupGetter(rt,"parentNode");if("function"==typeof L){const s=u.createElement("template");s.content&&s.content.ownerDocument&&(u=s.content.ownerDocument)}let pt,ht="";const{implementation:dt,createNodeIterator:mt,createDocumentFragment:gt,getElementsByTagName:yt}=u,{importNode:vt}=_;let bt={};DOMPurify.isSupported="function"==typeof s&&"function"==typeof ut&&dt&&void 0!==dt.createHTMLDocument;const{MUSTACHE_EXPR:_t,ERB_EXPR:Et,TMPLIT_EXPR:wt,DATA_ATTR:St,ARIA_ATTR:xt,IS_SCRIPT_OR_DATA:kt,ATTR_WHITESPACE:Ot,CUSTOM_ELEMENT:Ct}=st;let{IS_ALLOWED_URI:At}=st,jt=null;const Pt=addToSet({},[...be,..._e,...we,...xe,...Te]);let It=null;const Nt=addToSet({},[...Re,...qe,...$e,...ze]);let Mt=Object.seal(B(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Tt=null,Rt=null,Dt=!0,Bt=!0,Lt=!1,Ft=!0,qt=!1,$t=!0,Ut=!1,zt=!1,Vt=!1,Wt=!1,Kt=!1,Ht=!1,Jt=!0,Gt=!1;const Xt="user-content-";let Yt=!0,Qt=!1,Zt={},er=null;const tr=addToSet({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let rr=null;const nr=addToSet({},["audio","video","img","source","image","track"]);let sr=null;const ir=addToSet({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ar="http://www.w3.org/1998/Math/MathML",lr="http://www.w3.org/2000/svg",cr="http://www.w3.org/1999/xhtml";let ur=cr,pr=!1,dr=null;const fr=addToSet({},[ar,lr,cr],ie);let mr=null;const gr=["application/xhtml+xml","text/html"],yr="text/html";let vr=null,br=null;const _r=255,Er=u.createElement("form"),wr=function isRegexOrFunction(s){return s instanceof RegExp||s instanceof Function},Sr=function _parseConfig(){let s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!br||br!==s){if(s&&"object"==typeof s||(s={}),s=clone(s),mr=-1===gr.indexOf(s.PARSER_MEDIA_TYPE)?yr:s.PARSER_MEDIA_TYPE,vr="application/xhtml+xml"===mr?ie:ee,jt=de(s,"ALLOWED_TAGS")?addToSet({},s.ALLOWED_TAGS,vr):Pt,It=de(s,"ALLOWED_ATTR")?addToSet({},s.ALLOWED_ATTR,vr):Nt,dr=de(s,"ALLOWED_NAMESPACES")?addToSet({},s.ALLOWED_NAMESPACES,ie):fr,sr=de(s,"ADD_URI_SAFE_ATTR")?addToSet(clone(ir),s.ADD_URI_SAFE_ATTR,vr):ir,rr=de(s,"ADD_DATA_URI_TAGS")?addToSet(clone(nr),s.ADD_DATA_URI_TAGS,vr):nr,er=de(s,"FORBID_CONTENTS")?addToSet({},s.FORBID_CONTENTS,vr):tr,Tt=de(s,"FORBID_TAGS")?addToSet({},s.FORBID_TAGS,vr):{},Rt=de(s,"FORBID_ATTR")?addToSet({},s.FORBID_ATTR,vr):{},Zt=!!de(s,"USE_PROFILES")&&s.USE_PROFILES,Dt=!1!==s.ALLOW_ARIA_ATTR,Bt=!1!==s.ALLOW_DATA_ATTR,Lt=s.ALLOW_UNKNOWN_PROTOCOLS||!1,Ft=!1!==s.ALLOW_SELF_CLOSE_IN_ATTR,qt=s.SAFE_FOR_TEMPLATES||!1,$t=!1!==s.SAFE_FOR_XML,Ut=s.WHOLE_DOCUMENT||!1,Wt=s.RETURN_DOM||!1,Kt=s.RETURN_DOM_FRAGMENT||!1,Ht=s.RETURN_TRUSTED_TYPE||!1,Vt=s.FORCE_BODY||!1,Jt=!1!==s.SANITIZE_DOM,Gt=s.SANITIZE_NAMED_PROPS||!1,Yt=!1!==s.KEEP_CONTENT,Qt=s.IN_PLACE||!1,At=s.ALLOWED_URI_REGEXP||et,ur=s.NAMESPACE||cr,Mt=s.CUSTOM_ELEMENT_HANDLING||{},s.CUSTOM_ELEMENT_HANDLING&&wr(s.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Mt.tagNameCheck=s.CUSTOM_ELEMENT_HANDLING.tagNameCheck),s.CUSTOM_ELEMENT_HANDLING&&wr(s.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Mt.attributeNameCheck=s.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),s.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof s.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Mt.allowCustomizedBuiltInElements=s.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),qt&&(Bt=!1),Kt&&(Wt=!0),Zt&&(jt=addToSet({},Te),It=[],!0===Zt.html&&(addToSet(jt,be),addToSet(It,Re)),!0===Zt.svg&&(addToSet(jt,_e),addToSet(It,qe),addToSet(It,ze)),!0===Zt.svgFilters&&(addToSet(jt,we),addToSet(It,qe),addToSet(It,ze)),!0===Zt.mathMl&&(addToSet(jt,xe),addToSet(It,$e),addToSet(It,ze))),s.ADD_TAGS&&(jt===Pt&&(jt=clone(jt)),addToSet(jt,s.ADD_TAGS,vr)),s.ADD_ATTR&&(It===Nt&&(It=clone(It)),addToSet(It,s.ADD_ATTR,vr)),s.ADD_URI_SAFE_ATTR&&addToSet(sr,s.ADD_URI_SAFE_ATTR,vr),s.FORBID_CONTENTS&&(er===tr&&(er=clone(er)),addToSet(er,s.FORBID_CONTENTS,vr)),Yt&&(jt["#text"]=!0),Ut&&addToSet(jt,["html","head","body"]),jt.table&&(addToSet(jt,["tbody"]),delete Tt.tbody),s.TRUSTED_TYPES_POLICY){if("function"!=typeof s.TRUSTED_TYPES_POLICY.createHTML)throw ye('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof s.TRUSTED_TYPES_POLICY.createScriptURL)throw ye('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');pt=s.TRUSTED_TYPES_POLICY,ht=pt.createHTML("")}else void 0===pt&&(pt=at(tt,w)),null!==pt&&"string"==typeof ht&&(ht=pt.createHTML(""));x&&x(s),br=s}},xr=addToSet({},["mi","mo","mn","ms","mtext"]),kr=addToSet({},["foreignobject","desc","title","annotation-xml"]),Or=addToSet({},["title","style","font","a","script"]),Cr=addToSet({},[..._e,...we,...Se]),Ar=addToSet({},[...xe,...Pe]),jr=function _checkValidNamespace(s){let i=ut(s);i&&i.tagName||(i={namespaceURI:ur,tagName:"template"});const u=ee(s.tagName),_=ee(i.tagName);return!!dr[s.namespaceURI]&&(s.namespaceURI===lr?i.namespaceURI===cr?"svg"===u:i.namespaceURI===ar?"svg"===u&&("annotation-xml"===_||xr[_]):Boolean(Cr[u]):s.namespaceURI===ar?i.namespaceURI===cr?"math"===u:i.namespaceURI===lr?"math"===u&&kr[_]:Boolean(Ar[u]):s.namespaceURI===cr?!(i.namespaceURI===lr&&!kr[_])&&!(i.namespaceURI===ar&&!xr[_])&&!Ar[u]&&(Or[u]||!Cr[u]):!("application/xhtml+xml"!==mr||!dr[s.namespaceURI]))},Pr=function _forceRemove(s){Z(DOMPurify.removed,{element:s});try{s.parentNode.removeChild(s)}catch(i){s.remove()}},Ir=function _removeAttribute(s,i){try{Z(DOMPurify.removed,{attribute:i.getAttributeNode(s),from:i})}catch(s){Z(DOMPurify.removed,{attribute:null,from:i})}if(i.removeAttribute(s),"is"===s&&!It[s])if(Wt||Kt)try{Pr(i)}catch(s){}else try{i.setAttribute(s,"")}catch(s){}},Nr=function _initDocument(s){let i=null,_=null;if(Vt)s=""+s;else{const i=ae(s,/^[\r\n\t ]+/);_=i&&i[0]}"application/xhtml+xml"===mr&&ur===cr&&(s=''+s+"");const w=pt?pt.createHTML(s):s;if(ur===cr)try{i=(new Qe).parseFromString(w,mr)}catch(s){}if(!i||!i.documentElement){i=dt.createDocument(ur,"template",null);try{i.documentElement.innerHTML=pr?ht:w}catch(s){}}const x=i.body||i.documentElement;return s&&_&&x.insertBefore(u.createTextNode(_),x.childNodes[0]||null),ur===cr?yt.call(i,Ut?"html":"body")[0]:Ut?i.documentElement:x},Mr=function _createNodeIterator(s){return mt.call(s.ownerDocument||s,s,He.SHOW_ELEMENT|He.SHOW_COMMENT|He.SHOW_TEXT|He.SHOW_PROCESSING_INSTRUCTION|He.SHOW_CDATA_SECTION,null)},Tr=function _isClobbered(s){return s instanceof Ye&&(void 0!==s.__depth&&"number"!=typeof s.__depth||void 0!==s.__removalCount&&"number"!=typeof s.__removalCount||"string"!=typeof s.nodeName||"string"!=typeof s.textContent||"function"!=typeof s.removeChild||!(s.attributes instanceof Xe)||"function"!=typeof s.removeAttribute||"function"!=typeof s.setAttribute||"string"!=typeof s.namespaceURI||"function"!=typeof s.insertBefore||"function"!=typeof s.hasChildNodes)},Rr=function _isNode(s){return"function"==typeof $&&s instanceof $},Dr=function _executeHook(s,i,u){bt[s]&&U(bt[s],(s=>{s.call(DOMPurify,i,u,br)}))},Br=function _sanitizeElements(s){let i=null;if(Dr("beforeSanitizeElements",s,null),Tr(s))return Pr(s),!0;const u=vr(s.nodeName);if(Dr("uponSanitizeElement",s,{tagName:u,allowedTags:jt}),s.hasChildNodes()&&!Rr(s.firstElementChild)&&fe(/<[/\w]/g,s.innerHTML)&&fe(/<[/\w]/g,s.textContent))return Pr(s),!0;if(7===s.nodeType)return Pr(s),!0;if($t&&8===s.nodeType&&fe(/<[/\w]/g,s.data))return Pr(s),!0;if(!jt[u]||Tt[u]){if(!Tt[u]&&Fr(u)){if(Mt.tagNameCheck instanceof RegExp&&fe(Mt.tagNameCheck,u))return!1;if(Mt.tagNameCheck instanceof Function&&Mt.tagNameCheck(u))return!1}if(Yt&&!er[u]){const i=ut(s)||s.parentNode,u=ct(s)||s.childNodes;if(u&&i)for(let _=u.length-1;_>=0;--_){const w=ot(u[_],!0);w.__removalCount=(s.__removalCount||0)+1,i.insertBefore(w,lt(s))}}return Pr(s),!0}return s instanceof We&&!jr(s)?(Pr(s),!0):"noscript"!==u&&"noembed"!==u&&"noframes"!==u||!fe(/<\/no(script|embed|frames)/i,s.innerHTML)?(qt&&3===s.nodeType&&(i=s.textContent,U([_t,Et,wt],(s=>{i=le(i,s," ")})),s.textContent!==i&&(Z(DOMPurify.removed,{element:s.cloneNode()}),s.textContent=i)),Dr("afterSanitizeElements",s,null),!1):(Pr(s),!0)},Lr=function _isValidAttribute(s,i,_){if(Jt&&("id"===i||"name"===i)&&(_ in u||_ in Er))return!1;if(Bt&&!Rt[i]&&fe(St,i));else if(Dt&&fe(xt,i));else if(!It[i]||Rt[i]){if(!(Fr(s)&&(Mt.tagNameCheck instanceof RegExp&&fe(Mt.tagNameCheck,s)||Mt.tagNameCheck instanceof Function&&Mt.tagNameCheck(s))&&(Mt.attributeNameCheck instanceof RegExp&&fe(Mt.attributeNameCheck,i)||Mt.attributeNameCheck instanceof Function&&Mt.attributeNameCheck(i))||"is"===i&&Mt.allowCustomizedBuiltInElements&&(Mt.tagNameCheck instanceof RegExp&&fe(Mt.tagNameCheck,_)||Mt.tagNameCheck instanceof Function&&Mt.tagNameCheck(_))))return!1}else if(sr[i]);else if(fe(At,le(_,Ot,"")));else if("src"!==i&&"xlink:href"!==i&&"href"!==i||"script"===s||0!==ce(_,"data:")||!rr[s])if(Lt&&!fe(kt,le(_,Ot,"")));else if(_)return!1;return!0},Fr=function _isBasicCustomElement(s){return"annotation-xml"!==s&&ae(s,Ct)},qr=function _sanitizeAttributes(s){Dr("beforeSanitizeAttributes",s,null);const{attributes:i}=s;if(!i)return;const u={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:It};let _=i.length;for(;_--;){const w=i[_],{name:x,namespaceURI:j,value:B}=w,L=vr(x);let $="value"===x?B:pe(B);if(u.attrName=L,u.attrValue=$,u.keepAttr=!0,u.forceKeepAttr=void 0,Dr("uponSanitizeAttribute",s,u),$=u.attrValue,u.forceKeepAttr)continue;if(Ir(x,s),!u.keepAttr)continue;if(!Ft&&fe(/\/>/i,$)){Ir(x,s);continue}qt&&U([_t,Et,wt],(s=>{$=le($,s," ")}));const Z=vr(s.nodeName);if(Lr(Z,L,$)){if(!Gt||"id"!==L&&"name"!==L||(Ir(x,s),$=Xt+$),pt&&"object"==typeof tt&&"function"==typeof tt.getAttributeType)if(j);else switch(tt.getAttributeType(Z,L)){case"TrustedHTML":$=pt.createHTML($);break;case"TrustedScriptURL":$=pt.createScriptURL($)}try{j?s.setAttributeNS(j,x,$):s.setAttribute(x,$),Y(DOMPurify.removed)}catch(s){}}}Dr("afterSanitizeAttributes",s,null)},$r=function _sanitizeShadowDOM(s){let i=null;const u=Mr(s);for(Dr("beforeSanitizeShadowDOM",s,null);i=u.nextNode();)Dr("uponSanitizeShadowNode",i,null),Br(i)||(1===i.nodeType&&(i.parentNode&&i.parentNode.__depth?i.__depth=(i.__removalCount||0)+i.parentNode.__depth+1:i.__depth=1),i.__depth>=_r&&Pr(i),i.content instanceof j&&(i.content.__depth=i.__depth,_sanitizeShadowDOM(i.content)),qr(i));Dr("afterSanitizeShadowDOM",s,null)};return DOMPurify.sanitize=function(s){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},u=null,w=null,x=null,B=null;if(pr=!s,pr&&(s="\x3c!--\x3e"),"string"!=typeof s&&!Rr(s)){if("function"!=typeof s.toString)throw ye("toString is not a function");if("string"!=typeof(s=s.toString()))throw ye("dirty is not a string, aborting")}if(!DOMPurify.isSupported)return s;if(zt||Sr(i),DOMPurify.removed=[],"string"==typeof s&&(Qt=!1),Qt){if(s.nodeName){const i=vr(s.nodeName);if(!jt[i]||Tt[i])throw ye("root node is forbidden and cannot be sanitized in-place")}}else if(s instanceof $)u=Nr("\x3c!----\x3e"),w=u.ownerDocument.importNode(s,!0),1===w.nodeType&&"BODY"===w.nodeName||"HTML"===w.nodeName?u=w:u.appendChild(w);else{if(!Wt&&!qt&&!Ut&&-1===s.indexOf("<"))return pt&&Ht?pt.createHTML(s):s;if(u=Nr(s),!u)return Wt?null:Ht?ht:""}u&&Vt&&Pr(u.firstChild);const L=Mr(Qt?s:u);for(;x=L.nextNode();)Br(x)||(1===x.nodeType&&(x.parentNode&&x.parentNode.__depth?x.__depth=(x.__removalCount||0)+x.parentNode.__depth+1:x.__depth=1),x.__depth>=_r&&Pr(x),x.content instanceof j&&(x.content.__depth=x.__depth,$r(x.content)),qr(x));if(Qt)return s;if(Wt){if(Kt)for(B=gt.call(u.ownerDocument);u.firstChild;)B.appendChild(u.firstChild);else B=u;return(It.shadowroot||It.shadowrootmode)&&(B=vt.call(_,B,!0)),B}let Y=Ut?u.outerHTML:u.innerHTML;return Ut&&jt["!doctype"]&&u.ownerDocument&&u.ownerDocument.doctype&&u.ownerDocument.doctype.name&&fe(nt,u.ownerDocument.doctype.name)&&(Y="\n"+Y),qt&&U([_t,Et,wt],(s=>{Y=le(Y,s," ")})),pt&&Ht?pt.createHTML(Y):Y},DOMPurify.setConfig=function(){Sr(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),zt=!0},DOMPurify.clearConfig=function(){br=null,zt=!1},DOMPurify.isValidAttribute=function(s,i,u){br||Sr({});const _=vr(s),w=vr(i);return Lr(_,w,u)},DOMPurify.addHook=function(s,i){"function"==typeof i&&(bt[s]=bt[s]||[],Z(bt[s],i))},DOMPurify.removeHook=function(s){if(bt[s])return Y(bt[s])},DOMPurify.removeHooks=function(s){bt[s]&&(bt[s]=[])},DOMPurify.removeAllHooks=function(){bt={}},DOMPurify}return createDOMPurify()}()},78004:s=>{"use strict";class SubRange{constructor(s,i){this.low=s,this.high=i,this.length=1+i-s}overlaps(s){return!(this.highs.high)}touches(s){return!(this.high+1s.high)}add(s){return new SubRange(Math.min(this.low,s.low),Math.max(this.high,s.high))}subtract(s){return s.low<=this.low&&s.high>=this.high?[]:s.low>this.low&&s.highs+i.length),0)}add(s,i){var _add=s=>{for(var i=0;i{for(var i=0;i{for(var i=0;i{for(var u=i.low;u<=i.high;)s.push(u),u++;return s}),[])}subranges(){return this.ranges.map((s=>({low:s.low,high:s.high,length:1+s.high-s.low})))}}s.exports=DRange},30655:(s,i,u)=>{"use strict";var _=u(70453)("%Object.defineProperty%",!0)||!1;if(_)try{_({},"a",{value:1})}catch(s){_=!1}s.exports=_},41237:s=>{"use strict";s.exports=EvalError},69383:s=>{"use strict";s.exports=Error},79290:s=>{"use strict";s.exports=RangeError},79538:s=>{"use strict";s.exports=ReferenceError},58068:s=>{"use strict";s.exports=SyntaxError},69675:s=>{"use strict";s.exports=TypeError},35345:s=>{"use strict";s.exports=URIError},37007:s=>{"use strict";var i,u="object"==typeof Reflect?Reflect:null,_=u&&"function"==typeof u.apply?u.apply:function ReflectApply(s,i,u){return Function.prototype.apply.call(s,i,u)};i=u&&"function"==typeof u.ownKeys?u.ownKeys:Object.getOwnPropertySymbols?function ReflectOwnKeys(s){return Object.getOwnPropertyNames(s).concat(Object.getOwnPropertySymbols(s))}:function ReflectOwnKeys(s){return Object.getOwnPropertyNames(s)};var w=Number.isNaN||function NumberIsNaN(s){return s!=s};function EventEmitter(){EventEmitter.init.call(this)}s.exports=EventEmitter,s.exports.once=function once(s,i){return new Promise((function(u,_){function errorListener(u){s.removeListener(i,resolver),_(u)}function resolver(){"function"==typeof s.removeListener&&s.removeListener("error",errorListener),u([].slice.call(arguments))}eventTargetAgnosticAddListener(s,i,resolver,{once:!0}),"error"!==i&&function addErrorHandlerIfEventEmitter(s,i,u){"function"==typeof s.on&&eventTargetAgnosticAddListener(s,"error",i,u)}(s,errorListener,{once:!0})}))},EventEmitter.EventEmitter=EventEmitter,EventEmitter.prototype._events=void 0,EventEmitter.prototype._eventsCount=0,EventEmitter.prototype._maxListeners=void 0;var x=10;function checkListener(s){if("function"!=typeof s)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof s)}function _getMaxListeners(s){return void 0===s._maxListeners?EventEmitter.defaultMaxListeners:s._maxListeners}function _addListener(s,i,u,_){var w,x,j;if(checkListener(u),void 0===(x=s._events)?(x=s._events=Object.create(null),s._eventsCount=0):(void 0!==x.newListener&&(s.emit("newListener",i,u.listener?u.listener:u),x=s._events),j=x[i]),void 0===j)j=x[i]=u,++s._eventsCount;else if("function"==typeof j?j=x[i]=_?[u,j]:[j,u]:_?j.unshift(u):j.push(u),(w=_getMaxListeners(s))>0&&j.length>w&&!j.warned){j.warned=!0;var B=new Error("Possible EventEmitter memory leak detected. "+j.length+" "+String(i)+" listeners added. Use emitter.setMaxListeners() to increase limit");B.name="MaxListenersExceededWarning",B.emitter=s,B.type=i,B.count=j.length,function ProcessEmitWarning(s){console&&console.warn&&console.warn(s)}(B)}return s}function onceWrapper(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function _onceWrap(s,i,u){var _={fired:!1,wrapFn:void 0,target:s,type:i,listener:u},w=onceWrapper.bind(_);return w.listener=u,_.wrapFn=w,w}function _listeners(s,i,u){var _=s._events;if(void 0===_)return[];var w=_[i];return void 0===w?[]:"function"==typeof w?u?[w.listener||w]:[w]:u?function unwrapListeners(s){for(var i=new Array(s.length),u=0;u0&&(j=i[0]),j instanceof Error)throw j;var B=new Error("Unhandled error."+(j?" ("+j.message+")":""));throw B.context=j,B}var L=x[s];if(void 0===L)return!1;if("function"==typeof L)_(L,this,i);else{var $=L.length,U=arrayClone(L,$);for(u=0;u<$;++u)_(U[u],this,i)}return!0},EventEmitter.prototype.addListener=function addListener(s,i){return _addListener(this,s,i,!1)},EventEmitter.prototype.on=EventEmitter.prototype.addListener,EventEmitter.prototype.prependListener=function prependListener(s,i){return _addListener(this,s,i,!0)},EventEmitter.prototype.once=function once(s,i){return checkListener(i),this.on(s,_onceWrap(this,s,i)),this},EventEmitter.prototype.prependOnceListener=function prependOnceListener(s,i){return checkListener(i),this.prependListener(s,_onceWrap(this,s,i)),this},EventEmitter.prototype.removeListener=function removeListener(s,i){var u,_,w,x,j;if(checkListener(i),void 0===(_=this._events))return this;if(void 0===(u=_[s]))return this;if(u===i||u.listener===i)0==--this._eventsCount?this._events=Object.create(null):(delete _[s],_.removeListener&&this.emit("removeListener",s,u.listener||i));else if("function"!=typeof u){for(w=-1,x=u.length-1;x>=0;x--)if(u[x]===i||u[x].listener===i){j=u[x].listener,w=x;break}if(w<0)return this;0===w?u.shift():function spliceOne(s,i){for(;i+1=0;_--)this.removeListener(s,i[_]);return this},EventEmitter.prototype.listeners=function listeners(s){return _listeners(this,s,!0)},EventEmitter.prototype.rawListeners=function rawListeners(s){return _listeners(this,s,!1)},EventEmitter.listenerCount=function(s,i){return"function"==typeof s.listenerCount?s.listenerCount(i):listenerCount.call(s,i)},EventEmitter.prototype.listenerCount=listenerCount,EventEmitter.prototype.eventNames=function eventNames(){return this._eventsCount>0?i(this._events):[]}},85587:(s,i,u)=>{"use strict";var _=u(26311),w=create(Error);function create(s){return FormattedError.displayName=s.displayName||s.name,FormattedError;function FormattedError(i){return i&&(i=_.apply(null,arguments)),new s(i)}}s.exports=w,w.eval=create(EvalError),w.range=create(RangeError),w.reference=create(ReferenceError),w.syntax=create(SyntaxError),w.type=create(TypeError),w.uri=create(URIError),w.create=create},26311:s=>{!function(){var i;function format(s){for(var i,u,_,w,x=1,j=[].slice.call(arguments),B=0,L=s.length,$="",U=!1,Y=!1,nextArg=function(){return j[x++]},slurpNumber=function(){for(var u="";/\d/.test(s[B]);)u+=s[B++],i=s[B];return u.length>0?parseInt(u):null};B{"use strict";var i=Object.prototype.toString,u=Math.max,_=function concatty(s,i){for(var u=[],_=0;_{"use strict";var _=u(89353);s.exports=Function.prototype.bind||_},70453:(s,i,u)=>{"use strict";var _,w=u(69383),x=u(41237),j=u(79290),B=u(79538),L=u(58068),$=u(69675),U=u(35345),Y=Function,getEvalledConstructor=function(s){try{return Y('"use strict"; return ('+s+").constructor;")()}catch(s){}},Z=Object.getOwnPropertyDescriptor;if(Z)try{Z({},"")}catch(s){Z=null}var throwTypeError=function(){throw new $},ee=Z?function(){try{return throwTypeError}catch(s){try{return Z(arguments,"callee").get}catch(s){return throwTypeError}}}():throwTypeError,ie=u(64039)(),ae=u(80024)(),le=Object.getPrototypeOf||(ae?function(s){return s.__proto__}:null),ce={},pe="undefined"!=typeof Uint8Array&&le?le(Uint8Array):_,de={__proto__:null,"%AggregateError%":"undefined"==typeof AggregateError?_:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?_:ArrayBuffer,"%ArrayIteratorPrototype%":ie&&le?le([][Symbol.iterator]()):_,"%AsyncFromSyncIteratorPrototype%":_,"%AsyncFunction%":ce,"%AsyncGenerator%":ce,"%AsyncGeneratorFunction%":ce,"%AsyncIteratorPrototype%":ce,"%Atomics%":"undefined"==typeof Atomics?_:Atomics,"%BigInt%":"undefined"==typeof BigInt?_:BigInt,"%BigInt64Array%":"undefined"==typeof BigInt64Array?_:BigInt64Array,"%BigUint64Array%":"undefined"==typeof BigUint64Array?_:BigUint64Array,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?_:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":w,"%eval%":eval,"%EvalError%":x,"%Float32Array%":"undefined"==typeof Float32Array?_:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?_:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?_:FinalizationRegistry,"%Function%":Y,"%GeneratorFunction%":ce,"%Int8Array%":"undefined"==typeof Int8Array?_:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?_:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?_:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":ie&&le?le(le([][Symbol.iterator]())):_,"%JSON%":"object"==typeof JSON?JSON:_,"%Map%":"undefined"==typeof Map?_:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&ie&&le?le((new Map)[Symbol.iterator]()):_,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?_:Promise,"%Proxy%":"undefined"==typeof Proxy?_:Proxy,"%RangeError%":j,"%ReferenceError%":B,"%Reflect%":"undefined"==typeof Reflect?_:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?_:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&ie&&le?le((new Set)[Symbol.iterator]()):_,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?_:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":ie&&le?le(""[Symbol.iterator]()):_,"%Symbol%":ie?Symbol:_,"%SyntaxError%":L,"%ThrowTypeError%":ee,"%TypedArray%":pe,"%TypeError%":$,"%Uint8Array%":"undefined"==typeof Uint8Array?_:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?_:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?_:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?_:Uint32Array,"%URIError%":U,"%WeakMap%":"undefined"==typeof WeakMap?_:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?_:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?_:WeakSet};if(le)try{null.error}catch(s){var fe=le(le(s));de["%Error.prototype%"]=fe}var ye=function doEval(s){var i;if("%AsyncFunction%"===s)i=getEvalledConstructor("async function () {}");else if("%GeneratorFunction%"===s)i=getEvalledConstructor("function* () {}");else if("%AsyncGeneratorFunction%"===s)i=getEvalledConstructor("async function* () {}");else if("%AsyncGenerator%"===s){var u=doEval("%AsyncGeneratorFunction%");u&&(i=u.prototype)}else if("%AsyncIteratorPrototype%"===s){var _=doEval("%AsyncGenerator%");_&&le&&(i=le(_.prototype))}return de[s]=i,i},be={__proto__:null,"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},_e=u(66743),we=u(9957),Se=_e.call(Function.call,Array.prototype.concat),xe=_e.call(Function.apply,Array.prototype.splice),Pe=_e.call(Function.call,String.prototype.replace),Te=_e.call(Function.call,String.prototype.slice),Re=_e.call(Function.call,RegExp.prototype.exec),qe=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,$e=/\\(\\)?/g,ze=function getBaseIntrinsic(s,i){var u,_=s;if(we(be,_)&&(_="%"+(u=be[_])[0]+"%"),we(de,_)){var w=de[_];if(w===ce&&(w=ye(_)),void 0===w&&!i)throw new $("intrinsic "+s+" exists, but is not available. Please file an issue!");return{alias:u,name:_,value:w}}throw new L("intrinsic "+s+" does not exist!")};s.exports=function GetIntrinsic(s,i){if("string"!=typeof s||0===s.length)throw new $("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof i)throw new $('"allowMissing" argument must be a boolean');if(null===Re(/^%?[^%]*%?$/,s))throw new L("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var u=function stringToPath(s){var i=Te(s,0,1),u=Te(s,-1);if("%"===i&&"%"!==u)throw new L("invalid intrinsic syntax, expected closing `%`");if("%"===u&&"%"!==i)throw new L("invalid intrinsic syntax, expected opening `%`");var _=[];return Pe(s,qe,(function(s,i,u,w){_[_.length]=u?Pe(w,$e,"$1"):i||s})),_}(s),_=u.length>0?u[0]:"",w=ze("%"+_+"%",i),x=w.name,j=w.value,B=!1,U=w.alias;U&&(_=U[0],xe(u,Se([0,1],U)));for(var Y=1,ee=!0;Y=u.length){var ce=Z(j,ie);j=(ee=!!ce)&&"get"in ce&&!("originalValue"in ce.get)?ce.get:j[ie]}else ee=we(j,ie),j=j[ie];ee&&!B&&(de[x]=j)}}return j}},75795:(s,i,u)=>{"use strict";var _=u(70453)("%Object.getOwnPropertyDescriptor%",!0);if(_)try{_([],"length")}catch(s){_=null}s.exports=_},30592:(s,i,u)=>{"use strict";var _=u(30655),w=function hasPropertyDescriptors(){return!!_};w.hasArrayLengthDefineBug=function hasArrayLengthDefineBug(){if(!_)return null;try{return 1!==_([],"length",{value:1}).length}catch(s){return!0}},s.exports=w},80024:s=>{"use strict";var i={__proto__:null,foo:{}},u=Object;s.exports=function hasProto(){return{__proto__:i}.foo===i.foo&&!(i instanceof u)}},64039:(s,i,u)=>{"use strict";var _="undefined"!=typeof Symbol&&Symbol,w=u(41333);s.exports=function hasNativeSymbols(){return"function"==typeof _&&("function"==typeof Symbol&&("symbol"==typeof _("foo")&&("symbol"==typeof Symbol("bar")&&w())))}},41333:s=>{"use strict";s.exports=function hasSymbols(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var s={},i=Symbol("test"),u=Object(i);if("string"==typeof i)return!1;if("[object Symbol]"!==Object.prototype.toString.call(i))return!1;if("[object Symbol]"!==Object.prototype.toString.call(u))return!1;for(i in s[i]=42,s)return!1;if("function"==typeof Object.keys&&0!==Object.keys(s).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(s).length)return!1;var _=Object.getOwnPropertySymbols(s);if(1!==_.length||_[0]!==i)return!1;if(!Object.prototype.propertyIsEnumerable.call(s,i))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var w=Object.getOwnPropertyDescriptor(s,i);if(42!==w.value||!0!==w.enumerable)return!1}return!0}},9957:(s,i,u)=>{"use strict";var _=Function.prototype.call,w=Object.prototype.hasOwnProperty,x=u(66743);s.exports=x.call(_,w)},45981:s=>{function deepFreeze(s){return s instanceof Map?s.clear=s.delete=s.set=function(){throw new Error("map is read-only")}:s instanceof Set&&(s.add=s.clear=s.delete=function(){throw new Error("set is read-only")}),Object.freeze(s),Object.getOwnPropertyNames(s).forEach((function(i){var u=s[i];"object"!=typeof u||Object.isFrozen(u)||deepFreeze(u)})),s}var i=deepFreeze,u=deepFreeze;i.default=u;class Response{constructor(s){void 0===s.data&&(s.data={}),this.data=s.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function escapeHTML(s){return s.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function inherit(s,...i){const u=Object.create(null);for(const i in s)u[i]=s[i];return i.forEach((function(s){for(const i in s)u[i]=s[i]})),u}const emitsWrappingTags=s=>!!s.kind;class HTMLRenderer{constructor(s,i){this.buffer="",this.classPrefix=i.classPrefix,s.walk(this)}addText(s){this.buffer+=escapeHTML(s)}openNode(s){if(!emitsWrappingTags(s))return;let i=s.kind;s.sublanguage||(i=`${this.classPrefix}${i}`),this.span(i)}closeNode(s){emitsWrappingTags(s)&&(this.buffer+="")}value(){return this.buffer}span(s){this.buffer+=``}}class TokenTree{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(s){this.top.children.push(s)}openNode(s){const i={kind:s,children:[]};this.add(i),this.stack.push(i)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(s){return this.constructor._walk(s,this.rootNode)}static _walk(s,i){return"string"==typeof i?s.addText(i):i.children&&(s.openNode(i),i.children.forEach((i=>this._walk(s,i))),s.closeNode(i)),s}static _collapse(s){"string"!=typeof s&&s.children&&(s.children.every((s=>"string"==typeof s))?s.children=[s.children.join("")]:s.children.forEach((s=>{TokenTree._collapse(s)})))}}class TokenTreeEmitter extends TokenTree{constructor(s){super(),this.options=s}addKeyword(s,i){""!==s&&(this.openNode(i),this.addText(s),this.closeNode())}addText(s){""!==s&&this.add(s)}addSublanguage(s,i){const u=s.root;u.kind=i,u.sublanguage=!0,this.add(u)}toHTML(){return new HTMLRenderer(this,this.options).value()}finalize(){return!0}}function source(s){return s?"string"==typeof s?s:s.source:null}const _=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;const w="[a-zA-Z]\\w*",x="[a-zA-Z_]\\w*",j="\\b\\d+(\\.\\d+)?",B="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",L="\\b(0b[01]+)",$={begin:"\\\\[\\s\\S]",relevance:0},U={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[$]},Y={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[$]},Z={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},COMMENT=function(s,i,u={}){const _=inherit({className:"comment",begin:s,end:i,contains:[]},u);return _.contains.push(Z),_.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),_},ee=COMMENT("//","$"),ie=COMMENT("/\\*","\\*/"),ae=COMMENT("#","$"),le={className:"number",begin:j,relevance:0},ce={className:"number",begin:B,relevance:0},pe={className:"number",begin:L,relevance:0},de={className:"number",begin:j+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},fe={begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[$,{begin:/\[/,end:/\]/,relevance:0,contains:[$]}]}]},ye={className:"title",begin:w,relevance:0},be={className:"title",begin:x,relevance:0},_e={begin:"\\.\\s*"+x,relevance:0};var we=Object.freeze({__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:w,UNDERSCORE_IDENT_RE:x,NUMBER_RE:j,C_NUMBER_RE:B,BINARY_NUMBER_RE:L,RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(s={})=>{const i=/^#![ ]*\//;return s.binary&&(s.begin=function concat(...s){return s.map((s=>source(s))).join("")}(i,/.*\b/,s.binary,/\b.*/)),inherit({className:"meta",begin:i,end:/$/,relevance:0,"on:begin":(s,i)=>{0!==s.index&&i.ignoreMatch()}},s)},BACKSLASH_ESCAPE:$,APOS_STRING_MODE:U,QUOTE_STRING_MODE:Y,PHRASAL_WORDS_MODE:Z,COMMENT,C_LINE_COMMENT_MODE:ee,C_BLOCK_COMMENT_MODE:ie,HASH_COMMENT_MODE:ae,NUMBER_MODE:le,C_NUMBER_MODE:ce,BINARY_NUMBER_MODE:pe,CSS_NUMBER_MODE:de,REGEXP_MODE:fe,TITLE_MODE:ye,UNDERSCORE_TITLE_MODE:be,METHOD_GUARD:_e,END_SAME_AS_BEGIN:function(s){return Object.assign(s,{"on:begin":(s,i)=>{i.data._beginMatch=s[1]},"on:end":(s,i)=>{i.data._beginMatch!==s[1]&&i.ignoreMatch()}})}});function skipIfhasPrecedingDot(s,i){"."===s.input[s.index-1]&&i.ignoreMatch()}function beginKeywords(s,i){i&&s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",s.__beforeBegin=skipIfhasPrecedingDot,s.keywords=s.keywords||s.beginKeywords,delete s.beginKeywords,void 0===s.relevance&&(s.relevance=0))}function compileIllegal(s,i){Array.isArray(s.illegal)&&(s.illegal=function either(...s){return"("+s.map((s=>source(s))).join("|")+")"}(...s.illegal))}function compileMatch(s,i){if(s.match){if(s.begin||s.end)throw new Error("begin & end are not supported with match");s.begin=s.match,delete s.match}}function compileRelevance(s,i){void 0===s.relevance&&(s.relevance=1)}const Se=["of","and","for","in","not","or","if","then","parent","list","value"],xe="keyword";function compileKeywords(s,i,u=xe){const _={};return"string"==typeof s?compileList(u,s.split(" ")):Array.isArray(s)?compileList(u,s):Object.keys(s).forEach((function(u){Object.assign(_,compileKeywords(s[u],i,u))})),_;function compileList(s,u){i&&(u=u.map((s=>s.toLowerCase()))),u.forEach((function(i){const u=i.split("|");_[u[0]]=[s,scoreForKeyword(u[0],u[1])]}))}}function scoreForKeyword(s,i){return i?Number(i):function commonKeyword(s){return Se.includes(s.toLowerCase())}(s)?0:1}function compileLanguage(s,{plugins:i}){function langRe(i,u){return new RegExp(source(i),"m"+(s.case_insensitive?"i":"")+(u?"g":""))}class MultiRegex{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(s,i){i.position=this.position++,this.matchIndexes[this.matchAt]=i,this.regexes.push([i,s]),this.matchAt+=function countMatchGroups(s){return new RegExp(s.toString()+"|").exec("").length-1}(s)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const s=this.regexes.map((s=>s[1]));this.matcherRe=langRe(function join(s,i="|"){let u=0;return s.map((s=>{u+=1;const i=u;let w=source(s),x="";for(;w.length>0;){const s=_.exec(w);if(!s){x+=w;break}x+=w.substring(0,s.index),w=w.substring(s.index+s[0].length),"\\"===s[0][0]&&s[1]?x+="\\"+String(Number(s[1])+i):(x+=s[0],"("===s[0]&&u++)}return x})).map((s=>`(${s})`)).join(i)}(s),!0),this.lastIndex=0}exec(s){this.matcherRe.lastIndex=this.lastIndex;const i=this.matcherRe.exec(s);if(!i)return null;const u=i.findIndex(((s,i)=>i>0&&void 0!==s)),_=this.matchIndexes[u];return i.splice(0,u),Object.assign(i,_)}}class ResumableMultiRegex{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(s){if(this.multiRegexes[s])return this.multiRegexes[s];const i=new MultiRegex;return this.rules.slice(s).forEach((([s,u])=>i.addRule(s,u))),i.compile(),this.multiRegexes[s]=i,i}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(s,i){this.rules.push([s,i]),"begin"===i.type&&this.count++}exec(s){const i=this.getMatcher(this.regexIndex);i.lastIndex=this.lastIndex;let u=i.exec(s);if(this.resumingScanAtSamePosition())if(u&&u.index===this.lastIndex);else{const i=this.getMatcher(0);i.lastIndex=this.lastIndex+1,u=i.exec(s)}return u&&(this.regexIndex+=u.position+1,this.regexIndex===this.count&&this.considerAll()),u}}if(s.compilerExtensions||(s.compilerExtensions=[]),s.contains&&s.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return s.classNameAliases=inherit(s.classNameAliases||{}),function compileMode(i,u){const _=i;if(i.isCompiled)return _;[compileMatch].forEach((s=>s(i,u))),s.compilerExtensions.forEach((s=>s(i,u))),i.__beforeBegin=null,[beginKeywords,compileIllegal,compileRelevance].forEach((s=>s(i,u))),i.isCompiled=!0;let w=null;if("object"==typeof i.keywords&&(w=i.keywords.$pattern,delete i.keywords.$pattern),i.keywords&&(i.keywords=compileKeywords(i.keywords,s.case_insensitive)),i.lexemes&&w)throw new Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return w=w||i.lexemes||/\w+/,_.keywordPatternRe=langRe(w,!0),u&&(i.begin||(i.begin=/\B|\b/),_.beginRe=langRe(i.begin),i.endSameAsBegin&&(i.end=i.begin),i.end||i.endsWithParent||(i.end=/\B|\b/),i.end&&(_.endRe=langRe(i.end)),_.terminatorEnd=source(i.end)||"",i.endsWithParent&&u.terminatorEnd&&(_.terminatorEnd+=(i.end?"|":"")+u.terminatorEnd)),i.illegal&&(_.illegalRe=langRe(i.illegal)),i.contains||(i.contains=[]),i.contains=[].concat(...i.contains.map((function(s){return function expandOrCloneMode(s){s.variants&&!s.cachedVariants&&(s.cachedVariants=s.variants.map((function(i){return inherit(s,{variants:null},i)})));if(s.cachedVariants)return s.cachedVariants;if(dependencyOnParent(s))return inherit(s,{starts:s.starts?inherit(s.starts):null});if(Object.isFrozen(s))return inherit(s);return s}("self"===s?i:s)}))),i.contains.forEach((function(s){compileMode(s,_)})),i.starts&&compileMode(i.starts,u),_.matcher=function buildModeRegex(s){const i=new ResumableMultiRegex;return s.contains.forEach((s=>i.addRule(s.begin,{rule:s,type:"begin"}))),s.terminatorEnd&&i.addRule(s.terminatorEnd,{type:"end"}),s.illegal&&i.addRule(s.illegal,{type:"illegal"}),i}(_),_}(s)}function dependencyOnParent(s){return!!s&&(s.endsWithParent||dependencyOnParent(s.starts))}function BuildVuePlugin(s){const i={props:["language","code","autodetect"],data:function(){return{detectedLanguage:"",unknownLanguage:!1}},computed:{className(){return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){if(!this.autoDetect&&!s.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`),this.unknownLanguage=!0,escapeHTML(this.code);let i={};return this.autoDetect?(i=s.highlightAuto(this.code),this.detectedLanguage=i.language):(i=s.highlight(this.language,this.code,this.ignoreIllegals),this.detectedLanguage=this.language),i.value},autoDetect(){return!this.language||function hasValueOrEmptyAttribute(s){return Boolean(s||""===s)}(this.autodetect)},ignoreIllegals:()=>!0},render(s){return s("pre",{},[s("code",{class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{Component:i,VuePlugin:{install(s){s.component("highlightjs",i)}}}}const Pe={"after:highlightElement":({el:s,result:i,text:u})=>{const _=nodeStream(s);if(!_.length)return;const w=document.createElement("div");w.innerHTML=i.value,i.value=function mergeStreams(s,i,u){let _=0,w="";const x=[];function selectStream(){return s.length&&i.length?s[0].offset!==i[0].offset?s[0].offset"}function close(s){w+=""}function render(s){("start"===s.event?open:close)(s.node)}for(;s.length||i.length;){let i=selectStream();if(w+=escapeHTML(u.substring(_,i[0].offset)),_=i[0].offset,i===s){x.reverse().forEach(close);do{render(i.splice(0,1)[0]),i=selectStream()}while(i===s&&i.length&&i[0].offset===_);x.reverse().forEach(open)}else"start"===i[0].event?x.push(i[0].node):x.pop(),render(i.splice(0,1)[0])}return w+escapeHTML(u.substr(_))}(_,nodeStream(w),u)}};function tag(s){return s.nodeName.toLowerCase()}function nodeStream(s){const i=[];return function _nodeStream(s,u){for(let _=s.firstChild;_;_=_.nextSibling)3===_.nodeType?u+=_.nodeValue.length:1===_.nodeType&&(i.push({event:"start",offset:u,node:_}),u=_nodeStream(_,u),tag(_).match(/br|hr|img|input/)||i.push({event:"stop",offset:u,node:_}));return u}(s,0),i}const Te={},error=s=>{console.error(s)},warn=(s,...i)=>{console.log(`WARN: ${s}`,...i)},deprecated=(s,i)=>{Te[`${s}/${i}`]||(console.log(`Deprecated as of ${s}. ${i}`),Te[`${s}/${i}`]=!0)},Re=escapeHTML,qe=inherit,$e=Symbol("nomatch");var ze=function(s){const u=Object.create(null),_=Object.create(null),w=[];let x=!0;const j=/(^(<[^>]+>|\t|)+|\n)/gm,B="Could not find the language '{}', did you forget to load/include a language module?",L={disableAutodetect:!0,name:"Plain text",contains:[]};let $={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:TokenTreeEmitter};function shouldNotHighlight(s){return $.noHighlightRe.test(s)}function highlight(s,i,u,_){let w="",x="";"object"==typeof i?(w=s,u=i.ignoreIllegals,x=i.language,_=void 0):(deprecated("10.7.0","highlight(lang, code, ...args) has been deprecated."),deprecated("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),x=s,w=i);const j={code:w,language:x};fire("before:highlight",j);const B=j.result?j.result:_highlight(j.language,j.code,u,_);return B.code=j.code,fire("after:highlight",B),B}function _highlight(s,i,_,j){function keywordData(s,i){const u=U.case_insensitive?i[0].toLowerCase():i[0];return Object.prototype.hasOwnProperty.call(s.keywords,u)&&s.keywords[u]}function processBuffer(){null!=ee.subLanguage?function processSubLanguage(){if(""===le)return;let s=null;if("string"==typeof ee.subLanguage){if(!u[ee.subLanguage])return void ae.addText(le);s=_highlight(ee.subLanguage,le,!0,ie[ee.subLanguage]),ie[ee.subLanguage]=s.top}else s=highlightAuto(le,ee.subLanguage.length?ee.subLanguage:null);ee.relevance>0&&(ce+=s.relevance),ae.addSublanguage(s.emitter,s.language)}():function processKeywords(){if(!ee.keywords)return void ae.addText(le);let s=0;ee.keywordPatternRe.lastIndex=0;let i=ee.keywordPatternRe.exec(le),u="";for(;i;){u+=le.substring(s,i.index);const _=keywordData(ee,i);if(_){const[s,w]=_;if(ae.addText(u),u="",ce+=w,s.startsWith("_"))u+=i[0];else{const u=U.classNameAliases[s]||s;ae.addKeyword(i[0],u)}}else u+=i[0];s=ee.keywordPatternRe.lastIndex,i=ee.keywordPatternRe.exec(le)}u+=le.substr(s),ae.addText(u)}(),le=""}function startNewMode(s){return s.className&&ae.openNode(U.classNameAliases[s.className]||s.className),ee=Object.create(s,{parent:{value:ee}}),ee}function endOfMode(s,i,u){let _=function startsWith(s,i){const u=s&&s.exec(i);return u&&0===u.index}(s.endRe,u);if(_){if(s["on:end"]){const u=new Response(s);s["on:end"](i,u),u.isMatchIgnored&&(_=!1)}if(_){for(;s.endsParent&&s.parent;)s=s.parent;return s}}if(s.endsWithParent)return endOfMode(s.parent,i,u)}function doIgnore(s){return 0===ee.matcher.regexIndex?(le+=s[0],1):(fe=!0,0)}function doBeginMatch(s){const i=s[0],u=s.rule,_=new Response(u),w=[u.__beforeBegin,u["on:begin"]];for(const u of w)if(u&&(u(s,_),_.isMatchIgnored))return doIgnore(i);return u&&u.endSameAsBegin&&(u.endRe=function escape(s){return new RegExp(s.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}(i)),u.skip?le+=i:(u.excludeBegin&&(le+=i),processBuffer(),u.returnBegin||u.excludeBegin||(le=i)),startNewMode(u),u.returnBegin?0:i.length}function doEndMatch(s){const u=s[0],_=i.substr(s.index),w=endOfMode(ee,s,_);if(!w)return $e;const x=ee;x.skip?le+=u:(x.returnEnd||x.excludeEnd||(le+=u),processBuffer(),x.excludeEnd&&(le=u));do{ee.className&&ae.closeNode(),ee.skip||ee.subLanguage||(ce+=ee.relevance),ee=ee.parent}while(ee!==w.parent);return w.starts&&(w.endSameAsBegin&&(w.starts.endRe=w.endRe),startNewMode(w.starts)),x.returnEnd?0:u.length}let L={};function processLexeme(u,w){const j=w&&w[0];if(le+=u,null==j)return processBuffer(),0;if("begin"===L.type&&"end"===w.type&&L.index===w.index&&""===j){if(le+=i.slice(w.index,w.index+1),!x){const i=new Error("0 width match regex");throw i.languageName=s,i.badRule=L.rule,i}return 1}if(L=w,"begin"===w.type)return doBeginMatch(w);if("illegal"===w.type&&!_){const s=new Error('Illegal lexeme "'+j+'" for mode "'+(ee.className||"")+'"');throw s.mode=ee,s}if("end"===w.type){const s=doEndMatch(w);if(s!==$e)return s}if("illegal"===w.type&&""===j)return 1;if(de>1e5&&de>3*w.index){throw new Error("potential infinite loop, way more iterations than matches")}return le+=j,j.length}const U=getLanguage(s);if(!U)throw error(B.replace("{}",s)),new Error('Unknown language: "'+s+'"');const Y=compileLanguage(U,{plugins:w});let Z="",ee=j||Y;const ie={},ae=new $.__emitter($);!function processContinuations(){const s=[];for(let i=ee;i!==U;i=i.parent)i.className&&s.unshift(i.className);s.forEach((s=>ae.openNode(s)))}();let le="",ce=0,pe=0,de=0,fe=!1;try{for(ee.matcher.considerAll();;){de++,fe?fe=!1:ee.matcher.considerAll(),ee.matcher.lastIndex=pe;const s=ee.matcher.exec(i);if(!s)break;const u=processLexeme(i.substring(pe,s.index),s);pe=s.index+u}return processLexeme(i.substr(pe)),ae.closeAllNodes(),ae.finalize(),Z=ae.toHTML(),{relevance:Math.floor(ce),value:Z,language:s,illegal:!1,emitter:ae,top:ee}}catch(u){if(u.message&&u.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:u.message,context:i.slice(pe-100,pe+100),mode:u.mode},sofar:Z,relevance:0,value:Re(i),emitter:ae};if(x)return{illegal:!1,relevance:0,value:Re(i),emitter:ae,language:s,top:ee,errorRaised:u};throw u}}function highlightAuto(s,i){i=i||$.languages||Object.keys(u);const _=function justTextHighlightResult(s){const i={relevance:0,emitter:new $.__emitter($),value:Re(s),illegal:!1,top:L};return i.emitter.addText(s),i}(s),w=i.filter(getLanguage).filter(autoDetection).map((i=>_highlight(i,s,!1)));w.unshift(_);const x=w.sort(((s,i)=>{if(s.relevance!==i.relevance)return i.relevance-s.relevance;if(s.language&&i.language){if(getLanguage(s.language).supersetOf===i.language)return 1;if(getLanguage(i.language).supersetOf===s.language)return-1}return 0})),[j,B]=x,U=j;return U.second_best=B,U}const U={"before:highlightElement":({el:s})=>{$.useBR&&(s.innerHTML=s.innerHTML.replace(/\n/g,"").replace(//g,"\n"))},"after:highlightElement":({result:s})=>{$.useBR&&(s.value=s.value.replace(/\n/g,"
"))}},Y=/^(<[^>]+>|\t)+/gm,Z={"after:highlightElement":({result:s})=>{$.tabReplace&&(s.value=s.value.replace(Y,(s=>s.replace(/\t/g,$.tabReplace))))}};function highlightElement(s){let i=null;const u=function blockLanguage(s){let i=s.className+" ";i+=s.parentNode?s.parentNode.className:"";const u=$.languageDetectRe.exec(i);if(u){const i=getLanguage(u[1]);return i||(warn(B.replace("{}",u[1])),warn("Falling back to no-highlight mode for this block.",s)),i?u[1]:"no-highlight"}return i.split(/\s+/).find((s=>shouldNotHighlight(s)||getLanguage(s)))}(s);if(shouldNotHighlight(u))return;fire("before:highlightElement",{el:s,language:u}),i=s;const w=i.textContent,x=u?highlight(w,{language:u,ignoreIllegals:!0}):highlightAuto(w);fire("after:highlightElement",{el:s,result:x,text:w}),s.innerHTML=x.value,function updateClassName(s,i,u){const w=i?_[i]:u;s.classList.add("hljs"),w&&s.classList.add(w)}(s,u,x.language),s.result={language:x.language,re:x.relevance,relavance:x.relevance},x.second_best&&(s.second_best={language:x.second_best.language,re:x.second_best.relevance,relavance:x.second_best.relevance})}const initHighlighting=()=>{if(initHighlighting.called)return;initHighlighting.called=!0,deprecated("10.6.0","initHighlighting() is deprecated. Use highlightAll() instead.");document.querySelectorAll("pre code").forEach(highlightElement)};let ee=!1;function highlightAll(){if("loading"===document.readyState)return void(ee=!0);document.querySelectorAll("pre code").forEach(highlightElement)}function getLanguage(s){return s=(s||"").toLowerCase(),u[s]||u[_[s]]}function registerAliases(s,{languageName:i}){"string"==typeof s&&(s=[s]),s.forEach((s=>{_[s.toLowerCase()]=i}))}function autoDetection(s){const i=getLanguage(s);return i&&!i.disableAutodetect}function fire(s,i){const u=s;w.forEach((function(s){s[u]&&s[u](i)}))}"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(function boot(){ee&&highlightAll()}),!1),Object.assign(s,{highlight,highlightAuto,highlightAll,fixMarkup:function deprecateFixMarkup(s){return deprecated("10.2.0","fixMarkup will be removed entirely in v11.0"),deprecated("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"),function fixMarkup(s){return $.tabReplace||$.useBR?s.replace(j,(s=>"\n"===s?$.useBR?"
":s:$.tabReplace?s.replace(/\t/g,$.tabReplace):s)):s}(s)},highlightElement,highlightBlock:function deprecateHighlightBlock(s){return deprecated("10.7.0","highlightBlock will be removed entirely in v12.0"),deprecated("10.7.0","Please use highlightElement now."),highlightElement(s)},configure:function configure(s){s.useBR&&(deprecated("10.3.0","'useBR' will be removed entirely in v11.0"),deprecated("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")),$=qe($,s)},initHighlighting,initHighlightingOnLoad:function initHighlightingOnLoad(){deprecated("10.6.0","initHighlightingOnLoad() is deprecated. Use highlightAll() instead."),ee=!0},registerLanguage:function registerLanguage(i,_){let w=null;try{w=_(s)}catch(s){if(error("Language definition for '{}' could not be registered.".replace("{}",i)),!x)throw s;error(s),w=L}w.name||(w.name=i),u[i]=w,w.rawDefinition=_.bind(null,s),w.aliases&®isterAliases(w.aliases,{languageName:i})},unregisterLanguage:function unregisterLanguage(s){delete u[s];for(const i of Object.keys(_))_[i]===s&&delete _[i]},listLanguages:function listLanguages(){return Object.keys(u)},getLanguage,registerAliases,requireLanguage:function requireLanguage(s){deprecated("10.4.0","requireLanguage will be removed entirely in v11."),deprecated("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844");const i=getLanguage(s);if(i)return i;throw new Error("The '{}' language is required, but not loaded.".replace("{}",s))},autoDetection,inherit:qe,addPlugin:function addPlugin(s){!function upgradePluginAPI(s){s["before:highlightBlock"]&&!s["before:highlightElement"]&&(s["before:highlightElement"]=i=>{s["before:highlightBlock"](Object.assign({block:i.el},i))}),s["after:highlightBlock"]&&!s["after:highlightElement"]&&(s["after:highlightElement"]=i=>{s["after:highlightBlock"](Object.assign({block:i.el},i))})}(s),w.push(s)},vuePlugin:BuildVuePlugin(s).VuePlugin}),s.debugMode=function(){x=!1},s.safeMode=function(){x=!0},s.versionString="10.7.3";for(const s in we)"object"==typeof we[s]&&i(we[s]);return Object.assign(s,we),s.addPlugin(U),s.addPlugin(Pe),s.addPlugin(Z),s}({});s.exports=ze},35344:s=>{function concat(...s){return s.map((s=>function source(s){return s?"string"==typeof s?s:s.source:null}(s))).join("")}s.exports=function bash(s){const i={},u={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[i]}]};Object.assign(i,{className:"variable",variants:[{begin:concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},u]});const _={className:"subst",begin:/\$\(/,end:/\)/,contains:[s.BACKSLASH_ESCAPE]},w={begin:/<<-?\s*(?=\w+)/,starts:{contains:[s.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},x={className:"string",begin:/"/,end:/"/,contains:[s.BACKSLASH_ESCAPE,i,_]};_.contains.push(x);const j={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},s.NUMBER_MODE,i]},B=s.SHEBANG({binary:`(${["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"].join("|")})`,relevance:10}),L={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[s.inherit(s.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp"},contains:[B,s.SHEBANG(),L,j,s.HASH_COMMENT_MODE,w,x,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},i]}}},73402:s=>{function concat(...s){return s.map((s=>function source(s){return s?"string"==typeof s?s:s.source:null}(s))).join("")}s.exports=function http(s){const i="HTTP/(2|1\\.[01])",u={className:"attribute",begin:concat("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]}},_=[u,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+i+" \\d{3})",end:/$/,contains:[{className:"meta",begin:i},{className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:_}},{begin:"(?=^[A-Z]+ (.*?) "+i+"$)",end:/$/,contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:i},{className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:_}},s.inherit(u,{relevance:0})]}}},95089:s=>{const i="[A-Za-z$_][0-9A-Za-z$_]*",u=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],_=["true","false","null","undefined","NaN","Infinity"],w=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function lookahead(s){return concat("(?=",s,")")}function concat(...s){return s.map((s=>function source(s){return s?"string"==typeof s?s:s.source:null}(s))).join("")}s.exports=function javascript(s){const x=i,j="<>",B="",L={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(s,i)=>{const u=s[0].length+s.index,_=s.input[u];"<"!==_?">"===_&&(((s,{after:i})=>{const u="",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:s.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:$,contains:ye}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:j,end:B},{begin:L.begin,"on:begin":L.isTrulyOpeningTag,end:L.end}],subLanguage:"xml",contains:[{begin:L.begin,end:L.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:$,contains:["self",s.inherit(s.TITLE_MODE,{begin:x}),be],illegal:/%/},{beginKeywords:"while if switch catch for"},{className:"function",begin:s.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,contains:[be,s.inherit(s.TITLE_MODE,{begin:x})]},{variants:[{begin:"\\."+x},{begin:"\\$"+x}],relevance:0},{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{beginKeywords:"extends"},s.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/,end:/[{;]/,excludeEnd:!0,contains:[s.inherit(s.TITLE_MODE,{begin:x}),"self",be]},{begin:"(get|set)\\s+(?="+x+"\\()",end:/\{/,keywords:"get set",contains:[s.inherit(s.TITLE_MODE,{begin:x}),{begin:/\(\)/},be]},{begin:/\$[(.]/}]}}},65772:s=>{s.exports=function json(s){const i={literal:"true false null"},u=[s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE],_=[s.QUOTE_STRING_MODE,s.C_NUMBER_MODE],w={end:",",endsWithParent:!0,excludeEnd:!0,contains:_,keywords:i},x={begin:/\{/,end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/,contains:[s.BACKSLASH_ESCAPE],illegal:"\\n"},s.inherit(w,{begin:/:/})].concat(u),illegal:"\\S"},j={begin:"\\[",end:"\\]",contains:[s.inherit(w)],illegal:"\\S"};return _.push(x,j),u.forEach((function(s){_.push(s)})),{name:"JSON",contains:_,keywords:i,illegal:"\\S"}}},26571:s=>{s.exports=function powershell(s){const i={$pattern:/-?[A-z\.\-]+\b/,keyword:"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter",built_in:"ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write"},u={begin:"`[\\s\\S]",relevance:0},_={className:"variable",variants:[{begin:/\$\B/},{className:"keyword",begin:/\$this/},{begin:/\$[\w\d][\w\d_:]*/}]},w={className:"string",variants:[{begin:/"/,end:/"/},{begin:/@"/,end:/^"@/}],contains:[u,_,{className:"variable",begin:/\$[A-z]/,end:/[^A-z]/}]},x={className:"string",variants:[{begin:/'/,end:/'/},{begin:/@'/,end:/^'@/}]},j=s.inherit(s.COMMENT(null,null),{variants:[{begin:/#/,end:/$/},{begin:/<#/,end:/#>/}],contains:[{className:"doctag",variants:[{begin:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{begin:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]}]}),B={className:"built_in",variants:[{begin:"(".concat("Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|Mount|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Build|Complete|Confirm|Deny|Deploy|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where",")+(-)[\\w\\d]+")}]},L={className:"class",beginKeywords:"class enum",end:/\s*[{]/,excludeEnd:!0,relevance:0,contains:[s.TITLE_MODE]},$={className:"function",begin:/function\s+/,end:/\s*\{|$/,excludeEnd:!0,returnBegin:!0,relevance:0,contains:[{begin:"function",relevance:0,className:"keyword"},{className:"title",begin:/\w[\w\d]*((-)[\w\d]+)*/,relevance:0},{begin:/\(/,end:/\)/,className:"params",relevance:0,contains:[_]}]},U={begin:/using\s/,end:/$/,returnBegin:!0,contains:[w,x,{className:"keyword",begin:/(using|assembly|command|module|namespace|type)/}]},Y={variants:[{className:"operator",begin:"(".concat("-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor",")\\b")},{className:"literal",begin:/(-)[\w\d]+/,relevance:0}]},Z={className:"function",begin:/\[.*\]\s*[\w]+[ ]??\(/,end:/$/,returnBegin:!0,relevance:0,contains:[{className:"keyword",begin:"(".concat(i.keyword.toString().replace(/\s/g,"|"),")\\b"),endsParent:!0,relevance:0},s.inherit(s.TITLE_MODE,{endsParent:!0})]},ee=[Z,j,u,s.NUMBER_MODE,w,x,B,_,{className:"literal",begin:/\$(null|true|false)\b/},{className:"selector-tag",begin:/@\B/,relevance:0}],ie={begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[].concat("self",ee,{begin:"("+["string","char","byte","int","long","bool","decimal","single","double","DateTime","xml","array","hashtable","void"].join("|")+")",className:"built_in",relevance:0},{className:"type",begin:/[\.\w\d]+/,relevance:0})};return Z.contains.unshift(ie),{name:"PowerShell",aliases:["ps","ps1"],case_insensitive:!0,keywords:i,contains:ee.concat(L,$,U,Y,ie)}}},17285:s=>{function source(s){return s?"string"==typeof s?s:s.source:null}function lookahead(s){return concat("(?=",s,")")}function concat(...s){return s.map((s=>source(s))).join("")}function either(...s){return"("+s.map((s=>source(s))).join("|")+")"}s.exports=function xml(s){const i=concat(/[A-Z_]/,function optional(s){return concat("(",s,")?")}(/[A-Z0-9_.-]*:/),/[A-Z0-9_.-]*/),u={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},_={begin:/\s/,contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},w=s.inherit(_,{begin:/\(/,end:/\)/}),x=s.inherit(s.APOS_STRING_MODE,{className:"meta-string"}),j=s.inherit(s.QUOTE_STRING_MODE,{className:"meta-string"}),B={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin://,relevance:10,contains:[_,j,x,w,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[_,w,j,x]}]}]},s.COMMENT(//,{relevance:10}),{begin://,relevance:10},u,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[B],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[B],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:i,relevance:0,starts:B}]},{className:"tag",begin:concat(/<\//,lookahead(concat(i,/>/))),contains:[{className:"name",begin:i,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}},17533:s=>{s.exports=function yaml(s){var i="true false yes no null",u="[\\w#;/?:@&=+$,.~*'()[\\]]+",_={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[s.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},w=s.inherit(_,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),x={className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},j={end:",",endsWithParent:!0,excludeEnd:!0,keywords:i,relevance:0},B={begin:/\{/,end:/\}/,contains:[j],illegal:"\\n",relevance:0},L={begin:"\\[",end:"\\]",contains:[j],illegal:"\\n",relevance:0},$=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+u},{className:"type",begin:"!<"+u+">"},{className:"type",begin:"!"+u},{className:"type",begin:"!!"+u},{className:"meta",begin:"&"+s.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+s.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},s.HASH_COMMENT_MODE,{beginKeywords:i,keywords:{literal:i}},x,{className:"number",begin:s.C_NUMBER_RE+"\\b",relevance:0},B,L,_],U=[...$];return U.pop(),U.push(w),j.contains=U,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:$}}},251:(s,i)=>{i.read=function(s,i,u,_,w){var x,j,B=8*w-_-1,L=(1<>1,U=-7,Y=u?w-1:0,Z=u?-1:1,ee=s[i+Y];for(Y+=Z,x=ee&(1<<-U)-1,ee>>=-U,U+=B;U>0;x=256*x+s[i+Y],Y+=Z,U-=8);for(j=x&(1<<-U)-1,x>>=-U,U+=_;U>0;j=256*j+s[i+Y],Y+=Z,U-=8);if(0===x)x=1-$;else{if(x===L)return j?NaN:1/0*(ee?-1:1);j+=Math.pow(2,_),x-=$}return(ee?-1:1)*j*Math.pow(2,x-_)},i.write=function(s,i,u,_,w,x){var j,B,L,$=8*x-w-1,U=(1<<$)-1,Y=U>>1,Z=23===w?Math.pow(2,-24)-Math.pow(2,-77):0,ee=_?0:x-1,ie=_?1:-1,ae=i<0||0===i&&1/i<0?1:0;for(i=Math.abs(i),isNaN(i)||i===1/0?(B=isNaN(i)?1:0,j=U):(j=Math.floor(Math.log(i)/Math.LN2),i*(L=Math.pow(2,-j))<1&&(j--,L*=2),(i+=j+Y>=1?Z/L:Z*Math.pow(2,1-Y))*L>=2&&(j++,L/=2),j+Y>=U?(B=0,j=U):j+Y>=1?(B=(i*L-1)*Math.pow(2,w),j+=Y):(B=i*Math.pow(2,Y-1)*Math.pow(2,w),j=0));w>=8;s[u+ee]=255&B,ee+=ie,B/=256,w-=8);for(j=j<0;s[u+ee]=255&j,ee+=ie,j/=256,$-=8);s[u+ee-ie]|=128*ae}},9404:function(s){s.exports=function(){"use strict";var s=Array.prototype.slice;function createClass(s,i){i&&(s.prototype=Object.create(i.prototype)),s.prototype.constructor=s}function Iterable(s){return isIterable(s)?s:Seq(s)}function KeyedIterable(s){return isKeyed(s)?s:KeyedSeq(s)}function IndexedIterable(s){return isIndexed(s)?s:IndexedSeq(s)}function SetIterable(s){return isIterable(s)&&!isAssociative(s)?s:SetSeq(s)}function isIterable(s){return!(!s||!s[i])}function isKeyed(s){return!(!s||!s[u])}function isIndexed(s){return!(!s||!s[_])}function isAssociative(s){return isKeyed(s)||isIndexed(s)}function isOrdered(s){return!(!s||!s[w])}createClass(KeyedIterable,Iterable),createClass(IndexedIterable,Iterable),createClass(SetIterable,Iterable),Iterable.isIterable=isIterable,Iterable.isKeyed=isKeyed,Iterable.isIndexed=isIndexed,Iterable.isAssociative=isAssociative,Iterable.isOrdered=isOrdered,Iterable.Keyed=KeyedIterable,Iterable.Indexed=IndexedIterable,Iterable.Set=SetIterable;var i="@@__IMMUTABLE_ITERABLE__@@",u="@@__IMMUTABLE_KEYED__@@",_="@@__IMMUTABLE_INDEXED__@@",w="@@__IMMUTABLE_ORDERED__@@",x="delete",j=5,B=1<>>0;if(""+u!==i||4294967295===u)return NaN;i=u}return i<0?ensureSize(s)+i:i}function returnTrue(){return!0}function wholeSlice(s,i,u){return(0===s||void 0!==u&&s<=-u)&&(void 0===i||void 0!==u&&i>=u)}function resolveBegin(s,i){return resolveIndex(s,i,0)}function resolveEnd(s,i){return resolveIndex(s,i,i)}function resolveIndex(s,i,u){return void 0===s?u:s<0?Math.max(0,i+s):void 0===i?s:Math.min(i,s)}var Z=0,ee=1,ie=2,ae="function"==typeof Symbol&&Symbol.iterator,le="@@iterator",ce=ae||le;function Iterator(s){this.next=s}function iteratorValue(s,i,u,_){var w=0===s?i:1===s?u:[i,u];return _?_.value=w:_={value:w,done:!1},_}function iteratorDone(){return{value:void 0,done:!0}}function hasIterator(s){return!!getIteratorFn(s)}function isIterator(s){return s&&"function"==typeof s.next}function getIterator(s){var i=getIteratorFn(s);return i&&i.call(s)}function getIteratorFn(s){var i=s&&(ae&&s[ae]||s[le]);if("function"==typeof i)return i}function isArrayLike(s){return s&&"number"==typeof s.length}function Seq(s){return null==s?emptySequence():isIterable(s)?s.toSeq():seqFromValue(s)}function KeyedSeq(s){return null==s?emptySequence().toKeyedSeq():isIterable(s)?isKeyed(s)?s.toSeq():s.fromEntrySeq():keyedSeqFromValue(s)}function IndexedSeq(s){return null==s?emptySequence():isIterable(s)?isKeyed(s)?s.entrySeq():s.toIndexedSeq():indexedSeqFromValue(s)}function SetSeq(s){return(null==s?emptySequence():isIterable(s)?isKeyed(s)?s.entrySeq():s:indexedSeqFromValue(s)).toSetSeq()}Iterator.prototype.toString=function(){return"[Iterator]"},Iterator.KEYS=Z,Iterator.VALUES=ee,Iterator.ENTRIES=ie,Iterator.prototype.inspect=Iterator.prototype.toSource=function(){return this.toString()},Iterator.prototype[ce]=function(){return this},createClass(Seq,Iterable),Seq.of=function(){return Seq(arguments)},Seq.prototype.toSeq=function(){return this},Seq.prototype.toString=function(){return this.__toString("Seq {","}")},Seq.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},Seq.prototype.__iterate=function(s,i){return seqIterate(this,s,i,!0)},Seq.prototype.__iterator=function(s,i){return seqIterator(this,s,i,!0)},createClass(KeyedSeq,Seq),KeyedSeq.prototype.toKeyedSeq=function(){return this},createClass(IndexedSeq,Seq),IndexedSeq.of=function(){return IndexedSeq(arguments)},IndexedSeq.prototype.toIndexedSeq=function(){return this},IndexedSeq.prototype.toString=function(){return this.__toString("Seq [","]")},IndexedSeq.prototype.__iterate=function(s,i){return seqIterate(this,s,i,!1)},IndexedSeq.prototype.__iterator=function(s,i){return seqIterator(this,s,i,!1)},createClass(SetSeq,Seq),SetSeq.of=function(){return SetSeq(arguments)},SetSeq.prototype.toSetSeq=function(){return this},Seq.isSeq=isSeq,Seq.Keyed=KeyedSeq,Seq.Set=SetSeq,Seq.Indexed=IndexedSeq;var pe,de,fe,ye="@@__IMMUTABLE_SEQ__@@";function ArraySeq(s){this._array=s,this.size=s.length}function ObjectSeq(s){var i=Object.keys(s);this._object=s,this._keys=i,this.size=i.length}function IterableSeq(s){this._iterable=s,this.size=s.length||s.size}function IteratorSeq(s){this._iterator=s,this._iteratorCache=[]}function isSeq(s){return!(!s||!s[ye])}function emptySequence(){return pe||(pe=new ArraySeq([]))}function keyedSeqFromValue(s){var i=Array.isArray(s)?new ArraySeq(s).fromEntrySeq():isIterator(s)?new IteratorSeq(s).fromEntrySeq():hasIterator(s)?new IterableSeq(s).fromEntrySeq():"object"==typeof s?new ObjectSeq(s):void 0;if(!i)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+s);return i}function indexedSeqFromValue(s){var i=maybeIndexedSeqFromValue(s);if(!i)throw new TypeError("Expected Array or iterable object of values: "+s);return i}function seqFromValue(s){var i=maybeIndexedSeqFromValue(s)||"object"==typeof s&&new ObjectSeq(s);if(!i)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+s);return i}function maybeIndexedSeqFromValue(s){return isArrayLike(s)?new ArraySeq(s):isIterator(s)?new IteratorSeq(s):hasIterator(s)?new IterableSeq(s):void 0}function seqIterate(s,i,u,_){var w=s._cache;if(w){for(var x=w.length-1,j=0;j<=x;j++){var B=w[u?x-j:j];if(!1===i(B[1],_?B[0]:j,s))return j+1}return j}return s.__iterateUncached(i,u)}function seqIterator(s,i,u,_){var w=s._cache;if(w){var x=w.length-1,j=0;return new Iterator((function(){var s=w[u?x-j:j];return j++>x?iteratorDone():iteratorValue(i,_?s[0]:j-1,s[1])}))}return s.__iteratorUncached(i,u)}function fromJS(s,i){return i?fromJSWith(i,s,"",{"":s}):fromJSDefault(s)}function fromJSWith(s,i,u,_){return Array.isArray(i)?s.call(_,u,IndexedSeq(i).map((function(u,_){return fromJSWith(s,u,_,i)}))):isPlainObj(i)?s.call(_,u,KeyedSeq(i).map((function(u,_){return fromJSWith(s,u,_,i)}))):i}function fromJSDefault(s){return Array.isArray(s)?IndexedSeq(s).map(fromJSDefault).toList():isPlainObj(s)?KeyedSeq(s).map(fromJSDefault).toMap():s}function isPlainObj(s){return s&&(s.constructor===Object||void 0===s.constructor)}function is(s,i){if(s===i||s!=s&&i!=i)return!0;if(!s||!i)return!1;if("function"==typeof s.valueOf&&"function"==typeof i.valueOf){if((s=s.valueOf())===(i=i.valueOf())||s!=s&&i!=i)return!0;if(!s||!i)return!1}return!("function"!=typeof s.equals||"function"!=typeof i.equals||!s.equals(i))}function deepEqual(s,i){if(s===i)return!0;if(!isIterable(i)||void 0!==s.size&&void 0!==i.size&&s.size!==i.size||void 0!==s.__hash&&void 0!==i.__hash&&s.__hash!==i.__hash||isKeyed(s)!==isKeyed(i)||isIndexed(s)!==isIndexed(i)||isOrdered(s)!==isOrdered(i))return!1;if(0===s.size&&0===i.size)return!0;var u=!isAssociative(s);if(isOrdered(s)){var _=s.entries();return i.every((function(s,i){var w=_.next().value;return w&&is(w[1],s)&&(u||is(w[0],i))}))&&_.next().done}var w=!1;if(void 0===s.size)if(void 0===i.size)"function"==typeof s.cacheResult&&s.cacheResult();else{w=!0;var x=s;s=i,i=x}var j=!0,B=i.__iterate((function(i,_){if(u?!s.has(i):w?!is(i,s.get(_,$)):!is(s.get(_,$),i))return j=!1,!1}));return j&&s.size===B}function Repeat(s,i){if(!(this instanceof Repeat))return new Repeat(s,i);if(this._value=s,this.size=void 0===i?1/0:Math.max(0,i),0===this.size){if(de)return de;de=this}}function invariant(s,i){if(!s)throw new Error(i)}function Range(s,i,u){if(!(this instanceof Range))return new Range(s,i,u);if(invariant(0!==u,"Cannot step a Range by 0"),s=s||0,void 0===i&&(i=1/0),u=void 0===u?1:Math.abs(u),i_?iteratorDone():iteratorValue(s,w,u[i?_-w++:w++])}))},createClass(ObjectSeq,KeyedSeq),ObjectSeq.prototype.get=function(s,i){return void 0===i||this.has(s)?this._object[s]:i},ObjectSeq.prototype.has=function(s){return this._object.hasOwnProperty(s)},ObjectSeq.prototype.__iterate=function(s,i){for(var u=this._object,_=this._keys,w=_.length-1,x=0;x<=w;x++){var j=_[i?w-x:x];if(!1===s(u[j],j,this))return x+1}return x},ObjectSeq.prototype.__iterator=function(s,i){var u=this._object,_=this._keys,w=_.length-1,x=0;return new Iterator((function(){var j=_[i?w-x:x];return x++>w?iteratorDone():iteratorValue(s,j,u[j])}))},ObjectSeq.prototype[w]=!0,createClass(IterableSeq,IndexedSeq),IterableSeq.prototype.__iterateUncached=function(s,i){if(i)return this.cacheResult().__iterate(s,i);var u=getIterator(this._iterable),_=0;if(isIterator(u))for(var w;!(w=u.next()).done&&!1!==s(w.value,_++,this););return _},IterableSeq.prototype.__iteratorUncached=function(s,i){if(i)return this.cacheResult().__iterator(s,i);var u=getIterator(this._iterable);if(!isIterator(u))return new Iterator(iteratorDone);var _=0;return new Iterator((function(){var i=u.next();return i.done?i:iteratorValue(s,_++,i.value)}))},createClass(IteratorSeq,IndexedSeq),IteratorSeq.prototype.__iterateUncached=function(s,i){if(i)return this.cacheResult().__iterate(s,i);for(var u,_=this._iterator,w=this._iteratorCache,x=0;x=_.length){var i=u.next();if(i.done)return i;_[w]=i.value}return iteratorValue(s,w,_[w++])}))},createClass(Repeat,IndexedSeq),Repeat.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},Repeat.prototype.get=function(s,i){return this.has(s)?this._value:i},Repeat.prototype.includes=function(s){return is(this._value,s)},Repeat.prototype.slice=function(s,i){var u=this.size;return wholeSlice(s,i,u)?this:new Repeat(this._value,resolveEnd(i,u)-resolveBegin(s,u))},Repeat.prototype.reverse=function(){return this},Repeat.prototype.indexOf=function(s){return is(this._value,s)?0:-1},Repeat.prototype.lastIndexOf=function(s){return is(this._value,s)?this.size:-1},Repeat.prototype.__iterate=function(s,i){for(var u=0;u=0&&i=0&&uu?iteratorDone():iteratorValue(s,x++,j)}))},Range.prototype.equals=function(s){return s instanceof Range?this._start===s._start&&this._end===s._end&&this._step===s._step:deepEqual(this,s)},createClass(Collection,Iterable),createClass(KeyedCollection,Collection),createClass(IndexedCollection,Collection),createClass(SetCollection,Collection),Collection.Keyed=KeyedCollection,Collection.Indexed=IndexedCollection,Collection.Set=SetCollection;var be="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function imul(s,i){var u=65535&(s|=0),_=65535&(i|=0);return u*_+((s>>>16)*_+u*(i>>>16)<<16>>>0)|0};function smi(s){return s>>>1&1073741824|3221225471&s}function hash(s){if(!1===s||null==s)return 0;if("function"==typeof s.valueOf&&(!1===(s=s.valueOf())||null==s))return 0;if(!0===s)return 1;var i=typeof s;if("number"===i){if(s!=s||s===1/0)return 0;var u=0|s;for(u!==s&&(u^=4294967295*s);s>4294967295;)u^=s/=4294967295;return smi(u)}if("string"===i)return s.length>Re?cachedHashString(s):hashString(s);if("function"==typeof s.hashCode)return s.hashCode();if("object"===i)return hashJSObj(s);if("function"==typeof s.toString)return hashString(s.toString());throw new Error("Value type "+i+" cannot be hashed.")}function cachedHashString(s){var i=ze[s];return void 0===i&&(i=hashString(s),$e===qe&&($e=0,ze={}),$e++,ze[s]=i),i}function hashString(s){for(var i=0,u=0;u0)switch(s.nodeType){case 1:return s.uniqueID;case 9:return s.documentElement&&s.documentElement.uniqueID}}var Se,xe="function"==typeof WeakMap;xe&&(Se=new WeakMap);var Pe=0,Te="__immutablehash__";"function"==typeof Symbol&&(Te=Symbol(Te));var Re=16,qe=255,$e=0,ze={};function assertNotInfinite(s){invariant(s!==1/0,"Cannot perform this action with an infinite size.")}function Map(s){return null==s?emptyMap():isMap(s)&&!isOrdered(s)?s:emptyMap().withMutations((function(i){var u=KeyedIterable(s);assertNotInfinite(u.size),u.forEach((function(s,u){return i.set(u,s)}))}))}function isMap(s){return!(!s||!s[He])}createClass(Map,KeyedCollection),Map.of=function(){var i=s.call(arguments,0);return emptyMap().withMutations((function(s){for(var u=0;u=i.length)throw new Error("Missing value for key: "+i[u]);s.set(i[u],i[u+1])}}))},Map.prototype.toString=function(){return this.__toString("Map {","}")},Map.prototype.get=function(s,i){return this._root?this._root.get(0,void 0,s,i):i},Map.prototype.set=function(s,i){return updateMap(this,s,i)},Map.prototype.setIn=function(s,i){return this.updateIn(s,$,(function(){return i}))},Map.prototype.remove=function(s){return updateMap(this,s,$)},Map.prototype.deleteIn=function(s){return this.updateIn(s,(function(){return $}))},Map.prototype.update=function(s,i,u){return 1===arguments.length?s(this):this.updateIn([s],i,u)},Map.prototype.updateIn=function(s,i,u){u||(u=i,i=void 0);var _=updateInDeepMap(this,forceIterator(s),i,u);return _===$?void 0:_},Map.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):emptyMap()},Map.prototype.merge=function(){return mergeIntoMapWith(this,void 0,arguments)},Map.prototype.mergeWith=function(i){return mergeIntoMapWith(this,i,s.call(arguments,1))},Map.prototype.mergeIn=function(i){var u=s.call(arguments,1);return this.updateIn(i,emptyMap(),(function(s){return"function"==typeof s.merge?s.merge.apply(s,u):u[u.length-1]}))},Map.prototype.mergeDeep=function(){return mergeIntoMapWith(this,deepMerger,arguments)},Map.prototype.mergeDeepWith=function(i){var u=s.call(arguments,1);return mergeIntoMapWith(this,deepMergerWith(i),u)},Map.prototype.mergeDeepIn=function(i){var u=s.call(arguments,1);return this.updateIn(i,emptyMap(),(function(s){return"function"==typeof s.mergeDeep?s.mergeDeep.apply(s,u):u[u.length-1]}))},Map.prototype.sort=function(s){return OrderedMap(sortFactory(this,s))},Map.prototype.sortBy=function(s,i){return OrderedMap(sortFactory(this,i,s))},Map.prototype.withMutations=function(s){var i=this.asMutable();return s(i),i.wasAltered()?i.__ensureOwner(this.__ownerID):this},Map.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new OwnerID)},Map.prototype.asImmutable=function(){return this.__ensureOwner()},Map.prototype.wasAltered=function(){return this.__altered},Map.prototype.__iterator=function(s,i){return new MapIterator(this,s,i)},Map.prototype.__iterate=function(s,i){var u=this,_=0;return this._root&&this._root.iterate((function(i){return _++,s(i[1],i[0],u)}),i),_},Map.prototype.__ensureOwner=function(s){return s===this.__ownerID?this:s?makeMap(this.size,this._root,s,this.__hash):(this.__ownerID=s,this.__altered=!1,this)},Map.isMap=isMap;var We,He="@@__IMMUTABLE_MAP__@@",Xe=Map.prototype;function ArrayMapNode(s,i){this.ownerID=s,this.entries=i}function BitmapIndexedNode(s,i,u){this.ownerID=s,this.bitmap=i,this.nodes=u}function HashArrayMapNode(s,i,u){this.ownerID=s,this.count=i,this.nodes=u}function HashCollisionNode(s,i,u){this.ownerID=s,this.keyHash=i,this.entries=u}function ValueNode(s,i,u){this.ownerID=s,this.keyHash=i,this.entry=u}function MapIterator(s,i,u){this._type=i,this._reverse=u,this._stack=s._root&&mapIteratorFrame(s._root)}function mapIteratorValue(s,i){return iteratorValue(s,i[0],i[1])}function mapIteratorFrame(s,i){return{node:s,index:0,__prev:i}}function makeMap(s,i,u,_){var w=Object.create(Xe);return w.size=s,w._root=i,w.__ownerID=u,w.__hash=_,w.__altered=!1,w}function emptyMap(){return We||(We=makeMap(0))}function updateMap(s,i,u){var _,w;if(s._root){var x=MakeRef(U),j=MakeRef(Y);if(_=updateNode(s._root,s.__ownerID,0,void 0,i,u,x,j),!j.value)return s;w=s.size+(x.value?u===$?-1:1:0)}else{if(u===$)return s;w=1,_=new ArrayMapNode(s.__ownerID,[[i,u]])}return s.__ownerID?(s.size=w,s._root=_,s.__hash=void 0,s.__altered=!0,s):_?makeMap(w,_):emptyMap()}function updateNode(s,i,u,_,w,x,j,B){return s?s.update(i,u,_,w,x,j,B):x===$?s:(SetRef(B),SetRef(j),new ValueNode(i,_,[w,x]))}function isLeafNode(s){return s.constructor===ValueNode||s.constructor===HashCollisionNode}function mergeIntoNode(s,i,u,_,w){if(s.keyHash===_)return new HashCollisionNode(i,_,[s.entry,w]);var x,B=(0===u?s.keyHash:s.keyHash>>>u)&L,$=(0===u?_:_>>>u)&L;return new BitmapIndexedNode(i,1<>>=1)j[L]=1&u?i[x++]:void 0;return j[_]=w,new HashArrayMapNode(s,x+1,j)}function mergeIntoMapWith(s,i,u){for(var _=[],w=0;w>1&1431655765))+(s>>2&858993459))+(s>>4)&252645135,s+=s>>8,127&(s+=s>>16)}function setIn(s,i,u,_){var w=_?s:arrCopy(s);return w[i]=u,w}function spliceIn(s,i,u,_){var w=s.length+1;if(_&&i+1===w)return s[i]=u,s;for(var x=new Array(w),j=0,B=0;B=Ye)return createNodes(s,L,_,w);var ee=s&&s===this.ownerID,ie=ee?L:arrCopy(L);return Z?B?U===Y-1?ie.pop():ie[U]=ie.pop():ie[U]=[_,w]:ie.push([_,w]),ee?(this.entries=ie,this):new ArrayMapNode(s,ie)}},BitmapIndexedNode.prototype.get=function(s,i,u,_){void 0===i&&(i=hash(u));var w=1<<((0===s?i:i>>>s)&L),x=this.bitmap;return 0==(x&w)?_:this.nodes[popCount(x&w-1)].get(s+j,i,u,_)},BitmapIndexedNode.prototype.update=function(s,i,u,_,w,x,B){void 0===u&&(u=hash(_));var U=(0===i?u:u>>>i)&L,Y=1<=Qe)return expandNodes(s,ae,Z,U,ce);if(ee&&!ce&&2===ae.length&&isLeafNode(ae[1^ie]))return ae[1^ie];if(ee&&ce&&1===ae.length&&isLeafNode(ce))return ce;var pe=s&&s===this.ownerID,de=ee?ce?Z:Z^Y:Z|Y,fe=ee?ce?setIn(ae,ie,ce,pe):spliceOut(ae,ie,pe):spliceIn(ae,ie,ce,pe);return pe?(this.bitmap=de,this.nodes=fe,this):new BitmapIndexedNode(s,de,fe)},HashArrayMapNode.prototype.get=function(s,i,u,_){void 0===i&&(i=hash(u));var w=(0===s?i:i>>>s)&L,x=this.nodes[w];return x?x.get(s+j,i,u,_):_},HashArrayMapNode.prototype.update=function(s,i,u,_,w,x,B){void 0===u&&(u=hash(_));var U=(0===i?u:u>>>i)&L,Y=w===$,Z=this.nodes,ee=Z[U];if(Y&&!ee)return this;var ie=updateNode(ee,s,i+j,u,_,w,x,B);if(ie===ee)return this;var ae=this.count;if(ee){if(!ie&&--ae0&&_=0&&s>>i&L;if(_>=this.array.length)return new VNode([],s);var w,x=0===_;if(i>0){var B=this.array[_];if((w=B&&B.removeBefore(s,i-j,u))===B&&x)return this}if(x&&!w)return this;var $=editableVNode(this,s);if(!x)for(var U=0;U<_;U++)$.array[U]=void 0;return w&&($.array[_]=w),$},VNode.prototype.removeAfter=function(s,i,u){if(u===(i?1<>>i&L;if(w>=this.array.length)return this;if(i>0){var x=this.array[w];if((_=x&&x.removeAfter(s,i-j,u))===x&&w===this.array.length-1)return this}var B=editableVNode(this,s);return B.array.splice(w+1),_&&(B.array[w]=_),B};var nt,ot,st={};function iterateList(s,i){var u=s._origin,_=s._capacity,w=getTailOffset(_),x=s._tail;return iterateNodeOrLeaf(s._root,s._level,0);function iterateNodeOrLeaf(s,i,u){return 0===i?iterateLeaf(s,u):iterateNode(s,i,u)}function iterateLeaf(s,j){var L=j===w?x&&x.array:s&&s.array,$=j>u?0:u-j,U=_-j;return U>B&&(U=B),function(){if($===U)return st;var s=i?--U:$++;return L&&L[s]}}function iterateNode(s,w,x){var L,$=s&&s.array,U=x>u?0:u-x>>w,Y=1+(_-x>>w);return Y>B&&(Y=B),function(){for(;;){if(L){var s=L();if(s!==st)return s;L=null}if(U===Y)return st;var u=i?--Y:U++;L=iterateNodeOrLeaf($&&$[u],w-j,x+(u<=s.size||i<0)return s.withMutations((function(s){i<0?setListBounds(s,i).set(0,u):setListBounds(s,0,i+1).set(i,u)}));i+=s._origin;var _=s._tail,w=s._root,x=MakeRef(Y);return i>=getTailOffset(s._capacity)?_=updateVNode(_,s.__ownerID,0,i,u,x):w=updateVNode(w,s.__ownerID,s._level,i,u,x),x.value?s.__ownerID?(s._root=w,s._tail=_,s.__hash=void 0,s.__altered=!0,s):makeList(s._origin,s._capacity,s._level,w,_):s}function updateVNode(s,i,u,_,w,x){var B,$=_>>>u&L,U=s&&$0){var Y=s&&s.array[$],Z=updateVNode(Y,i,u-j,_,w,x);return Z===Y?s:((B=editableVNode(s,i)).array[$]=Z,B)}return U&&s.array[$]===w?s:(SetRef(x),B=editableVNode(s,i),void 0===w&&$===B.array.length-1?B.array.pop():B.array[$]=w,B)}function editableVNode(s,i){return i&&s&&i===s.ownerID?s:new VNode(s?s.array.slice():[],i)}function listNodeFor(s,i){if(i>=getTailOffset(s._capacity))return s._tail;if(i<1<0;)u=u.array[i>>>_&L],_-=j;return u}}function setListBounds(s,i,u){void 0!==i&&(i|=0),void 0!==u&&(u|=0);var _=s.__ownerID||new OwnerID,w=s._origin,x=s._capacity,B=w+i,$=void 0===u?x:u<0?x+u:w+u;if(B===w&&$===x)return s;if(B>=$)return s.clear();for(var U=s._level,Y=s._root,Z=0;B+Z<0;)Y=new VNode(Y&&Y.array.length?[void 0,Y]:[],_),Z+=1<<(U+=j);Z&&(B+=Z,w+=Z,$+=Z,x+=Z);for(var ee=getTailOffset(x),ie=getTailOffset($);ie>=1<ee?new VNode([],_):ae;if(ae&&ie>ee&&Bj;pe-=j){var de=ee>>>pe&L;ce=ce.array[de]=editableVNode(ce.array[de],_)}ce.array[ee>>>j&L]=ae}if($=ie)B-=ie,$-=ie,U=j,Y=null,le=le&&le.removeBefore(_,0,B);else if(B>w||ie>>U&L;if(fe!==ie>>>U&L)break;fe&&(Z+=(1<w&&(Y=Y.removeBefore(_,U,B-Z)),Y&&iew&&(w=B.size),isIterable(j)||(B=B.map((function(s){return fromJS(s)}))),_.push(B)}return w>s.size&&(s=s.setSize(w)),mergeIntoCollectionWith(s,i,_)}function getTailOffset(s){return s>>j<=B&&j.size>=2*x.size?(_=(w=j.filter((function(s,i){return void 0!==s&&L!==i}))).toKeyedSeq().map((function(s){return s[0]})).flip().toMap(),s.__ownerID&&(_.__ownerID=w.__ownerID=s.__ownerID)):(_=x.remove(i),w=L===j.size-1?j.pop():j.set(L,void 0))}else if(U){if(u===j.get(L)[1])return s;_=x,w=j.set(L,[i,u])}else _=x.set(i,j.size),w=j.set(j.size,[i,u]);return s.__ownerID?(s.size=_.size,s._map=_,s._list=w,s.__hash=void 0,s):makeOrderedMap(_,w)}function ToKeyedSequence(s,i){this._iter=s,this._useKeys=i,this.size=s.size}function ToIndexedSequence(s){this._iter=s,this.size=s.size}function ToSetSequence(s){this._iter=s,this.size=s.size}function FromEntriesSequence(s){this._iter=s,this.size=s.size}function flipFactory(s){var i=makeSequence(s);return i._iter=s,i.size=s.size,i.flip=function(){return s},i.reverse=function(){var i=s.reverse.apply(this);return i.flip=function(){return s.reverse()},i},i.has=function(i){return s.includes(i)},i.includes=function(i){return s.has(i)},i.cacheResult=cacheResultThrough,i.__iterateUncached=function(i,u){var _=this;return s.__iterate((function(s,u){return!1!==i(u,s,_)}),u)},i.__iteratorUncached=function(i,u){if(i===ie){var _=s.__iterator(i,u);return new Iterator((function(){var s=_.next();if(!s.done){var i=s.value[0];s.value[0]=s.value[1],s.value[1]=i}return s}))}return s.__iterator(i===ee?Z:ee,u)},i}function mapFactory(s,i,u){var _=makeSequence(s);return _.size=s.size,_.has=function(i){return s.has(i)},_.get=function(_,w){var x=s.get(_,$);return x===$?w:i.call(u,x,_,s)},_.__iterateUncached=function(_,w){var x=this;return s.__iterate((function(s,w,j){return!1!==_(i.call(u,s,w,j),w,x)}),w)},_.__iteratorUncached=function(_,w){var x=s.__iterator(ie,w);return new Iterator((function(){var w=x.next();if(w.done)return w;var j=w.value,B=j[0];return iteratorValue(_,B,i.call(u,j[1],B,s),w)}))},_}function reverseFactory(s,i){var u=makeSequence(s);return u._iter=s,u.size=s.size,u.reverse=function(){return s},s.flip&&(u.flip=function(){var i=flipFactory(s);return i.reverse=function(){return s.flip()},i}),u.get=function(u,_){return s.get(i?u:-1-u,_)},u.has=function(u){return s.has(i?u:-1-u)},u.includes=function(i){return s.includes(i)},u.cacheResult=cacheResultThrough,u.__iterate=function(i,u){var _=this;return s.__iterate((function(s,u){return i(s,u,_)}),!u)},u.__iterator=function(i,u){return s.__iterator(i,!u)},u}function filterFactory(s,i,u,_){var w=makeSequence(s);return _&&(w.has=function(_){var w=s.get(_,$);return w!==$&&!!i.call(u,w,_,s)},w.get=function(_,w){var x=s.get(_,$);return x!==$&&i.call(u,x,_,s)?x:w}),w.__iterateUncached=function(w,x){var j=this,B=0;return s.__iterate((function(s,x,L){if(i.call(u,s,x,L))return B++,w(s,_?x:B-1,j)}),x),B},w.__iteratorUncached=function(w,x){var j=s.__iterator(ie,x),B=0;return new Iterator((function(){for(;;){var x=j.next();if(x.done)return x;var L=x.value,$=L[0],U=L[1];if(i.call(u,U,$,s))return iteratorValue(w,_?$:B++,U,x)}}))},w}function countByFactory(s,i,u){var _=Map().asMutable();return s.__iterate((function(w,x){_.update(i.call(u,w,x,s),0,(function(s){return s+1}))})),_.asImmutable()}function groupByFactory(s,i,u){var _=isKeyed(s),w=(isOrdered(s)?OrderedMap():Map()).asMutable();s.__iterate((function(x,j){w.update(i.call(u,x,j,s),(function(s){return(s=s||[]).push(_?[j,x]:x),s}))}));var x=iterableClass(s);return w.map((function(i){return reify(s,x(i))}))}function sliceFactory(s,i,u,_){var w=s.size;if(void 0!==i&&(i|=0),void 0!==u&&(u===1/0?u=w:u|=0),wholeSlice(i,u,w))return s;var x=resolveBegin(i,w),j=resolveEnd(u,w);if(x!=x||j!=j)return sliceFactory(s.toSeq().cacheResult(),i,u,_);var B,L=j-x;L==L&&(B=L<0?0:L);var $=makeSequence(s);return $.size=0===B?B:s.size&&B||void 0,!_&&isSeq(s)&&B>=0&&($.get=function(i,u){return(i=wrapIndex(this,i))>=0&&iB)return iteratorDone();var s=w.next();return _||i===ee?s:iteratorValue(i,L-1,i===Z?void 0:s.value[1],s)}))},$}function takeWhileFactory(s,i,u){var _=makeSequence(s);return _.__iterateUncached=function(_,w){var x=this;if(w)return this.cacheResult().__iterate(_,w);var j=0;return s.__iterate((function(s,w,B){return i.call(u,s,w,B)&&++j&&_(s,w,x)})),j},_.__iteratorUncached=function(_,w){var x=this;if(w)return this.cacheResult().__iterator(_,w);var j=s.__iterator(ie,w),B=!0;return new Iterator((function(){if(!B)return iteratorDone();var s=j.next();if(s.done)return s;var w=s.value,L=w[0],$=w[1];return i.call(u,$,L,x)?_===ie?s:iteratorValue(_,L,$,s):(B=!1,iteratorDone())}))},_}function skipWhileFactory(s,i,u,_){var w=makeSequence(s);return w.__iterateUncached=function(w,x){var j=this;if(x)return this.cacheResult().__iterate(w,x);var B=!0,L=0;return s.__iterate((function(s,x,$){if(!B||!(B=i.call(u,s,x,$)))return L++,w(s,_?x:L-1,j)})),L},w.__iteratorUncached=function(w,x){var j=this;if(x)return this.cacheResult().__iterator(w,x);var B=s.__iterator(ie,x),L=!0,$=0;return new Iterator((function(){var s,x,U;do{if((s=B.next()).done)return _||w===ee?s:iteratorValue(w,$++,w===Z?void 0:s.value[1],s);var Y=s.value;x=Y[0],U=Y[1],L&&(L=i.call(u,U,x,j))}while(L);return w===ie?s:iteratorValue(w,x,U,s)}))},w}function concatFactory(s,i){var u=isKeyed(s),_=[s].concat(i).map((function(s){return isIterable(s)?u&&(s=KeyedIterable(s)):s=u?keyedSeqFromValue(s):indexedSeqFromValue(Array.isArray(s)?s:[s]),s})).filter((function(s){return 0!==s.size}));if(0===_.length)return s;if(1===_.length){var w=_[0];if(w===s||u&&isKeyed(w)||isIndexed(s)&&isIndexed(w))return w}var x=new ArraySeq(_);return u?x=x.toKeyedSeq():isIndexed(s)||(x=x.toSetSeq()),(x=x.flatten(!0)).size=_.reduce((function(s,i){if(void 0!==s){var u=i.size;if(void 0!==u)return s+u}}),0),x}function flattenFactory(s,i,u){var _=makeSequence(s);return _.__iterateUncached=function(_,w){var x=0,j=!1;function flatDeep(s,B){var L=this;s.__iterate((function(s,w){return(!i||B0}function zipWithFactory(s,i,u){var _=makeSequence(s);return _.size=new ArraySeq(u).map((function(s){return s.size})).min(),_.__iterate=function(s,i){for(var u,_=this.__iterator(ee,i),w=0;!(u=_.next()).done&&!1!==s(u.value,w++,this););return w},_.__iteratorUncached=function(s,_){var w=u.map((function(s){return s=Iterable(s),getIterator(_?s.reverse():s)})),x=0,j=!1;return new Iterator((function(){var u;return j||(u=w.map((function(s){return s.next()})),j=u.some((function(s){return s.done}))),j?iteratorDone():iteratorValue(s,x++,i.apply(null,u.map((function(s){return s.value}))))}))},_}function reify(s,i){return isSeq(s)?i:s.constructor(i)}function validateEntry(s){if(s!==Object(s))throw new TypeError("Expected [K, V] tuple: "+s)}function resolveSize(s){return assertNotInfinite(s.size),ensureSize(s)}function iterableClass(s){return isKeyed(s)?KeyedIterable:isIndexed(s)?IndexedIterable:SetIterable}function makeSequence(s){return Object.create((isKeyed(s)?KeyedSeq:isIndexed(s)?IndexedSeq:SetSeq).prototype)}function cacheResultThrough(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):Seq.prototype.cacheResult.call(this)}function defaultComparator(s,i){return s>i?1:s=0;u--)i={value:arguments[u],next:i};return this.__ownerID?(this.size=s,this._head=i,this.__hash=void 0,this.__altered=!0,this):makeStack(s,i)},Stack.prototype.pushAll=function(s){if(0===(s=IndexedIterable(s)).size)return this;assertNotInfinite(s.size);var i=this.size,u=this._head;return s.reverse().forEach((function(s){i++,u={value:s,next:u}})),this.__ownerID?(this.size=i,this._head=u,this.__hash=void 0,this.__altered=!0,this):makeStack(i,u)},Stack.prototype.pop=function(){return this.slice(1)},Stack.prototype.unshift=function(){return this.push.apply(this,arguments)},Stack.prototype.unshiftAll=function(s){return this.pushAll(s)},Stack.prototype.shift=function(){return this.pop.apply(this,arguments)},Stack.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):emptyStack()},Stack.prototype.slice=function(s,i){if(wholeSlice(s,i,this.size))return this;var u=resolveBegin(s,this.size);if(resolveEnd(i,this.size)!==this.size)return IndexedCollection.prototype.slice.call(this,s,i);for(var _=this.size-u,w=this._head;u--;)w=w.next;return this.__ownerID?(this.size=_,this._head=w,this.__hash=void 0,this.__altered=!0,this):makeStack(_,w)},Stack.prototype.__ensureOwner=function(s){return s===this.__ownerID?this:s?makeStack(this.size,this._head,s,this.__hash):(this.__ownerID=s,this.__altered=!1,this)},Stack.prototype.__iterate=function(s,i){if(i)return this.reverse().__iterate(s);for(var u=0,_=this._head;_&&!1!==s(_.value,u++,this);)_=_.next;return u},Stack.prototype.__iterator=function(s,i){if(i)return this.reverse().__iterator(s);var u=0,_=this._head;return new Iterator((function(){if(_){var i=_.value;return _=_.next,iteratorValue(s,u++,i)}return iteratorDone()}))},Stack.isStack=isStack;var ht,dt="@@__IMMUTABLE_STACK__@@",mt=Stack.prototype;function makeStack(s,i,u,_){var w=Object.create(mt);return w.size=s,w._head=i,w.__ownerID=u,w.__hash=_,w.__altered=!1,w}function emptyStack(){return ht||(ht=makeStack(0))}function mixin(s,i){var keyCopier=function(u){s.prototype[u]=i[u]};return Object.keys(i).forEach(keyCopier),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(i).forEach(keyCopier),s}mt[dt]=!0,mt.withMutations=Xe.withMutations,mt.asMutable=Xe.asMutable,mt.asImmutable=Xe.asImmutable,mt.wasAltered=Xe.wasAltered,Iterable.Iterator=Iterator,mixin(Iterable,{toArray:function(){assertNotInfinite(this.size);var s=new Array(this.size||0);return this.valueSeq().__iterate((function(i,u){s[u]=i})),s},toIndexedSeq:function(){return new ToIndexedSequence(this)},toJS:function(){return this.toSeq().map((function(s){return s&&"function"==typeof s.toJS?s.toJS():s})).__toJS()},toJSON:function(){return this.toSeq().map((function(s){return s&&"function"==typeof s.toJSON?s.toJSON():s})).__toJS()},toKeyedSeq:function(){return new ToKeyedSequence(this,!0)},toMap:function(){return Map(this.toKeyedSeq())},toObject:function(){assertNotInfinite(this.size);var s={};return this.__iterate((function(i,u){s[u]=i})),s},toOrderedMap:function(){return OrderedMap(this.toKeyedSeq())},toOrderedSet:function(){return OrderedSet(isKeyed(this)?this.valueSeq():this)},toSet:function(){return Set(isKeyed(this)?this.valueSeq():this)},toSetSeq:function(){return new ToSetSequence(this)},toSeq:function(){return isIndexed(this)?this.toIndexedSeq():isKeyed(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Stack(isKeyed(this)?this.valueSeq():this)},toList:function(){return List(isKeyed(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(s,i){return 0===this.size?s+i:s+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+i},concat:function(){return reify(this,concatFactory(this,s.call(arguments,0)))},includes:function(s){return this.some((function(i){return is(i,s)}))},entries:function(){return this.__iterator(ie)},every:function(s,i){assertNotInfinite(this.size);var u=!0;return this.__iterate((function(_,w,x){if(!s.call(i,_,w,x))return u=!1,!1})),u},filter:function(s,i){return reify(this,filterFactory(this,s,i,!0))},find:function(s,i,u){var _=this.findEntry(s,i);return _?_[1]:u},forEach:function(s,i){return assertNotInfinite(this.size),this.__iterate(i?s.bind(i):s)},join:function(s){assertNotInfinite(this.size),s=void 0!==s?""+s:",";var i="",u=!0;return this.__iterate((function(_){u?u=!1:i+=s,i+=null!=_?_.toString():""})),i},keys:function(){return this.__iterator(Z)},map:function(s,i){return reify(this,mapFactory(this,s,i))},reduce:function(s,i,u){var _,w;return assertNotInfinite(this.size),arguments.length<2?w=!0:_=i,this.__iterate((function(i,x,j){w?(w=!1,_=i):_=s.call(u,_,i,x,j)})),_},reduceRight:function(s,i,u){var _=this.toKeyedSeq().reverse();return _.reduce.apply(_,arguments)},reverse:function(){return reify(this,reverseFactory(this,!0))},slice:function(s,i){return reify(this,sliceFactory(this,s,i,!0))},some:function(s,i){return!this.every(not(s),i)},sort:function(s){return reify(this,sortFactory(this,s))},values:function(){return this.__iterator(ee)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(s,i){return ensureSize(s?this.toSeq().filter(s,i):this)},countBy:function(s,i){return countByFactory(this,s,i)},equals:function(s){return deepEqual(this,s)},entrySeq:function(){var s=this;if(s._cache)return new ArraySeq(s._cache);var i=s.toSeq().map(entryMapper).toIndexedSeq();return i.fromEntrySeq=function(){return s.toSeq()},i},filterNot:function(s,i){return this.filter(not(s),i)},findEntry:function(s,i,u){var _=u;return this.__iterate((function(u,w,x){if(s.call(i,u,w,x))return _=[w,u],!1})),_},findKey:function(s,i){var u=this.findEntry(s,i);return u&&u[0]},findLast:function(s,i,u){return this.toKeyedSeq().reverse().find(s,i,u)},findLastEntry:function(s,i,u){return this.toKeyedSeq().reverse().findEntry(s,i,u)},findLastKey:function(s,i){return this.toKeyedSeq().reverse().findKey(s,i)},first:function(){return this.find(returnTrue)},flatMap:function(s,i){return reify(this,flatMapFactory(this,s,i))},flatten:function(s){return reify(this,flattenFactory(this,s,!0))},fromEntrySeq:function(){return new FromEntriesSequence(this)},get:function(s,i){return this.find((function(i,u){return is(u,s)}),void 0,i)},getIn:function(s,i){for(var u,_=this,w=forceIterator(s);!(u=w.next()).done;){var x=u.value;if((_=_&&_.get?_.get(x,$):$)===$)return i}return _},groupBy:function(s,i){return groupByFactory(this,s,i)},has:function(s){return this.get(s,$)!==$},hasIn:function(s){return this.getIn(s,$)!==$},isSubset:function(s){return s="function"==typeof s.includes?s:Iterable(s),this.every((function(i){return s.includes(i)}))},isSuperset:function(s){return(s="function"==typeof s.isSubset?s:Iterable(s)).isSubset(this)},keyOf:function(s){return this.findKey((function(i){return is(i,s)}))},keySeq:function(){return this.toSeq().map(keyMapper).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(s){return this.toKeyedSeq().reverse().keyOf(s)},max:function(s){return maxFactory(this,s)},maxBy:function(s,i){return maxFactory(this,i,s)},min:function(s){return maxFactory(this,s?neg(s):defaultNegComparator)},minBy:function(s,i){return maxFactory(this,i?neg(i):defaultNegComparator,s)},rest:function(){return this.slice(1)},skip:function(s){return this.slice(Math.max(0,s))},skipLast:function(s){return reify(this,this.toSeq().reverse().skip(s).reverse())},skipWhile:function(s,i){return reify(this,skipWhileFactory(this,s,i,!0))},skipUntil:function(s,i){return this.skipWhile(not(s),i)},sortBy:function(s,i){return reify(this,sortFactory(this,i,s))},take:function(s){return this.slice(0,Math.max(0,s))},takeLast:function(s){return reify(this,this.toSeq().reverse().take(s).reverse())},takeWhile:function(s,i){return reify(this,takeWhileFactory(this,s,i))},takeUntil:function(s,i){return this.takeWhile(not(s),i)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=hashIterable(this))}});var gt=Iterable.prototype;gt[i]=!0,gt[ce]=gt.values,gt.__toJS=gt.toArray,gt.__toStringMapper=quoteString,gt.inspect=gt.toSource=function(){return this.toString()},gt.chain=gt.flatMap,gt.contains=gt.includes,mixin(KeyedIterable,{flip:function(){return reify(this,flipFactory(this))},mapEntries:function(s,i){var u=this,_=0;return reify(this,this.toSeq().map((function(w,x){return s.call(i,[x,w],_++,u)})).fromEntrySeq())},mapKeys:function(s,i){var u=this;return reify(this,this.toSeq().flip().map((function(_,w){return s.call(i,_,w,u)})).flip())}});var yt=KeyedIterable.prototype;function keyMapper(s,i){return i}function entryMapper(s,i){return[i,s]}function not(s){return function(){return!s.apply(this,arguments)}}function neg(s){return function(){return-s.apply(this,arguments)}}function quoteString(s){return"string"==typeof s?JSON.stringify(s):String(s)}function defaultZipper(){return arrCopy(arguments)}function defaultNegComparator(s,i){return si?-1:0}function hashIterable(s){if(s.size===1/0)return 0;var i=isOrdered(s),u=isKeyed(s),_=i?1:0;return murmurHashOfSize(s.__iterate(u?i?function(s,i){_=31*_+hashMerge(hash(s),hash(i))|0}:function(s,i){_=_+hashMerge(hash(s),hash(i))|0}:i?function(s){_=31*_+hash(s)|0}:function(s){_=_+hash(s)|0}),_)}function murmurHashOfSize(s,i){return i=be(i,3432918353),i=be(i<<15|i>>>-15,461845907),i=be(i<<13|i>>>-13,5),i=be((i=(i+3864292196|0)^s)^i>>>16,2246822507),i=smi((i=be(i^i>>>13,3266489909))^i>>>16)}function hashMerge(s,i){return s^i+2654435769+(s<<6)+(s>>2)|0}return yt[u]=!0,yt[ce]=gt.entries,yt.__toJS=gt.toObject,yt.__toStringMapper=function(s,i){return JSON.stringify(i)+": "+quoteString(s)},mixin(IndexedIterable,{toKeyedSeq:function(){return new ToKeyedSequence(this,!1)},filter:function(s,i){return reify(this,filterFactory(this,s,i,!1))},findIndex:function(s,i){var u=this.findEntry(s,i);return u?u[0]:-1},indexOf:function(s){var i=this.keyOf(s);return void 0===i?-1:i},lastIndexOf:function(s){var i=this.lastKeyOf(s);return void 0===i?-1:i},reverse:function(){return reify(this,reverseFactory(this,!1))},slice:function(s,i){return reify(this,sliceFactory(this,s,i,!1))},splice:function(s,i){var u=arguments.length;if(i=Math.max(0|i,0),0===u||2===u&&!i)return this;s=resolveBegin(s,s<0?this.count():this.size);var _=this.slice(0,s);return reify(this,1===u?_:_.concat(arrCopy(arguments,2),this.slice(s+i)))},findLastIndex:function(s,i){var u=this.findLastEntry(s,i);return u?u[0]:-1},first:function(){return this.get(0)},flatten:function(s){return reify(this,flattenFactory(this,s,!1))},get:function(s,i){return(s=wrapIndex(this,s))<0||this.size===1/0||void 0!==this.size&&s>this.size?i:this.find((function(i,u){return u===s}),void 0,i)},has:function(s){return(s=wrapIndex(this,s))>=0&&(void 0!==this.size?this.size===1/0||s{"function"==typeof Object.create?s.exports=function inherits(s,i){i&&(s.super_=i,s.prototype=Object.create(i.prototype,{constructor:{value:s,enumerable:!1,writable:!0,configurable:!0}}))}:s.exports=function inherits(s,i){if(i){s.super_=i;var TempCtor=function(){};TempCtor.prototype=i.prototype,s.prototype=new TempCtor,s.prototype.constructor=s}}},5419:s=>{s.exports=function(s,i,u,_){var w=new Blob(void 0!==_?[_,s]:[s],{type:u||"application/octet-stream"});if(void 0!==window.navigator.msSaveBlob)window.navigator.msSaveBlob(w,i);else{var x=window.URL&&window.URL.createObjectURL?window.URL.createObjectURL(w):window.webkitURL.createObjectURL(w),j=document.createElement("a");j.style.display="none",j.href=x,j.setAttribute("download",i),void 0===j.download&&j.setAttribute("target","_blank"),document.body.appendChild(j),j.click(),setTimeout((function(){document.body.removeChild(j),window.URL.revokeObjectURL(x)}),200)}}},20181:(s,i,u)=>{var _=NaN,w="[object Symbol]",x=/^\s+|\s+$/g,j=/^[-+]0x[0-9a-f]+$/i,B=/^0b[01]+$/i,L=/^0o[0-7]+$/i,$=parseInt,U="object"==typeof u.g&&u.g&&u.g.Object===Object&&u.g,Y="object"==typeof self&&self&&self.Object===Object&&self,Z=U||Y||Function("return this")(),ee=Object.prototype.toString,ie=Math.max,ae=Math.min,now=function(){return Z.Date.now()};function isObject(s){var i=typeof s;return!!s&&("object"==i||"function"==i)}function toNumber(s){if("number"==typeof s)return s;if(function isSymbol(s){return"symbol"==typeof s||function isObjectLike(s){return!!s&&"object"==typeof s}(s)&&ee.call(s)==w}(s))return _;if(isObject(s)){var i="function"==typeof s.valueOf?s.valueOf():s;s=isObject(i)?i+"":i}if("string"!=typeof s)return 0===s?s:+s;s=s.replace(x,"");var u=B.test(s);return u||L.test(s)?$(s.slice(2),u?2:8):j.test(s)?_:+s}s.exports=function debounce(s,i,u){var _,w,x,j,B,L,$=0,U=!1,Y=!1,Z=!0;if("function"!=typeof s)throw new TypeError("Expected a function");function invokeFunc(i){var u=_,x=w;return _=w=void 0,$=i,j=s.apply(x,u)}function shouldInvoke(s){var u=s-L;return void 0===L||u>=i||u<0||Y&&s-$>=x}function timerExpired(){var s=now();if(shouldInvoke(s))return trailingEdge(s);B=setTimeout(timerExpired,function remainingWait(s){var u=i-(s-L);return Y?ae(u,x-(s-$)):u}(s))}function trailingEdge(s){return B=void 0,Z&&_?invokeFunc(s):(_=w=void 0,j)}function debounced(){var s=now(),u=shouldInvoke(s);if(_=arguments,w=this,L=s,u){if(void 0===B)return function leadingEdge(s){return $=s,B=setTimeout(timerExpired,i),U?invokeFunc(s):j}(L);if(Y)return B=setTimeout(timerExpired,i),invokeFunc(L)}return void 0===B&&(B=setTimeout(timerExpired,i)),j}return i=toNumber(i)||0,isObject(u)&&(U=!!u.leading,x=(Y="maxWait"in u)?ie(toNumber(u.maxWait)||0,i):x,Z="trailing"in u?!!u.trailing:Z),debounced.cancel=function cancel(){void 0!==B&&clearTimeout(B),$=0,_=L=w=B=void 0},debounced.flush=function flush(){return void 0===B?j:trailingEdge(now())},debounced}},55580:(s,i,u)=>{var _=u(56110)(u(9325),"DataView");s.exports=_},21549:(s,i,u)=>{var _=u(22032),w=u(63862),x=u(66721),j=u(12749),B=u(35749);function Hash(s){var i=-1,u=null==s?0:s.length;for(this.clear();++i{var _=u(39344),w=u(94033);function LazyWrapper(s){this.__wrapped__=s,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}LazyWrapper.prototype=_(w.prototype),LazyWrapper.prototype.constructor=LazyWrapper,s.exports=LazyWrapper},80079:(s,i,u)=>{var _=u(63702),w=u(70080),x=u(24739),j=u(48655),B=u(31175);function ListCache(s){var i=-1,u=null==s?0:s.length;for(this.clear();++i{var _=u(39344),w=u(94033);function LodashWrapper(s,i){this.__wrapped__=s,this.__actions__=[],this.__chain__=!!i,this.__index__=0,this.__values__=void 0}LodashWrapper.prototype=_(w.prototype),LodashWrapper.prototype.constructor=LodashWrapper,s.exports=LodashWrapper},68223:(s,i,u)=>{var _=u(56110)(u(9325),"Map");s.exports=_},53661:(s,i,u)=>{var _=u(63040),w=u(17670),x=u(90289),j=u(4509),B=u(72949);function MapCache(s){var i=-1,u=null==s?0:s.length;for(this.clear();++i{var _=u(56110)(u(9325),"Promise");s.exports=_},76545:(s,i,u)=>{var _=u(56110)(u(9325),"Set");s.exports=_},38859:(s,i,u)=>{var _=u(53661),w=u(31380),x=u(51459);function SetCache(s){var i=-1,u=null==s?0:s.length;for(this.__data__=new _;++i{var _=u(80079),w=u(51420),x=u(90938),j=u(63605),B=u(29817),L=u(80945);function Stack(s){var i=this.__data__=new _(s);this.size=i.size}Stack.prototype.clear=w,Stack.prototype.delete=x,Stack.prototype.get=j,Stack.prototype.has=B,Stack.prototype.set=L,s.exports=Stack},51873:(s,i,u)=>{var _=u(9325).Symbol;s.exports=_},37828:(s,i,u)=>{var _=u(9325).Uint8Array;s.exports=_},28303:(s,i,u)=>{var _=u(56110)(u(9325),"WeakMap");s.exports=_},91033:s=>{s.exports=function apply(s,i,u){switch(u.length){case 0:return s.call(i);case 1:return s.call(i,u[0]);case 2:return s.call(i,u[0],u[1]);case 3:return s.call(i,u[0],u[1],u[2])}return s.apply(i,u)}},83729:s=>{s.exports=function arrayEach(s,i){for(var u=-1,_=null==s?0:s.length;++u<_&&!1!==i(s[u],u,s););return s}},79770:s=>{s.exports=function arrayFilter(s,i){for(var u=-1,_=null==s?0:s.length,w=0,x=[];++u<_;){var j=s[u];i(j,u,s)&&(x[w++]=j)}return x}},15325:(s,i,u)=>{var _=u(96131);s.exports=function arrayIncludes(s,i){return!!(null==s?0:s.length)&&_(s,i,0)>-1}},70695:(s,i,u)=>{var _=u(78096),w=u(72428),x=u(56449),j=u(3656),B=u(30361),L=u(37167),$=Object.prototype.hasOwnProperty;s.exports=function arrayLikeKeys(s,i){var u=x(s),U=!u&&w(s),Y=!u&&!U&&j(s),Z=!u&&!U&&!Y&&L(s),ee=u||U||Y||Z,ie=ee?_(s.length,String):[],ae=ie.length;for(var le in s)!i&&!$.call(s,le)||ee&&("length"==le||Y&&("offset"==le||"parent"==le)||Z&&("buffer"==le||"byteLength"==le||"byteOffset"==le)||B(le,ae))||ie.push(le);return ie}},34932:s=>{s.exports=function arrayMap(s,i){for(var u=-1,_=null==s?0:s.length,w=Array(_);++u<_;)w[u]=i(s[u],u,s);return w}},14528:s=>{s.exports=function arrayPush(s,i){for(var u=-1,_=i.length,w=s.length;++u<_;)s[w+u]=i[u];return s}},40882:s=>{s.exports=function arrayReduce(s,i,u,_){var w=-1,x=null==s?0:s.length;for(_&&x&&(u=s[++w]);++w{s.exports=function arraySome(s,i){for(var u=-1,_=null==s?0:s.length;++u<_;)if(i(s[u],u,s))return!0;return!1}},61074:s=>{s.exports=function asciiToArray(s){return s.split("")}},1733:s=>{var i=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;s.exports=function asciiWords(s){return s.match(i)||[]}},87805:(s,i,u)=>{var _=u(43360),w=u(75288);s.exports=function assignMergeValue(s,i,u){(void 0!==u&&!w(s[i],u)||void 0===u&&!(i in s))&&_(s,i,u)}},16547:(s,i,u)=>{var _=u(43360),w=u(75288),x=Object.prototype.hasOwnProperty;s.exports=function assignValue(s,i,u){var j=s[i];x.call(s,i)&&w(j,u)&&(void 0!==u||i in s)||_(s,i,u)}},26025:(s,i,u)=>{var _=u(75288);s.exports=function assocIndexOf(s,i){for(var u=s.length;u--;)if(_(s[u][0],i))return u;return-1}},74733:(s,i,u)=>{var _=u(21791),w=u(95950);s.exports=function baseAssign(s,i){return s&&_(i,w(i),s)}},43838:(s,i,u)=>{var _=u(21791),w=u(37241);s.exports=function baseAssignIn(s,i){return s&&_(i,w(i),s)}},43360:(s,i,u)=>{var _=u(93243);s.exports=function baseAssignValue(s,i,u){"__proto__"==i&&_?_(s,i,{configurable:!0,enumerable:!0,value:u,writable:!0}):s[i]=u}},9999:(s,i,u)=>{var _=u(37217),w=u(83729),x=u(16547),j=u(74733),B=u(43838),L=u(93290),$=u(23007),U=u(92271),Y=u(48948),Z=u(50002),ee=u(83349),ie=u(5861),ae=u(76189),le=u(77199),ce=u(35529),pe=u(56449),de=u(3656),fe=u(87730),ye=u(23805),be=u(38440),_e=u(95950),we=u(37241),Se="[object Arguments]",xe="[object Function]",Pe="[object Object]",Te={};Te[Se]=Te["[object Array]"]=Te["[object ArrayBuffer]"]=Te["[object DataView]"]=Te["[object Boolean]"]=Te["[object Date]"]=Te["[object Float32Array]"]=Te["[object Float64Array]"]=Te["[object Int8Array]"]=Te["[object Int16Array]"]=Te["[object Int32Array]"]=Te["[object Map]"]=Te["[object Number]"]=Te[Pe]=Te["[object RegExp]"]=Te["[object Set]"]=Te["[object String]"]=Te["[object Symbol]"]=Te["[object Uint8Array]"]=Te["[object Uint8ClampedArray]"]=Te["[object Uint16Array]"]=Te["[object Uint32Array]"]=!0,Te["[object Error]"]=Te[xe]=Te["[object WeakMap]"]=!1,s.exports=function baseClone(s,i,u,Re,qe,$e){var ze,We=1&i,He=2&i,Xe=4&i;if(u&&(ze=qe?u(s,Re,qe,$e):u(s)),void 0!==ze)return ze;if(!ye(s))return s;var Ye=pe(s);if(Ye){if(ze=ae(s),!We)return $(s,ze)}else{var Qe=ie(s),et=Qe==xe||"[object GeneratorFunction]"==Qe;if(de(s))return L(s,We);if(Qe==Pe||Qe==Se||et&&!qe){if(ze=He||et?{}:ce(s),!We)return He?Y(s,B(ze,s)):U(s,j(ze,s))}else{if(!Te[Qe])return qe?s:{};ze=le(s,Qe,We)}}$e||($e=new _);var tt=$e.get(s);if(tt)return tt;$e.set(s,ze),be(s)?s.forEach((function(_){ze.add(baseClone(_,i,u,_,s,$e))})):fe(s)&&s.forEach((function(_,w){ze.set(w,baseClone(_,i,u,w,s,$e))}));var rt=Ye?void 0:(Xe?He?ee:Z:He?we:_e)(s);return w(rt||s,(function(_,w){rt&&(_=s[w=_]),x(ze,w,baseClone(_,i,u,w,s,$e))})),ze}},39344:(s,i,u)=>{var _=u(23805),w=Object.create,x=function(){function object(){}return function(s){if(!_(s))return{};if(w)return w(s);object.prototype=s;var i=new object;return object.prototype=void 0,i}}();s.exports=x},80909:(s,i,u)=>{var _=u(30641),w=u(38329)(_);s.exports=w},2523:s=>{s.exports=function baseFindIndex(s,i,u,_){for(var w=s.length,x=u+(_?1:-1);_?x--:++x{var _=u(14528),w=u(45891);s.exports=function baseFlatten(s,i,u,x,j){var B=-1,L=s.length;for(u||(u=w),j||(j=[]);++B0&&u($)?i>1?baseFlatten($,i-1,u,x,j):_(j,$):x||(j[j.length]=$)}return j}},86649:(s,i,u)=>{var _=u(83221)();s.exports=_},30641:(s,i,u)=>{var _=u(86649),w=u(95950);s.exports=function baseForOwn(s,i){return s&&_(s,i,w)}},47422:(s,i,u)=>{var _=u(31769),w=u(77797);s.exports=function baseGet(s,i){for(var u=0,x=(i=_(i,s)).length;null!=s&&u{var _=u(14528),w=u(56449);s.exports=function baseGetAllKeys(s,i,u){var x=i(s);return w(s)?x:_(x,u(s))}},72552:(s,i,u)=>{var _=u(51873),w=u(659),x=u(59350),j=_?_.toStringTag:void 0;s.exports=function baseGetTag(s){return null==s?void 0===s?"[object Undefined]":"[object Null]":j&&j in Object(s)?w(s):x(s)}},20426:s=>{var i=Object.prototype.hasOwnProperty;s.exports=function baseHas(s,u){return null!=s&&i.call(s,u)}},28077:s=>{s.exports=function baseHasIn(s,i){return null!=s&&i in Object(s)}},96131:(s,i,u)=>{var _=u(2523),w=u(85463),x=u(76959);s.exports=function baseIndexOf(s,i,u){return i==i?x(s,i,u):_(s,w,u)}},27534:(s,i,u)=>{var _=u(72552),w=u(40346);s.exports=function baseIsArguments(s){return w(s)&&"[object Arguments]"==_(s)}},60270:(s,i,u)=>{var _=u(87068),w=u(40346);s.exports=function baseIsEqual(s,i,u,x,j){return s===i||(null==s||null==i||!w(s)&&!w(i)?s!=s&&i!=i:_(s,i,u,x,baseIsEqual,j))}},87068:(s,i,u)=>{var _=u(37217),w=u(25911),x=u(21986),j=u(50689),B=u(5861),L=u(56449),$=u(3656),U=u(37167),Y="[object Arguments]",Z="[object Array]",ee="[object Object]",ie=Object.prototype.hasOwnProperty;s.exports=function baseIsEqualDeep(s,i,u,ae,le,ce){var pe=L(s),de=L(i),fe=pe?Z:B(s),ye=de?Z:B(i),be=(fe=fe==Y?ee:fe)==ee,_e=(ye=ye==Y?ee:ye)==ee,we=fe==ye;if(we&&$(s)){if(!$(i))return!1;pe=!0,be=!1}if(we&&!be)return ce||(ce=new _),pe||U(s)?w(s,i,u,ae,le,ce):x(s,i,fe,u,ae,le,ce);if(!(1&u)){var Se=be&&ie.call(s,"__wrapped__"),xe=_e&&ie.call(i,"__wrapped__");if(Se||xe){var Pe=Se?s.value():s,Te=xe?i.value():i;return ce||(ce=new _),le(Pe,Te,u,ae,ce)}}return!!we&&(ce||(ce=new _),j(s,i,u,ae,le,ce))}},29172:(s,i,u)=>{var _=u(5861),w=u(40346);s.exports=function baseIsMap(s){return w(s)&&"[object Map]"==_(s)}},41799:(s,i,u)=>{var _=u(37217),w=u(60270);s.exports=function baseIsMatch(s,i,u,x){var j=u.length,B=j,L=!x;if(null==s)return!B;for(s=Object(s);j--;){var $=u[j];if(L&&$[2]?$[1]!==s[$[0]]:!($[0]in s))return!1}for(;++j{s.exports=function baseIsNaN(s){return s!=s}},45083:(s,i,u)=>{var _=u(1882),w=u(87296),x=u(23805),j=u(47473),B=/^\[object .+?Constructor\]$/,L=Function.prototype,$=Object.prototype,U=L.toString,Y=$.hasOwnProperty,Z=RegExp("^"+U.call(Y).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");s.exports=function baseIsNative(s){return!(!x(s)||w(s))&&(_(s)?Z:B).test(j(s))}},16038:(s,i,u)=>{var _=u(5861),w=u(40346);s.exports=function baseIsSet(s){return w(s)&&"[object Set]"==_(s)}},4901:(s,i,u)=>{var _=u(72552),w=u(30294),x=u(40346),j={};j["[object Float32Array]"]=j["[object Float64Array]"]=j["[object Int8Array]"]=j["[object Int16Array]"]=j["[object Int32Array]"]=j["[object Uint8Array]"]=j["[object Uint8ClampedArray]"]=j["[object Uint16Array]"]=j["[object Uint32Array]"]=!0,j["[object Arguments]"]=j["[object Array]"]=j["[object ArrayBuffer]"]=j["[object Boolean]"]=j["[object DataView]"]=j["[object Date]"]=j["[object Error]"]=j["[object Function]"]=j["[object Map]"]=j["[object Number]"]=j["[object Object]"]=j["[object RegExp]"]=j["[object Set]"]=j["[object String]"]=j["[object WeakMap]"]=!1,s.exports=function baseIsTypedArray(s){return x(s)&&w(s.length)&&!!j[_(s)]}},15389:(s,i,u)=>{var _=u(93663),w=u(87978),x=u(83488),j=u(56449),B=u(50583);s.exports=function baseIteratee(s){return"function"==typeof s?s:null==s?x:"object"==typeof s?j(s)?w(s[0],s[1]):_(s):B(s)}},88984:(s,i,u)=>{var _=u(55527),w=u(3650),x=Object.prototype.hasOwnProperty;s.exports=function baseKeys(s){if(!_(s))return w(s);var i=[];for(var u in Object(s))x.call(s,u)&&"constructor"!=u&&i.push(u);return i}},72903:(s,i,u)=>{var _=u(23805),w=u(55527),x=u(90181),j=Object.prototype.hasOwnProperty;s.exports=function baseKeysIn(s){if(!_(s))return x(s);var i=w(s),u=[];for(var B in s)("constructor"!=B||!i&&j.call(s,B))&&u.push(B);return u}},94033:s=>{s.exports=function baseLodash(){}},93663:(s,i,u)=>{var _=u(41799),w=u(10776),x=u(67197);s.exports=function baseMatches(s){var i=w(s);return 1==i.length&&i[0][2]?x(i[0][0],i[0][1]):function(u){return u===s||_(u,s,i)}}},87978:(s,i,u)=>{var _=u(60270),w=u(58156),x=u(80631),j=u(28586),B=u(30756),L=u(67197),$=u(77797);s.exports=function baseMatchesProperty(s,i){return j(s)&&B(i)?L($(s),i):function(u){var j=w(u,s);return void 0===j&&j===i?x(u,s):_(i,j,3)}}},85250:(s,i,u)=>{var _=u(37217),w=u(87805),x=u(86649),j=u(42824),B=u(23805),L=u(37241),$=u(14974);s.exports=function baseMerge(s,i,u,U,Y){s!==i&&x(i,(function(x,L){if(Y||(Y=new _),B(x))j(s,i,L,u,baseMerge,U,Y);else{var Z=U?U($(s,L),x,L+"",s,i,Y):void 0;void 0===Z&&(Z=x),w(s,L,Z)}}),L)}},42824:(s,i,u)=>{var _=u(87805),w=u(93290),x=u(71961),j=u(23007),B=u(35529),L=u(72428),$=u(56449),U=u(83693),Y=u(3656),Z=u(1882),ee=u(23805),ie=u(11331),ae=u(37167),le=u(14974),ce=u(69884);s.exports=function baseMergeDeep(s,i,u,pe,de,fe,ye){var be=le(s,u),_e=le(i,u),we=ye.get(_e);if(we)_(s,u,we);else{var Se=fe?fe(be,_e,u+"",s,i,ye):void 0,xe=void 0===Se;if(xe){var Pe=$(_e),Te=!Pe&&Y(_e),Re=!Pe&&!Te&&ae(_e);Se=_e,Pe||Te||Re?$(be)?Se=be:U(be)?Se=j(be):Te?(xe=!1,Se=w(_e,!0)):Re?(xe=!1,Se=x(_e,!0)):Se=[]:ie(_e)||L(_e)?(Se=be,L(be)?Se=ce(be):ee(be)&&!Z(be)||(Se=B(_e))):xe=!1}xe&&(ye.set(_e,Se),de(Se,_e,pe,fe,ye),ye.delete(_e)),_(s,u,Se)}}},47237:s=>{s.exports=function baseProperty(s){return function(i){return null==i?void 0:i[s]}}},17255:(s,i,u)=>{var _=u(47422);s.exports=function basePropertyDeep(s){return function(i){return _(i,s)}}},54552:s=>{s.exports=function basePropertyOf(s){return function(i){return null==s?void 0:s[i]}}},85558:s=>{s.exports=function baseReduce(s,i,u,_,w){return w(s,(function(s,w,x){u=_?(_=!1,s):i(u,s,w,x)})),u}},69302:(s,i,u)=>{var _=u(83488),w=u(56757),x=u(32865);s.exports=function baseRest(s,i){return x(w(s,i,_),s+"")}},73170:(s,i,u)=>{var _=u(16547),w=u(31769),x=u(30361),j=u(23805),B=u(77797);s.exports=function baseSet(s,i,u,L){if(!j(s))return s;for(var $=-1,U=(i=w(i,s)).length,Y=U-1,Z=s;null!=Z&&++${var _=u(83488),w=u(48152),x=w?function(s,i){return w.set(s,i),s}:_;s.exports=x},19570:(s,i,u)=>{var _=u(37334),w=u(93243),x=u(83488),j=w?function(s,i){return w(s,"toString",{configurable:!0,enumerable:!1,value:_(i),writable:!0})}:x;s.exports=j},25160:s=>{s.exports=function baseSlice(s,i,u){var _=-1,w=s.length;i<0&&(i=-i>w?0:w+i),(u=u>w?w:u)<0&&(u+=w),w=i>u?0:u-i>>>0,i>>>=0;for(var x=Array(w);++_{var _=u(80909);s.exports=function baseSome(s,i){var u;return _(s,(function(s,_,w){return!(u=i(s,_,w))})),!!u}},78096:s=>{s.exports=function baseTimes(s,i){for(var u=-1,_=Array(s);++u{var _=u(51873),w=u(34932),x=u(56449),j=u(44394),B=_?_.prototype:void 0,L=B?B.toString:void 0;s.exports=function baseToString(s){if("string"==typeof s)return s;if(x(s))return w(s,baseToString)+"";if(j(s))return L?L.call(s):"";var i=s+"";return"0"==i&&1/s==-Infinity?"-0":i}},54128:(s,i,u)=>{var _=u(31800),w=/^\s+/;s.exports=function baseTrim(s){return s?s.slice(0,_(s)+1).replace(w,""):s}},27301:s=>{s.exports=function baseUnary(s){return function(i){return s(i)}}},19931:(s,i,u)=>{var _=u(31769),w=u(68090),x=u(68969),j=u(77797);s.exports=function baseUnset(s,i){return i=_(i,s),null==(s=x(s,i))||delete s[j(w(i))]}},51234:s=>{s.exports=function baseZipObject(s,i,u){for(var _=-1,w=s.length,x=i.length,j={};++_{s.exports=function cacheHas(s,i){return s.has(i)}},31769:(s,i,u)=>{var _=u(56449),w=u(28586),x=u(61802),j=u(13222);s.exports=function castPath(s,i){return _(s)?s:w(s,i)?[s]:x(j(s))}},28754:(s,i,u)=>{var _=u(25160);s.exports=function castSlice(s,i,u){var w=s.length;return u=void 0===u?w:u,!i&&u>=w?s:_(s,i,u)}},49653:(s,i,u)=>{var _=u(37828);s.exports=function cloneArrayBuffer(s){var i=new s.constructor(s.byteLength);return new _(i).set(new _(s)),i}},93290:(s,i,u)=>{s=u.nmd(s);var _=u(9325),w=i&&!i.nodeType&&i,x=w&&s&&!s.nodeType&&s,j=x&&x.exports===w?_.Buffer:void 0,B=j?j.allocUnsafe:void 0;s.exports=function cloneBuffer(s,i){if(i)return s.slice();var u=s.length,_=B?B(u):new s.constructor(u);return s.copy(_),_}},76169:(s,i,u)=>{var _=u(49653);s.exports=function cloneDataView(s,i){var u=i?_(s.buffer):s.buffer;return new s.constructor(u,s.byteOffset,s.byteLength)}},73201:s=>{var i=/\w*$/;s.exports=function cloneRegExp(s){var u=new s.constructor(s.source,i.exec(s));return u.lastIndex=s.lastIndex,u}},93736:(s,i,u)=>{var _=u(51873),w=_?_.prototype:void 0,x=w?w.valueOf:void 0;s.exports=function cloneSymbol(s){return x?Object(x.call(s)):{}}},71961:(s,i,u)=>{var _=u(49653);s.exports=function cloneTypedArray(s,i){var u=i?_(s.buffer):s.buffer;return new s.constructor(u,s.byteOffset,s.length)}},91596:s=>{var i=Math.max;s.exports=function composeArgs(s,u,_,w){for(var x=-1,j=s.length,B=_.length,L=-1,$=u.length,U=i(j-B,0),Y=Array($+U),Z=!w;++L<$;)Y[L]=u[L];for(;++x{var i=Math.max;s.exports=function composeArgsRight(s,u,_,w){for(var x=-1,j=s.length,B=-1,L=_.length,$=-1,U=u.length,Y=i(j-L,0),Z=Array(Y+U),ee=!w;++x{s.exports=function copyArray(s,i){var u=-1,_=s.length;for(i||(i=Array(_));++u<_;)i[u]=s[u];return i}},21791:(s,i,u)=>{var _=u(16547),w=u(43360);s.exports=function copyObject(s,i,u,x){var j=!u;u||(u={});for(var B=-1,L=i.length;++B{var _=u(21791),w=u(4664);s.exports=function copySymbols(s,i){return _(s,w(s),i)}},48948:(s,i,u)=>{var _=u(21791),w=u(86375);s.exports=function copySymbolsIn(s,i){return _(s,w(s),i)}},55481:(s,i,u)=>{var _=u(9325)["__core-js_shared__"];s.exports=_},58523:s=>{s.exports=function countHolders(s,i){for(var u=s.length,_=0;u--;)s[u]===i&&++_;return _}},20999:(s,i,u)=>{var _=u(69302),w=u(36800);s.exports=function createAssigner(s){return _((function(i,u){var _=-1,x=u.length,j=x>1?u[x-1]:void 0,B=x>2?u[2]:void 0;for(j=s.length>3&&"function"==typeof j?(x--,j):void 0,B&&w(u[0],u[1],B)&&(j=x<3?void 0:j,x=1),i=Object(i);++_{var _=u(64894);s.exports=function createBaseEach(s,i){return function(u,w){if(null==u)return u;if(!_(u))return s(u,w);for(var x=u.length,j=i?x:-1,B=Object(u);(i?j--:++j{s.exports=function createBaseFor(s){return function(i,u,_){for(var w=-1,x=Object(i),j=_(i),B=j.length;B--;){var L=j[s?B:++w];if(!1===u(x[L],L,x))break}return i}}},11842:(s,i,u)=>{var _=u(82819),w=u(9325);s.exports=function createBind(s,i,u){var x=1&i,j=_(s);return function wrapper(){return(this&&this!==w&&this instanceof wrapper?j:s).apply(x?u:this,arguments)}}},12507:(s,i,u)=>{var _=u(28754),w=u(49698),x=u(63912),j=u(13222);s.exports=function createCaseFirst(s){return function(i){i=j(i);var u=w(i)?x(i):void 0,B=u?u[0]:i.charAt(0),L=u?_(u,1).join(""):i.slice(1);return B[s]()+L}}},45539:(s,i,u)=>{var _=u(40882),w=u(50828),x=u(66645),j=RegExp("['’]","g");s.exports=function createCompounder(s){return function(i){return _(x(w(i).replace(j,"")),s,"")}}},82819:(s,i,u)=>{var _=u(39344),w=u(23805);s.exports=function createCtor(s){return function(){var i=arguments;switch(i.length){case 0:return new s;case 1:return new s(i[0]);case 2:return new s(i[0],i[1]);case 3:return new s(i[0],i[1],i[2]);case 4:return new s(i[0],i[1],i[2],i[3]);case 5:return new s(i[0],i[1],i[2],i[3],i[4]);case 6:return new s(i[0],i[1],i[2],i[3],i[4],i[5]);case 7:return new s(i[0],i[1],i[2],i[3],i[4],i[5],i[6])}var u=_(s.prototype),x=s.apply(u,i);return w(x)?x:u}}},77078:(s,i,u)=>{var _=u(91033),w=u(82819),x=u(37471),j=u(18073),B=u(11287),L=u(36306),$=u(9325);s.exports=function createCurry(s,i,u){var U=w(s);return function wrapper(){for(var w=arguments.length,Y=Array(w),Z=w,ee=B(wrapper);Z--;)Y[Z]=arguments[Z];var ie=w<3&&Y[0]!==ee&&Y[w-1]!==ee?[]:L(Y,ee);return(w-=ie.length){var _=u(15389),w=u(64894),x=u(95950);s.exports=function createFind(s){return function(i,u,j){var B=Object(i);if(!w(i)){var L=_(u,3);i=x(i),u=function(s){return L(B[s],s,B)}}var $=s(i,u,j);return $>-1?B[L?i[$]:$]:void 0}}},37471:(s,i,u)=>{var _=u(91596),w=u(53320),x=u(58523),j=u(82819),B=u(18073),L=u(11287),$=u(68294),U=u(36306),Y=u(9325);s.exports=function createHybrid(s,i,u,Z,ee,ie,ae,le,ce,pe){var de=128&i,fe=1&i,ye=2&i,be=24&i,_e=512&i,we=ye?void 0:j(s);return function wrapper(){for(var Se=arguments.length,xe=Array(Se),Pe=Se;Pe--;)xe[Pe]=arguments[Pe];if(be)var Te=L(wrapper),Re=x(xe,Te);if(Z&&(xe=_(xe,Z,ee,be)),ie&&(xe=w(xe,ie,ae,be)),Se-=Re,be&&Se1&&xe.reverse(),de&&ce{var _=u(91033),w=u(82819),x=u(9325);s.exports=function createPartial(s,i,u,j){var B=1&i,L=w(s);return function wrapper(){for(var i=-1,w=arguments.length,$=-1,U=j.length,Y=Array(U+w),Z=this&&this!==x&&this instanceof wrapper?L:s;++${var _=u(85087),w=u(54641),x=u(70981);s.exports=function createRecurry(s,i,u,j,B,L,$,U,Y,Z){var ee=8&i;i|=ee?32:64,4&(i&=~(ee?64:32))||(i&=-4);var ie=[s,i,B,ee?L:void 0,ee?$:void 0,ee?void 0:L,ee?void 0:$,U,Y,Z],ae=u.apply(void 0,ie);return _(s)&&w(ae,ie),ae.placeholder=j,x(ae,s,i)}},66977:(s,i,u)=>{var _=u(68882),w=u(11842),x=u(77078),j=u(37471),B=u(24168),L=u(37381),$=u(3209),U=u(54641),Y=u(70981),Z=u(61489),ee=Math.max;s.exports=function createWrap(s,i,u,ie,ae,le,ce,pe){var de=2&i;if(!de&&"function"!=typeof s)throw new TypeError("Expected a function");var fe=ie?ie.length:0;if(fe||(i&=-97,ie=ae=void 0),ce=void 0===ce?ce:ee(Z(ce),0),pe=void 0===pe?pe:Z(pe),fe-=ae?ae.length:0,64&i){var ye=ie,be=ae;ie=ae=void 0}var _e=de?void 0:L(s),we=[s,i,u,ie,ae,ye,be,le,ce,pe];if(_e&&$(we,_e),s=we[0],i=we[1],u=we[2],ie=we[3],ae=we[4],!(pe=we[9]=void 0===we[9]?de?0:s.length:ee(we[9]-fe,0))&&24&i&&(i&=-25),i&&1!=i)Se=8==i||16==i?x(s,i,pe):32!=i&&33!=i||ae.length?j.apply(void 0,we):B(s,i,u,ie);else var Se=w(s,i,u);return Y((_e?_:U)(Se,we),s,i)}},53138:(s,i,u)=>{var _=u(11331);s.exports=function customOmitClone(s){return _(s)?void 0:s}},24647:(s,i,u)=>{var _=u(54552)({À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"});s.exports=_},93243:(s,i,u)=>{var _=u(56110),w=function(){try{var s=_(Object,"defineProperty");return s({},"",{}),s}catch(s){}}();s.exports=w},25911:(s,i,u)=>{var _=u(38859),w=u(14248),x=u(19219);s.exports=function equalArrays(s,i,u,j,B,L){var $=1&u,U=s.length,Y=i.length;if(U!=Y&&!($&&Y>U))return!1;var Z=L.get(s),ee=L.get(i);if(Z&&ee)return Z==i&&ee==s;var ie=-1,ae=!0,le=2&u?new _:void 0;for(L.set(s,i),L.set(i,s);++ie{var _=u(51873),w=u(37828),x=u(75288),j=u(25911),B=u(20317),L=u(84247),$=_?_.prototype:void 0,U=$?$.valueOf:void 0;s.exports=function equalByTag(s,i,u,_,$,Y,Z){switch(u){case"[object DataView]":if(s.byteLength!=i.byteLength||s.byteOffset!=i.byteOffset)return!1;s=s.buffer,i=i.buffer;case"[object ArrayBuffer]":return!(s.byteLength!=i.byteLength||!Y(new w(s),new w(i)));case"[object Boolean]":case"[object Date]":case"[object Number]":return x(+s,+i);case"[object Error]":return s.name==i.name&&s.message==i.message;case"[object RegExp]":case"[object String]":return s==i+"";case"[object Map]":var ee=B;case"[object Set]":var ie=1&_;if(ee||(ee=L),s.size!=i.size&&!ie)return!1;var ae=Z.get(s);if(ae)return ae==i;_|=2,Z.set(s,i);var le=j(ee(s),ee(i),_,$,Y,Z);return Z.delete(s),le;case"[object Symbol]":if(U)return U.call(s)==U.call(i)}return!1}},50689:(s,i,u)=>{var _=u(50002),w=Object.prototype.hasOwnProperty;s.exports=function equalObjects(s,i,u,x,j,B){var L=1&u,$=_(s),U=$.length;if(U!=_(i).length&&!L)return!1;for(var Y=U;Y--;){var Z=$[Y];if(!(L?Z in i:w.call(i,Z)))return!1}var ee=B.get(s),ie=B.get(i);if(ee&&ie)return ee==i&&ie==s;var ae=!0;B.set(s,i),B.set(i,s);for(var le=L;++Y{var _=u(35970),w=u(56757),x=u(32865);s.exports=function flatRest(s){return x(w(s,void 0,_),s+"")}},34840:(s,i,u)=>{var _="object"==typeof u.g&&u.g&&u.g.Object===Object&&u.g;s.exports=_},50002:(s,i,u)=>{var _=u(82199),w=u(4664),x=u(95950);s.exports=function getAllKeys(s){return _(s,x,w)}},83349:(s,i,u)=>{var _=u(82199),w=u(86375),x=u(37241);s.exports=function getAllKeysIn(s){return _(s,x,w)}},37381:(s,i,u)=>{var _=u(48152),w=u(63950),x=_?function(s){return _.get(s)}:w;s.exports=x},62284:(s,i,u)=>{var _=u(84629),w=Object.prototype.hasOwnProperty;s.exports=function getFuncName(s){for(var i=s.name+"",u=_[i],x=w.call(_,i)?u.length:0;x--;){var j=u[x],B=j.func;if(null==B||B==s)return j.name}return i}},11287:s=>{s.exports=function getHolder(s){return s.placeholder}},12651:(s,i,u)=>{var _=u(74218);s.exports=function getMapData(s,i){var u=s.__data__;return _(i)?u["string"==typeof i?"string":"hash"]:u.map}},10776:(s,i,u)=>{var _=u(30756),w=u(95950);s.exports=function getMatchData(s){for(var i=w(s),u=i.length;u--;){var x=i[u],j=s[x];i[u]=[x,j,_(j)]}return i}},56110:(s,i,u)=>{var _=u(45083),w=u(10392);s.exports=function getNative(s,i){var u=w(s,i);return _(u)?u:void 0}},28879:(s,i,u)=>{var _=u(74335)(Object.getPrototypeOf,Object);s.exports=_},659:(s,i,u)=>{var _=u(51873),w=Object.prototype,x=w.hasOwnProperty,j=w.toString,B=_?_.toStringTag:void 0;s.exports=function getRawTag(s){var i=x.call(s,B),u=s[B];try{s[B]=void 0;var _=!0}catch(s){}var w=j.call(s);return _&&(i?s[B]=u:delete s[B]),w}},4664:(s,i,u)=>{var _=u(79770),w=u(63345),x=Object.prototype.propertyIsEnumerable,j=Object.getOwnPropertySymbols,B=j?function(s){return null==s?[]:(s=Object(s),_(j(s),(function(i){return x.call(s,i)})))}:w;s.exports=B},86375:(s,i,u)=>{var _=u(14528),w=u(28879),x=u(4664),j=u(63345),B=Object.getOwnPropertySymbols?function(s){for(var i=[];s;)_(i,x(s)),s=w(s);return i}:j;s.exports=B},5861:(s,i,u)=>{var _=u(55580),w=u(68223),x=u(32804),j=u(76545),B=u(28303),L=u(72552),$=u(47473),U="[object Map]",Y="[object Promise]",Z="[object Set]",ee="[object WeakMap]",ie="[object DataView]",ae=$(_),le=$(w),ce=$(x),pe=$(j),de=$(B),fe=L;(_&&fe(new _(new ArrayBuffer(1)))!=ie||w&&fe(new w)!=U||x&&fe(x.resolve())!=Y||j&&fe(new j)!=Z||B&&fe(new B)!=ee)&&(fe=function(s){var i=L(s),u="[object Object]"==i?s.constructor:void 0,_=u?$(u):"";if(_)switch(_){case ae:return ie;case le:return U;case ce:return Y;case pe:return Z;case de:return ee}return i}),s.exports=fe},10392:s=>{s.exports=function getValue(s,i){return null==s?void 0:s[i]}},75251:s=>{var i=/\{\n\/\* \[wrapped with (.+)\] \*/,u=/,? & /;s.exports=function getWrapDetails(s){var _=s.match(i);return _?_[1].split(u):[]}},49326:(s,i,u)=>{var _=u(31769),w=u(72428),x=u(56449),j=u(30361),B=u(30294),L=u(77797);s.exports=function hasPath(s,i,u){for(var $=-1,U=(i=_(i,s)).length,Y=!1;++${var i=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");s.exports=function hasUnicode(s){return i.test(s)}},45434:s=>{var i=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;s.exports=function hasUnicodeWord(s){return i.test(s)}},22032:(s,i,u)=>{var _=u(81042);s.exports=function hashClear(){this.__data__=_?_(null):{},this.size=0}},63862:s=>{s.exports=function hashDelete(s){var i=this.has(s)&&delete this.__data__[s];return this.size-=i?1:0,i}},66721:(s,i,u)=>{var _=u(81042),w=Object.prototype.hasOwnProperty;s.exports=function hashGet(s){var i=this.__data__;if(_){var u=i[s];return"__lodash_hash_undefined__"===u?void 0:u}return w.call(i,s)?i[s]:void 0}},12749:(s,i,u)=>{var _=u(81042),w=Object.prototype.hasOwnProperty;s.exports=function hashHas(s){var i=this.__data__;return _?void 0!==i[s]:w.call(i,s)}},35749:(s,i,u)=>{var _=u(81042);s.exports=function hashSet(s,i){var u=this.__data__;return this.size+=this.has(s)?0:1,u[s]=_&&void 0===i?"__lodash_hash_undefined__":i,this}},76189:s=>{var i=Object.prototype.hasOwnProperty;s.exports=function initCloneArray(s){var u=s.length,_=new s.constructor(u);return u&&"string"==typeof s[0]&&i.call(s,"index")&&(_.index=s.index,_.input=s.input),_}},77199:(s,i,u)=>{var _=u(49653),w=u(76169),x=u(73201),j=u(93736),B=u(71961);s.exports=function initCloneByTag(s,i,u){var L=s.constructor;switch(i){case"[object ArrayBuffer]":return _(s);case"[object Boolean]":case"[object Date]":return new L(+s);case"[object DataView]":return w(s,u);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return B(s,u);case"[object Map]":case"[object Set]":return new L;case"[object Number]":case"[object String]":return new L(s);case"[object RegExp]":return x(s);case"[object Symbol]":return j(s)}}},35529:(s,i,u)=>{var _=u(39344),w=u(28879),x=u(55527);s.exports=function initCloneObject(s){return"function"!=typeof s.constructor||x(s)?{}:_(w(s))}},62060:s=>{var i=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;s.exports=function insertWrapDetails(s,u){var _=u.length;if(!_)return s;var w=_-1;return u[w]=(_>1?"& ":"")+u[w],u=u.join(_>2?", ":" "),s.replace(i,"{\n/* [wrapped with "+u+"] */\n")}},45891:(s,i,u)=>{var _=u(51873),w=u(72428),x=u(56449),j=_?_.isConcatSpreadable:void 0;s.exports=function isFlattenable(s){return x(s)||w(s)||!!(j&&s&&s[j])}},30361:s=>{var i=/^(?:0|[1-9]\d*)$/;s.exports=function isIndex(s,u){var _=typeof s;return!!(u=null==u?9007199254740991:u)&&("number"==_||"symbol"!=_&&i.test(s))&&s>-1&&s%1==0&&s{var _=u(75288),w=u(64894),x=u(30361),j=u(23805);s.exports=function isIterateeCall(s,i,u){if(!j(u))return!1;var B=typeof i;return!!("number"==B?w(u)&&x(i,u.length):"string"==B&&i in u)&&_(u[i],s)}},28586:(s,i,u)=>{var _=u(56449),w=u(44394),x=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,j=/^\w*$/;s.exports=function isKey(s,i){if(_(s))return!1;var u=typeof s;return!("number"!=u&&"symbol"!=u&&"boolean"!=u&&null!=s&&!w(s))||(j.test(s)||!x.test(s)||null!=i&&s in Object(i))}},74218:s=>{s.exports=function isKeyable(s){var i=typeof s;return"string"==i||"number"==i||"symbol"==i||"boolean"==i?"__proto__"!==s:null===s}},85087:(s,i,u)=>{var _=u(30980),w=u(37381),x=u(62284),j=u(53758);s.exports=function isLaziable(s){var i=x(s),u=j[i];if("function"!=typeof u||!(i in _.prototype))return!1;if(s===u)return!0;var B=w(u);return!!B&&s===B[0]}},87296:(s,i,u)=>{var _,w=u(55481),x=(_=/[^.]+$/.exec(w&&w.keys&&w.keys.IE_PROTO||""))?"Symbol(src)_1."+_:"";s.exports=function isMasked(s){return!!x&&x in s}},55527:s=>{var i=Object.prototype;s.exports=function isPrototype(s){var u=s&&s.constructor;return s===("function"==typeof u&&u.prototype||i)}},30756:(s,i,u)=>{var _=u(23805);s.exports=function isStrictComparable(s){return s==s&&!_(s)}},63702:s=>{s.exports=function listCacheClear(){this.__data__=[],this.size=0}},70080:(s,i,u)=>{var _=u(26025),w=Array.prototype.splice;s.exports=function listCacheDelete(s){var i=this.__data__,u=_(i,s);return!(u<0)&&(u==i.length-1?i.pop():w.call(i,u,1),--this.size,!0)}},24739:(s,i,u)=>{var _=u(26025);s.exports=function listCacheGet(s){var i=this.__data__,u=_(i,s);return u<0?void 0:i[u][1]}},48655:(s,i,u)=>{var _=u(26025);s.exports=function listCacheHas(s){return _(this.__data__,s)>-1}},31175:(s,i,u)=>{var _=u(26025);s.exports=function listCacheSet(s,i){var u=this.__data__,w=_(u,s);return w<0?(++this.size,u.push([s,i])):u[w][1]=i,this}},63040:(s,i,u)=>{var _=u(21549),w=u(80079),x=u(68223);s.exports=function mapCacheClear(){this.size=0,this.__data__={hash:new _,map:new(x||w),string:new _}}},17670:(s,i,u)=>{var _=u(12651);s.exports=function mapCacheDelete(s){var i=_(this,s).delete(s);return this.size-=i?1:0,i}},90289:(s,i,u)=>{var _=u(12651);s.exports=function mapCacheGet(s){return _(this,s).get(s)}},4509:(s,i,u)=>{var _=u(12651);s.exports=function mapCacheHas(s){return _(this,s).has(s)}},72949:(s,i,u)=>{var _=u(12651);s.exports=function mapCacheSet(s,i){var u=_(this,s),w=u.size;return u.set(s,i),this.size+=u.size==w?0:1,this}},20317:s=>{s.exports=function mapToArray(s){var i=-1,u=Array(s.size);return s.forEach((function(s,_){u[++i]=[_,s]})),u}},67197:s=>{s.exports=function matchesStrictComparable(s,i){return function(u){return null!=u&&(u[s]===i&&(void 0!==i||s in Object(u)))}}},62224:(s,i,u)=>{var _=u(50104);s.exports=function memoizeCapped(s){var i=_(s,(function(s){return 500===u.size&&u.clear(),s})),u=i.cache;return i}},3209:(s,i,u)=>{var _=u(91596),w=u(53320),x=u(36306),j="__lodash_placeholder__",B=128,L=Math.min;s.exports=function mergeData(s,i){var u=s[1],$=i[1],U=u|$,Y=U<131,Z=$==B&&8==u||$==B&&256==u&&s[7].length<=i[8]||384==$&&i[7].length<=i[8]&&8==u;if(!Y&&!Z)return s;1&$&&(s[2]=i[2],U|=1&u?0:4);var ee=i[3];if(ee){var ie=s[3];s[3]=ie?_(ie,ee,i[4]):ee,s[4]=ie?x(s[3],j):i[4]}return(ee=i[5])&&(ie=s[5],s[5]=ie?w(ie,ee,i[6]):ee,s[6]=ie?x(s[5],j):i[6]),(ee=i[7])&&(s[7]=ee),$&B&&(s[8]=null==s[8]?i[8]:L(s[8],i[8])),null==s[9]&&(s[9]=i[9]),s[0]=i[0],s[1]=U,s}},48152:(s,i,u)=>{var _=u(28303),w=_&&new _;s.exports=w},81042:(s,i,u)=>{var _=u(56110)(Object,"create");s.exports=_},3650:(s,i,u)=>{var _=u(74335)(Object.keys,Object);s.exports=_},90181:s=>{s.exports=function nativeKeysIn(s){var i=[];if(null!=s)for(var u in Object(s))i.push(u);return i}},86009:(s,i,u)=>{s=u.nmd(s);var _=u(34840),w=i&&!i.nodeType&&i,x=w&&s&&!s.nodeType&&s,j=x&&x.exports===w&&_.process,B=function(){try{var s=x&&x.require&&x.require("util").types;return s||j&&j.binding&&j.binding("util")}catch(s){}}();s.exports=B},59350:s=>{var i=Object.prototype.toString;s.exports=function objectToString(s){return i.call(s)}},74335:s=>{s.exports=function overArg(s,i){return function(u){return s(i(u))}}},56757:(s,i,u)=>{var _=u(91033),w=Math.max;s.exports=function overRest(s,i,u){return i=w(void 0===i?s.length-1:i,0),function(){for(var x=arguments,j=-1,B=w(x.length-i,0),L=Array(B);++j{var _=u(47422),w=u(25160);s.exports=function parent(s,i){return i.length<2?s:_(s,w(i,0,-1))}},84629:s=>{s.exports={}},68294:(s,i,u)=>{var _=u(23007),w=u(30361),x=Math.min;s.exports=function reorder(s,i){for(var u=s.length,j=x(i.length,u),B=_(s);j--;){var L=i[j];s[j]=w(L,u)?B[L]:void 0}return s}},36306:s=>{var i="__lodash_placeholder__";s.exports=function replaceHolders(s,u){for(var _=-1,w=s.length,x=0,j=[];++_{var _=u(34840),w="object"==typeof self&&self&&self.Object===Object&&self,x=_||w||Function("return this")();s.exports=x},14974:s=>{s.exports=function safeGet(s,i){if(("constructor"!==i||"function"!=typeof s[i])&&"__proto__"!=i)return s[i]}},31380:s=>{s.exports=function setCacheAdd(s){return this.__data__.set(s,"__lodash_hash_undefined__"),this}},51459:s=>{s.exports=function setCacheHas(s){return this.__data__.has(s)}},54641:(s,i,u)=>{var _=u(68882),w=u(51811)(_);s.exports=w},84247:s=>{s.exports=function setToArray(s){var i=-1,u=Array(s.size);return s.forEach((function(s){u[++i]=s})),u}},32865:(s,i,u)=>{var _=u(19570),w=u(51811)(_);s.exports=w},70981:(s,i,u)=>{var _=u(75251),w=u(62060),x=u(32865),j=u(75948);s.exports=function setWrapToString(s,i,u){var B=i+"";return x(s,w(B,j(_(B),u)))}},51811:s=>{var i=Date.now;s.exports=function shortOut(s){var u=0,_=0;return function(){var w=i(),x=16-(w-_);if(_=w,x>0){if(++u>=800)return arguments[0]}else u=0;return s.apply(void 0,arguments)}}},51420:(s,i,u)=>{var _=u(80079);s.exports=function stackClear(){this.__data__=new _,this.size=0}},90938:s=>{s.exports=function stackDelete(s){var i=this.__data__,u=i.delete(s);return this.size=i.size,u}},63605:s=>{s.exports=function stackGet(s){return this.__data__.get(s)}},29817:s=>{s.exports=function stackHas(s){return this.__data__.has(s)}},80945:(s,i,u)=>{var _=u(80079),w=u(68223),x=u(53661);s.exports=function stackSet(s,i){var u=this.__data__;if(u instanceof _){var j=u.__data__;if(!w||j.length<199)return j.push([s,i]),this.size=++u.size,this;u=this.__data__=new x(j)}return u.set(s,i),this.size=u.size,this}},76959:s=>{s.exports=function strictIndexOf(s,i,u){for(var _=u-1,w=s.length;++_{var _=u(61074),w=u(49698),x=u(42054);s.exports=function stringToArray(s){return w(s)?x(s):_(s)}},61802:(s,i,u)=>{var _=u(62224),w=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,x=/\\(\\)?/g,j=_((function(s){var i=[];return 46===s.charCodeAt(0)&&i.push(""),s.replace(w,(function(s,u,_,w){i.push(_?w.replace(x,"$1"):u||s)})),i}));s.exports=j},77797:(s,i,u)=>{var _=u(44394);s.exports=function toKey(s){if("string"==typeof s||_(s))return s;var i=s+"";return"0"==i&&1/s==-Infinity?"-0":i}},47473:s=>{var i=Function.prototype.toString;s.exports=function toSource(s){if(null!=s){try{return i.call(s)}catch(s){}try{return s+""}catch(s){}}return""}},31800:s=>{var i=/\s/;s.exports=function trimmedEndIndex(s){for(var u=s.length;u--&&i.test(s.charAt(u)););return u}},42054:s=>{var i="\\ud800-\\udfff",u="["+i+"]",_="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",w="\\ud83c[\\udffb-\\udfff]",x="[^"+i+"]",j="(?:\\ud83c[\\udde6-\\uddff]){2}",B="[\\ud800-\\udbff][\\udc00-\\udfff]",L="(?:"+_+"|"+w+")"+"?",$="[\\ufe0e\\ufe0f]?",U=$+L+("(?:\\u200d(?:"+[x,j,B].join("|")+")"+$+L+")*"),Y="(?:"+[x+_+"?",_,j,B,u].join("|")+")",Z=RegExp(w+"(?="+w+")|"+Y+U,"g");s.exports=function unicodeToArray(s){return s.match(Z)||[]}},22225:s=>{var i="\\ud800-\\udfff",u="\\u2700-\\u27bf",_="a-z\\xdf-\\xf6\\xf8-\\xff",w="A-Z\\xc0-\\xd6\\xd8-\\xde",x="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",j="["+x+"]",B="\\d+",L="["+u+"]",$="["+_+"]",U="[^"+i+x+B+u+_+w+"]",Y="(?:\\ud83c[\\udde6-\\uddff]){2}",Z="[\\ud800-\\udbff][\\udc00-\\udfff]",ee="["+w+"]",ie="(?:"+$+"|"+U+")",ae="(?:"+ee+"|"+U+")",le="(?:['’](?:d|ll|m|re|s|t|ve))?",ce="(?:['’](?:D|LL|M|RE|S|T|VE))?",pe="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",de="[\\ufe0e\\ufe0f]?",fe=de+pe+("(?:\\u200d(?:"+["[^"+i+"]",Y,Z].join("|")+")"+de+pe+")*"),ye="(?:"+[L,Y,Z].join("|")+")"+fe,be=RegExp([ee+"?"+$+"+"+le+"(?="+[j,ee,"$"].join("|")+")",ae+"+"+ce+"(?="+[j,ee+ie,"$"].join("|")+")",ee+"?"+ie+"+"+le,ee+"+"+ce,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",B,ye].join("|"),"g");s.exports=function unicodeWords(s){return s.match(be)||[]}},75948:(s,i,u)=>{var _=u(83729),w=u(15325),x=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]];s.exports=function updateWrapDetails(s,i){return _(x,(function(u){var _="_."+u[0];i&u[1]&&!w(s,_)&&s.push(_)})),s.sort()}},80257:(s,i,u)=>{var _=u(30980),w=u(56017),x=u(23007);s.exports=function wrapperClone(s){if(s instanceof _)return s.clone();var i=new w(s.__wrapped__,s.__chain__);return i.__actions__=x(s.__actions__),i.__index__=s.__index__,i.__values__=s.__values__,i}},64626:(s,i,u)=>{var _=u(66977);s.exports=function ary(s,i,u){return i=u?void 0:i,i=s&&null==i?s.length:i,_(s,128,void 0,void 0,void 0,void 0,i)}},84058:(s,i,u)=>{var _=u(14792),w=u(45539)((function(s,i,u){return i=i.toLowerCase(),s+(u?_(i):i)}));s.exports=w},14792:(s,i,u)=>{var _=u(13222),w=u(55808);s.exports=function capitalize(s){return w(_(s).toLowerCase())}},32629:(s,i,u)=>{var _=u(9999);s.exports=function clone(s){return _(s,4)}},37334:s=>{s.exports=function constant(s){return function(){return s}}},49747:(s,i,u)=>{var _=u(66977);function curry(s,i,u){var w=_(s,8,void 0,void 0,void 0,void 0,void 0,i=u?void 0:i);return w.placeholder=curry.placeholder,w}curry.placeholder={},s.exports=curry},38221:(s,i,u)=>{var _=u(23805),w=u(10124),x=u(99374),j=Math.max,B=Math.min;s.exports=function debounce(s,i,u){var L,$,U,Y,Z,ee,ie=0,ae=!1,le=!1,ce=!0;if("function"!=typeof s)throw new TypeError("Expected a function");function invokeFunc(i){var u=L,_=$;return L=$=void 0,ie=i,Y=s.apply(_,u)}function shouldInvoke(s){var u=s-ee;return void 0===ee||u>=i||u<0||le&&s-ie>=U}function timerExpired(){var s=w();if(shouldInvoke(s))return trailingEdge(s);Z=setTimeout(timerExpired,function remainingWait(s){var u=i-(s-ee);return le?B(u,U-(s-ie)):u}(s))}function trailingEdge(s){return Z=void 0,ce&&L?invokeFunc(s):(L=$=void 0,Y)}function debounced(){var s=w(),u=shouldInvoke(s);if(L=arguments,$=this,ee=s,u){if(void 0===Z)return function leadingEdge(s){return ie=s,Z=setTimeout(timerExpired,i),ae?invokeFunc(s):Y}(ee);if(le)return clearTimeout(Z),Z=setTimeout(timerExpired,i),invokeFunc(ee)}return void 0===Z&&(Z=setTimeout(timerExpired,i)),Y}return i=x(i)||0,_(u)&&(ae=!!u.leading,U=(le="maxWait"in u)?j(x(u.maxWait)||0,i):U,ce="trailing"in u?!!u.trailing:ce),debounced.cancel=function cancel(){void 0!==Z&&clearTimeout(Z),ie=0,L=ee=$=Z=void 0},debounced.flush=function flush(){return void 0===Z?Y:trailingEdge(w())},debounced}},50828:(s,i,u)=>{var _=u(24647),w=u(13222),x=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,j=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");s.exports=function deburr(s){return(s=w(s))&&s.replace(x,_).replace(j,"")}},75288:s=>{s.exports=function eq(s,i){return s===i||s!=s&&i!=i}},60680:(s,i,u)=>{var _=u(13222),w=/[\\^$.*+?()[\]{}|]/g,x=RegExp(w.source);s.exports=function escapeRegExp(s){return(s=_(s))&&x.test(s)?s.replace(w,"\\$&"):s}},7309:(s,i,u)=>{var _=u(62006)(u(24713));s.exports=_},24713:(s,i,u)=>{var _=u(2523),w=u(15389),x=u(61489),j=Math.max;s.exports=function findIndex(s,i,u){var B=null==s?0:s.length;if(!B)return-1;var L=null==u?0:x(u);return L<0&&(L=j(B+L,0)),_(s,w(i,3),L)}},35970:(s,i,u)=>{var _=u(83120);s.exports=function flatten(s){return(null==s?0:s.length)?_(s,1):[]}},73424:(s,i,u)=>{var _=u(16962),w=u(2874),x=Array.prototype.push;function baseAry(s,i){return 2==i?function(i,u){return s(i,u)}:function(i){return s(i)}}function cloneArray(s){for(var i=s?s.length:0,u=Array(i);i--;)u[i]=s[i];return u}function wrapImmutable(s,i){return function(){var u=arguments.length;if(u){for(var _=Array(u);u--;)_[u]=arguments[u];var w=_[0]=i.apply(void 0,_);return s.apply(void 0,_),w}}}s.exports=function baseConvert(s,i,u,j){var B="function"==typeof i,L=i===Object(i);if(L&&(j=u,u=i,i=void 0),null==u)throw new TypeError;j||(j={});var $={cap:!("cap"in j)||j.cap,curry:!("curry"in j)||j.curry,fixed:!("fixed"in j)||j.fixed,immutable:!("immutable"in j)||j.immutable,rearg:!("rearg"in j)||j.rearg},U=B?u:w,Y="curry"in j&&j.curry,Z="fixed"in j&&j.fixed,ee="rearg"in j&&j.rearg,ie=B?u.runInContext():void 0,ae=B?u:{ary:s.ary,assign:s.assign,clone:s.clone,curry:s.curry,forEach:s.forEach,isArray:s.isArray,isError:s.isError,isFunction:s.isFunction,isWeakMap:s.isWeakMap,iteratee:s.iteratee,keys:s.keys,rearg:s.rearg,toInteger:s.toInteger,toPath:s.toPath},le=ae.ary,ce=ae.assign,pe=ae.clone,de=ae.curry,fe=ae.forEach,ye=ae.isArray,be=ae.isError,_e=ae.isFunction,we=ae.isWeakMap,Se=ae.keys,xe=ae.rearg,Pe=ae.toInteger,Te=ae.toPath,Re=Se(_.aryMethod),qe={castArray:function(s){return function(){var i=arguments[0];return ye(i)?s(cloneArray(i)):s.apply(void 0,arguments)}},iteratee:function(s){return function(){var i=arguments[1],u=s(arguments[0],i),_=u.length;return $.cap&&"number"==typeof i?(i=i>2?i-2:1,_&&_<=i?u:baseAry(u,i)):u}},mixin:function(s){return function(i){var u=this;if(!_e(u))return s(u,Object(i));var _=[];return fe(Se(i),(function(s){_e(i[s])&&_.push([s,u.prototype[s]])})),s(u,Object(i)),fe(_,(function(s){var i=s[1];_e(i)?u.prototype[s[0]]=i:delete u.prototype[s[0]]})),u}},nthArg:function(s){return function(i){var u=i<0?1:Pe(i)+1;return de(s(i),u)}},rearg:function(s){return function(i,u){var _=u?u.length:0;return de(s(i,u),_)}},runInContext:function(i){return function(u){return baseConvert(s,i(u),j)}}};function castCap(s,i){if($.cap){var u=_.iterateeRearg[s];if(u)return function iterateeRearg(s,i){return overArg(s,(function(s){var u=i.length;return function baseArity(s,i){return 2==i?function(i,u){return s.apply(void 0,arguments)}:function(i){return s.apply(void 0,arguments)}}(xe(baseAry(s,u),i),u)}))}(i,u);var w=!B&&_.iterateeAry[s];if(w)return function iterateeAry(s,i){return overArg(s,(function(s){return"function"==typeof s?baseAry(s,i):s}))}(i,w)}return i}function castFixed(s,i,u){if($.fixed&&(Z||!_.skipFixed[s])){var w=_.methodSpread[s],j=w&&w.start;return void 0===j?le(i,u):function flatSpread(s,i){return function(){for(var u=arguments.length,_=u-1,w=Array(u);u--;)w[u]=arguments[u];var j=w[i],B=w.slice(0,i);return j&&x.apply(B,j),i!=_&&x.apply(B,w.slice(i+1)),s.apply(this,B)}}(i,j)}return i}function castRearg(s,i,u){return $.rearg&&u>1&&(ee||!_.skipRearg[s])?xe(i,_.methodRearg[s]||_.aryRearg[u]):i}function cloneByPath(s,i){for(var u=-1,_=(i=Te(i)).length,w=_-1,x=pe(Object(s)),j=x;null!=j&&++u<_;){var B=i[u],L=j[B];null==L||_e(L)||be(L)||we(L)||(j[B]=pe(u==w?L:Object(L))),j=j[B]}return x}function createConverter(s,i){var u=_.aliasToReal[s]||s,w=_.remap[u]||u,x=j;return function(s){var _=B?ie:ae,j=B?ie[w]:i,L=ce(ce({},x),s);return baseConvert(_,u,j,L)}}function overArg(s,i){return function(){var u=arguments.length;if(!u)return s();for(var _=Array(u);u--;)_[u]=arguments[u];var w=$.rearg?0:u-1;return _[w]=i(_[w]),s.apply(void 0,_)}}function wrap(s,i,u){var w,x=_.aliasToReal[s]||s,j=i,B=qe[x];return B?j=B(i):$.immutable&&(_.mutate.array[x]?j=wrapImmutable(i,cloneArray):_.mutate.object[x]?j=wrapImmutable(i,function createCloner(s){return function(i){return s({},i)}}(i)):_.mutate.set[x]&&(j=wrapImmutable(i,cloneByPath))),fe(Re,(function(s){return fe(_.aryMethod[s],(function(i){if(x==i){var u=_.methodSpread[x],B=u&&u.afterRearg;return w=B?castFixed(x,castRearg(x,j,s),s):castRearg(x,castFixed(x,j,s),s),w=function castCurry(s,i,u){return Y||$.curry&&u>1?de(i,u):i}(0,w=castCap(x,w),s),!1}})),!w})),w||(w=j),w==i&&(w=Y?de(w,1):function(){return i.apply(this,arguments)}),w.convert=createConverter(x,i),w.placeholder=i.placeholder=u,w}if(!L)return wrap(i,u,U);var $e=u,ze=[];return fe(Re,(function(s){fe(_.aryMethod[s],(function(s){var i=$e[_.remap[s]||s];i&&ze.push([s,wrap(s,i,$e)])}))})),fe(Se($e),(function(s){var i=$e[s];if("function"==typeof i){for(var u=ze.length;u--;)if(ze[u][0]==s)return;i.convert=createConverter(s,i),ze.push([s,i])}})),fe(ze,(function(s){$e[s[0]]=s[1]})),$e.convert=function convertLib(s){return $e.runInContext.convert(s)(void 0)},$e.placeholder=$e,fe(Se($e),(function(s){fe(_.realToAlias[s]||[],(function(i){$e[i]=$e[s]}))})),$e}},16962:(s,i)=>{i.aliasToReal={each:"forEach",eachRight:"forEachRight",entries:"toPairs",entriesIn:"toPairsIn",extend:"assignIn",extendAll:"assignInAll",extendAllWith:"assignInAllWith",extendWith:"assignInWith",first:"head",conforms:"conformsTo",matches:"isMatch",property:"get",__:"placeholder",F:"stubFalse",T:"stubTrue",all:"every",allPass:"overEvery",always:"constant",any:"some",anyPass:"overSome",apply:"spread",assoc:"set",assocPath:"set",complement:"negate",compose:"flowRight",contains:"includes",dissoc:"unset",dissocPath:"unset",dropLast:"dropRight",dropLastWhile:"dropRightWhile",equals:"isEqual",identical:"eq",indexBy:"keyBy",init:"initial",invertObj:"invert",juxt:"over",omitAll:"omit",nAry:"ary",path:"get",pathEq:"matchesProperty",pathOr:"getOr",paths:"at",pickAll:"pick",pipe:"flow",pluck:"map",prop:"get",propEq:"matchesProperty",propOr:"getOr",props:"at",symmetricDifference:"xor",symmetricDifferenceBy:"xorBy",symmetricDifferenceWith:"xorWith",takeLast:"takeRight",takeLastWhile:"takeRightWhile",unapply:"rest",unnest:"flatten",useWith:"overArgs",where:"conformsTo",whereEq:"isMatch",zipObj:"zipObject"},i.aryMethod={1:["assignAll","assignInAll","attempt","castArray","ceil","create","curry","curryRight","defaultsAll","defaultsDeepAll","floor","flow","flowRight","fromPairs","invert","iteratee","memoize","method","mergeAll","methodOf","mixin","nthArg","over","overEvery","overSome","rest","reverse","round","runInContext","spread","template","trim","trimEnd","trimStart","uniqueId","words","zipAll"],2:["add","after","ary","assign","assignAllWith","assignIn","assignInAllWith","at","before","bind","bindAll","bindKey","chunk","cloneDeepWith","cloneWith","concat","conformsTo","countBy","curryN","curryRightN","debounce","defaults","defaultsDeep","defaultTo","delay","difference","divide","drop","dropRight","dropRightWhile","dropWhile","endsWith","eq","every","filter","find","findIndex","findKey","findLast","findLastIndex","findLastKey","flatMap","flatMapDeep","flattenDepth","forEach","forEachRight","forIn","forInRight","forOwn","forOwnRight","get","groupBy","gt","gte","has","hasIn","includes","indexOf","intersection","invertBy","invoke","invokeMap","isEqual","isMatch","join","keyBy","lastIndexOf","lt","lte","map","mapKeys","mapValues","matchesProperty","maxBy","meanBy","merge","mergeAllWith","minBy","multiply","nth","omit","omitBy","overArgs","pad","padEnd","padStart","parseInt","partial","partialRight","partition","pick","pickBy","propertyOf","pull","pullAll","pullAt","random","range","rangeRight","rearg","reject","remove","repeat","restFrom","result","sampleSize","some","sortBy","sortedIndex","sortedIndexOf","sortedLastIndex","sortedLastIndexOf","sortedUniqBy","split","spreadFrom","startsWith","subtract","sumBy","take","takeRight","takeRightWhile","takeWhile","tap","throttle","thru","times","trimChars","trimCharsEnd","trimCharsStart","truncate","union","uniqBy","uniqWith","unset","unzipWith","without","wrap","xor","zip","zipObject","zipObjectDeep"],3:["assignInWith","assignWith","clamp","differenceBy","differenceWith","findFrom","findIndexFrom","findLastFrom","findLastIndexFrom","getOr","includesFrom","indexOfFrom","inRange","intersectionBy","intersectionWith","invokeArgs","invokeArgsMap","isEqualWith","isMatchWith","flatMapDepth","lastIndexOfFrom","mergeWith","orderBy","padChars","padCharsEnd","padCharsStart","pullAllBy","pullAllWith","rangeStep","rangeStepRight","reduce","reduceRight","replace","set","slice","sortedIndexBy","sortedLastIndexBy","transform","unionBy","unionWith","update","xorBy","xorWith","zipWith"],4:["fill","setWith","updateWith"]},i.aryRearg={2:[1,0],3:[2,0,1],4:[3,2,0,1]},i.iterateeAry={dropRightWhile:1,dropWhile:1,every:1,filter:1,find:1,findFrom:1,findIndex:1,findIndexFrom:1,findKey:1,findLast:1,findLastFrom:1,findLastIndex:1,findLastIndexFrom:1,findLastKey:1,flatMap:1,flatMapDeep:1,flatMapDepth:1,forEach:1,forEachRight:1,forIn:1,forInRight:1,forOwn:1,forOwnRight:1,map:1,mapKeys:1,mapValues:1,partition:1,reduce:2,reduceRight:2,reject:1,remove:1,some:1,takeRightWhile:1,takeWhile:1,times:1,transform:2},i.iterateeRearg={mapKeys:[1],reduceRight:[1,0]},i.methodRearg={assignInAllWith:[1,0],assignInWith:[1,2,0],assignAllWith:[1,0],assignWith:[1,2,0],differenceBy:[1,2,0],differenceWith:[1,2,0],getOr:[2,1,0],intersectionBy:[1,2,0],intersectionWith:[1,2,0],isEqualWith:[1,2,0],isMatchWith:[2,1,0],mergeAllWith:[1,0],mergeWith:[1,2,0],padChars:[2,1,0],padCharsEnd:[2,1,0],padCharsStart:[2,1,0],pullAllBy:[2,1,0],pullAllWith:[2,1,0],rangeStep:[1,2,0],rangeStepRight:[1,2,0],setWith:[3,1,2,0],sortedIndexBy:[2,1,0],sortedLastIndexBy:[2,1,0],unionBy:[1,2,0],unionWith:[1,2,0],updateWith:[3,1,2,0],xorBy:[1,2,0],xorWith:[1,2,0],zipWith:[1,2,0]},i.methodSpread={assignAll:{start:0},assignAllWith:{start:0},assignInAll:{start:0},assignInAllWith:{start:0},defaultsAll:{start:0},defaultsDeepAll:{start:0},invokeArgs:{start:2},invokeArgsMap:{start:2},mergeAll:{start:0},mergeAllWith:{start:0},partial:{start:1},partialRight:{start:1},without:{start:1},zipAll:{start:0}},i.mutate={array:{fill:!0,pull:!0,pullAll:!0,pullAllBy:!0,pullAllWith:!0,pullAt:!0,remove:!0,reverse:!0},object:{assign:!0,assignAll:!0,assignAllWith:!0,assignIn:!0,assignInAll:!0,assignInAllWith:!0,assignInWith:!0,assignWith:!0,defaults:!0,defaultsAll:!0,defaultsDeep:!0,defaultsDeepAll:!0,merge:!0,mergeAll:!0,mergeAllWith:!0,mergeWith:!0},set:{set:!0,setWith:!0,unset:!0,update:!0,updateWith:!0}},i.realToAlias=function(){var s=Object.prototype.hasOwnProperty,u=i.aliasToReal,_={};for(var w in u){var x=u[w];s.call(_,x)?_[x].push(w):_[x]=[w]}return _}(),i.remap={assignAll:"assign",assignAllWith:"assignWith",assignInAll:"assignIn",assignInAllWith:"assignInWith",curryN:"curry",curryRightN:"curryRight",defaultsAll:"defaults",defaultsDeepAll:"defaultsDeep",findFrom:"find",findIndexFrom:"findIndex",findLastFrom:"findLast",findLastIndexFrom:"findLastIndex",getOr:"get",includesFrom:"includes",indexOfFrom:"indexOf",invokeArgs:"invoke",invokeArgsMap:"invokeMap",lastIndexOfFrom:"lastIndexOf",mergeAll:"merge",mergeAllWith:"mergeWith",padChars:"pad",padCharsEnd:"padEnd",padCharsStart:"padStart",propertyOf:"get",rangeStep:"range",rangeStepRight:"rangeRight",restFrom:"rest",spreadFrom:"spread",trimChars:"trim",trimCharsEnd:"trimEnd",trimCharsStart:"trimStart",zipAll:"zip"},i.skipFixed={castArray:!0,flow:!0,flowRight:!0,iteratee:!0,mixin:!0,rearg:!0,runInContext:!0},i.skipRearg={add:!0,assign:!0,assignIn:!0,bind:!0,bindKey:!0,concat:!0,difference:!0,divide:!0,eq:!0,gt:!0,gte:!0,isEqual:!0,lt:!0,lte:!0,matchesProperty:!0,merge:!0,multiply:!0,overArgs:!0,partial:!0,partialRight:!0,propertyOf:!0,random:!0,range:!0,rangeRight:!0,subtract:!0,zip:!0,zipObject:!0,zipObjectDeep:!0}},47934:(s,i,u)=>{s.exports={ary:u(64626),assign:u(74733),clone:u(32629),curry:u(49747),forEach:u(83729),isArray:u(56449),isError:u(23546),isFunction:u(1882),isWeakMap:u(47886),iteratee:u(33855),keys:u(88984),rearg:u(84195),toInteger:u(61489),toPath:u(42072)}},56367:(s,i,u)=>{s.exports=u(77731)},79920:(s,i,u)=>{var _=u(73424),w=u(47934);s.exports=function convert(s,i,u){return _(w,s,i,u)}},2874:s=>{s.exports={}},77731:(s,i,u)=>{var _=u(79920)("set",u(63560));_.placeholder=u(2874),s.exports=_},58156:(s,i,u)=>{var _=u(47422);s.exports=function get(s,i,u){var w=null==s?void 0:_(s,i);return void 0===w?u:w}},61448:(s,i,u)=>{var _=u(20426),w=u(49326);s.exports=function has(s,i){return null!=s&&w(s,i,_)}},80631:(s,i,u)=>{var _=u(28077),w=u(49326);s.exports=function hasIn(s,i){return null!=s&&w(s,i,_)}},83488:s=>{s.exports=function identity(s){return s}},72428:(s,i,u)=>{var _=u(27534),w=u(40346),x=Object.prototype,j=x.hasOwnProperty,B=x.propertyIsEnumerable,L=_(function(){return arguments}())?_:function(s){return w(s)&&j.call(s,"callee")&&!B.call(s,"callee")};s.exports=L},56449:s=>{var i=Array.isArray;s.exports=i},64894:(s,i,u)=>{var _=u(1882),w=u(30294);s.exports=function isArrayLike(s){return null!=s&&w(s.length)&&!_(s)}},83693:(s,i,u)=>{var _=u(64894),w=u(40346);s.exports=function isArrayLikeObject(s){return w(s)&&_(s)}},53812:(s,i,u)=>{var _=u(72552),w=u(40346);s.exports=function isBoolean(s){return!0===s||!1===s||w(s)&&"[object Boolean]"==_(s)}},3656:(s,i,u)=>{s=u.nmd(s);var _=u(9325),w=u(89935),x=i&&!i.nodeType&&i,j=x&&s&&!s.nodeType&&s,B=j&&j.exports===x?_.Buffer:void 0,L=(B?B.isBuffer:void 0)||w;s.exports=L},62193:(s,i,u)=>{var _=u(88984),w=u(5861),x=u(72428),j=u(56449),B=u(64894),L=u(3656),$=u(55527),U=u(37167),Y=Object.prototype.hasOwnProperty;s.exports=function isEmpty(s){if(null==s)return!0;if(B(s)&&(j(s)||"string"==typeof s||"function"==typeof s.splice||L(s)||U(s)||x(s)))return!s.length;var i=w(s);if("[object Map]"==i||"[object Set]"==i)return!s.size;if($(s))return!_(s).length;for(var u in s)if(Y.call(s,u))return!1;return!0}},2404:(s,i,u)=>{var _=u(60270);s.exports=function isEqual(s,i){return _(s,i)}},23546:(s,i,u)=>{var _=u(72552),w=u(40346),x=u(11331);s.exports=function isError(s){if(!w(s))return!1;var i=_(s);return"[object Error]"==i||"[object DOMException]"==i||"string"==typeof s.message&&"string"==typeof s.name&&!x(s)}},1882:(s,i,u)=>{var _=u(72552),w=u(23805);s.exports=function isFunction(s){if(!w(s))return!1;var i=_(s);return"[object Function]"==i||"[object GeneratorFunction]"==i||"[object AsyncFunction]"==i||"[object Proxy]"==i}},30294:s=>{s.exports=function isLength(s){return"number"==typeof s&&s>-1&&s%1==0&&s<=9007199254740991}},87730:(s,i,u)=>{var _=u(29172),w=u(27301),x=u(86009),j=x&&x.isMap,B=j?w(j):_;s.exports=B},5187:s=>{s.exports=function isNull(s){return null===s}},98023:(s,i,u)=>{var _=u(72552),w=u(40346);s.exports=function isNumber(s){return"number"==typeof s||w(s)&&"[object Number]"==_(s)}},23805:s=>{s.exports=function isObject(s){var i=typeof s;return null!=s&&("object"==i||"function"==i)}},40346:s=>{s.exports=function isObjectLike(s){return null!=s&&"object"==typeof s}},11331:(s,i,u)=>{var _=u(72552),w=u(28879),x=u(40346),j=Function.prototype,B=Object.prototype,L=j.toString,$=B.hasOwnProperty,U=L.call(Object);s.exports=function isPlainObject(s){if(!x(s)||"[object Object]"!=_(s))return!1;var i=w(s);if(null===i)return!0;var u=$.call(i,"constructor")&&i.constructor;return"function"==typeof u&&u instanceof u&&L.call(u)==U}},38440:(s,i,u)=>{var _=u(16038),w=u(27301),x=u(86009),j=x&&x.isSet,B=j?w(j):_;s.exports=B},85015:(s,i,u)=>{var _=u(72552),w=u(56449),x=u(40346);s.exports=function isString(s){return"string"==typeof s||!w(s)&&x(s)&&"[object String]"==_(s)}},44394:(s,i,u)=>{var _=u(72552),w=u(40346);s.exports=function isSymbol(s){return"symbol"==typeof s||w(s)&&"[object Symbol]"==_(s)}},37167:(s,i,u)=>{var _=u(4901),w=u(27301),x=u(86009),j=x&&x.isTypedArray,B=j?w(j):_;s.exports=B},47886:(s,i,u)=>{var _=u(5861),w=u(40346);s.exports=function isWeakMap(s){return w(s)&&"[object WeakMap]"==_(s)}},33855:(s,i,u)=>{var _=u(9999),w=u(15389);s.exports=function iteratee(s){return w("function"==typeof s?s:_(s,1))}},95950:(s,i,u)=>{var _=u(70695),w=u(88984),x=u(64894);s.exports=function keys(s){return x(s)?_(s):w(s)}},37241:(s,i,u)=>{var _=u(70695),w=u(72903),x=u(64894);s.exports=function keysIn(s){return x(s)?_(s,!0):w(s)}},68090:s=>{s.exports=function last(s){var i=null==s?0:s.length;return i?s[i-1]:void 0}},50104:(s,i,u)=>{var _=u(53661);function memoize(s,i){if("function"!=typeof s||null!=i&&"function"!=typeof i)throw new TypeError("Expected a function");var memoized=function(){var u=arguments,_=i?i.apply(this,u):u[0],w=memoized.cache;if(w.has(_))return w.get(_);var x=s.apply(this,u);return memoized.cache=w.set(_,x)||w,x};return memoized.cache=new(memoize.Cache||_),memoized}memoize.Cache=_,s.exports=memoize},55364:(s,i,u)=>{var _=u(85250),w=u(20999)((function(s,i,u){_(s,i,u)}));s.exports=w},6048:s=>{s.exports=function negate(s){if("function"!=typeof s)throw new TypeError("Expected a function");return function(){var i=arguments;switch(i.length){case 0:return!s.call(this);case 1:return!s.call(this,i[0]);case 2:return!s.call(this,i[0],i[1]);case 3:return!s.call(this,i[0],i[1],i[2])}return!s.apply(this,i)}}},63950:s=>{s.exports=function noop(){}},10124:(s,i,u)=>{var _=u(9325);s.exports=function(){return _.Date.now()}},90179:(s,i,u)=>{var _=u(34932),w=u(9999),x=u(19931),j=u(31769),B=u(21791),L=u(53138),$=u(38816),U=u(83349),Y=$((function(s,i){var u={};if(null==s)return u;var $=!1;i=_(i,(function(i){return i=j(i,s),$||($=i.length>1),i})),B(s,U(s),u),$&&(u=w(u,7,L));for(var Y=i.length;Y--;)x(u,i[Y]);return u}));s.exports=Y},50583:(s,i,u)=>{var _=u(47237),w=u(17255),x=u(28586),j=u(77797);s.exports=function property(s){return x(s)?_(j(s)):w(s)}},84195:(s,i,u)=>{var _=u(66977),w=u(38816),x=w((function(s,i){return _(s,256,void 0,void 0,void 0,i)}));s.exports=x},40860:(s,i,u)=>{var _=u(40882),w=u(80909),x=u(15389),j=u(85558),B=u(56449);s.exports=function reduce(s,i,u){var L=B(s)?_:j,$=arguments.length<3;return L(s,x(i,4),u,$,w)}},63560:(s,i,u)=>{var _=u(73170);s.exports=function set(s,i,u){return null==s?s:_(s,i,u)}},42426:(s,i,u)=>{var _=u(14248),w=u(15389),x=u(90916),j=u(56449),B=u(36800);s.exports=function some(s,i,u){var L=j(s)?_:x;return u&&B(s,i,u)&&(i=void 0),L(s,w(i,3))}},63345:s=>{s.exports=function stubArray(){return[]}},89935:s=>{s.exports=function stubFalse(){return!1}},17400:(s,i,u)=>{var _=u(99374),w=1/0;s.exports=function toFinite(s){return s?(s=_(s))===w||s===-1/0?17976931348623157e292*(s<0?-1:1):s==s?s:0:0===s?s:0}},61489:(s,i,u)=>{var _=u(17400);s.exports=function toInteger(s){var i=_(s),u=i%1;return i==i?u?i-u:i:0}},80218:(s,i,u)=>{var _=u(13222);s.exports=function toLower(s){return _(s).toLowerCase()}},99374:(s,i,u)=>{var _=u(54128),w=u(23805),x=u(44394),j=/^[-+]0x[0-9a-f]+$/i,B=/^0b[01]+$/i,L=/^0o[0-7]+$/i,$=parseInt;s.exports=function toNumber(s){if("number"==typeof s)return s;if(x(s))return NaN;if(w(s)){var i="function"==typeof s.valueOf?s.valueOf():s;s=w(i)?i+"":i}if("string"!=typeof s)return 0===s?s:+s;s=_(s);var u=B.test(s);return u||L.test(s)?$(s.slice(2),u?2:8):j.test(s)?NaN:+s}},42072:(s,i,u)=>{var _=u(34932),w=u(23007),x=u(56449),j=u(44394),B=u(61802),L=u(77797),$=u(13222);s.exports=function toPath(s){return x(s)?_(s,L):j(s)?[s]:w(B($(s)))}},69884:(s,i,u)=>{var _=u(21791),w=u(37241);s.exports=function toPlainObject(s){return _(s,w(s))}},13222:(s,i,u)=>{var _=u(77556);s.exports=function toString(s){return null==s?"":_(s)}},55808:(s,i,u)=>{var _=u(12507)("toUpperCase");s.exports=_},66645:(s,i,u)=>{var _=u(1733),w=u(45434),x=u(13222),j=u(22225);s.exports=function words(s,i,u){return s=x(s),void 0===(i=u?void 0:i)?w(s)?j(s):_(s):s.match(i)||[]}},53758:(s,i,u)=>{var _=u(30980),w=u(56017),x=u(94033),j=u(56449),B=u(40346),L=u(80257),$=Object.prototype.hasOwnProperty;function lodash(s){if(B(s)&&!j(s)&&!(s instanceof _)){if(s instanceof w)return s;if($.call(s,"__wrapped__"))return L(s)}return new w(s)}lodash.prototype=x.prototype,lodash.prototype.constructor=lodash,s.exports=lodash},47248:(s,i,u)=>{var _=u(16547),w=u(51234);s.exports=function zipObject(s,i){return w(s||[],i||[],_)}},43768:(s,i,u)=>{"use strict";var _=u(45981),w=u(85587);i.highlight=highlight,i.highlightAuto=function highlightAuto(s,i){var u,j,B,L,$=i||{},U=$.subset||_.listLanguages(),Y=$.prefix,Z=U.length,ee=-1;null==Y&&(Y=x);if("string"!=typeof s)throw w("Expected `string` for value, got `%s`",s);j={relevance:0,language:null,value:[]},u={relevance:0,language:null,value:[]};for(;++eej.relevance&&(j=B),B.relevance>u.relevance&&(j=u,u=B));j.language&&(u.secondBest=j);return u},i.registerLanguage=function registerLanguage(s,i){_.registerLanguage(s,i)},i.listLanguages=function listLanguages(){return _.listLanguages()},i.registerAlias=function registerAlias(s,i){var u,w=s;i&&((w={})[s]=i);for(u in w)_.registerAliases(w[u],{languageName:u})},Emitter.prototype.addText=function text(s){var i,u,_=this.stack;if(""===s)return;i=_[_.length-1],(u=i.children[i.children.length-1])&&"text"===u.type?u.value+=s:i.children.push({type:"text",value:s})},Emitter.prototype.addKeyword=function addKeyword(s,i){this.openNode(i),this.addText(s),this.closeNode()},Emitter.prototype.addSublanguage=function addSublanguage(s,i){var u=this.stack,_=u[u.length-1],w=s.rootNode.children,x=i?{type:"element",tagName:"span",properties:{className:[i]},children:w}:w;_.children=_.children.concat(x)},Emitter.prototype.openNode=function open(s){var i=this.stack,u=this.options.classPrefix+s,_=i[i.length-1],w={type:"element",tagName:"span",properties:{className:[u]},children:[]};_.children.push(w),i.push(w)},Emitter.prototype.closeNode=function close(){this.stack.pop()},Emitter.prototype.closeAllNodes=noop,Emitter.prototype.finalize=noop,Emitter.prototype.toHTML=function toHtmlNoop(){return""};var x="hljs-";function highlight(s,i,u){var j,B=_.configure({}),L=(u||{}).prefix;if("string"!=typeof s)throw w("Expected `string` for name, got `%s`",s);if(!_.getLanguage(s))throw w("Unknown language: `%s` is not registered",s);if("string"!=typeof i)throw w("Expected `string` for value, got `%s`",i);if(null==L&&(L=x),_.configure({__emitter:Emitter,classPrefix:L}),j=_.highlight(i,{language:s,ignoreIllegals:!0}),_.configure(B||{}),j.errorRaised)throw j.errorRaised;return{relevance:j.relevance,language:j.language,value:j.emitter.rootNode.children}}function Emitter(s){this.options=s,this.rootNode={children:[]},this.stack=[this.rootNode]}function noop(){}},92340:(s,i,u)=>{const _=u(6048);function coerceElementMatchingCallback(s){return"string"==typeof s?i=>i.element===s:s.constructor&&s.extend?i=>i instanceof s:s}class ArraySlice{constructor(s){this.elements=s||[]}toValue(){return this.elements.map((s=>s.toValue()))}map(s,i){return this.elements.map(s,i)}flatMap(s,i){return this.map(s,i).reduce(((s,i)=>s.concat(i)),[])}compactMap(s,i){const u=[];return this.forEach((_=>{const w=s.bind(i)(_);w&&u.push(w)})),u}filter(s,i){return s=coerceElementMatchingCallback(s),new ArraySlice(this.elements.filter(s,i))}reject(s,i){return s=coerceElementMatchingCallback(s),new ArraySlice(this.elements.filter(_(s),i))}find(s,i){return s=coerceElementMatchingCallback(s),this.elements.find(s,i)}forEach(s,i){this.elements.forEach(s,i)}reduce(s,i){return this.elements.reduce(s,i)}includes(s){return this.elements.some((i=>i.equals(s)))}shift(){return this.elements.shift()}unshift(s){this.elements.unshift(this.refract(s))}push(s){return this.elements.push(this.refract(s)),this}add(s){this.push(s)}get(s){return this.elements[s]}getValue(s){const i=this.elements[s];if(i)return i.toValue()}get length(){return this.elements.length}get isEmpty(){return 0===this.elements.length}get first(){return this.elements[0]}}"undefined"!=typeof Symbol&&(ArraySlice.prototype[Symbol.iterator]=function symbol(){return this.elements[Symbol.iterator]()}),s.exports=ArraySlice},55973:s=>{class KeyValuePair{constructor(s,i){this.key=s,this.value=i}clone(){const s=new KeyValuePair;return this.key&&(s.key=this.key.clone()),this.value&&(s.value=this.value.clone()),s}}s.exports=KeyValuePair},3110:(s,i,u)=>{const _=u(5187),w=u(85015),x=u(98023),j=u(53812),B=u(23805),L=u(85105),$=u(86804);class Namespace{constructor(s){this.elementMap={},this.elementDetection=[],this.Element=$.Element,this.KeyValuePair=$.KeyValuePair,s&&s.noDefault||this.useDefault(),this._attributeElementKeys=[],this._attributeElementArrayKeys=[]}use(s){return s.namespace&&s.namespace({base:this}),s.load&&s.load({base:this}),this}useDefault(){return this.register("null",$.NullElement).register("string",$.StringElement).register("number",$.NumberElement).register("boolean",$.BooleanElement).register("array",$.ArrayElement).register("object",$.ObjectElement).register("member",$.MemberElement).register("ref",$.RefElement).register("link",$.LinkElement),this.detect(_,$.NullElement,!1).detect(w,$.StringElement,!1).detect(x,$.NumberElement,!1).detect(j,$.BooleanElement,!1).detect(Array.isArray,$.ArrayElement,!1).detect(B,$.ObjectElement,!1),this}register(s,i){return this._elements=void 0,this.elementMap[s]=i,this}unregister(s){return this._elements=void 0,delete this.elementMap[s],this}detect(s,i,u){return void 0===u||u?this.elementDetection.unshift([s,i]):this.elementDetection.push([s,i]),this}toElement(s){if(s instanceof this.Element)return s;let i;for(let u=0;u{const i=s[0].toUpperCase()+s.substr(1);this._elements[i]=this.elementMap[s]}))),this._elements}get serialiser(){return new L(this)}}L.prototype.Namespace=Namespace,s.exports=Namespace},10866:(s,i,u)=>{const _=u(6048),w=u(92340);class ObjectSlice extends w{map(s,i){return this.elements.map((u=>s.bind(i)(u.value,u.key,u)))}filter(s,i){return new ObjectSlice(this.elements.filter((u=>s.bind(i)(u.value,u.key,u))))}reject(s,i){return this.filter(_(s.bind(i)))}forEach(s,i){return this.elements.forEach(((u,_)=>{s.bind(i)(u.value,u.key,u,_)}))}keys(){return this.map(((s,i)=>i.toValue()))}values(){return this.map((s=>s.toValue()))}}s.exports=ObjectSlice},86804:(s,i,u)=>{const _=u(10316),w=u(41067),x=u(71167),j=u(40239),B=u(12242),L=u(6233),$=u(87726),U=u(61045),Y=u(86303),Z=u(14540),ee=u(92340),ie=u(10866),ae=u(55973);function refract(s){if(s instanceof _)return s;if("string"==typeof s)return new x(s);if("number"==typeof s)return new j(s);if("boolean"==typeof s)return new B(s);if(null===s)return new w;if(Array.isArray(s))return new L(s.map(refract));if("object"==typeof s){return new U(s)}return s}_.prototype.ObjectElement=U,_.prototype.RefElement=Z,_.prototype.MemberElement=$,_.prototype.refract=refract,ee.prototype.refract=refract,s.exports={Element:_,NullElement:w,StringElement:x,NumberElement:j,BooleanElement:B,ArrayElement:L,MemberElement:$,ObjectElement:U,LinkElement:Y,RefElement:Z,refract,ArraySlice:ee,ObjectSlice:ie,KeyValuePair:ae}},86303:(s,i,u)=>{const _=u(10316);s.exports=class LinkElement extends _{constructor(s,i,u){super(s||[],i,u),this.element="link"}get relation(){return this.attributes.get("relation")}set relation(s){this.attributes.set("relation",s)}get href(){return this.attributes.get("href")}set href(s){this.attributes.set("href",s)}}},14540:(s,i,u)=>{const _=u(10316);s.exports=class RefElement extends _{constructor(s,i,u){super(s||[],i,u),this.element="ref",this.path||(this.path="element")}get path(){return this.attributes.get("path")}set path(s){this.attributes.set("path",s)}}},34035:(s,i,u)=>{const _=u(3110),w=u(86804);i.g$=_,i.KeyValuePair=u(55973),i.G6=w.ArraySlice,i.ot=w.ObjectSlice,i.Hg=w.Element,i.Om=w.StringElement,i.kT=w.NumberElement,i.bd=w.BooleanElement,i.Os=w.NullElement,i.wE=w.ArrayElement,i.Sh=w.ObjectElement,i.Pr=w.MemberElement,i.sI=w.RefElement,i.Ft=w.LinkElement,i.e=w.refract,u(85105),u(75147)},6233:(s,i,u)=>{const _=u(6048),w=u(10316),x=u(92340);class ArrayElement extends w{constructor(s,i,u){super(s||[],i,u),this.element="array"}primitive(){return"array"}get(s){return this.content[s]}getValue(s){const i=this.get(s);if(i)return i.toValue()}getIndex(s){return this.content[s]}set(s,i){return this.content[s]=this.refract(i),this}remove(s){const i=this.content.splice(s,1);return i.length?i[0]:null}map(s,i){return this.content.map(s,i)}flatMap(s,i){return this.map(s,i).reduce(((s,i)=>s.concat(i)),[])}compactMap(s,i){const u=[];return this.forEach((_=>{const w=s.bind(i)(_);w&&u.push(w)})),u}filter(s,i){return new x(this.content.filter(s,i))}reject(s,i){return this.filter(_(s),i)}reduce(s,i){let u,_;void 0!==i?(u=0,_=this.refract(i)):(u=1,_="object"===this.primitive()?this.first.value:this.first);for(let i=u;i{s.bind(i)(u,this.refract(_))}))}shift(){return this.content.shift()}unshift(s){this.content.unshift(this.refract(s))}push(s){return this.content.push(this.refract(s)),this}add(s){this.push(s)}findElements(s,i){const u=i||{},_=!!u.recursive,w=void 0===u.results?[]:u.results;return this.forEach(((i,u,x)=>{_&&void 0!==i.findElements&&i.findElements(s,{results:w,recursive:_}),s(i,u,x)&&w.push(i)})),w}find(s){return new x(this.findElements(s,{recursive:!0}))}findByElement(s){return this.find((i=>i.element===s))}findByClass(s){return this.find((i=>i.classes.includes(s)))}getById(s){return this.find((i=>i.id.toValue()===s)).first}includes(s){return this.content.some((i=>i.equals(s)))}contains(s){return this.includes(s)}empty(){return new this.constructor([])}"fantasy-land/empty"(){return this.empty()}concat(s){return new this.constructor(this.content.concat(s.content))}"fantasy-land/concat"(s){return this.concat(s)}"fantasy-land/map"(s){return new this.constructor(this.map(s))}"fantasy-land/chain"(s){return this.map((i=>s(i)),this).reduce(((s,i)=>s.concat(i)),this.empty())}"fantasy-land/filter"(s){return new this.constructor(this.content.filter(s))}"fantasy-land/reduce"(s,i){return this.content.reduce(s,i)}get length(){return this.content.length}get isEmpty(){return 0===this.content.length}get first(){return this.getIndex(0)}get second(){return this.getIndex(1)}get last(){return this.getIndex(this.length-1)}}ArrayElement.empty=function empty(){return new this},ArrayElement["fantasy-land/empty"]=ArrayElement.empty,"undefined"!=typeof Symbol&&(ArrayElement.prototype[Symbol.iterator]=function symbol(){return this.content[Symbol.iterator]()}),s.exports=ArrayElement},12242:(s,i,u)=>{const _=u(10316);s.exports=class BooleanElement extends _{constructor(s,i,u){super(s,i,u),this.element="boolean"}primitive(){return"boolean"}}},10316:(s,i,u)=>{const _=u(2404),w=u(55973),x=u(92340);class Element{constructor(s,i,u){i&&(this.meta=i),u&&(this.attributes=u),this.content=s}freeze(){Object.isFrozen(this)||(this._meta&&(this.meta.parent=this,this.meta.freeze()),this._attributes&&(this.attributes.parent=this,this.attributes.freeze()),this.children.forEach((s=>{s.parent=this,s.freeze()}),this),this.content&&Array.isArray(this.content)&&Object.freeze(this.content),Object.freeze(this))}primitive(){}clone(){const s=new this.constructor;return s.element=this.element,this.meta.length&&(s._meta=this.meta.clone()),this.attributes.length&&(s._attributes=this.attributes.clone()),this.content?this.content.clone?s.content=this.content.clone():Array.isArray(this.content)?s.content=this.content.map((s=>s.clone())):s.content=this.content:s.content=this.content,s}toValue(){return this.content instanceof Element?this.content.toValue():this.content instanceof w?{key:this.content.key.toValue(),value:this.content.value?this.content.value.toValue():void 0}:this.content&&this.content.map?this.content.map((s=>s.toValue()),this):this.content}toRef(s){if(""===this.id.toValue())throw Error("Cannot create reference to an element that does not contain an ID");const i=new this.RefElement(this.id.toValue());return s&&(i.path=s),i}findRecursive(...s){if(arguments.length>1&&!this.isFrozen)throw new Error("Cannot find recursive with multiple element names without first freezing the element. Call `element.freeze()`");const i=s.pop();let u=new x;const append=(s,i)=>(s.push(i),s),checkElement=(s,u)=>{u.element===i&&s.push(u);const _=u.findRecursive(i);return _&&_.reduce(append,s),u.content instanceof w&&(u.content.key&&checkElement(s,u.content.key),u.content.value&&checkElement(s,u.content.value)),s};return this.content&&(this.content.element&&checkElement(u,this.content),Array.isArray(this.content)&&this.content.reduce(checkElement,u)),s.isEmpty||(u=u.filter((i=>{let u=i.parents.map((s=>s.element));for(const i in s){const _=s[i],w=u.indexOf(_);if(-1===w)return!1;u=u.splice(0,w)}return!0}))),u}set(s){return this.content=s,this}equals(s){return _(this.toValue(),s)}getMetaProperty(s,i){if(!this.meta.hasKey(s)){if(this.isFrozen){const s=this.refract(i);return s.freeze(),s}this.meta.set(s,i)}return this.meta.get(s)}setMetaProperty(s,i){this.meta.set(s,i)}get element(){return this._storedElement||"element"}set element(s){this._storedElement=s}get content(){return this._content}set content(s){if(s instanceof Element)this._content=s;else if(s instanceof x)this.content=s.elements;else if("string"==typeof s||"number"==typeof s||"boolean"==typeof s||"null"===s||null==s)this._content=s;else if(s instanceof w)this._content=s;else if(Array.isArray(s))this._content=s.map(this.refract);else{if("object"!=typeof s)throw new Error("Cannot set content to given value");this._content=Object.keys(s).map((i=>new this.MemberElement(i,s[i])))}}get meta(){if(!this._meta){if(this.isFrozen){const s=new this.ObjectElement;return s.freeze(),s}this._meta=new this.ObjectElement}return this._meta}set meta(s){s instanceof this.ObjectElement?this._meta=s:this.meta.set(s||{})}get attributes(){if(!this._attributes){if(this.isFrozen){const s=new this.ObjectElement;return s.freeze(),s}this._attributes=new this.ObjectElement}return this._attributes}set attributes(s){s instanceof this.ObjectElement?this._attributes=s:this.attributes.set(s||{})}get id(){return this.getMetaProperty("id","")}set id(s){this.setMetaProperty("id",s)}get classes(){return this.getMetaProperty("classes",[])}set classes(s){this.setMetaProperty("classes",s)}get title(){return this.getMetaProperty("title","")}set title(s){this.setMetaProperty("title",s)}get description(){return this.getMetaProperty("description","")}set description(s){this.setMetaProperty("description",s)}get links(){return this.getMetaProperty("links",[])}set links(s){this.setMetaProperty("links",s)}get isFrozen(){return Object.isFrozen(this)}get parents(){let{parent:s}=this;const i=new x;for(;s;)i.push(s),s=s.parent;return i}get children(){if(Array.isArray(this.content))return new x(this.content);if(this.content instanceof w){const s=new x([this.content.key]);return this.content.value&&s.push(this.content.value),s}return this.content instanceof Element?new x([this.content]):new x}get recursiveChildren(){const s=new x;return this.children.forEach((i=>{s.push(i),i.recursiveChildren.forEach((i=>{s.push(i)}))})),s}}s.exports=Element},87726:(s,i,u)=>{const _=u(55973),w=u(10316);s.exports=class MemberElement extends w{constructor(s,i,u,w){super(new _,u,w),this.element="member",this.key=s,this.value=i}get key(){return this.content.key}set key(s){this.content.key=this.refract(s)}get value(){return this.content.value}set value(s){this.content.value=this.refract(s)}}},41067:(s,i,u)=>{const _=u(10316);s.exports=class NullElement extends _{constructor(s,i,u){super(s||null,i,u),this.element="null"}primitive(){return"null"}set(){return new Error("Cannot set the value of null")}}},40239:(s,i,u)=>{const _=u(10316);s.exports=class NumberElement extends _{constructor(s,i,u){super(s,i,u),this.element="number"}primitive(){return"number"}}},61045:(s,i,u)=>{const _=u(6048),w=u(23805),x=u(6233),j=u(87726),B=u(10866);s.exports=class ObjectElement extends x{constructor(s,i,u){super(s||[],i,u),this.element="object"}primitive(){return"object"}toValue(){return this.content.reduce(((s,i)=>(s[i.key.toValue()]=i.value?i.value.toValue():void 0,s)),{})}get(s){const i=this.getMember(s);if(i)return i.value}getMember(s){if(void 0!==s)return this.content.find((i=>i.key.toValue()===s))}remove(s){let i=null;return this.content=this.content.filter((u=>u.key.toValue()!==s||(i=u,!1))),i}getKey(s){const i=this.getMember(s);if(i)return i.key}set(s,i){if(w(s))return Object.keys(s).forEach((i=>{this.set(i,s[i])})),this;const u=s,_=this.getMember(u);return _?_.value=i:this.content.push(new j(u,i)),this}keys(){return this.content.map((s=>s.key.toValue()))}values(){return this.content.map((s=>s.value.toValue()))}hasKey(s){return this.content.some((i=>i.key.equals(s)))}items(){return this.content.map((s=>[s.key.toValue(),s.value.toValue()]))}map(s,i){return this.content.map((u=>s.bind(i)(u.value,u.key,u)))}compactMap(s,i){const u=[];return this.forEach(((_,w,x)=>{const j=s.bind(i)(_,w,x);j&&u.push(j)})),u}filter(s,i){return new B(this.content).filter(s,i)}reject(s,i){return this.filter(_(s),i)}forEach(s,i){return this.content.forEach((u=>s.bind(i)(u.value,u.key,u)))}}},71167:(s,i,u)=>{const _=u(10316);s.exports=class StringElement extends _{constructor(s,i,u){super(s,i,u),this.element="string"}primitive(){return"string"}get length(){return this.content.length}}},75147:(s,i,u)=>{const _=u(85105);s.exports=class JSON06Serialiser extends _{serialise(s){if(!(s instanceof this.namespace.elements.Element))throw new TypeError(`Given element \`${s}\` is not an Element instance`);let i;s._attributes&&s.attributes.get("variable")&&(i=s.attributes.get("variable"));const u={element:s.element};s._meta&&s._meta.length>0&&(u.meta=this.serialiseObject(s.meta));const _="enum"===s.element||-1!==s.attributes.keys().indexOf("enumerations");if(_){const i=this.enumSerialiseAttributes(s);i&&(u.attributes=i)}else if(s._attributes&&s._attributes.length>0){let{attributes:_}=s;_.get("metadata")&&(_=_.clone(),_.set("meta",_.get("metadata")),_.remove("metadata")),"member"===s.element&&i&&(_=_.clone(),_.remove("variable")),_.length>0&&(u.attributes=this.serialiseObject(_))}if(_)u.content=this.enumSerialiseContent(s,u);else if(this[`${s.element}SerialiseContent`])u.content=this[`${s.element}SerialiseContent`](s,u);else if(void 0!==s.content){let _;i&&s.content.key?(_=s.content.clone(),_.key.attributes.set("variable",i),_=this.serialiseContent(_)):_=this.serialiseContent(s.content),this.shouldSerialiseContent(s,_)&&(u.content=_)}else this.shouldSerialiseContent(s,s.content)&&s instanceof this.namespace.elements.Array&&(u.content=[]);return u}shouldSerialiseContent(s,i){return"parseResult"===s.element||"httpRequest"===s.element||"httpResponse"===s.element||"category"===s.element||"link"===s.element||void 0!==i&&(!Array.isArray(i)||0!==i.length)}refSerialiseContent(s,i){return delete i.attributes,{href:s.toValue(),path:s.path.toValue()}}sourceMapSerialiseContent(s){return s.toValue()}dataStructureSerialiseContent(s){return[this.serialiseContent(s.content)]}enumSerialiseAttributes(s){const i=s.attributes.clone(),u=i.remove("enumerations")||new this.namespace.elements.Array([]),_=i.get("default");let w=i.get("samples")||new this.namespace.elements.Array([]);if(_&&_.content&&(_.content.attributes&&_.content.attributes.remove("typeAttributes"),i.set("default",new this.namespace.elements.Array([_.content]))),w.forEach((s=>{s.content&&s.content.element&&s.content.attributes.remove("typeAttributes")})),s.content&&0!==u.length&&w.unshift(s.content),w=w.map((s=>s instanceof this.namespace.elements.Array?[s]:new this.namespace.elements.Array([s.content]))),w.length&&i.set("samples",w),i.length>0)return this.serialiseObject(i)}enumSerialiseContent(s){if(s._attributes){const i=s.attributes.get("enumerations");if(i&&i.length>0)return i.content.map((s=>{const i=s.clone();return i.attributes.remove("typeAttributes"),this.serialise(i)}))}if(s.content){const i=s.content.clone();return i.attributes.remove("typeAttributes"),[this.serialise(i)]}return[]}deserialise(s){if("string"==typeof s)return new this.namespace.elements.String(s);if("number"==typeof s)return new this.namespace.elements.Number(s);if("boolean"==typeof s)return new this.namespace.elements.Boolean(s);if(null===s)return new this.namespace.elements.Null;if(Array.isArray(s))return new this.namespace.elements.Array(s.map(this.deserialise,this));const i=this.namespace.getElementClass(s.element),u=new i;u.element!==s.element&&(u.element=s.element),s.meta&&this.deserialiseObject(s.meta,u.meta),s.attributes&&this.deserialiseObject(s.attributes,u.attributes);const _=this.deserialiseContent(s.content);if(void 0===_&&null!==u.content||(u.content=_),"enum"===u.element){u.content&&u.attributes.set("enumerations",u.content);let s=u.attributes.get("samples");if(u.attributes.remove("samples"),s){const _=s;s=new this.namespace.elements.Array,_.forEach((_=>{_.forEach((_=>{const w=new i(_);w.element=u.element,s.push(w)}))}));const w=s.shift();u.content=w?w.content:void 0,u.attributes.set("samples",s)}else u.content=void 0;let _=u.attributes.get("default");if(_&&_.length>0){_=_.get(0);const s=new i(_);s.element=u.element,u.attributes.set("default",s)}}else if("dataStructure"===u.element&&Array.isArray(u.content))[u.content]=u.content;else if("category"===u.element){const s=u.attributes.get("meta");s&&(u.attributes.set("metadata",s),u.attributes.remove("meta"))}else"member"===u.element&&u.key&&u.key._attributes&&u.key._attributes.getValue("variable")&&(u.attributes.set("variable",u.key.attributes.get("variable")),u.key.attributes.remove("variable"));return u}serialiseContent(s){if(s instanceof this.namespace.elements.Element)return this.serialise(s);if(s instanceof this.namespace.KeyValuePair){const i={key:this.serialise(s.key)};return s.value&&(i.value=this.serialise(s.value)),i}return s&&s.map?s.map(this.serialise,this):s}deserialiseContent(s){if(s){if(s.element)return this.deserialise(s);if(s.key){const i=new this.namespace.KeyValuePair(this.deserialise(s.key));return s.value&&(i.value=this.deserialise(s.value)),i}if(s.map)return s.map(this.deserialise,this)}return s}shouldRefract(s){return!!(s._attributes&&s.attributes.keys().length||s._meta&&s.meta.keys().length)||"enum"!==s.element&&(s.element!==s.primitive()||"member"===s.element)}convertKeyToRefract(s,i){return this.shouldRefract(i)?this.serialise(i):"enum"===i.element?this.serialiseEnum(i):"array"===i.element?i.map((i=>this.shouldRefract(i)||"default"===s?this.serialise(i):"array"===i.element||"object"===i.element||"enum"===i.element?i.children.map((s=>this.serialise(s))):i.toValue())):"object"===i.element?(i.content||[]).map(this.serialise,this):i.toValue()}serialiseEnum(s){return s.children.map((s=>this.serialise(s)))}serialiseObject(s){const i={};return s.forEach(((s,u)=>{if(s){const _=u.toValue();i[_]=this.convertKeyToRefract(_,s)}})),i}deserialiseObject(s,i){Object.keys(s).forEach((u=>{i.set(u,this.deserialise(s[u]))}))}}},85105:s=>{s.exports=class JSONSerialiser{constructor(s){this.namespace=s||new this.Namespace}serialise(s){if(!(s instanceof this.namespace.elements.Element))throw new TypeError(`Given element \`${s}\` is not an Element instance`);const i={element:s.element};s._meta&&s._meta.length>0&&(i.meta=this.serialiseObject(s.meta)),s._attributes&&s._attributes.length>0&&(i.attributes=this.serialiseObject(s.attributes));const u=this.serialiseContent(s.content);return void 0!==u&&(i.content=u),i}deserialise(s){if(!s.element)throw new Error("Given value is not an object containing an element name");const i=new(this.namespace.getElementClass(s.element));i.element!==s.element&&(i.element=s.element),s.meta&&this.deserialiseObject(s.meta,i.meta),s.attributes&&this.deserialiseObject(s.attributes,i.attributes);const u=this.deserialiseContent(s.content);return void 0===u&&null!==i.content||(i.content=u),i}serialiseContent(s){if(s instanceof this.namespace.elements.Element)return this.serialise(s);if(s instanceof this.namespace.KeyValuePair){const i={key:this.serialise(s.key)};return s.value&&(i.value=this.serialise(s.value)),i}if(s&&s.map){if(0===s.length)return;return s.map(this.serialise,this)}return s}deserialiseContent(s){if(s){if(s.element)return this.deserialise(s);if(s.key){const i=new this.namespace.KeyValuePair(this.deserialise(s.key));return s.value&&(i.value=this.deserialise(s.value)),i}if(s.map)return s.map(this.deserialise,this)}return s}serialiseObject(s){const i={};if(s.forEach(((s,u)=>{s&&(i[u.toValue()]=this.serialise(s))})),0!==Object.keys(i).length)return i}deserialiseObject(s,i){Object.keys(s).forEach((u=>{i.set(u,this.deserialise(s[u]))}))}}},58859:(s,i,u)=>{var _="function"==typeof Map&&Map.prototype,w=Object.getOwnPropertyDescriptor&&_?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,x=_&&w&&"function"==typeof w.get?w.get:null,j=_&&Map.prototype.forEach,B="function"==typeof Set&&Set.prototype,L=Object.getOwnPropertyDescriptor&&B?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,$=B&&L&&"function"==typeof L.get?L.get:null,U=B&&Set.prototype.forEach,Y="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,Z="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,ee="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,ie=Boolean.prototype.valueOf,ae=Object.prototype.toString,le=Function.prototype.toString,ce=String.prototype.match,pe=String.prototype.slice,de=String.prototype.replace,fe=String.prototype.toUpperCase,ye=String.prototype.toLowerCase,be=RegExp.prototype.test,_e=Array.prototype.concat,we=Array.prototype.join,Se=Array.prototype.slice,xe=Math.floor,Pe="function"==typeof BigInt?BigInt.prototype.valueOf:null,Te=Object.getOwnPropertySymbols,Re="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,qe="function"==typeof Symbol&&"object"==typeof Symbol.iterator,$e="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===qe||"symbol")?Symbol.toStringTag:null,ze=Object.prototype.propertyIsEnumerable,We=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(s){return s.__proto__}:null);function addNumericSeparator(s,i){if(s===1/0||s===-1/0||s!=s||s&&s>-1e3&&s<1e3||be.call(/e/,i))return i;var u=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof s){var _=s<0?-xe(-s):xe(s);if(_!==s){var w=String(_),x=pe.call(i,w.length+1);return de.call(w,u,"$&_")+"."+de.call(de.call(x,/([0-9]{3})/g,"$&_"),/_$/,"")}}return de.call(i,u,"$&_")}var He=u(42634),Xe=He.custom,Ye=isSymbol(Xe)?Xe:null;function wrapQuotes(s,i,u){var _="double"===(u.quoteStyle||i)?'"':"'";return _+s+_}function quote(s){return de.call(String(s),/"/g,""")}function isArray(s){return!("[object Array]"!==toStr(s)||$e&&"object"==typeof s&&$e in s)}function isRegExp(s){return!("[object RegExp]"!==toStr(s)||$e&&"object"==typeof s&&$e in s)}function isSymbol(s){if(qe)return s&&"object"==typeof s&&s instanceof Symbol;if("symbol"==typeof s)return!0;if(!s||"object"!=typeof s||!Re)return!1;try{return Re.call(s),!0}catch(s){}return!1}s.exports=function inspect_(s,i,_,w){var B=i||{};if(has(B,"quoteStyle")&&"single"!==B.quoteStyle&&"double"!==B.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(has(B,"maxStringLength")&&("number"==typeof B.maxStringLength?B.maxStringLength<0&&B.maxStringLength!==1/0:null!==B.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var L=!has(B,"customInspect")||B.customInspect;if("boolean"!=typeof L&&"symbol"!==L)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(has(B,"indent")&&null!==B.indent&&"\t"!==B.indent&&!(parseInt(B.indent,10)===B.indent&&B.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(has(B,"numericSeparator")&&"boolean"!=typeof B.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var ae=B.numericSeparator;if(void 0===s)return"undefined";if(null===s)return"null";if("boolean"==typeof s)return s?"true":"false";if("string"==typeof s)return inspectString(s,B);if("number"==typeof s){if(0===s)return 1/0/s>0?"0":"-0";var fe=String(s);return ae?addNumericSeparator(s,fe):fe}if("bigint"==typeof s){var be=String(s)+"n";return ae?addNumericSeparator(s,be):be}var xe=void 0===B.depth?5:B.depth;if(void 0===_&&(_=0),_>=xe&&xe>0&&"object"==typeof s)return isArray(s)?"[Array]":"[Object]";var Te=function getIndent(s,i){var u;if("\t"===s.indent)u="\t";else{if(!("number"==typeof s.indent&&s.indent>0))return null;u=we.call(Array(s.indent+1)," ")}return{base:u,prev:we.call(Array(i+1),u)}}(B,_);if(void 0===w)w=[];else if(indexOf(w,s)>=0)return"[Circular]";function inspect(s,i,u){if(i&&(w=Se.call(w)).push(i),u){var x={depth:B.depth};return has(B,"quoteStyle")&&(x.quoteStyle=B.quoteStyle),inspect_(s,x,_+1,w)}return inspect_(s,B,_+1,w)}if("function"==typeof s&&!isRegExp(s)){var Xe=function nameOf(s){if(s.name)return s.name;var i=ce.call(le.call(s),/^function\s*([\w$]+)/);if(i)return i[1];return null}(s),Qe=arrObjKeys(s,inspect);return"[Function"+(Xe?": "+Xe:" (anonymous)")+"]"+(Qe.length>0?" { "+we.call(Qe,", ")+" }":"")}if(isSymbol(s)){var et=qe?de.call(String(s),/^(Symbol\(.*\))_[^)]*$/,"$1"):Re.call(s);return"object"!=typeof s||qe?et:markBoxed(et)}if(function isElement(s){if(!s||"object"!=typeof s)return!1;if("undefined"!=typeof HTMLElement&&s instanceof HTMLElement)return!0;return"string"==typeof s.nodeName&&"function"==typeof s.getAttribute}(s)){for(var tt="<"+ye.call(String(s.nodeName)),rt=s.attributes||[],nt=0;nt"}if(isArray(s)){if(0===s.length)return"[]";var ot=arrObjKeys(s,inspect);return Te&&!function singleLineValues(s){for(var i=0;i=0)return!1;return!0}(ot)?"["+indentedJoin(ot,Te)+"]":"[ "+we.call(ot,", ")+" ]"}if(function isError(s){return!("[object Error]"!==toStr(s)||$e&&"object"==typeof s&&$e in s)}(s)){var st=arrObjKeys(s,inspect);return"cause"in Error.prototype||!("cause"in s)||ze.call(s,"cause")?0===st.length?"["+String(s)+"]":"{ ["+String(s)+"] "+we.call(st,", ")+" }":"{ ["+String(s)+"] "+we.call(_e.call("[cause]: "+inspect(s.cause),st),", ")+" }"}if("object"==typeof s&&L){if(Ye&&"function"==typeof s[Ye]&&He)return He(s,{depth:xe-_});if("symbol"!==L&&"function"==typeof s.inspect)return s.inspect()}if(function isMap(s){if(!x||!s||"object"!=typeof s)return!1;try{x.call(s);try{$.call(s)}catch(s){return!0}return s instanceof Map}catch(s){}return!1}(s)){var it=[];return j&&j.call(s,(function(i,u){it.push(inspect(u,s,!0)+" => "+inspect(i,s))})),collectionOf("Map",x.call(s),it,Te)}if(function isSet(s){if(!$||!s||"object"!=typeof s)return!1;try{$.call(s);try{x.call(s)}catch(s){return!0}return s instanceof Set}catch(s){}return!1}(s)){var at=[];return U&&U.call(s,(function(i){at.push(inspect(i,s))})),collectionOf("Set",$.call(s),at,Te)}if(function isWeakMap(s){if(!Y||!s||"object"!=typeof s)return!1;try{Y.call(s,Y);try{Z.call(s,Z)}catch(s){return!0}return s instanceof WeakMap}catch(s){}return!1}(s))return weakCollectionOf("WeakMap");if(function isWeakSet(s){if(!Z||!s||"object"!=typeof s)return!1;try{Z.call(s,Z);try{Y.call(s,Y)}catch(s){return!0}return s instanceof WeakSet}catch(s){}return!1}(s))return weakCollectionOf("WeakSet");if(function isWeakRef(s){if(!ee||!s||"object"!=typeof s)return!1;try{return ee.call(s),!0}catch(s){}return!1}(s))return weakCollectionOf("WeakRef");if(function isNumber(s){return!("[object Number]"!==toStr(s)||$e&&"object"==typeof s&&$e in s)}(s))return markBoxed(inspect(Number(s)));if(function isBigInt(s){if(!s||"object"!=typeof s||!Pe)return!1;try{return Pe.call(s),!0}catch(s){}return!1}(s))return markBoxed(inspect(Pe.call(s)));if(function isBoolean(s){return!("[object Boolean]"!==toStr(s)||$e&&"object"==typeof s&&$e in s)}(s))return markBoxed(ie.call(s));if(function isString(s){return!("[object String]"!==toStr(s)||$e&&"object"==typeof s&&$e in s)}(s))return markBoxed(inspect(String(s)));if("undefined"!=typeof window&&s===window)return"{ [object Window] }";if(s===u.g)return"{ [object globalThis] }";if(!function isDate(s){return!("[object Date]"!==toStr(s)||$e&&"object"==typeof s&&$e in s)}(s)&&!isRegExp(s)){var lt=arrObjKeys(s,inspect),ct=We?We(s)===Object.prototype:s instanceof Object||s.constructor===Object,ut=s instanceof Object?"":"null prototype",pt=!ct&&$e&&Object(s)===s&&$e in s?pe.call(toStr(s),8,-1):ut?"Object":"",ht=(ct||"function"!=typeof s.constructor?"":s.constructor.name?s.constructor.name+" ":"")+(pt||ut?"["+we.call(_e.call([],pt||[],ut||[]),": ")+"] ":"");return 0===lt.length?ht+"{}":Te?ht+"{"+indentedJoin(lt,Te)+"}":ht+"{ "+we.call(lt,", ")+" }"}return String(s)};var Qe=Object.prototype.hasOwnProperty||function(s){return s in this};function has(s,i){return Qe.call(s,i)}function toStr(s){return ae.call(s)}function indexOf(s,i){if(s.indexOf)return s.indexOf(i);for(var u=0,_=s.length;u<_;u++)if(s[u]===i)return u;return-1}function inspectString(s,i){if(s.length>i.maxStringLength){var u=s.length-i.maxStringLength,_="... "+u+" more character"+(u>1?"s":"");return inspectString(pe.call(s,0,i.maxStringLength),i)+_}return wrapQuotes(de.call(de.call(s,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,lowbyte),"single",i)}function lowbyte(s){var i=s.charCodeAt(0),u={8:"b",9:"t",10:"n",12:"f",13:"r"}[i];return u?"\\"+u:"\\x"+(i<16?"0":"")+fe.call(i.toString(16))}function markBoxed(s){return"Object("+s+")"}function weakCollectionOf(s){return s+" { ? }"}function collectionOf(s,i,u,_){return s+" ("+i+") {"+(_?indentedJoin(u,_):we.call(u,", "))+"}"}function indentedJoin(s,i){if(0===s.length)return"";var u="\n"+i.prev+i.base;return u+we.call(s,","+u)+"\n"+i.prev}function arrObjKeys(s,i){var u=isArray(s),_=[];if(u){_.length=s.length;for(var w=0;w{var i,u,_=s.exports={};function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(s){if(i===setTimeout)return setTimeout(s,0);if((i===defaultSetTimout||!i)&&setTimeout)return i=setTimeout,setTimeout(s,0);try{return i(s,0)}catch(u){try{return i.call(null,s,0)}catch(u){return i.call(this,s,0)}}}!function(){try{i="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(s){i=defaultSetTimout}try{u="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(s){u=defaultClearTimeout}}();var w,x=[],j=!1,B=-1;function cleanUpNextTick(){j&&w&&(j=!1,w.length?x=w.concat(x):B=-1,x.length&&drainQueue())}function drainQueue(){if(!j){var s=runTimeout(cleanUpNextTick);j=!0;for(var i=x.length;i;){for(w=x,x=[];++B1)for(var u=1;u{"use strict";var _=u(6925);function emptyFunction(){}function emptyFunctionWithReset(){}emptyFunctionWithReset.resetWarningCache=emptyFunction,s.exports=function(){function shim(s,i,u,w,x,j){if(j!==_){var B=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw B.name="Invariant Violation",B}}function getShim(){return shim}shim.isRequired=shim;var s={array:shim,bigint:shim,bool:shim,func:shim,number:shim,object:shim,string:shim,symbol:shim,any:shim,arrayOf:getShim,element:shim,elementType:shim,instanceOf:getShim,node:shim,objectOf:getShim,oneOf:getShim,oneOfType:getShim,shape:getShim,exact:getShim,checkPropTypes:emptyFunctionWithReset,resetWarningCache:emptyFunction};return s.PropTypes=s,s}},5556:(s,i,u)=>{s.exports=u(2694)()},6925:s=>{"use strict";s.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},74765:s=>{"use strict";var i=String.prototype.replace,u=/%20/g,_="RFC1738",w="RFC3986";s.exports={default:w,formatters:{RFC1738:function(s){return i.call(s,u,"+")},RFC3986:function(s){return String(s)}},RFC1738:_,RFC3986:w}},55373:(s,i,u)=>{"use strict";var _=u(98636),w=u(62642),x=u(74765);s.exports={formats:x,parse:w,stringify:_}},62642:(s,i,u)=>{"use strict";var _=u(37720),w=Object.prototype.hasOwnProperty,x=Array.isArray,j={allowDots:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decoder:_.decode,delimiter:"&",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},interpretNumericEntities=function(s){return s.replace(/&#(\d+);/g,(function(s,i){return String.fromCharCode(parseInt(i,10))}))},parseArrayValue=function(s,i){return s&&"string"==typeof s&&i.comma&&s.indexOf(",")>-1?s.split(","):s},B=function parseQueryStringKeys(s,i,u,_){if(s){var x=u.allowDots?s.replace(/\.([^.[]+)/g,"[$1]"):s,j=/(\[[^[\]]*])/g,B=u.depth>0&&/(\[[^[\]]*])/.exec(x),L=B?x.slice(0,B.index):x,$=[];if(L){if(!u.plainObjects&&w.call(Object.prototype,L)&&!u.allowPrototypes)return;$.push(L)}for(var U=0;u.depth>0&&null!==(B=j.exec(x))&&U=0;--x){var j,B=s[x];if("[]"===B&&u.parseArrays)j=[].concat(w);else{j=u.plainObjects?Object.create(null):{};var L="["===B.charAt(0)&&"]"===B.charAt(B.length-1)?B.slice(1,-1):B,$=parseInt(L,10);u.parseArrays||""!==L?!isNaN($)&&B!==L&&String($)===L&&$>=0&&u.parseArrays&&$<=u.arrayLimit?(j=[])[$]=w:"__proto__"!==L&&(j[L]=w):j={0:w}}w=j}return w}($,i,u,_)}};s.exports=function(s,i){var u=function normalizeParseOptions(s){if(!s)return j;if(null!==s.decoder&&void 0!==s.decoder&&"function"!=typeof s.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==s.charset&&"utf-8"!==s.charset&&"iso-8859-1"!==s.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var i=void 0===s.charset?j.charset:s.charset;return{allowDots:void 0===s.allowDots?j.allowDots:!!s.allowDots,allowPrototypes:"boolean"==typeof s.allowPrototypes?s.allowPrototypes:j.allowPrototypes,allowSparse:"boolean"==typeof s.allowSparse?s.allowSparse:j.allowSparse,arrayLimit:"number"==typeof s.arrayLimit?s.arrayLimit:j.arrayLimit,charset:i,charsetSentinel:"boolean"==typeof s.charsetSentinel?s.charsetSentinel:j.charsetSentinel,comma:"boolean"==typeof s.comma?s.comma:j.comma,decoder:"function"==typeof s.decoder?s.decoder:j.decoder,delimiter:"string"==typeof s.delimiter||_.isRegExp(s.delimiter)?s.delimiter:j.delimiter,depth:"number"==typeof s.depth||!1===s.depth?+s.depth:j.depth,ignoreQueryPrefix:!0===s.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof s.interpretNumericEntities?s.interpretNumericEntities:j.interpretNumericEntities,parameterLimit:"number"==typeof s.parameterLimit?s.parameterLimit:j.parameterLimit,parseArrays:!1!==s.parseArrays,plainObjects:"boolean"==typeof s.plainObjects?s.plainObjects:j.plainObjects,strictNullHandling:"boolean"==typeof s.strictNullHandling?s.strictNullHandling:j.strictNullHandling}}(i);if(""===s||null==s)return u.plainObjects?Object.create(null):{};for(var L="string"==typeof s?function parseQueryStringValues(s,i){var u,B={},L=i.ignoreQueryPrefix?s.replace(/^\?/,""):s,$=i.parameterLimit===1/0?void 0:i.parameterLimit,U=L.split(i.delimiter,$),Y=-1,Z=i.charset;if(i.charsetSentinel)for(u=0;u-1&&(ie=x(ie)?[ie]:ie),w.call(B,ee)?B[ee]=_.combine(B[ee],ie):B[ee]=ie}return B}(s,u):s,$=u.plainObjects?Object.create(null):{},U=Object.keys(L),Y=0;Y{"use strict";var _=u(920),w=u(37720),x=u(74765),j=Object.prototype.hasOwnProperty,B={brackets:function brackets(s){return s+"[]"},comma:"comma",indices:function indices(s,i){return s+"["+i+"]"},repeat:function repeat(s){return s}},L=Array.isArray,$=String.prototype.split,U=Array.prototype.push,pushToArray=function(s,i){U.apply(s,L(i)?i:[i])},Y=Date.prototype.toISOString,Z=x.default,ee={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:w.encode,encodeValuesOnly:!1,format:Z,formatter:x.formatters[Z],indices:!1,serializeDate:function serializeDate(s){return Y.call(s)},skipNulls:!1,strictNullHandling:!1},ie={},ae=function stringify(s,i,u,x,j,B,U,Y,Z,ae,le,ce,pe,de,fe,ye){for(var be=s,_e=ye,we=0,Se=!1;void 0!==(_e=_e.get(ie))&&!Se;){var xe=_e.get(s);if(we+=1,void 0!==xe){if(xe===we)throw new RangeError("Cyclic object value");Se=!0}void 0===_e.get(ie)&&(we=0)}if("function"==typeof Y?be=Y(i,be):be instanceof Date?be=le(be):"comma"===u&&L(be)&&(be=w.maybeMap(be,(function(s){return s instanceof Date?le(s):s}))),null===be){if(j)return U&&!de?U(i,ee.encoder,fe,"key",ce):i;be=""}if(function isNonNullishPrimitive(s){return"string"==typeof s||"number"==typeof s||"boolean"==typeof s||"symbol"==typeof s||"bigint"==typeof s}(be)||w.isBuffer(be)){if(U){var Pe=de?i:U(i,ee.encoder,fe,"key",ce);if("comma"===u&&de){for(var Te=$.call(String(be),","),Re="",qe=0;qe0?be.join(",")||null:void 0}];else if(L(Y))$e=Y;else{var We=Object.keys(be);$e=Z?We.sort(Z):We}for(var He=x&&L(be)&&1===be.length?i+"[]":i,Xe=0;Xe<$e.length;++Xe){var Ye=$e[Xe],Qe="object"==typeof Ye&&void 0!==Ye.value?Ye.value:be[Ye];if(!B||null!==Qe){var et=L(be)?"function"==typeof u?u(He,Ye):He:He+(ae?"."+Ye:"["+Ye+"]");ye.set(s,we);var tt=_();tt.set(ie,ye),pushToArray(ze,stringify(Qe,et,u,x,j,B,U,Y,Z,ae,le,ce,pe,de,fe,tt))}}return ze};s.exports=function(s,i){var u,w=s,$=function normalizeStringifyOptions(s){if(!s)return ee;if(null!==s.encoder&&void 0!==s.encoder&&"function"!=typeof s.encoder)throw new TypeError("Encoder has to be a function.");var i=s.charset||ee.charset;if(void 0!==s.charset&&"utf-8"!==s.charset&&"iso-8859-1"!==s.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var u=x.default;if(void 0!==s.format){if(!j.call(x.formatters,s.format))throw new TypeError("Unknown format option provided.");u=s.format}var _=x.formatters[u],w=ee.filter;return("function"==typeof s.filter||L(s.filter))&&(w=s.filter),{addQueryPrefix:"boolean"==typeof s.addQueryPrefix?s.addQueryPrefix:ee.addQueryPrefix,allowDots:void 0===s.allowDots?ee.allowDots:!!s.allowDots,charset:i,charsetSentinel:"boolean"==typeof s.charsetSentinel?s.charsetSentinel:ee.charsetSentinel,delimiter:void 0===s.delimiter?ee.delimiter:s.delimiter,encode:"boolean"==typeof s.encode?s.encode:ee.encode,encoder:"function"==typeof s.encoder?s.encoder:ee.encoder,encodeValuesOnly:"boolean"==typeof s.encodeValuesOnly?s.encodeValuesOnly:ee.encodeValuesOnly,filter:w,format:u,formatter:_,serializeDate:"function"==typeof s.serializeDate?s.serializeDate:ee.serializeDate,skipNulls:"boolean"==typeof s.skipNulls?s.skipNulls:ee.skipNulls,sort:"function"==typeof s.sort?s.sort:null,strictNullHandling:"boolean"==typeof s.strictNullHandling?s.strictNullHandling:ee.strictNullHandling}}(i);"function"==typeof $.filter?w=(0,$.filter)("",w):L($.filter)&&(u=$.filter);var U,Y=[];if("object"!=typeof w||null===w)return"";U=i&&i.arrayFormat in B?i.arrayFormat:i&&"indices"in i?i.indices?"indices":"repeat":"indices";var Z=B[U];if(i&&"commaRoundTrip"in i&&"boolean"!=typeof i.commaRoundTrip)throw new TypeError("`commaRoundTrip` must be a boolean, or absent");var ie="comma"===Z&&i&&i.commaRoundTrip;u||(u=Object.keys(w)),$.sort&&u.sort($.sort);for(var le=_(),ce=0;ce0?fe+de:""}},37720:(s,i,u)=>{"use strict";var _=u(74765),w=Object.prototype.hasOwnProperty,x=Array.isArray,j=function(){for(var s=[],i=0;i<256;++i)s.push("%"+((i<16?"0":"")+i.toString(16)).toUpperCase());return s}(),B=function arrayToObject(s,i){for(var u=i&&i.plainObjects?Object.create(null):{},_=0;_1;){var i=s.pop(),u=i.obj[i.prop];if(x(u)){for(var _=[],w=0;w=48&&U<=57||U>=65&&U<=90||U>=97&&U<=122||x===_.RFC1738&&(40===U||41===U)?L+=B.charAt($):U<128?L+=j[U]:U<2048?L+=j[192|U>>6]+j[128|63&U]:U<55296||U>=57344?L+=j[224|U>>12]+j[128|U>>6&63]+j[128|63&U]:($+=1,U=65536+((1023&U)<<10|1023&B.charCodeAt($)),L+=j[240|U>>18]+j[128|U>>12&63]+j[128|U>>6&63]+j[128|63&U])}return L},isBuffer:function isBuffer(s){return!(!s||"object"!=typeof s)&&!!(s.constructor&&s.constructor.isBuffer&&s.constructor.isBuffer(s))},isRegExp:function isRegExp(s){return"[object RegExp]"===Object.prototype.toString.call(s)},maybeMap:function maybeMap(s,i){if(x(s)){for(var u=[],_=0;_{"use strict";var u=Object.prototype.hasOwnProperty;function decode(s){try{return decodeURIComponent(s.replace(/\+/g," "))}catch(s){return null}}function encode(s){try{return encodeURIComponent(s)}catch(s){return null}}i.stringify=function querystringify(s,i){i=i||"";var _,w,x=[];for(w in"string"!=typeof i&&(i="?"),s)if(u.call(s,w)){if((_=s[w])||null!=_&&!isNaN(_)||(_=""),w=encode(w),_=encode(_),null===w||null===_)continue;x.push(w+"="+_)}return x.length?i+x.join("&"):""},i.parse=function querystring(s){for(var i,u=/([^=?#&]+)=?([^&]*)/g,_={};i=u.exec(s);){var w=decode(i[1]),x=decode(i[2]);null===w||null===x||w in _||(_[w]=x)}return _}},41859:(s,i,u)=>{const _=u(27096),w=u(78004),x=_.types;s.exports=class RandExp{constructor(s,i){if(this._setDefaults(s),s instanceof RegExp)this.ignoreCase=s.ignoreCase,this.multiline=s.multiline,s=s.source;else{if("string"!=typeof s)throw new Error("Expected a regexp or string");this.ignoreCase=i&&-1!==i.indexOf("i"),this.multiline=i&&-1!==i.indexOf("m")}this.tokens=_(s)}_setDefaults(s){this.max=null!=s.max?s.max:null!=RandExp.prototype.max?RandExp.prototype.max:100,this.defaultRange=s.defaultRange?s.defaultRange:this.defaultRange.clone(),s.randInt&&(this.randInt=s.randInt)}gen(){return this._gen(this.tokens,[])}_gen(s,i){var u,_,w,j,B;switch(s.type){case x.ROOT:case x.GROUP:if(s.followedBy||s.notFollowedBy)return"";for(s.remember&&void 0===s.groupNumber&&(s.groupNumber=i.push(null)-1),_="",j=0,B=(u=s.options?this._randSelect(s.options):s.stack).length;j{"use strict";var _=u(65606),w=65536,x=4294967295;var j=u(92861).Buffer,B=u.g.crypto||u.g.msCrypto;B&&B.getRandomValues?s.exports=function randomBytes(s,i){if(s>x)throw new RangeError("requested too many random bytes");var u=j.allocUnsafe(s);if(s>0)if(s>w)for(var L=0;L{"use strict";function _typeof(s){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(s){return typeof s}:function(s){return s&&"function"==typeof Symbol&&s.constructor===Symbol&&s!==Symbol.prototype?"symbol":typeof s},_typeof(s)}Object.defineProperty(i,"__esModule",{value:!0}),i.CopyToClipboard=void 0;var _=_interopRequireDefault(u(96540)),w=_interopRequireDefault(u(17965)),x=["text","onCopy","options","children"];function _interopRequireDefault(s){return s&&s.__esModule?s:{default:s}}function ownKeys(s,i){var u=Object.keys(s);if(Object.getOwnPropertySymbols){var _=Object.getOwnPropertySymbols(s);i&&(_=_.filter((function(i){return Object.getOwnPropertyDescriptor(s,i).enumerable}))),u.push.apply(u,_)}return u}function _objectSpread(s){for(var i=1;i=0||(w[u]=s[u]);return w}(s,i);if(Object.getOwnPropertySymbols){var x=Object.getOwnPropertySymbols(s);for(_=0;_=0||Object.prototype.propertyIsEnumerable.call(s,u)&&(w[u]=s[u])}return w}function _defineProperties(s,i){for(var u=0;u{"use strict";var _=u(25264).CopyToClipboard;_.CopyToClipboard=_,s.exports=_},81214:(s,i,u)=>{"use strict";function _typeof(s){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(s){return typeof s}:function(s){return s&&"function"==typeof Symbol&&s.constructor===Symbol&&s!==Symbol.prototype?"symbol":typeof s},_typeof(s)}Object.defineProperty(i,"__esModule",{value:!0}),i.DebounceInput=void 0;var _=_interopRequireDefault(u(96540)),w=_interopRequireDefault(u(20181)),x=["element","onChange","value","minLength","debounceTimeout","forceNotifyByEnter","forceNotifyOnBlur","onKeyDown","onBlur","inputRef"];function _interopRequireDefault(s){return s&&s.__esModule?s:{default:s}}function _objectWithoutProperties(s,i){if(null==s)return{};var u,_,w=function _objectWithoutPropertiesLoose(s,i){if(null==s)return{};var u,_,w={},x=Object.keys(s);for(_=0;_=0||(w[u]=s[u]);return w}(s,i);if(Object.getOwnPropertySymbols){var x=Object.getOwnPropertySymbols(s);for(_=0;_=0||Object.prototype.propertyIsEnumerable.call(s,u)&&(w[u]=s[u])}return w}function ownKeys(s,i){var u=Object.keys(s);if(Object.getOwnPropertySymbols){var _=Object.getOwnPropertySymbols(s);i&&(_=_.filter((function(i){return Object.getOwnPropertyDescriptor(s,i).enumerable}))),u.push.apply(u,_)}return u}function _objectSpread(s){for(var i=1;i=_?u.notify(s):i.length>w.length&&u.notify(_objectSpread(_objectSpread({},s),{},{target:_objectSpread(_objectSpread({},s.target),{},{value:""})}))}))})),_defineProperty(_assertThisInitialized(u),"onKeyDown",(function(s){"Enter"===s.key&&u.forceNotify(s);var i=u.props.onKeyDown;i&&(s.persist(),i(s))})),_defineProperty(_assertThisInitialized(u),"onBlur",(function(s){u.forceNotify(s);var i=u.props.onBlur;i&&(s.persist(),i(s))})),_defineProperty(_assertThisInitialized(u),"createNotifier",(function(s){if(s<0)u.notify=function(){return null};else if(0===s)u.notify=u.doNotify;else{var i=(0,w.default)((function(s){u.isDebouncing=!1,u.doNotify(s)}),s);u.notify=function(s){u.isDebouncing=!0,i(s)},u.flush=function(){return i.flush()},u.cancel=function(){u.isDebouncing=!1,i.cancel()}}})),_defineProperty(_assertThisInitialized(u),"doNotify",(function(){u.props.onChange.apply(void 0,arguments)})),_defineProperty(_assertThisInitialized(u),"forceNotify",(function(s){var i=u.props.debounceTimeout;if(u.isDebouncing||!(i>0)){u.cancel&&u.cancel();var _=u.state.value,w=u.props.minLength;_.length>=w?u.doNotify(s):u.doNotify(_objectSpread(_objectSpread({},s),{},{target:_objectSpread(_objectSpread({},s.target),{},{value:_})}))}})),u.isDebouncing=!1,u.state={value:void 0===s.value||null===s.value?"":s.value};var _=u.props.debounceTimeout;return u.createNotifier(_),u}return function _createClass(s,i,u){return i&&_defineProperties(s.prototype,i),u&&_defineProperties(s,u),Object.defineProperty(s,"prototype",{writable:!1}),s}(DebounceInput,[{key:"componentDidUpdate",value:function componentDidUpdate(s){if(!this.isDebouncing){var i=this.props,u=i.value,_=i.debounceTimeout,w=s.debounceTimeout,x=s.value,j=this.state.value;void 0!==u&&x!==u&&j!==u&&this.setState({value:u}),_!==w&&this.createNotifier(_)}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.flush&&this.flush()}},{key:"render",value:function render(){var s,i,u=this.props,w=u.element,j=(u.onChange,u.value,u.minLength,u.debounceTimeout,u.forceNotifyByEnter),B=u.forceNotifyOnBlur,L=u.onKeyDown,$=u.onBlur,U=u.inputRef,Y=_objectWithoutProperties(u,x),Z=this.state.value;s=j?{onKeyDown:this.onKeyDown}:L?{onKeyDown:L}:{},i=B?{onBlur:this.onBlur}:$?{onBlur:$}:{};var ee=U?{ref:U}:{};return _.default.createElement(w,_objectSpread(_objectSpread(_objectSpread(_objectSpread({},Y),{},{onChange:this.onChange,value:Z},s),i),ee))}}]),DebounceInput}(_.default.PureComponent);i.DebounceInput=j,_defineProperty(j,"defaultProps",{element:"input",type:"text",onKeyDown:void 0,onBlur:void 0,value:void 0,minLength:0,debounceTimeout:100,forceNotifyByEnter:!0,forceNotifyOnBlur:!0,inputRef:void 0})},24677:(s,i,u)=>{"use strict";var _=u(81214).DebounceInput;_.DebounceInput=_,s.exports=_},22551:(s,i,u)=>{"use strict";var _=u(96540),w=u(69982);function p(s){for(var i="https://reactjs.org/docs/error-decoder.html?invariant="+s,u=1;u
")}value(){return this.buffer}span(s){this.buffer+=``}}class TokenTree{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(s){this.top.children.push(s)}openNode(s){const o={kind:s,children:[]};this.add(o),this.stack.push(o)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(s){return this.constructor._walk(s,this.rootNode)}static _walk(s,o){return"string"==typeof o?s.addText(o):o.children&&(s.openNode(o),o.children.forEach((o=>this._walk(s,o))),s.closeNode(o)),s}static _collapse(s){"string"!=typeof s&&s.children&&(s.children.every((s=>"string"==typeof s))?s.children=[s.children.join("")]:s.children.forEach((s=>{TokenTree._collapse(s)})))}}class TokenTreeEmitter extends TokenTree{constructor(s){super(),this.options=s}addKeyword(s,o){""!==s&&(this.openNode(o),this.addText(s),this.closeNode())}addText(s){""!==s&&this.add(s)}addSublanguage(s,o){const i=s.root;i.kind=o,i.sublanguage=!0,this.add(i)}toHTML(){return new HTMLRenderer(this,this.options).value()}finalize(){return!0}}function source(s){return s?"string"==typeof s?s:s.source:null}const a=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;const u="[a-zA-Z]\\w*",_="[a-zA-Z_]\\w*",w="\\b\\d+(\\.\\d+)?",x="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",C="\\b(0b[01]+)",j={begin:"\\\\[\\s\\S]",relevance:0},L={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[j]},B={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[j]},$={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},COMMENT=function(s,o,i={}){const a=inherit({className:"comment",begin:s,end:o,contains:[]},i);return a.contains.push($),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},U=COMMENT("//","$"),V=COMMENT("/\\*","\\*/"),z=COMMENT("#","$"),Y={className:"number",begin:w,relevance:0},Z={className:"number",begin:x,relevance:0},ee={className:"number",begin:C,relevance:0},ie={className:"number",begin:w+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},ae={begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[j,{begin:/\[/,end:/\]/,relevance:0,contains:[j]}]}]},ce={className:"title",begin:u,relevance:0},le={className:"title",begin:_,relevance:0},pe={begin:"\\.\\s*"+_,relevance:0};var de=Object.freeze({__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:u,UNDERSCORE_IDENT_RE:_,NUMBER_RE:w,C_NUMBER_RE:x,BINARY_NUMBER_RE:C,RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(s={})=>{const o=/^#![ ]*\//;return s.binary&&(s.begin=function concat(...s){return s.map((s=>source(s))).join("")}(o,/.*\b/,s.binary,/\b.*/)),inherit({className:"meta",begin:o,end:/$/,relevance:0,"on:begin":(s,o)=>{0!==s.index&&o.ignoreMatch()}},s)},BACKSLASH_ESCAPE:j,APOS_STRING_MODE:L,QUOTE_STRING_MODE:B,PHRASAL_WORDS_MODE:$,COMMENT,C_LINE_COMMENT_MODE:U,C_BLOCK_COMMENT_MODE:V,HASH_COMMENT_MODE:z,NUMBER_MODE:Y,C_NUMBER_MODE:Z,BINARY_NUMBER_MODE:ee,CSS_NUMBER_MODE:ie,REGEXP_MODE:ae,TITLE_MODE:ce,UNDERSCORE_TITLE_MODE:le,METHOD_GUARD:pe,END_SAME_AS_BEGIN:function(s){return Object.assign(s,{"on:begin":(s,o)=>{o.data._beginMatch=s[1]},"on:end":(s,o)=>{o.data._beginMatch!==s[1]&&o.ignoreMatch()}})}});function skipIfhasPrecedingDot(s,o){"."===s.input[s.index-1]&&o.ignoreMatch()}function beginKeywords(s,o){o&&s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",s.__beforeBegin=skipIfhasPrecedingDot,s.keywords=s.keywords||s.beginKeywords,delete s.beginKeywords,void 0===s.relevance&&(s.relevance=0))}function compileIllegal(s,o){Array.isArray(s.illegal)&&(s.illegal=function either(...s){return"("+s.map((s=>source(s))).join("|")+")"}(...s.illegal))}function compileMatch(s,o){if(s.match){if(s.begin||s.end)throw new Error("begin & end are not supported with match");s.begin=s.match,delete s.match}}function compileRelevance(s,o){void 0===s.relevance&&(s.relevance=1)}const fe=["of","and","for","in","not","or","if","then","parent","list","value"];function compileKeywords(s,o,i="keyword"){const a={};return"string"==typeof s?compileList(i,s.split(" ")):Array.isArray(s)?compileList(i,s):Object.keys(s).forEach((function(i){Object.assign(a,compileKeywords(s[i],o,i))})),a;function compileList(s,i){o&&(i=i.map((s=>s.toLowerCase()))),i.forEach((function(o){const i=o.split("|");a[i[0]]=[s,scoreForKeyword(i[0],i[1])]}))}}function scoreForKeyword(s,o){return o?Number(o):function commonKeyword(s){return fe.includes(s.toLowerCase())}(s)?0:1}function compileLanguage(s,{plugins:o}){function langRe(o,i){return new RegExp(source(o),"m"+(s.case_insensitive?"i":"")+(i?"g":""))}class MultiRegex{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(s,o){o.position=this.position++,this.matchIndexes[this.matchAt]=o,this.regexes.push([o,s]),this.matchAt+=function countMatchGroups(s){return new RegExp(s.toString()+"|").exec("").length-1}(s)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const s=this.regexes.map((s=>s[1]));this.matcherRe=langRe(function join(s,o="|"){let i=0;return s.map((s=>{i+=1;const o=i;let u=source(s),_="";for(;u.length>0;){const s=a.exec(u);if(!s){_+=u;break}_+=u.substring(0,s.index),u=u.substring(s.index+s[0].length),"\\"===s[0][0]&&s[1]?_+="\\"+String(Number(s[1])+o):(_+=s[0],"("===s[0]&&i++)}return _})).map((s=>`(${s})`)).join(o)}(s),!0),this.lastIndex=0}exec(s){this.matcherRe.lastIndex=this.lastIndex;const o=this.matcherRe.exec(s);if(!o)return null;const i=o.findIndex(((s,o)=>o>0&&void 0!==s)),a=this.matchIndexes[i];return o.splice(0,i),Object.assign(o,a)}}class ResumableMultiRegex{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(s){if(this.multiRegexes[s])return this.multiRegexes[s];const o=new MultiRegex;return this.rules.slice(s).forEach((([s,i])=>o.addRule(s,i))),o.compile(),this.multiRegexes[s]=o,o}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(s,o){this.rules.push([s,o]),"begin"===o.type&&this.count++}exec(s){const o=this.getMatcher(this.regexIndex);o.lastIndex=this.lastIndex;let i=o.exec(s);if(this.resumingScanAtSamePosition())if(i&&i.index===this.lastIndex);else{const o=this.getMatcher(0);o.lastIndex=this.lastIndex+1,i=o.exec(s)}return i&&(this.regexIndex+=i.position+1,this.regexIndex===this.count&&this.considerAll()),i}}if(s.compilerExtensions||(s.compilerExtensions=[]),s.contains&&s.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return s.classNameAliases=inherit(s.classNameAliases||{}),function compileMode(o,i){const a=o;if(o.isCompiled)return a;[compileMatch].forEach((s=>s(o,i))),s.compilerExtensions.forEach((s=>s(o,i))),o.__beforeBegin=null,[beginKeywords,compileIllegal,compileRelevance].forEach((s=>s(o,i))),o.isCompiled=!0;let u=null;if("object"==typeof o.keywords&&(u=o.keywords.$pattern,delete o.keywords.$pattern),o.keywords&&(o.keywords=compileKeywords(o.keywords,s.case_insensitive)),o.lexemes&&u)throw new Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return u=u||o.lexemes||/\w+/,a.keywordPatternRe=langRe(u,!0),i&&(o.begin||(o.begin=/\B|\b/),a.beginRe=langRe(o.begin),o.endSameAsBegin&&(o.end=o.begin),o.end||o.endsWithParent||(o.end=/\B|\b/),o.end&&(a.endRe=langRe(o.end)),a.terminatorEnd=source(o.end)||"",o.endsWithParent&&i.terminatorEnd&&(a.terminatorEnd+=(o.end?"|":"")+i.terminatorEnd)),o.illegal&&(a.illegalRe=langRe(o.illegal)),o.contains||(o.contains=[]),o.contains=[].concat(...o.contains.map((function(s){return function expandOrCloneMode(s){s.variants&&!s.cachedVariants&&(s.cachedVariants=s.variants.map((function(o){return inherit(s,{variants:null},o)})));if(s.cachedVariants)return s.cachedVariants;if(dependencyOnParent(s))return inherit(s,{starts:s.starts?inherit(s.starts):null});if(Object.isFrozen(s))return inherit(s);return s}("self"===s?o:s)}))),o.contains.forEach((function(s){compileMode(s,a)})),o.starts&&compileMode(o.starts,i),a.matcher=function buildModeRegex(s){const o=new ResumableMultiRegex;return s.contains.forEach((s=>o.addRule(s.begin,{rule:s,type:"begin"}))),s.terminatorEnd&&o.addRule(s.terminatorEnd,{type:"end"}),s.illegal&&o.addRule(s.illegal,{type:"illegal"}),o}(a),a}(s)}function dependencyOnParent(s){return!!s&&(s.endsWithParent||dependencyOnParent(s.starts))}function BuildVuePlugin(s){const o={props:["language","code","autodetect"],data:function(){return{detectedLanguage:"",unknownLanguage:!1}},computed:{className(){return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){if(!this.autoDetect&&!s.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`),this.unknownLanguage=!0,escapeHTML(this.code);let o={};return this.autoDetect?(o=s.highlightAuto(this.code),this.detectedLanguage=o.language):(o=s.highlight(this.language,this.code,this.ignoreIllegals),this.detectedLanguage=this.language),o.value},autoDetect(){return!this.language||function hasValueOrEmptyAttribute(s){return Boolean(s||""===s)}(this.autodetect)},ignoreIllegals:()=>!0},render(s){return s("pre",{},[s("code",{class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{Component:o,VuePlugin:{install(s){s.component("highlightjs",o)}}}}const ye={"after:highlightElement":({el:s,result:o,text:i})=>{const a=nodeStream(s);if(!a.length)return;const u=document.createElement("div");u.innerHTML=o.value,o.value=function mergeStreams(s,o,i){let a=0,u="";const _=[];function selectStream(){return s.length&&o.length?s[0].offset!==o[0].offset?s[0].offset"}function close(s){u+=""}function render(s){("start"===s.event?open:close)(s.node)}for(;s.length||o.length;){let o=selectStream();if(u+=escapeHTML(i.substring(a,o[0].offset)),a=o[0].offset,o===s){_.reverse().forEach(close);do{render(o.splice(0,1)[0]),o=selectStream()}while(o===s&&o.length&&o[0].offset===a);_.reverse().forEach(open)}else"start"===o[0].event?_.push(o[0].node):_.pop(),render(o.splice(0,1)[0])}return u+escapeHTML(i.substr(a))}(a,nodeStream(u),i)}};function tag(s){return s.nodeName.toLowerCase()}function nodeStream(s){const o=[];return function _nodeStream(s,i){for(let a=s.firstChild;a;a=a.nextSibling)3===a.nodeType?i+=a.nodeValue.length:1===a.nodeType&&(o.push({event:"start",offset:i,node:a}),i=_nodeStream(a,i),tag(a).match(/br|hr|img|input/)||o.push({event:"stop",offset:i,node:a}));return i}(s,0),o}const be={},error=s=>{console.error(s)},warn=(s,...o)=>{console.log(`WARN: ${s}`,...o)},deprecated=(s,o)=>{be[`${s}/${o}`]||(console.log(`Deprecated as of ${s}. ${o}`),be[`${s}/${o}`]=!0)},_e=escapeHTML,Se=inherit,we=Symbol("nomatch");var xe=function(s){const i=Object.create(null),a=Object.create(null),u=[];let _=!0;const w=/(^(<[^>]+>|\t|)+|\n)/gm,x="Could not find the language '{}', did you forget to load/include a language module?",C={disableAutodetect:!0,name:"Plain text",contains:[]};let j={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:TokenTreeEmitter};function shouldNotHighlight(s){return j.noHighlightRe.test(s)}function highlight(s,o,i,a){let u="",_="";"object"==typeof o?(u=s,i=o.ignoreIllegals,_=o.language,a=void 0):(deprecated("10.7.0","highlight(lang, code, ...args) has been deprecated."),deprecated("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),_=s,u=o);const w={code:u,language:_};fire("before:highlight",w);const x=w.result?w.result:_highlight(w.language,w.code,i,a);return x.code=w.code,fire("after:highlight",x),x}function _highlight(s,o,a,w){function keywordData(s,o){const i=L.case_insensitive?o[0].toLowerCase():o[0];return Object.prototype.hasOwnProperty.call(s.keywords,i)&&s.keywords[i]}function processBuffer(){null!=U.subLanguage?function processSubLanguage(){if(""===Y)return;let s=null;if("string"==typeof U.subLanguage){if(!i[U.subLanguage])return void z.addText(Y);s=_highlight(U.subLanguage,Y,!0,V[U.subLanguage]),V[U.subLanguage]=s.top}else s=highlightAuto(Y,U.subLanguage.length?U.subLanguage:null);U.relevance>0&&(Z+=s.relevance),z.addSublanguage(s.emitter,s.language)}():function processKeywords(){if(!U.keywords)return void z.addText(Y);let s=0;U.keywordPatternRe.lastIndex=0;let o=U.keywordPatternRe.exec(Y),i="";for(;o;){i+=Y.substring(s,o.index);const a=keywordData(U,o);if(a){const[s,u]=a;if(z.addText(i),i="",Z+=u,s.startsWith("_"))i+=o[0];else{const i=L.classNameAliases[s]||s;z.addKeyword(o[0],i)}}else i+=o[0];s=U.keywordPatternRe.lastIndex,o=U.keywordPatternRe.exec(Y)}i+=Y.substr(s),z.addText(i)}(),Y=""}function startNewMode(s){return s.className&&z.openNode(L.classNameAliases[s.className]||s.className),U=Object.create(s,{parent:{value:U}}),U}function endOfMode(s,o,i){let a=function startsWith(s,o){const i=s&&s.exec(o);return i&&0===i.index}(s.endRe,i);if(a){if(s["on:end"]){const i=new Response(s);s["on:end"](o,i),i.isMatchIgnored&&(a=!1)}if(a){for(;s.endsParent&&s.parent;)s=s.parent;return s}}if(s.endsWithParent)return endOfMode(s.parent,o,i)}function doIgnore(s){return 0===U.matcher.regexIndex?(Y+=s[0],1):(ae=!0,0)}function doBeginMatch(s){const o=s[0],i=s.rule,a=new Response(i),u=[i.__beforeBegin,i["on:begin"]];for(const i of u)if(i&&(i(s,a),a.isMatchIgnored))return doIgnore(o);return i&&i.endSameAsBegin&&(i.endRe=function escape(s){return new RegExp(s.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}(o)),i.skip?Y+=o:(i.excludeBegin&&(Y+=o),processBuffer(),i.returnBegin||i.excludeBegin||(Y=o)),startNewMode(i),i.returnBegin?0:o.length}function doEndMatch(s){const i=s[0],a=o.substr(s.index),u=endOfMode(U,s,a);if(!u)return we;const _=U;_.skip?Y+=i:(_.returnEnd||_.excludeEnd||(Y+=i),processBuffer(),_.excludeEnd&&(Y=i));do{U.className&&z.closeNode(),U.skip||U.subLanguage||(Z+=U.relevance),U=U.parent}while(U!==u.parent);return u.starts&&(u.endSameAsBegin&&(u.starts.endRe=u.endRe),startNewMode(u.starts)),_.returnEnd?0:i.length}let C={};function processLexeme(i,u){const w=u&&u[0];if(Y+=i,null==w)return processBuffer(),0;if("begin"===C.type&&"end"===u.type&&C.index===u.index&&""===w){if(Y+=o.slice(u.index,u.index+1),!_){const o=new Error("0 width match regex");throw o.languageName=s,o.badRule=C.rule,o}return 1}if(C=u,"begin"===u.type)return doBeginMatch(u);if("illegal"===u.type&&!a){const s=new Error('Illegal lexeme "'+w+'" for mode "'+(U.className||"")+'"');throw s.mode=U,s}if("end"===u.type){const s=doEndMatch(u);if(s!==we)return s}if("illegal"===u.type&&""===w)return 1;if(ie>1e5&&ie>3*u.index){throw new Error("potential infinite loop, way more iterations than matches")}return Y+=w,w.length}const L=getLanguage(s);if(!L)throw error(x.replace("{}",s)),new Error('Unknown language: "'+s+'"');const B=compileLanguage(L,{plugins:u});let $="",U=w||B;const V={},z=new j.__emitter(j);!function processContinuations(){const s=[];for(let o=U;o!==L;o=o.parent)o.className&&s.unshift(o.className);s.forEach((s=>z.openNode(s)))}();let Y="",Z=0,ee=0,ie=0,ae=!1;try{for(U.matcher.considerAll();;){ie++,ae?ae=!1:U.matcher.considerAll(),U.matcher.lastIndex=ee;const s=U.matcher.exec(o);if(!s)break;const i=processLexeme(o.substring(ee,s.index),s);ee=s.index+i}return processLexeme(o.substr(ee)),z.closeAllNodes(),z.finalize(),$=z.toHTML(),{relevance:Math.floor(Z),value:$,language:s,illegal:!1,emitter:z,top:U}}catch(i){if(i.message&&i.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:i.message,context:o.slice(ee-100,ee+100),mode:i.mode},sofar:$,relevance:0,value:_e(o),emitter:z};if(_)return{illegal:!1,relevance:0,value:_e(o),emitter:z,language:s,top:U,errorRaised:i};throw i}}function highlightAuto(s,o){o=o||j.languages||Object.keys(i);const a=function justTextHighlightResult(s){const o={relevance:0,emitter:new j.__emitter(j),value:_e(s),illegal:!1,top:C};return o.emitter.addText(s),o}(s),u=o.filter(getLanguage).filter(autoDetection).map((o=>_highlight(o,s,!1)));u.unshift(a);const _=u.sort(((s,o)=>{if(s.relevance!==o.relevance)return o.relevance-s.relevance;if(s.language&&o.language){if(getLanguage(s.language).supersetOf===o.language)return 1;if(getLanguage(o.language).supersetOf===s.language)return-1}return 0})),[w,x]=_,L=w;return L.second_best=x,L}const L={"before:highlightElement":({el:s})=>{j.useBR&&(s.innerHTML=s.innerHTML.replace(/\n/g,"").replace(//g,"\n"))},"after:highlightElement":({result:s})=>{j.useBR&&(s.value=s.value.replace(/\n/g,"
"))}},B=/^(<[^>]+>|\t)+/gm,$={"after:highlightElement":({result:s})=>{j.tabReplace&&(s.value=s.value.replace(B,(s=>s.replace(/\t/g,j.tabReplace))))}};function highlightElement(s){let o=null;const i=function blockLanguage(s){let o=s.className+" ";o+=s.parentNode?s.parentNode.className:"";const i=j.languageDetectRe.exec(o);if(i){const o=getLanguage(i[1]);return o||(warn(x.replace("{}",i[1])),warn("Falling back to no-highlight mode for this block.",s)),o?i[1]:"no-highlight"}return o.split(/\s+/).find((s=>shouldNotHighlight(s)||getLanguage(s)))}(s);if(shouldNotHighlight(i))return;fire("before:highlightElement",{el:s,language:i}),o=s;const u=o.textContent,_=i?highlight(u,{language:i,ignoreIllegals:!0}):highlightAuto(u);fire("after:highlightElement",{el:s,result:_,text:u}),s.innerHTML=_.value,function updateClassName(s,o,i){const u=o?a[o]:i;s.classList.add("hljs"),u&&s.classList.add(u)}(s,i,_.language),s.result={language:_.language,re:_.relevance,relavance:_.relevance},_.second_best&&(s.second_best={language:_.second_best.language,re:_.second_best.relevance,relavance:_.second_best.relevance})}const initHighlighting=()=>{if(initHighlighting.called)return;initHighlighting.called=!0,deprecated("10.6.0","initHighlighting() is deprecated. Use highlightAll() instead.");document.querySelectorAll("pre code").forEach(highlightElement)};let U=!1;function highlightAll(){if("loading"===document.readyState)return void(U=!0);document.querySelectorAll("pre code").forEach(highlightElement)}function getLanguage(s){return s=(s||"").toLowerCase(),i[s]||i[a[s]]}function registerAliases(s,{languageName:o}){"string"==typeof s&&(s=[s]),s.forEach((s=>{a[s.toLowerCase()]=o}))}function autoDetection(s){const o=getLanguage(s);return o&&!o.disableAutodetect}function fire(s,o){const i=s;u.forEach((function(s){s[i]&&s[i](o)}))}"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(function boot(){U&&highlightAll()}),!1),Object.assign(s,{highlight,highlightAuto,highlightAll,fixMarkup:function deprecateFixMarkup(s){return deprecated("10.2.0","fixMarkup will be removed entirely in v11.0"),deprecated("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"),function fixMarkup(s){return j.tabReplace||j.useBR?s.replace(w,(s=>"\n"===s?j.useBR?"
":s:j.tabReplace?s.replace(/\t/g,j.tabReplace):s)):s}(s)},highlightElement,highlightBlock:function deprecateHighlightBlock(s){return deprecated("10.7.0","highlightBlock will be removed entirely in v12.0"),deprecated("10.7.0","Please use highlightElement now."),highlightElement(s)},configure:function configure(s){s.useBR&&(deprecated("10.3.0","'useBR' will be removed entirely in v11.0"),deprecated("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")),j=Se(j,s)},initHighlighting,initHighlightingOnLoad:function initHighlightingOnLoad(){deprecated("10.6.0","initHighlightingOnLoad() is deprecated. Use highlightAll() instead."),U=!0},registerLanguage:function registerLanguage(o,a){let u=null;try{u=a(s)}catch(s){if(error("Language definition for '{}' could not be registered.".replace("{}",o)),!_)throw s;error(s),u=C}u.name||(u.name=o),i[o]=u,u.rawDefinition=a.bind(null,s),u.aliases&®isterAliases(u.aliases,{languageName:o})},unregisterLanguage:function unregisterLanguage(s){delete i[s];for(const o of Object.keys(a))a[o]===s&&delete a[o]},listLanguages:function listLanguages(){return Object.keys(i)},getLanguage,registerAliases,requireLanguage:function requireLanguage(s){deprecated("10.4.0","requireLanguage will be removed entirely in v11."),deprecated("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844");const o=getLanguage(s);if(o)return o;throw new Error("The '{}' language is required, but not loaded.".replace("{}",s))},autoDetection,inherit:Se,addPlugin:function addPlugin(s){!function upgradePluginAPI(s){s["before:highlightBlock"]&&!s["before:highlightElement"]&&(s["before:highlightElement"]=o=>{s["before:highlightBlock"](Object.assign({block:o.el},o))}),s["after:highlightBlock"]&&!s["after:highlightElement"]&&(s["after:highlightElement"]=o=>{s["after:highlightBlock"](Object.assign({block:o.el},o))})}(s),u.push(s)},vuePlugin:BuildVuePlugin(s).VuePlugin}),s.debugMode=function(){_=!1},s.safeMode=function(){_=!0},s.versionString="10.7.3";for(const s in de)"object"==typeof de[s]&&o(de[s]);return Object.assign(s,de),s.addPlugin(L),s.addPlugin(ye),s.addPlugin($),s}({});s.exports=xe},46028:(s,o,i)=>{"use strict";var a=i(13930),u=i(46285),_=i(25594),w=i(29367),x=i(60581),C=i(76264),j=TypeError,L=C("toPrimitive");s.exports=function(s,o){if(!u(s)||_(s))return s;var i,C=w(s,L);if(C){if(void 0===o&&(o="default"),i=a(C,s,o),!u(i)||_(i))return i;throw new j("Can't convert object to primitive value")}return void 0===o&&(o="number"),x(s,o)}},46076:(s,o,i)=>{"use strict";i(91599);var a=i(68623);s.exports=a},46285:(s,o,i)=>{"use strict";var a=i(62250);s.exports=function(s){return"object"==typeof s?null!==s:a(s)}},46942:(s,o)=>{var i;!function(){"use strict";var a={}.hasOwnProperty;function classNames(){for(var s="",o=0;o{"use strict";s.exports="undefined"!=typeof Reflect&&Reflect&&Reflect.apply},47181:(s,o,i)=>{"use strict";var a=i(95116).IteratorPrototype,u=i(58075),_=i(75817),w=i(14840),x=i(93742),returnThis=function(){return this};s.exports=function(s,o,i,C){var j=o+" Iterator";return s.prototype=u(a,{next:_(+!C,i)}),w(s,j,!1,!0),x[j]=returnThis,s}},47237:s=>{s.exports=function baseProperty(s){return function(o){return null==o?void 0:o[s]}}},47248:(s,o,i)=>{var a=i(16547),u=i(51234);s.exports=function zipObject(s,o){return u(s||[],o||[],a)}},47422:(s,o,i)=>{var a=i(31769),u=i(77797);s.exports=function baseGet(s,o){for(var i=0,_=(o=a(o,s)).length;null!=s&&i<_;)s=s[u(o[i++])];return i&&i==_?s:void 0}},47473:s=>{var o=Function.prototype.toString;s.exports=function toSource(s){if(null!=s){try{return o.call(s)}catch(s){}try{return s+""}catch(s){}}return""}},47886:(s,o,i)=>{var a=i(5861),u=i(40346);s.exports=function isWeakMap(s){return u(s)&&"[object WeakMap]"==a(s)}},47934:(s,o,i)=>{s.exports={ary:i(64626),assign:i(74733),clone:i(32629),curry:i(49747),forEach:i(83729),isArray:i(56449),isError:i(23546),isFunction:i(1882),isWeakMap:i(47886),iteratee:i(33855),keys:i(88984),rearg:i(84195),toInteger:i(61489),toPath:i(42072)}},48152:(s,o,i)=>{var a=i(28303),u=a&&new a;s.exports=u},48287:(s,o,i)=>{"use strict";const a=i(67526),u=i(251),_="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;o.Buffer=Buffer,o.SlowBuffer=function SlowBuffer(s){+s!=s&&(s=0);return Buffer.alloc(+s)},o.INSPECT_MAX_BYTES=50;const w=2147483647;function createBuffer(s){if(s>w)throw new RangeError('The value "'+s+'" is invalid for option "size"');const o=new Uint8Array(s);return Object.setPrototypeOf(o,Buffer.prototype),o}function Buffer(s,o,i){if("number"==typeof s){if("string"==typeof o)throw new TypeError('The "string" argument must be of type string. Received type number');return allocUnsafe(s)}return from(s,o,i)}function from(s,o,i){if("string"==typeof s)return function fromString(s,o){"string"==typeof o&&""!==o||(o="utf8");if(!Buffer.isEncoding(o))throw new TypeError("Unknown encoding: "+o);const i=0|byteLength(s,o);let a=createBuffer(i);const u=a.write(s,o);u!==i&&(a=a.slice(0,u));return a}(s,o);if(ArrayBuffer.isView(s))return function fromArrayView(s){if(isInstance(s,Uint8Array)){const o=new Uint8Array(s);return fromArrayBuffer(o.buffer,o.byteOffset,o.byteLength)}return fromArrayLike(s)}(s);if(null==s)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof s);if(isInstance(s,ArrayBuffer)||s&&isInstance(s.buffer,ArrayBuffer))return fromArrayBuffer(s,o,i);if("undefined"!=typeof SharedArrayBuffer&&(isInstance(s,SharedArrayBuffer)||s&&isInstance(s.buffer,SharedArrayBuffer)))return fromArrayBuffer(s,o,i);if("number"==typeof s)throw new TypeError('The "value" argument must not be of type number. Received type number');const a=s.valueOf&&s.valueOf();if(null!=a&&a!==s)return Buffer.from(a,o,i);const u=function fromObject(s){if(Buffer.isBuffer(s)){const o=0|checked(s.length),i=createBuffer(o);return 0===i.length||s.copy(i,0,0,o),i}if(void 0!==s.length)return"number"!=typeof s.length||numberIsNaN(s.length)?createBuffer(0):fromArrayLike(s);if("Buffer"===s.type&&Array.isArray(s.data))return fromArrayLike(s.data)}(s);if(u)return u;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof s[Symbol.toPrimitive])return Buffer.from(s[Symbol.toPrimitive]("string"),o,i);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof s)}function assertSize(s){if("number"!=typeof s)throw new TypeError('"size" argument must be of type number');if(s<0)throw new RangeError('The value "'+s+'" is invalid for option "size"')}function allocUnsafe(s){return assertSize(s),createBuffer(s<0?0:0|checked(s))}function fromArrayLike(s){const o=s.length<0?0:0|checked(s.length),i=createBuffer(o);for(let a=0;a=w)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+w.toString(16)+" bytes");return 0|s}function byteLength(s,o){if(Buffer.isBuffer(s))return s.length;if(ArrayBuffer.isView(s)||isInstance(s,ArrayBuffer))return s.byteLength;if("string"!=typeof s)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof s);const i=s.length,a=arguments.length>2&&!0===arguments[2];if(!a&&0===i)return 0;let u=!1;for(;;)switch(o){case"ascii":case"latin1":case"binary":return i;case"utf8":case"utf-8":return utf8ToBytes(s).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*i;case"hex":return i>>>1;case"base64":return base64ToBytes(s).length;default:if(u)return a?-1:utf8ToBytes(s).length;o=(""+o).toLowerCase(),u=!0}}function slowToString(s,o,i){let a=!1;if((void 0===o||o<0)&&(o=0),o>this.length)return"";if((void 0===i||i>this.length)&&(i=this.length),i<=0)return"";if((i>>>=0)<=(o>>>=0))return"";for(s||(s="utf8");;)switch(s){case"hex":return hexSlice(this,o,i);case"utf8":case"utf-8":return utf8Slice(this,o,i);case"ascii":return asciiSlice(this,o,i);case"latin1":case"binary":return latin1Slice(this,o,i);case"base64":return base64Slice(this,o,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,o,i);default:if(a)throw new TypeError("Unknown encoding: "+s);s=(s+"").toLowerCase(),a=!0}}function swap(s,o,i){const a=s[o];s[o]=s[i],s[i]=a}function bidirectionalIndexOf(s,o,i,a,u){if(0===s.length)return-1;if("string"==typeof i?(a=i,i=0):i>2147483647?i=2147483647:i<-2147483648&&(i=-2147483648),numberIsNaN(i=+i)&&(i=u?0:s.length-1),i<0&&(i=s.length+i),i>=s.length){if(u)return-1;i=s.length-1}else if(i<0){if(!u)return-1;i=0}if("string"==typeof o&&(o=Buffer.from(o,a)),Buffer.isBuffer(o))return 0===o.length?-1:arrayIndexOf(s,o,i,a,u);if("number"==typeof o)return o&=255,"function"==typeof Uint8Array.prototype.indexOf?u?Uint8Array.prototype.indexOf.call(s,o,i):Uint8Array.prototype.lastIndexOf.call(s,o,i):arrayIndexOf(s,[o],i,a,u);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(s,o,i,a,u){let _,w=1,x=s.length,C=o.length;if(void 0!==a&&("ucs2"===(a=String(a).toLowerCase())||"ucs-2"===a||"utf16le"===a||"utf-16le"===a)){if(s.length<2||o.length<2)return-1;w=2,x/=2,C/=2,i/=2}function read(s,o){return 1===w?s[o]:s.readUInt16BE(o*w)}if(u){let a=-1;for(_=i;_x&&(i=x-C),_=i;_>=0;_--){let i=!0;for(let a=0;au&&(a=u):a=u;const _=o.length;let w;for(a>_/2&&(a=_/2),w=0;w>8,u=i%256,_.push(u),_.push(a);return _}(o,s.length-i),s,i,a)}function base64Slice(s,o,i){return 0===o&&i===s.length?a.fromByteArray(s):a.fromByteArray(s.slice(o,i))}function utf8Slice(s,o,i){i=Math.min(s.length,i);const a=[];let u=o;for(;u239?4:o>223?3:o>191?2:1;if(u+w<=i){let i,a,x,C;switch(w){case 1:o<128&&(_=o);break;case 2:i=s[u+1],128==(192&i)&&(C=(31&o)<<6|63&i,C>127&&(_=C));break;case 3:i=s[u+1],a=s[u+2],128==(192&i)&&128==(192&a)&&(C=(15&o)<<12|(63&i)<<6|63&a,C>2047&&(C<55296||C>57343)&&(_=C));break;case 4:i=s[u+1],a=s[u+2],x=s[u+3],128==(192&i)&&128==(192&a)&&128==(192&x)&&(C=(15&o)<<18|(63&i)<<12|(63&a)<<6|63&x,C>65535&&C<1114112&&(_=C))}}null===_?(_=65533,w=1):_>65535&&(_-=65536,a.push(_>>>10&1023|55296),_=56320|1023&_),a.push(_),u+=w}return function decodeCodePointsArray(s){const o=s.length;if(o<=x)return String.fromCharCode.apply(String,s);let i="",a=0;for(;aa.length?(Buffer.isBuffer(o)||(o=Buffer.from(o)),o.copy(a,u)):Uint8Array.prototype.set.call(a,o,u);else{if(!Buffer.isBuffer(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(a,u)}u+=o.length}return a},Buffer.byteLength=byteLength,Buffer.prototype._isBuffer=!0,Buffer.prototype.swap16=function swap16(){const s=this.length;if(s%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let o=0;oi&&(s+=" ... "),""},_&&(Buffer.prototype[_]=Buffer.prototype.inspect),Buffer.prototype.compare=function compare(s,o,i,a,u){if(isInstance(s,Uint8Array)&&(s=Buffer.from(s,s.offset,s.byteLength)),!Buffer.isBuffer(s))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof s);if(void 0===o&&(o=0),void 0===i&&(i=s?s.length:0),void 0===a&&(a=0),void 0===u&&(u=this.length),o<0||i>s.length||a<0||u>this.length)throw new RangeError("out of range index");if(a>=u&&o>=i)return 0;if(a>=u)return-1;if(o>=i)return 1;if(this===s)return 0;let _=(u>>>=0)-(a>>>=0),w=(i>>>=0)-(o>>>=0);const x=Math.min(_,w),C=this.slice(a,u),j=s.slice(o,i);for(let s=0;s>>=0,isFinite(i)?(i>>>=0,void 0===a&&(a="utf8")):(a=i,i=void 0)}const u=this.length-o;if((void 0===i||i>u)&&(i=u),s.length>0&&(i<0||o<0)||o>this.length)throw new RangeError("Attempt to write outside buffer bounds");a||(a="utf8");let _=!1;for(;;)switch(a){case"hex":return hexWrite(this,s,o,i);case"utf8":case"utf-8":return utf8Write(this,s,o,i);case"ascii":case"latin1":case"binary":return asciiWrite(this,s,o,i);case"base64":return base64Write(this,s,o,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,s,o,i);default:if(_)throw new TypeError("Unknown encoding: "+a);a=(""+a).toLowerCase(),_=!0}},Buffer.prototype.toJSON=function toJSON(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const x=4096;function asciiSlice(s,o,i){let a="";i=Math.min(s.length,i);for(let u=o;ua)&&(i=a);let u="";for(let a=o;ai)throw new RangeError("Trying to access beyond buffer length")}function checkInt(s,o,i,a,u,_){if(!Buffer.isBuffer(s))throw new TypeError('"buffer" argument must be a Buffer instance');if(o>u||o<_)throw new RangeError('"value" argument is out of bounds');if(i+a>s.length)throw new RangeError("Index out of range")}function wrtBigUInt64LE(s,o,i,a,u){checkIntBI(o,a,u,s,i,7);let _=Number(o&BigInt(4294967295));s[i++]=_,_>>=8,s[i++]=_,_>>=8,s[i++]=_,_>>=8,s[i++]=_;let w=Number(o>>BigInt(32)&BigInt(4294967295));return s[i++]=w,w>>=8,s[i++]=w,w>>=8,s[i++]=w,w>>=8,s[i++]=w,i}function wrtBigUInt64BE(s,o,i,a,u){checkIntBI(o,a,u,s,i,7);let _=Number(o&BigInt(4294967295));s[i+7]=_,_>>=8,s[i+6]=_,_>>=8,s[i+5]=_,_>>=8,s[i+4]=_;let w=Number(o>>BigInt(32)&BigInt(4294967295));return s[i+3]=w,w>>=8,s[i+2]=w,w>>=8,s[i+1]=w,w>>=8,s[i]=w,i+8}function checkIEEE754(s,o,i,a,u,_){if(i+a>s.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("Index out of range")}function writeFloat(s,o,i,a,_){return o=+o,i>>>=0,_||checkIEEE754(s,0,i,4),u.write(s,o,i,a,23,4),i+4}function writeDouble(s,o,i,a,_){return o=+o,i>>>=0,_||checkIEEE754(s,0,i,8),u.write(s,o,i,a,52,8),i+8}Buffer.prototype.slice=function slice(s,o){const i=this.length;(s=~~s)<0?(s+=i)<0&&(s=0):s>i&&(s=i),(o=void 0===o?i:~~o)<0?(o+=i)<0&&(o=0):o>i&&(o=i),o>>=0,o>>>=0,i||checkOffset(s,o,this.length);let a=this[s],u=1,_=0;for(;++_>>=0,o>>>=0,i||checkOffset(s,o,this.length);let a=this[s+--o],u=1;for(;o>0&&(u*=256);)a+=this[s+--o]*u;return a},Buffer.prototype.readUint8=Buffer.prototype.readUInt8=function readUInt8(s,o){return s>>>=0,o||checkOffset(s,1,this.length),this[s]},Buffer.prototype.readUint16LE=Buffer.prototype.readUInt16LE=function readUInt16LE(s,o){return s>>>=0,o||checkOffset(s,2,this.length),this[s]|this[s+1]<<8},Buffer.prototype.readUint16BE=Buffer.prototype.readUInt16BE=function readUInt16BE(s,o){return s>>>=0,o||checkOffset(s,2,this.length),this[s]<<8|this[s+1]},Buffer.prototype.readUint32LE=Buffer.prototype.readUInt32LE=function readUInt32LE(s,o){return s>>>=0,o||checkOffset(s,4,this.length),(this[s]|this[s+1]<<8|this[s+2]<<16)+16777216*this[s+3]},Buffer.prototype.readUint32BE=Buffer.prototype.readUInt32BE=function readUInt32BE(s,o){return s>>>=0,o||checkOffset(s,4,this.length),16777216*this[s]+(this[s+1]<<16|this[s+2]<<8|this[s+3])},Buffer.prototype.readBigUInt64LE=defineBigIntMethod((function readBigUInt64LE(s){validateNumber(s>>>=0,"offset");const o=this[s],i=this[s+7];void 0!==o&&void 0!==i||boundsError(s,this.length-8);const a=o+256*this[++s]+65536*this[++s]+this[++s]*2**24,u=this[++s]+256*this[++s]+65536*this[++s]+i*2**24;return BigInt(a)+(BigInt(u)<>>=0,"offset");const o=this[s],i=this[s+7];void 0!==o&&void 0!==i||boundsError(s,this.length-8);const a=o*2**24+65536*this[++s]+256*this[++s]+this[++s],u=this[++s]*2**24+65536*this[++s]+256*this[++s]+i;return(BigInt(a)<>>=0,o>>>=0,i||checkOffset(s,o,this.length);let a=this[s],u=1,_=0;for(;++_=u&&(a-=Math.pow(2,8*o)),a},Buffer.prototype.readIntBE=function readIntBE(s,o,i){s>>>=0,o>>>=0,i||checkOffset(s,o,this.length);let a=o,u=1,_=this[s+--a];for(;a>0&&(u*=256);)_+=this[s+--a]*u;return u*=128,_>=u&&(_-=Math.pow(2,8*o)),_},Buffer.prototype.readInt8=function readInt8(s,o){return s>>>=0,o||checkOffset(s,1,this.length),128&this[s]?-1*(255-this[s]+1):this[s]},Buffer.prototype.readInt16LE=function readInt16LE(s,o){s>>>=0,o||checkOffset(s,2,this.length);const i=this[s]|this[s+1]<<8;return 32768&i?4294901760|i:i},Buffer.prototype.readInt16BE=function readInt16BE(s,o){s>>>=0,o||checkOffset(s,2,this.length);const i=this[s+1]|this[s]<<8;return 32768&i?4294901760|i:i},Buffer.prototype.readInt32LE=function readInt32LE(s,o){return s>>>=0,o||checkOffset(s,4,this.length),this[s]|this[s+1]<<8|this[s+2]<<16|this[s+3]<<24},Buffer.prototype.readInt32BE=function readInt32BE(s,o){return s>>>=0,o||checkOffset(s,4,this.length),this[s]<<24|this[s+1]<<16|this[s+2]<<8|this[s+3]},Buffer.prototype.readBigInt64LE=defineBigIntMethod((function readBigInt64LE(s){validateNumber(s>>>=0,"offset");const o=this[s],i=this[s+7];void 0!==o&&void 0!==i||boundsError(s,this.length-8);const a=this[s+4]+256*this[s+5]+65536*this[s+6]+(i<<24);return(BigInt(a)<>>=0,"offset");const o=this[s],i=this[s+7];void 0!==o&&void 0!==i||boundsError(s,this.length-8);const a=(o<<24)+65536*this[++s]+256*this[++s]+this[++s];return(BigInt(a)<>>=0,o||checkOffset(s,4,this.length),u.read(this,s,!0,23,4)},Buffer.prototype.readFloatBE=function readFloatBE(s,o){return s>>>=0,o||checkOffset(s,4,this.length),u.read(this,s,!1,23,4)},Buffer.prototype.readDoubleLE=function readDoubleLE(s,o){return s>>>=0,o||checkOffset(s,8,this.length),u.read(this,s,!0,52,8)},Buffer.prototype.readDoubleBE=function readDoubleBE(s,o){return s>>>=0,o||checkOffset(s,8,this.length),u.read(this,s,!1,52,8)},Buffer.prototype.writeUintLE=Buffer.prototype.writeUIntLE=function writeUIntLE(s,o,i,a){if(s=+s,o>>>=0,i>>>=0,!a){checkInt(this,s,o,i,Math.pow(2,8*i)-1,0)}let u=1,_=0;for(this[o]=255&s;++_>>=0,i>>>=0,!a){checkInt(this,s,o,i,Math.pow(2,8*i)-1,0)}let u=i-1,_=1;for(this[o+u]=255&s;--u>=0&&(_*=256);)this[o+u]=s/_&255;return o+i},Buffer.prototype.writeUint8=Buffer.prototype.writeUInt8=function writeUInt8(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,1,255,0),this[o]=255&s,o+1},Buffer.prototype.writeUint16LE=Buffer.prototype.writeUInt16LE=function writeUInt16LE(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,2,65535,0),this[o]=255&s,this[o+1]=s>>>8,o+2},Buffer.prototype.writeUint16BE=Buffer.prototype.writeUInt16BE=function writeUInt16BE(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,2,65535,0),this[o]=s>>>8,this[o+1]=255&s,o+2},Buffer.prototype.writeUint32LE=Buffer.prototype.writeUInt32LE=function writeUInt32LE(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,4,4294967295,0),this[o+3]=s>>>24,this[o+2]=s>>>16,this[o+1]=s>>>8,this[o]=255&s,o+4},Buffer.prototype.writeUint32BE=Buffer.prototype.writeUInt32BE=function writeUInt32BE(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,4,4294967295,0),this[o]=s>>>24,this[o+1]=s>>>16,this[o+2]=s>>>8,this[o+3]=255&s,o+4},Buffer.prototype.writeBigUInt64LE=defineBigIntMethod((function writeBigUInt64LE(s,o=0){return wrtBigUInt64LE(this,s,o,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeBigUInt64BE=defineBigIntMethod((function writeBigUInt64BE(s,o=0){return wrtBigUInt64BE(this,s,o,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeIntLE=function writeIntLE(s,o,i,a){if(s=+s,o>>>=0,!a){const a=Math.pow(2,8*i-1);checkInt(this,s,o,i,a-1,-a)}let u=0,_=1,w=0;for(this[o]=255&s;++u>>=0,!a){const a=Math.pow(2,8*i-1);checkInt(this,s,o,i,a-1,-a)}let u=i-1,_=1,w=0;for(this[o+u]=255&s;--u>=0&&(_*=256);)s<0&&0===w&&0!==this[o+u+1]&&(w=1),this[o+u]=(s/_|0)-w&255;return o+i},Buffer.prototype.writeInt8=function writeInt8(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,1,127,-128),s<0&&(s=255+s+1),this[o]=255&s,o+1},Buffer.prototype.writeInt16LE=function writeInt16LE(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,2,32767,-32768),this[o]=255&s,this[o+1]=s>>>8,o+2},Buffer.prototype.writeInt16BE=function writeInt16BE(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,2,32767,-32768),this[o]=s>>>8,this[o+1]=255&s,o+2},Buffer.prototype.writeInt32LE=function writeInt32LE(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,4,2147483647,-2147483648),this[o]=255&s,this[o+1]=s>>>8,this[o+2]=s>>>16,this[o+3]=s>>>24,o+4},Buffer.prototype.writeInt32BE=function writeInt32BE(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,4,2147483647,-2147483648),s<0&&(s=4294967295+s+1),this[o]=s>>>24,this[o+1]=s>>>16,this[o+2]=s>>>8,this[o+3]=255&s,o+4},Buffer.prototype.writeBigInt64LE=defineBigIntMethod((function writeBigInt64LE(s,o=0){return wrtBigUInt64LE(this,s,o,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeBigInt64BE=defineBigIntMethod((function writeBigInt64BE(s,o=0){return wrtBigUInt64BE(this,s,o,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeFloatLE=function writeFloatLE(s,o,i){return writeFloat(this,s,o,!0,i)},Buffer.prototype.writeFloatBE=function writeFloatBE(s,o,i){return writeFloat(this,s,o,!1,i)},Buffer.prototype.writeDoubleLE=function writeDoubleLE(s,o,i){return writeDouble(this,s,o,!0,i)},Buffer.prototype.writeDoubleBE=function writeDoubleBE(s,o,i){return writeDouble(this,s,o,!1,i)},Buffer.prototype.copy=function copy(s,o,i,a){if(!Buffer.isBuffer(s))throw new TypeError("argument should be a Buffer");if(i||(i=0),a||0===a||(a=this.length),o>=s.length&&(o=s.length),o||(o=0),a>0&&a=this.length)throw new RangeError("Index out of range");if(a<0)throw new RangeError("sourceEnd out of bounds");a>this.length&&(a=this.length),s.length-o>>=0,i=void 0===i?this.length:i>>>0,s||(s=0),"number"==typeof s)for(u=o;u=a+4;i-=3)o=`_${s.slice(i-3,i)}${o}`;return`${s.slice(0,i)}${o}`}function checkIntBI(s,o,i,a,u,_){if(s>i||s3?0===o||o===BigInt(0)?`>= 0${a} and < 2${a} ** ${8*(_+1)}${a}`:`>= -(2${a} ** ${8*(_+1)-1}${a}) and < 2 ** ${8*(_+1)-1}${a}`:`>= ${o}${a} and <= ${i}${a}`,new C.ERR_OUT_OF_RANGE("value",u,s)}!function checkBounds(s,o,i){validateNumber(o,"offset"),void 0!==s[o]&&void 0!==s[o+i]||boundsError(o,s.length-(i+1))}(a,u,_)}function validateNumber(s,o){if("number"!=typeof s)throw new C.ERR_INVALID_ARG_TYPE(o,"number",s)}function boundsError(s,o,i){if(Math.floor(s)!==s)throw validateNumber(s,i),new C.ERR_OUT_OF_RANGE(i||"offset","an integer",s);if(o<0)throw new C.ERR_BUFFER_OUT_OF_BOUNDS;throw new C.ERR_OUT_OF_RANGE(i||"offset",`>= ${i?1:0} and <= ${o}`,s)}E("ERR_BUFFER_OUT_OF_BOUNDS",(function(s){return s?`${s} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),E("ERR_INVALID_ARG_TYPE",(function(s,o){return`The "${s}" argument must be of type number. Received type ${typeof o}`}),TypeError),E("ERR_OUT_OF_RANGE",(function(s,o,i){let a=`The value of "${s}" is out of range.`,u=i;return Number.isInteger(i)&&Math.abs(i)>2**32?u=addNumericalSeparator(String(i)):"bigint"==typeof i&&(u=String(i),(i>BigInt(2)**BigInt(32)||i<-(BigInt(2)**BigInt(32)))&&(u=addNumericalSeparator(u)),u+="n"),a+=` It must be ${o}. Received ${u}`,a}),RangeError);const j=/[^+/0-9A-Za-z-_]/g;function utf8ToBytes(s,o){let i;o=o||1/0;const a=s.length;let u=null;const _=[];for(let w=0;w55295&&i<57344){if(!u){if(i>56319){(o-=3)>-1&&_.push(239,191,189);continue}if(w+1===a){(o-=3)>-1&&_.push(239,191,189);continue}u=i;continue}if(i<56320){(o-=3)>-1&&_.push(239,191,189),u=i;continue}i=65536+(u-55296<<10|i-56320)}else u&&(o-=3)>-1&&_.push(239,191,189);if(u=null,i<128){if((o-=1)<0)break;_.push(i)}else if(i<2048){if((o-=2)<0)break;_.push(i>>6|192,63&i|128)}else if(i<65536){if((o-=3)<0)break;_.push(i>>12|224,i>>6&63|128,63&i|128)}else{if(!(i<1114112))throw new Error("Invalid code point");if((o-=4)<0)break;_.push(i>>18|240,i>>12&63|128,i>>6&63|128,63&i|128)}}return _}function base64ToBytes(s){return a.toByteArray(function base64clean(s){if((s=(s=s.split("=")[0]).trim().replace(j,"")).length<2)return"";for(;s.length%4!=0;)s+="=";return s}(s))}function blitBuffer(s,o,i,a){let u;for(u=0;u=o.length||u>=s.length);++u)o[u+i]=s[u];return u}function isInstance(s,o){return s instanceof o||null!=s&&null!=s.constructor&&null!=s.constructor.name&&s.constructor.name===o.name}function numberIsNaN(s){return s!=s}const L=function(){const s="0123456789abcdef",o=new Array(256);for(let i=0;i<16;++i){const a=16*i;for(let u=0;u<16;++u)o[a+u]=s[i]+s[u]}return o}();function defineBigIntMethod(s){return"undefined"==typeof BigInt?BufferBigIntNotDefined:s}function BufferBigIntNotDefined(){throw new Error("BigInt not supported")}},48590:(s,o)=>{"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.default=function(s){return s&&"@@redux/INIT"===s.type?"initialState argument passed to createStore":"previous state received by the reducer"},s.exports=o.default},48648:s=>{"use strict";s.exports="undefined"!=typeof Reflect&&Reflect.getPrototypeOf||null},48655:(s,o,i)=>{var a=i(26025);s.exports=function listCacheHas(s){return a(this.__data__,s)>-1}},48675:(s,o,i)=>{s.exports=i(20850)},48948:(s,o,i)=>{var a=i(21791),u=i(86375);s.exports=function copySymbolsIn(s,o){return a(s,u(s),o)}},49092:(s,o,i)=>{"use strict";var a=i(41333);s.exports=function hasToStringTagShams(){return a()&&!!Symbol.toStringTag}},49326:(s,o,i)=>{var a=i(31769),u=i(72428),_=i(56449),w=i(30361),x=i(30294),C=i(77797);s.exports=function hasPath(s,o,i){for(var j=-1,L=(o=a(o,s)).length,B=!1;++j{"use strict";var a=i(45951),u=i(46285),_=a.document,w=u(_)&&u(_.createElement);s.exports=function(s){return w?_.createElement(s):{}}},49653:(s,o,i)=>{var a=i(37828);s.exports=function cloneArrayBuffer(s){var o=new s.constructor(s.byteLength);return new a(o).set(new a(s)),o}},49698:s=>{var o=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");s.exports=function hasUnicode(s){return o.test(s)}},49724:(s,o,i)=>{"use strict";var a=i(1907),u=i(39298),_=a({}.hasOwnProperty);s.exports=Object.hasOwn||function hasOwn(s,o){return _(u(s),o)}},49747:(s,o,i)=>{var a=i(66977);function curry(s,o,i){var u=a(s,8,void 0,void 0,void 0,void 0,void 0,o=i?void 0:o);return u.placeholder=curry.placeholder,u}curry.placeholder={},s.exports=curry},50002:(s,o,i)=>{var a=i(82199),u=i(4664),_=i(95950);s.exports=function getAllKeys(s){return a(s,_,u)}},50104:(s,o,i)=>{var a=i(53661);function memoize(s,o){if("function"!=typeof s||null!=o&&"function"!=typeof o)throw new TypeError("Expected a function");var memoized=function(){var i=arguments,a=o?o.apply(this,i):i[0],u=memoized.cache;if(u.has(a))return u.get(a);var _=s.apply(this,i);return memoized.cache=u.set(a,_)||u,_};return memoized.cache=new(memoize.Cache||a),memoized}memoize.Cache=a,s.exports=memoize},50583:(s,o,i)=>{var a=i(47237),u=i(17255),_=i(28586),w=i(77797);s.exports=function property(s){return _(s)?a(w(s)):u(s)}},50689:(s,o,i)=>{var a=i(50002),u=Object.prototype.hasOwnProperty;s.exports=function equalObjects(s,o,i,_,w,x){var C=1&i,j=a(s),L=j.length;if(L!=a(o).length&&!C)return!1;for(var B=L;B--;){var $=j[B];if(!(C?$ in o:u.call(o,$)))return!1}var U=x.get(s),V=x.get(o);if(U&&V)return U==o&&V==s;var z=!0;x.set(s,o),x.set(o,s);for(var Y=C;++B{var a=i(24647),u=i(13222),_=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,w=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");s.exports=function deburr(s){return(s=u(s))&&s.replace(_,a).replace(w,"")}},51175:(s,o,i)=>{"use strict";var a=i(19846);s.exports=a&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},51234:s=>{s.exports=function baseZipObject(s,o,i){for(var a=-1,u=s.length,_=o.length,w={};++a{var a=i(80079);s.exports=function stackClear(){this.__data__=new a,this.size=0}},51459:s=>{s.exports=function setCacheHas(s){return this.__data__.has(s)}},51811:s=>{var o=Date.now;s.exports=function shortOut(s){var i=0,a=0;return function(){var u=o(),_=16-(u-a);if(a=u,_>0){if(++i>=800)return arguments[0]}else i=0;return s.apply(void 0,arguments)}}},51871:(s,o,i)=>{"use strict";var a=i(1907),u=i(82159);s.exports=function(s,o,i){try{return a(u(Object.getOwnPropertyDescriptor(s,o)[i]))}catch(s){}}},51873:(s,o,i)=>{var a=i(9325).Symbol;s.exports=a},52623:(s,o,i)=>{"use strict";var a={};a[i(76264)("toStringTag")]="z",s.exports="[object z]"===String(a)},53138:(s,o,i)=>{var a=i(11331);s.exports=function customOmitClone(s){return a(s)?void 0:s}},53209:(s,o,i)=>{"use strict";var a=i(65606),u=65536,_=4294967295;var w=i(92861).Buffer,x=i.g.crypto||i.g.msCrypto;x&&x.getRandomValues?s.exports=function randomBytes(s,o){if(s>_)throw new RangeError("requested too many random bytes");var i=w.allocUnsafe(s);if(s>0)if(s>u)for(var C=0;C{var o=Math.max;s.exports=function composeArgsRight(s,i,a,u){for(var _=-1,w=s.length,x=-1,C=a.length,j=-1,L=i.length,B=o(w-C,0),$=Array(B+L),U=!u;++_{"use strict";var a=i(93700);s.exports=a},53661:(s,o,i)=>{var a=i(63040),u=i(17670),_=i(90289),w=i(4509),x=i(72949);function MapCache(s){var o=-1,i=null==s?0:s.length;for(this.clear();++o{var a=i(30980),u=i(56017),_=i(94033),w=i(56449),x=i(40346),C=i(80257),j=Object.prototype.hasOwnProperty;function lodash(s){if(x(s)&&!w(s)&&!(s instanceof a)){if(s instanceof u)return s;if(j.call(s,"__wrapped__"))return C(s)}return new u(s)}lodash.prototype=_.prototype,lodash.prototype.constructor=lodash,s.exports=lodash},53812:(s,o,i)=>{var a=i(72552),u=i(40346);s.exports=function isBoolean(s){return!0===s||!1===s||u(s)&&"[object Boolean]"==a(s)}},54018:(s,o,i)=>{"use strict";var a=i(46285);s.exports=function(s){return a(s)||null===s}},54128:(s,o,i)=>{var a=i(31800),u=/^\s+/;s.exports=function baseTrim(s){return s?s.slice(0,a(s)+1).replace(u,""):s}},54552:s=>{s.exports=function basePropertyOf(s){return function(o){return null==s?void 0:s[o]}}},54641:(s,o,i)=>{var a=i(68882),u=i(51811)(a);s.exports=u},54829:(s,o,i)=>{"use strict";var a=i(74284).f;s.exports=function(s,o,i){i in s||a(s,i,{configurable:!0,get:function(){return o[i]},set:function(s){o[i]=s}})}},54878:(s,o,i)=>{"use strict";var a=i(52623),u=i(73948);s.exports=a?{}.toString:function toString(){return"[object "+u(this)+"]"}},55157:s=>{s.exports=function(){throw new Error("Readable.from is not available in the browser")}},55364:(s,o,i)=>{var a=i(85250),u=i(20999)((function(s,o,i){a(s,o,i)}));s.exports=u},55481:(s,o,i)=>{var a=i(9325)["__core-js_shared__"];s.exports=a},55527:s=>{var o=Object.prototype;s.exports=function isPrototype(s){var i=s&&s.constructor;return s===("function"==typeof i&&i.prototype||o)}},55580:(s,o,i)=>{var a=i(56110)(i(9325),"DataView");s.exports=a},55674:(s,o,i)=>{"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.validateNextState=o.getUnexpectedInvocationParameterMessage=o.getStateName=void 0;var a=_interopRequireDefault(i(48590)),u=_interopRequireDefault(i(82261)),_=_interopRequireDefault(i(27374));function _interopRequireDefault(s){return s&&s.__esModule?s:{default:s}}o.getStateName=a.default,o.getUnexpectedInvocationParameterMessage=u.default,o.validateNextState=_.default},55808:(s,o,i)=>{var a=i(12507)("toUpperCase");s.exports=a},55973:s=>{class KeyValuePair{constructor(s,o){this.key=s,this.value=o}clone(){const s=new KeyValuePair;return this.key&&(s.key=this.key.clone()),this.value&&(s.value=this.value.clone()),s}}s.exports=KeyValuePair},56017:(s,o,i)=>{var a=i(39344),u=i(94033);function LodashWrapper(s,o){this.__wrapped__=s,this.__actions__=[],this.__chain__=!!o,this.__index__=0,this.__values__=void 0}LodashWrapper.prototype=a(u.prototype),LodashWrapper.prototype.constructor=LodashWrapper,s.exports=LodashWrapper},56110:(s,o,i)=>{var a=i(45083),u=i(10392);s.exports=function getNative(s,o){var i=u(s,o);return a(i)?i:void 0}},56367:(s,o,i)=>{s.exports=i(77731)},56449:s=>{var o=Array.isArray;s.exports=o},56698:s=>{"function"==typeof Object.create?s.exports=function inherits(s,o){o&&(s.super_=o,s.prototype=Object.create(o.prototype,{constructor:{value:s,enumerable:!1,writable:!0,configurable:!0}}))}:s.exports=function inherits(s,o){if(o){s.super_=o;var TempCtor=function(){};TempCtor.prototype=o.prototype,s.prototype=new TempCtor,s.prototype.constructor=s}}},56757:(s,o,i)=>{var a=i(91033),u=Math.max;s.exports=function overRest(s,o,i){return o=u(void 0===o?s.length-1:o,0),function(){for(var _=arguments,w=-1,x=u(_.length-o,0),C=Array(x);++w{"use strict";var a=i(98828);s.exports=!a((function(){function F(){}return F.prototype.constructor=null,Object.getPrototypeOf(new F)!==F.prototype}))},57758:(s,o,i)=>{"use strict";var a;var u=i(86048).F,_=u.ERR_MISSING_ARGS,w=u.ERR_STREAM_DESTROYED;function noop(s){if(s)throw s}function call(s){s()}function pipe(s,o){return s.pipe(o)}s.exports=function pipeline(){for(var s=arguments.length,o=new Array(s),u=0;u0,(function(s){x||(x=s),s&&j.forEach(call),_||(j.forEach(call),C(x))}))}));return o.reduce(pipe)}},58068:s=>{"use strict";s.exports=SyntaxError},58075:(s,o,i)=>{"use strict";var a,u=i(36624),_=i(42220),w=i(80376),x=i(38530),C=i(62416),j=i(49552),L=i(92522),B="prototype",$="script",U=L("IE_PROTO"),EmptyConstructor=function(){},scriptTag=function(s){return"<"+$+">"+s+""},NullProtoObjectViaActiveX=function(s){s.write(scriptTag("")),s.close();var o=s.parentWindow.Object;return s=null,o},NullProtoObject=function(){try{a=new ActiveXObject("htmlfile")}catch(s){}var s,o,i;NullProtoObject="undefined"!=typeof document?document.domain&&a?NullProtoObjectViaActiveX(a):(o=j("iframe"),i="java"+$+":",o.style.display="none",C.appendChild(o),o.src=String(i),(s=o.contentWindow.document).open(),s.write(scriptTag("document.F=Object")),s.close(),s.F):NullProtoObjectViaActiveX(a);for(var u=w.length;u--;)delete NullProtoObject[B][w[u]];return NullProtoObject()};x[U]=!0,s.exports=Object.create||function create(s,o){var i;return null!==s?(EmptyConstructor[B]=u(s),i=new EmptyConstructor,EmptyConstructor[B]=null,i[U]=s):i=NullProtoObject(),void 0===o?i:_.f(i,o)}},58156:(s,o,i)=>{var a=i(47422);s.exports=function get(s,o,i){var u=null==s?void 0:a(s,o);return void 0===u?i:u}},58523:s=>{s.exports=function countHolders(s,o){for(var i=s.length,a=0;i--;)s[i]===o&&++a;return a}},58661:(s,o,i)=>{"use strict";var a=i(39447),u=i(98828);s.exports=a&&u((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},58968:s=>{"use strict";s.exports=Math.floor},59350:s=>{var o=Object.prototype.toString;s.exports=function objectToString(s){return o.call(s)}},59399:(s,o,i)=>{"use strict";var a=i(25264).CopyToClipboard;a.CopyToClipboard=a,s.exports=a},59550:s=>{"use strict";s.exports=function(s,o){return{value:s,done:o}}},60183:(s,o,i)=>{"use strict";var a=i(11091),u=i(13930),_=i(7376),w=i(36833),x=i(62250),C=i(47181),j=i(15972),L=i(79192),B=i(14840),$=i(61626),U=i(68055),V=i(76264),z=i(93742),Y=i(95116),Z=w.PROPER,ee=w.CONFIGURABLE,ie=Y.IteratorPrototype,ae=Y.BUGGY_SAFARI_ITERATORS,ce=V("iterator"),le="keys",pe="values",de="entries",returnThis=function(){return this};s.exports=function(s,o,i,w,V,Y,fe){C(i,o,w);var ye,be,_e,getIterationMethod=function(s){if(s===V&&Te)return Te;if(!ae&&s&&s in xe)return xe[s];switch(s){case le:return function keys(){return new i(this,s)};case pe:return function values(){return new i(this,s)};case de:return function entries(){return new i(this,s)}}return function(){return new i(this)}},Se=o+" Iterator",we=!1,xe=s.prototype,Pe=xe[ce]||xe["@@iterator"]||V&&xe[V],Te=!ae&&Pe||getIterationMethod(V),Re="Array"===o&&xe.entries||Pe;if(Re&&(ye=j(Re.call(new s)))!==Object.prototype&&ye.next&&(_||j(ye)===ie||(L?L(ye,ie):x(ye[ce])||U(ye,ce,returnThis)),B(ye,Se,!0,!0),_&&(z[Se]=returnThis)),Z&&V===pe&&Pe&&Pe.name!==pe&&(!_&&ee?$(xe,"name",pe):(we=!0,Te=function values(){return u(Pe,this)})),V)if(be={values:getIterationMethod(pe),keys:Y?Te:getIterationMethod(le),entries:getIterationMethod(de)},fe)for(_e in be)(ae||we||!(_e in xe))&&U(xe,_e,be[_e]);else a({target:o,proto:!0,forced:ae||we},be);return _&&!fe||xe[ce]===Te||U(xe,ce,Te,{name:V}),z[o]=Te,be}},60270:(s,o,i)=>{var a=i(87068),u=i(40346);s.exports=function baseIsEqual(s,o,i,_,w){return s===o||(null==s||null==o||!u(s)&&!u(o)?s!=s&&o!=o:a(s,o,i,_,baseIsEqual,w))}},60581:(s,o,i)=>{"use strict";var a=i(13930),u=i(62250),_=i(46285),w=TypeError;s.exports=function(s,o){var i,x;if("string"===o&&u(i=s.toString)&&!_(x=a(i,s)))return x;if(u(i=s.valueOf)&&!_(x=a(i,s)))return x;if("string"!==o&&u(i=s.toString)&&!_(x=a(i,s)))return x;throw new w("Can't convert object to primitive value")}},60680:(s,o,i)=>{var a=i(13222),u=/[\\^$.*+?()[\]{}|]/g,_=RegExp(u.source);s.exports=function escapeRegExp(s){return(s=a(s))&&_.test(s)?s.replace(u,"\\$&"):s}},61045:(s,o,i)=>{const a=i(6048),u=i(23805),_=i(6233),w=i(87726),x=i(10866);s.exports=class ObjectElement extends _{constructor(s,o,i){super(s||[],o,i),this.element="object"}primitive(){return"object"}toValue(){return this.content.reduce(((s,o)=>(s[o.key.toValue()]=o.value?o.value.toValue():void 0,s)),{})}get(s){const o=this.getMember(s);if(o)return o.value}getMember(s){if(void 0!==s)return this.content.find((o=>o.key.toValue()===s))}remove(s){let o=null;return this.content=this.content.filter((i=>i.key.toValue()!==s||(o=i,!1))),o}getKey(s){const o=this.getMember(s);if(o)return o.key}set(s,o){if(u(s))return Object.keys(s).forEach((o=>{this.set(o,s[o])})),this;const i=s,a=this.getMember(i);return a?a.value=o:this.content.push(new w(i,o)),this}keys(){return this.content.map((s=>s.key.toValue()))}values(){return this.content.map((s=>s.value.toValue()))}hasKey(s){return this.content.some((o=>o.key.equals(s)))}items(){return this.content.map((s=>[s.key.toValue(),s.value.toValue()]))}map(s,o){return this.content.map((i=>s.bind(o)(i.value,i.key,i)))}compactMap(s,o){const i=[];return this.forEach(((a,u,_)=>{const w=s.bind(o)(a,u,_);w&&i.push(w)})),i}filter(s,o){return new x(this.content).filter(s,o)}reject(s,o){return this.filter(a(s),o)}forEach(s,o){return this.content.forEach((i=>s.bind(o)(i.value,i.key,i)))}}},61074:s=>{s.exports=function asciiToArray(s){return s.split("")}},61160:(s,o,i)=>{"use strict";var a=i(92063),u=i(73992),_=/^[\x00-\x20\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/,w=/[\n\r\t]/g,x=/^[A-Za-z][A-Za-z0-9+-.]*:\/\//,C=/:\d+$/,j=/^([a-z][a-z0-9.+-]*:)?(\/\/)?([\\/]+)?([\S\s]*)/i,L=/^[a-zA-Z]:/;function trimLeft(s){return(s||"").toString().replace(_,"")}var B=[["#","hash"],["?","query"],function sanitize(s,o){return isSpecial(o.protocol)?s.replace(/\\/g,"/"):s},["/","pathname"],["@","auth",1],[NaN,"host",void 0,1,1],[/:(\d*)$/,"port",void 0,1],[NaN,"hostname",void 0,1,1]],$={hash:1,query:1};function lolcation(s){var o,a=("undefined"!=typeof window?window:void 0!==i.g?i.g:"undefined"!=typeof self?self:{}).location||{},u={},_=typeof(s=s||a);if("blob:"===s.protocol)u=new Url(unescape(s.pathname),{});else if("string"===_)for(o in u=new Url(s,{}),$)delete u[o];else if("object"===_){for(o in s)o in $||(u[o]=s[o]);void 0===u.slashes&&(u.slashes=x.test(s.href))}return u}function isSpecial(s){return"file:"===s||"ftp:"===s||"http:"===s||"https:"===s||"ws:"===s||"wss:"===s}function extractProtocol(s,o){s=(s=trimLeft(s)).replace(w,""),o=o||{};var i,a=j.exec(s),u=a[1]?a[1].toLowerCase():"",_=!!a[2],x=!!a[3],C=0;return _?x?(i=a[2]+a[3]+a[4],C=a[2].length+a[3].length):(i=a[2]+a[4],C=a[2].length):x?(i=a[3]+a[4],C=a[3].length):i=a[4],"file:"===u?C>=2&&(i=i.slice(2)):isSpecial(u)?i=a[4]:u?_&&(i=i.slice(2)):C>=2&&isSpecial(o.protocol)&&(i=a[4]),{protocol:u,slashes:_||isSpecial(u),slashesCount:C,rest:i}}function Url(s,o,i){if(s=(s=trimLeft(s)).replace(w,""),!(this instanceof Url))return new Url(s,o,i);var _,x,C,j,$,U,V=B.slice(),z=typeof o,Y=this,Z=0;for("object"!==z&&"string"!==z&&(i=o,o=null),i&&"function"!=typeof i&&(i=u.parse),_=!(x=extractProtocol(s||"",o=lolcation(o))).protocol&&!x.slashes,Y.slashes=x.slashes||_&&o.slashes,Y.protocol=x.protocol||o.protocol||"",s=x.rest,("file:"===x.protocol&&(2!==x.slashesCount||L.test(s))||!x.slashes&&(x.protocol||x.slashesCount<2||!isSpecial(Y.protocol)))&&(V[3]=[/(.*)/,"pathname"]);Z{var a=i(20426),u=i(49326);s.exports=function has(s,o){return null!=s&&u(s,o,a)}},61489:(s,o,i)=>{var a=i(17400);s.exports=function toInteger(s){var o=a(s),i=o%1;return o==o?i?o-i:o:0}},61626:(s,o,i)=>{"use strict";var a=i(39447),u=i(74284),_=i(75817);s.exports=a?function(s,o,i){return u.f(s,o,_(1,i))}:function(s,o,i){return s[o]=i,s}},61747:(s,o,i)=>{"use strict";var a=i(45951),u=i(92046);s.exports=function(s,o){var i=u[s+"Prototype"],_=i&&i[o];if(_)return _;var w=a[s],x=w&&w.prototype;return x&&x[o]}},61802:(s,o,i)=>{var a=i(62224),u=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,_=/\\(\\)?/g,w=a((function(s){var o=[];return 46===s.charCodeAt(0)&&o.push(""),s.replace(u,(function(s,i,a,u){o.push(a?u.replace(_,"$1"):i||s)})),o}));s.exports=w},62006:(s,o,i)=>{var a=i(15389),u=i(64894),_=i(95950);s.exports=function createFind(s){return function(o,i,w){var x=Object(o);if(!u(o)){var C=a(i,3);o=_(o),i=function(s){return C(x[s],s,x)}}var j=s(o,i,w);return j>-1?x[C?o[j]:j]:void 0}}},62060:s=>{var o=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;s.exports=function insertWrapDetails(s,i){var a=i.length;if(!a)return s;var u=a-1;return i[u]=(a>1?"& ":"")+i[u],i=i.join(a>2?", ":" "),s.replace(o,"{\n/* [wrapped with "+i+"] */\n")}},62193:(s,o,i)=>{var a=i(88984),u=i(5861),_=i(72428),w=i(56449),x=i(64894),C=i(3656),j=i(55527),L=i(37167),B=Object.prototype.hasOwnProperty;s.exports=function isEmpty(s){if(null==s)return!0;if(x(s)&&(w(s)||"string"==typeof s||"function"==typeof s.splice||C(s)||L(s)||_(s)))return!s.length;var o=u(s);if("[object Map]"==o||"[object Set]"==o)return!s.size;if(j(s))return!a(s).length;for(var i in s)if(B.call(s,i))return!1;return!0}},62224:(s,o,i)=>{var a=i(50104);s.exports=function memoizeCapped(s){var o=a(s,(function(s){return 500===i.size&&i.clear(),s})),i=o.cache;return o}},62250:s=>{"use strict";var o="object"==typeof document&&document.all;s.exports=void 0===o&&void 0!==o?function(s){return"function"==typeof s||s===o}:function(s){return"function"==typeof s}},62284:(s,o,i)=>{var a=i(84629),u=Object.prototype.hasOwnProperty;s.exports=function getFuncName(s){for(var o=s.name+"",i=a[o],_=u.call(a,o)?i.length:0;_--;){var w=i[_],x=w.func;if(null==x||x==s)return w.name}return o}},62416:(s,o,i)=>{"use strict";var a=i(85582);s.exports=a("document","documentElement")},62802:(s,o,i)=>{"use strict";s.exports=function SHA(o){var i=o.toLowerCase(),a=s.exports[i];if(!a)throw new Error(i+" is not supported (we accept pull requests)");return new a},s.exports.sha=i(27816),s.exports.sha1=i(63737),s.exports.sha224=i(26710),s.exports.sha256=i(24107),s.exports.sha384=i(32827),s.exports.sha512=i(82890)},63040:(s,o,i)=>{var a=i(21549),u=i(80079),_=i(68223);s.exports=function mapCacheClear(){this.size=0,this.__data__={hash:new a,map:new(_||u),string:new a}}},63345:s=>{s.exports=function stubArray(){return[]}},63560:(s,o,i)=>{var a=i(73170);s.exports=function set(s,o,i){return null==s?s:a(s,o,i)}},63600:(s,o,i)=>{"use strict";s.exports=PassThrough;var a=i(74610);function PassThrough(s){if(!(this instanceof PassThrough))return new PassThrough(s);a.call(this,s)}i(56698)(PassThrough,a),PassThrough.prototype._transform=function(s,o,i){i(null,s)}},63605:s=>{s.exports=function stackGet(s){return this.__data__.get(s)}},63702:s=>{s.exports=function listCacheClear(){this.__data__=[],this.size=0}},63737:(s,o,i)=>{"use strict";var a=i(56698),u=i(90392),_=i(92861).Buffer,w=[1518500249,1859775393,-1894007588,-899497514],x=new Array(80);function Sha1(){this.init(),this._w=x,u.call(this,64,56)}function rotl5(s){return s<<5|s>>>27}function rotl30(s){return s<<30|s>>>2}function ft(s,o,i,a){return 0===s?o&i|~o&a:2===s?o&i|o&a|i&a:o^i^a}a(Sha1,u),Sha1.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},Sha1.prototype._update=function(s){for(var o,i=this._w,a=0|this._a,u=0|this._b,_=0|this._c,x=0|this._d,C=0|this._e,j=0;j<16;++j)i[j]=s.readInt32BE(4*j);for(;j<80;++j)i[j]=(o=i[j-3]^i[j-8]^i[j-14]^i[j-16])<<1|o>>>31;for(var L=0;L<80;++L){var B=~~(L/20),$=rotl5(a)+ft(B,u,_,x)+C+i[L]+w[B]|0;C=x,x=_,_=rotl30(u),u=a,a=$}this._a=a+this._a|0,this._b=u+this._b|0,this._c=_+this._c|0,this._d=x+this._d|0,this._e=C+this._e|0},Sha1.prototype._hash=function(){var s=_.allocUnsafe(20);return s.writeInt32BE(0|this._a,0),s.writeInt32BE(0|this._b,4),s.writeInt32BE(0|this._c,8),s.writeInt32BE(0|this._d,12),s.writeInt32BE(0|this._e,16),s},s.exports=Sha1},63862:s=>{s.exports=function hashDelete(s){var o=this.has(s)&&delete this.__data__[s];return this.size-=o?1:0,o}},63912:(s,o,i)=>{var a=i(61074),u=i(49698),_=i(42054);s.exports=function stringToArray(s){return u(s)?_(s):a(s)}},63950:s=>{s.exports=function noop(){}},64039:(s,o,i)=>{"use strict";var a="undefined"!=typeof Symbol&&Symbol,u=i(41333);s.exports=function hasNativeSymbols(){return"function"==typeof a&&("function"==typeof Symbol&&("symbol"==typeof a("foo")&&("symbol"==typeof Symbol("bar")&&u())))}},64502:(s,o,i)=>{"use strict";i(82048)},64626:(s,o,i)=>{var a=i(66977);s.exports=function ary(s,o,i){return o=i?void 0:o,o=s&&null==o?s.length:o,a(s,128,void 0,void 0,void 0,void 0,o)}},64634:s=>{var o={}.toString;s.exports=Array.isArray||function(s){return"[object Array]"==o.call(s)}},64894:(s,o,i)=>{var a=i(1882),u=i(30294);s.exports=function isArrayLike(s){return null!=s&&u(s.length)&&!a(s)}},64932:(s,o,i)=>{"use strict";var a,u,_,w=i(40551),x=i(45951),C=i(46285),j=i(61626),L=i(49724),B=i(36128),$=i(92522),U=i(38530),V="Object already initialized",z=x.TypeError,Y=x.WeakMap;if(w||B.state){var Z=B.state||(B.state=new Y);Z.get=Z.get,Z.has=Z.has,Z.set=Z.set,a=function(s,o){if(Z.has(s))throw new z(V);return o.facade=s,Z.set(s,o),o},u=function(s){return Z.get(s)||{}},_=function(s){return Z.has(s)}}else{var ee=$("state");U[ee]=!0,a=function(s,o){if(L(s,ee))throw new z(V);return o.facade=s,j(s,ee,o),o},u=function(s){return L(s,ee)?s[ee]:{}},_=function(s){return L(s,ee)}}s.exports={set:a,get:u,has:_,enforce:function(s){return _(s)?u(s):a(s,{})},getterFor:function(s){return function(o){var i;if(!C(o)||(i=u(o)).type!==s)throw new z("Incompatible receiver, "+s+" required");return i}}}},65291:(s,o,i)=>{"use strict";var a=i(86048).F.ERR_INVALID_OPT_VALUE;s.exports={getHighWaterMark:function getHighWaterMark(s,o,i,u){var _=function highWaterMarkFrom(s,o,i){return null!=s.highWaterMark?s.highWaterMark:o?s[i]:null}(o,u,i);if(null!=_){if(!isFinite(_)||Math.floor(_)!==_||_<0)throw new a(u?i:"highWaterMark",_);return Math.floor(_)}return s.objectMode?16:16384}}},65482:(s,o,i)=>{"use strict";var a=i(41176);s.exports=function(s){var o=+s;return o!=o||0===o?0:a(o)}},65606:s=>{var o,i,a=s.exports={};function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(s){if(o===setTimeout)return setTimeout(s,0);if((o===defaultSetTimout||!o)&&setTimeout)return o=setTimeout,setTimeout(s,0);try{return o(s,0)}catch(i){try{return o.call(null,s,0)}catch(i){return o.call(this,s,0)}}}!function(){try{o="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(s){o=defaultSetTimout}try{i="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(s){i=defaultClearTimeout}}();var u,_=[],w=!1,x=-1;function cleanUpNextTick(){w&&u&&(w=!1,u.length?_=u.concat(_):x=-1,_.length&&drainQueue())}function drainQueue(){if(!w){var s=runTimeout(cleanUpNextTick);w=!0;for(var o=_.length;o;){for(u=_,_=[];++x1)for(var i=1;i{s.exports=function json(s){const o={literal:"true false null"},i=[s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE],a=[s.QUOTE_STRING_MODE,s.C_NUMBER_MODE],u={end:",",endsWithParent:!0,excludeEnd:!0,contains:a,keywords:o},_={begin:/\{/,end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/,contains:[s.BACKSLASH_ESCAPE],illegal:"\\n"},s.inherit(u,{begin:/:/})].concat(i),illegal:"\\S"},w={begin:"\\[",end:"\\]",contains:[s.inherit(u)],illegal:"\\S"};return a.push(_,w),i.forEach((function(s){a.push(s)})),{name:"JSON",contains:a,keywords:o,illegal:"\\S"}}},66645:(s,o,i)=>{var a=i(1733),u=i(45434),_=i(13222),w=i(22225);s.exports=function words(s,o,i){return s=_(s),void 0===(o=i?void 0:o)?u(s)?w(s):a(s):s.match(o)||[]}},66721:(s,o,i)=>{var a=i(81042),u=Object.prototype.hasOwnProperty;s.exports=function hashGet(s){var o=this.__data__;if(a){var i=o[s];return"__lodash_hash_undefined__"===i?void 0:i}return u.call(o,s)?o[s]:void 0}},66743:(s,o,i)=>{"use strict";var a=i(89353);s.exports=Function.prototype.bind||a},66977:(s,o,i)=>{var a=i(68882),u=i(11842),_=i(77078),w=i(37471),x=i(24168),C=i(37381),j=i(3209),L=i(54641),B=i(70981),$=i(61489),U=Math.max;s.exports=function createWrap(s,o,i,V,z,Y,Z,ee){var ie=2&o;if(!ie&&"function"!=typeof s)throw new TypeError("Expected a function");var ae=V?V.length:0;if(ae||(o&=-97,V=z=void 0),Z=void 0===Z?Z:U($(Z),0),ee=void 0===ee?ee:$(ee),ae-=z?z.length:0,64&o){var ce=V,le=z;V=z=void 0}var pe=ie?void 0:C(s),de=[s,o,i,V,z,ce,le,Y,Z,ee];if(pe&&j(de,pe),s=de[0],o=de[1],i=de[2],V=de[3],z=de[4],!(ee=de[9]=void 0===de[9]?ie?0:s.length:U(de[9]-ae,0))&&24&o&&(o&=-25),o&&1!=o)fe=8==o||16==o?_(s,o,ee):32!=o&&33!=o||z.length?w.apply(void 0,de):x(s,o,i,V);else var fe=u(s,o,i);return B((pe?a:L)(fe,de),s,o)}},67197:s=>{s.exports=function matchesStrictComparable(s,o){return function(i){return null!=i&&(i[s]===o&&(void 0!==o||s in Object(i)))}}},67526:(s,o)=>{"use strict";o.byteLength=function byteLength(s){var o=getLens(s),i=o[0],a=o[1];return 3*(i+a)/4-a},o.toByteArray=function toByteArray(s){var o,i,_=getLens(s),w=_[0],x=_[1],C=new u(function _byteLength(s,o,i){return 3*(o+i)/4-i}(0,w,x)),j=0,L=x>0?w-4:w;for(i=0;i>16&255,C[j++]=o>>8&255,C[j++]=255&o;2===x&&(o=a[s.charCodeAt(i)]<<2|a[s.charCodeAt(i+1)]>>4,C[j++]=255&o);1===x&&(o=a[s.charCodeAt(i)]<<10|a[s.charCodeAt(i+1)]<<4|a[s.charCodeAt(i+2)]>>2,C[j++]=o>>8&255,C[j++]=255&o);return C},o.fromByteArray=function fromByteArray(s){for(var o,a=s.length,u=a%3,_=[],w=16383,x=0,C=a-u;xC?C:x+w));1===u?(o=s[a-1],_.push(i[o>>2]+i[o<<4&63]+"==")):2===u&&(o=(s[a-2]<<8)+s[a-1],_.push(i[o>>10]+i[o>>4&63]+i[o<<2&63]+"="));return _.join("")};for(var i=[],a=[],u="undefined"!=typeof Uint8Array?Uint8Array:Array,_="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",w=0;w<64;++w)i[w]=_[w],a[_.charCodeAt(w)]=w;function getLens(s){var o=s.length;if(o%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var i=s.indexOf("=");return-1===i&&(i=o),[i,i===o?0:4-i%4]}function encodeChunk(s,o,a){for(var u,_,w=[],x=o;x>18&63]+i[_>>12&63]+i[_>>6&63]+i[63&_]);return w.join("")}a["-".charCodeAt(0)]=62,a["_".charCodeAt(0)]=63},68002:s=>{"use strict";s.exports=Math.min},68055:(s,o,i)=>{"use strict";var a=i(61626);s.exports=function(s,o,i,u){return u&&u.enumerable?s[o]=i:a(s,o,i),s}},68090:s=>{s.exports=function last(s){var o=null==s?0:s.length;return o?s[o-1]:void 0}},68223:(s,o,i)=>{var a=i(56110)(i(9325),"Map");s.exports=a},68294:(s,o,i)=>{var a=i(23007),u=i(30361),_=Math.min;s.exports=function reorder(s,o){for(var i=s.length,w=_(o.length,i),x=a(s);w--;){var C=o[w];s[w]=u(C,i)?x[C]:void 0}return s}},68623:(s,o,i)=>{"use strict";var a=i(694);s.exports=a},68882:(s,o,i)=>{var a=i(83488),u=i(48152),_=u?function(s,o){return u.set(s,o),s}:a;s.exports=_},68969:(s,o,i)=>{var a=i(47422),u=i(25160);s.exports=function parent(s,o){return o.length<2?s:a(s,u(o,0,-1))}},69302:(s,o,i)=>{var a=i(83488),u=i(56757),_=i(32865);s.exports=function baseRest(s,o){return _(u(s,o,a),s+"")}},69383:s=>{"use strict";s.exports=Error},69600:s=>{"use strict";var o,i,a=Function.prototype.toString,u="object"==typeof Reflect&&null!==Reflect&&Reflect.apply;if("function"==typeof u&&"function"==typeof Object.defineProperty)try{o=Object.defineProperty({},"length",{get:function(){throw i}}),i={},u((function(){throw 42}),null,o)}catch(s){s!==i&&(u=null)}else u=null;var _=/^\s*class\b/,w=function isES6ClassFunction(s){try{var o=a.call(s);return _.test(o)}catch(s){return!1}},x=function tryFunctionToStr(s){try{return!w(s)&&(a.call(s),!0)}catch(s){return!1}},C=Object.prototype.toString,j="function"==typeof Symbol&&!!Symbol.toStringTag,L=!(0 in[,]),B=function isDocumentDotAll(){return!1};if("object"==typeof document){var $=document.all;C.call($)===C.call(document.all)&&(B=function isDocumentDotAll(s){if((L||!s)&&(void 0===s||"object"==typeof s))try{var o=C.call(s);return("[object HTMLAllCollection]"===o||"[object HTML document.all class]"===o||"[object HTMLCollection]"===o||"[object Object]"===o)&&null==s("")}catch(s){}return!1})}s.exports=u?function isCallable(s){if(B(s))return!0;if(!s)return!1;if("function"!=typeof s&&"object"!=typeof s)return!1;try{u(s,null,o)}catch(s){if(s!==i)return!1}return!w(s)&&x(s)}:function isCallable(s){if(B(s))return!0;if(!s)return!1;if("function"!=typeof s&&"object"!=typeof s)return!1;if(j)return x(s);if(w(s))return!1;var o=C.call(s);return!("[object Function]"!==o&&"[object GeneratorFunction]"!==o&&!/^\[object HTML/.test(o))&&x(s)}},69675:s=>{"use strict";s.exports=TypeError},69884:(s,o,i)=>{var a=i(21791),u=i(37241);s.exports=function toPlainObject(s){return a(s,u(s))}},69982:(s,o,i)=>{"use strict";s.exports=i(29844)},70080:(s,o,i)=>{var a=i(26025),u=Array.prototype.splice;s.exports=function listCacheDelete(s){var o=this.__data__,i=a(o,s);return!(i<0)&&(i==o.length-1?o.pop():u.call(o,i,1),--this.size,!0)}},70414:s=>{"use strict";s.exports=Math.round},70453:(s,o,i)=>{"use strict";var a,u=i(79612),_=i(69383),w=i(41237),x=i(79290),C=i(79538),j=i(58068),L=i(69675),B=i(35345),$=i(71514),U=i(58968),V=i(6188),z=i(68002),Y=i(75880),Z=i(70414),ee=i(73093),ie=Function,getEvalledConstructor=function(s){try{return ie('"use strict"; return ('+s+").constructor;")()}catch(s){}},ae=i(75795),ce=i(30655),throwTypeError=function(){throw new L},le=ae?function(){try{return throwTypeError}catch(s){try{return ae(arguments,"callee").get}catch(s){return throwTypeError}}}():throwTypeError,pe=i(64039)(),de=i(93628),fe=i(71064),ye=i(48648),be=i(11002),_e=i(10076),Se={},we="undefined"!=typeof Uint8Array&&de?de(Uint8Array):a,xe={__proto__:null,"%AggregateError%":"undefined"==typeof AggregateError?a:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?a:ArrayBuffer,"%ArrayIteratorPrototype%":pe&&de?de([][Symbol.iterator]()):a,"%AsyncFromSyncIteratorPrototype%":a,"%AsyncFunction%":Se,"%AsyncGenerator%":Se,"%AsyncGeneratorFunction%":Se,"%AsyncIteratorPrototype%":Se,"%Atomics%":"undefined"==typeof Atomics?a:Atomics,"%BigInt%":"undefined"==typeof BigInt?a:BigInt,"%BigInt64Array%":"undefined"==typeof BigInt64Array?a:BigInt64Array,"%BigUint64Array%":"undefined"==typeof BigUint64Array?a:BigUint64Array,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?a:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":_,"%eval%":eval,"%EvalError%":w,"%Float32Array%":"undefined"==typeof Float32Array?a:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?a:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?a:FinalizationRegistry,"%Function%":ie,"%GeneratorFunction%":Se,"%Int8Array%":"undefined"==typeof Int8Array?a:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?a:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?a:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":pe&&de?de(de([][Symbol.iterator]())):a,"%JSON%":"object"==typeof JSON?JSON:a,"%Map%":"undefined"==typeof Map?a:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&pe&&de?de((new Map)[Symbol.iterator]()):a,"%Math%":Math,"%Number%":Number,"%Object%":u,"%Object.getOwnPropertyDescriptor%":ae,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?a:Promise,"%Proxy%":"undefined"==typeof Proxy?a:Proxy,"%RangeError%":x,"%ReferenceError%":C,"%Reflect%":"undefined"==typeof Reflect?a:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?a:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&pe&&de?de((new Set)[Symbol.iterator]()):a,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?a:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":pe&&de?de(""[Symbol.iterator]()):a,"%Symbol%":pe?Symbol:a,"%SyntaxError%":j,"%ThrowTypeError%":le,"%TypedArray%":we,"%TypeError%":L,"%Uint8Array%":"undefined"==typeof Uint8Array?a:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?a:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?a:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?a:Uint32Array,"%URIError%":B,"%WeakMap%":"undefined"==typeof WeakMap?a:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?a:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?a:WeakSet,"%Function.prototype.call%":_e,"%Function.prototype.apply%":be,"%Object.defineProperty%":ce,"%Object.getPrototypeOf%":fe,"%Math.abs%":$,"%Math.floor%":U,"%Math.max%":V,"%Math.min%":z,"%Math.pow%":Y,"%Math.round%":Z,"%Math.sign%":ee,"%Reflect.getPrototypeOf%":ye};if(de)try{null.error}catch(s){var Pe=de(de(s));xe["%Error.prototype%"]=Pe}var Te=function doEval(s){var o;if("%AsyncFunction%"===s)o=getEvalledConstructor("async function () {}");else if("%GeneratorFunction%"===s)o=getEvalledConstructor("function* () {}");else if("%AsyncGeneratorFunction%"===s)o=getEvalledConstructor("async function* () {}");else if("%AsyncGenerator%"===s){var i=doEval("%AsyncGeneratorFunction%");i&&(o=i.prototype)}else if("%AsyncIteratorPrototype%"===s){var a=doEval("%AsyncGenerator%");a&&de&&(o=de(a.prototype))}return xe[s]=o,o},Re={__proto__:null,"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},$e=i(66743),qe=i(9957),ze=$e.call(_e,Array.prototype.concat),We=$e.call(be,Array.prototype.splice),He=$e.call(_e,String.prototype.replace),Ye=$e.call(_e,String.prototype.slice),Xe=$e.call(_e,RegExp.prototype.exec),Qe=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,et=/\\(\\)?/g,tt=function getBaseIntrinsic(s,o){var i,a=s;if(qe(Re,a)&&(a="%"+(i=Re[a])[0]+"%"),qe(xe,a)){var u=xe[a];if(u===Se&&(u=Te(a)),void 0===u&&!o)throw new L("intrinsic "+s+" exists, but is not available. Please file an issue!");return{alias:i,name:a,value:u}}throw new j("intrinsic "+s+" does not exist!")};s.exports=function GetIntrinsic(s,o){if("string"!=typeof s||0===s.length)throw new L("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof o)throw new L('"allowMissing" argument must be a boolean');if(null===Xe(/^%?[^%]*%?$/,s))throw new j("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var i=function stringToPath(s){var o=Ye(s,0,1),i=Ye(s,-1);if("%"===o&&"%"!==i)throw new j("invalid intrinsic syntax, expected closing `%`");if("%"===i&&"%"!==o)throw new j("invalid intrinsic syntax, expected opening `%`");var a=[];return He(s,Qe,(function(s,o,i,u){a[a.length]=i?He(u,et,"$1"):o||s})),a}(s),a=i.length>0?i[0]:"",u=tt("%"+a+"%",o),_=u.name,w=u.value,x=!1,C=u.alias;C&&(a=C[0],We(i,ze([0,1],C)));for(var B=1,$=!0;B=i.length){var Y=ae(w,U);w=($=!!Y)&&"get"in Y&&!("originalValue"in Y.get)?Y.get:w[U]}else $=qe(w,U),w=w[U];$&&!x&&(xe[_]=w)}}return w}},70470:(s,o,i)=>{"use strict";var a=i(46028),u=i(25594);s.exports=function(s){var o=a(s,"string");return u(o)?o:o+""}},70695:(s,o,i)=>{var a=i(78096),u=i(72428),_=i(56449),w=i(3656),x=i(30361),C=i(37167),j=Object.prototype.hasOwnProperty;s.exports=function arrayLikeKeys(s,o){var i=_(s),L=!i&&u(s),B=!i&&!L&&w(s),$=!i&&!L&&!B&&C(s),U=i||L||B||$,V=U?a(s.length,String):[],z=V.length;for(var Y in s)!o&&!j.call(s,Y)||U&&("length"==Y||B&&("offset"==Y||"parent"==Y)||$&&("buffer"==Y||"byteLength"==Y||"byteOffset"==Y)||x(Y,z))||V.push(Y);return V}},70981:(s,o,i)=>{var a=i(75251),u=i(62060),_=i(32865),w=i(75948);s.exports=function setWrapToString(s,o,i){var x=o+"";return _(s,u(x,w(a(x),i)))}},71064:(s,o,i)=>{"use strict";var a=i(79612);s.exports=a.getPrototypeOf||null},71167:(s,o,i)=>{const a=i(10316);s.exports=class StringElement extends a{constructor(s,o,i){super(s,o,i),this.element="string"}primitive(){return"string"}get length(){return this.content.length}}},71340:(s,o,i)=>{"use strict";var a=i(11091),u=i(29538);a({target:"Object",stat:!0,arity:2,forced:Object.assign!==u},{assign:u})},71514:s=>{"use strict";s.exports=Math.abs},71961:(s,o,i)=>{var a=i(49653);s.exports=function cloneTypedArray(s,o){var i=o?a(s.buffer):s.buffer;return new s.constructor(i,s.byteOffset,s.length)}},72428:(s,o,i)=>{var a=i(27534),u=i(40346),_=Object.prototype,w=_.hasOwnProperty,x=_.propertyIsEnumerable,C=a(function(){return arguments}())?a:function(s){return u(s)&&w.call(s,"callee")&&!x.call(s,"callee")};s.exports=C},72552:(s,o,i)=>{var a=i(51873),u=i(659),_=i(59350),w=a?a.toStringTag:void 0;s.exports=function baseGetTag(s){return null==s?void 0===s?"[object Undefined]":"[object Null]":w&&w in Object(s)?u(s):_(s)}},72903:(s,o,i)=>{var a=i(23805),u=i(55527),_=i(90181),w=Object.prototype.hasOwnProperty;s.exports=function baseKeysIn(s){if(!a(s))return _(s);var o=u(s),i=[];for(var x in s)("constructor"!=x||!o&&w.call(s,x))&&i.push(x);return i}},72949:(s,o,i)=>{var a=i(12651);s.exports=function mapCacheSet(s,o){var i=a(this,s),u=i.size;return i.set(s,o),this.size+=i.size==u?0:1,this}},73093:(s,o,i)=>{"use strict";var a=i(94459);s.exports=function sign(s){return a(s)||0===s?s:s<0?-1:1}},73126:(s,o,i)=>{"use strict";var a=i(66743),u=i(69675),_=i(10076),w=i(13144);s.exports=function callBindBasic(s){if(s.length<1||"function"!=typeof s[0])throw new u("a function is required");return w(a,_,s)}},73170:(s,o,i)=>{var a=i(16547),u=i(31769),_=i(30361),w=i(23805),x=i(77797);s.exports=function baseSet(s,o,i,C){if(!w(s))return s;for(var j=-1,L=(o=u(o,s)).length,B=L-1,$=s;null!=$&&++j{var o=/\w*$/;s.exports=function cloneRegExp(s){var i=new s.constructor(s.source,o.exec(s));return i.lastIndex=s.lastIndex,i}},73402:s=>{function concat(...s){return s.map((s=>function source(s){return s?"string"==typeof s?s:s.source:null}(s))).join("")}s.exports=function http(s){const o="HTTP/(2|1\\.[01])",i={className:"attribute",begin:concat("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]}},a=[i,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+o+" \\d{3})",end:/$/,contains:[{className:"meta",begin:o},{className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:a}},{begin:"(?=^[A-Z]+ (.*?) "+o+"$)",end:/$/,contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:o},{className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:a}},s.inherit(i,{relevance:0})]}}},73424:(s,o,i)=>{var a=i(16962),u=i(2874),_=Array.prototype.push;function baseAry(s,o){return 2==o?function(o,i){return s(o,i)}:function(o){return s(o)}}function cloneArray(s){for(var o=s?s.length:0,i=Array(o);o--;)i[o]=s[o];return i}function wrapImmutable(s,o){return function(){var i=arguments.length;if(i){for(var a=Array(i);i--;)a[i]=arguments[i];var u=a[0]=o.apply(void 0,a);return s.apply(void 0,a),u}}}s.exports=function baseConvert(s,o,i,w){var x="function"==typeof o,C=o===Object(o);if(C&&(w=i,i=o,o=void 0),null==i)throw new TypeError;w||(w={});var j=!("cap"in w)||w.cap,L=!("curry"in w)||w.curry,B=!("fixed"in w)||w.fixed,$=!("immutable"in w)||w.immutable,U=!("rearg"in w)||w.rearg,V=x?i:u,z="curry"in w&&w.curry,Y="fixed"in w&&w.fixed,Z="rearg"in w&&w.rearg,ee=x?i.runInContext():void 0,ie=x?i:{ary:s.ary,assign:s.assign,clone:s.clone,curry:s.curry,forEach:s.forEach,isArray:s.isArray,isError:s.isError,isFunction:s.isFunction,isWeakMap:s.isWeakMap,iteratee:s.iteratee,keys:s.keys,rearg:s.rearg,toInteger:s.toInteger,toPath:s.toPath},ae=ie.ary,ce=ie.assign,le=ie.clone,pe=ie.curry,de=ie.forEach,fe=ie.isArray,ye=ie.isError,be=ie.isFunction,_e=ie.isWeakMap,Se=ie.keys,we=ie.rearg,xe=ie.toInteger,Pe=ie.toPath,Te=Se(a.aryMethod),Re={castArray:function(s){return function(){var o=arguments[0];return fe(o)?s(cloneArray(o)):s.apply(void 0,arguments)}},iteratee:function(s){return function(){var o=arguments[1],i=s(arguments[0],o),a=i.length;return j&&"number"==typeof o?(o=o>2?o-2:1,a&&a<=o?i:baseAry(i,o)):i}},mixin:function(s){return function(o){var i=this;if(!be(i))return s(i,Object(o));var a=[];return de(Se(o),(function(s){be(o[s])&&a.push([s,i.prototype[s]])})),s(i,Object(o)),de(a,(function(s){var o=s[1];be(o)?i.prototype[s[0]]=o:delete i.prototype[s[0]]})),i}},nthArg:function(s){return function(o){var i=o<0?1:xe(o)+1;return pe(s(o),i)}},rearg:function(s){return function(o,i){var a=i?i.length:0;return pe(s(o,i),a)}},runInContext:function(o){return function(i){return baseConvert(s,o(i),w)}}};function castCap(s,o){if(j){var i=a.iterateeRearg[s];if(i)return function iterateeRearg(s,o){return overArg(s,(function(s){var i=o.length;return function baseArity(s,o){return 2==o?function(o,i){return s.apply(void 0,arguments)}:function(o){return s.apply(void 0,arguments)}}(we(baseAry(s,i),o),i)}))}(o,i);var u=!x&&a.iterateeAry[s];if(u)return function iterateeAry(s,o){return overArg(s,(function(s){return"function"==typeof s?baseAry(s,o):s}))}(o,u)}return o}function castFixed(s,o,i){if(B&&(Y||!a.skipFixed[s])){var u=a.methodSpread[s],w=u&&u.start;return void 0===w?ae(o,i):function flatSpread(s,o){return function(){for(var i=arguments.length,a=i-1,u=Array(i);i--;)u[i]=arguments[i];var w=u[o],x=u.slice(0,o);return w&&_.apply(x,w),o!=a&&_.apply(x,u.slice(o+1)),s.apply(this,x)}}(o,w)}return o}function castRearg(s,o,i){return U&&i>1&&(Z||!a.skipRearg[s])?we(o,a.methodRearg[s]||a.aryRearg[i]):o}function cloneByPath(s,o){for(var i=-1,a=(o=Pe(o)).length,u=a-1,_=le(Object(s)),w=_;null!=w&&++i1?pe(o,i):o}(0,u=castCap(_,u),s),!1}})),!u})),u||(u=w),u==o&&(u=z?pe(u,1):function(){return o.apply(this,arguments)}),u.convert=createConverter(_,o),u.placeholder=o.placeholder=i,u}if(!C)return wrap(o,i,V);var $e=i,qe=[];return de(Te,(function(s){de(a.aryMethod[s],(function(s){var o=$e[a.remap[s]||s];o&&qe.push([s,wrap(s,o,$e)])}))})),de(Se($e),(function(s){var o=$e[s];if("function"==typeof o){for(var i=qe.length;i--;)if(qe[i][0]==s)return;o.convert=createConverter(s,o),qe.push([s,o])}})),de(qe,(function(s){$e[s[0]]=s[1]})),$e.convert=function convertLib(s){return $e.runInContext.convert(s)(void 0)},$e.placeholder=$e,de(Se($e),(function(s){de(a.realToAlias[s]||[],(function(o){$e[o]=$e[s]}))})),$e}},73448:(s,o,i)=>{"use strict";var a=i(73948),u=i(29367),_=i(87136),w=i(93742),x=i(76264)("iterator");s.exports=function(s){if(!_(s))return u(s,x)||u(s,"@@iterator")||w[a(s)]}},73648:(s,o,i)=>{"use strict";var a=i(39447),u=i(98828),_=i(49552);s.exports=!a&&!u((function(){return 7!==Object.defineProperty(_("div"),"a",{get:function(){return 7}}).a}))},73948:(s,o,i)=>{"use strict";var a=i(52623),u=i(62250),_=i(45807),w=i(76264)("toStringTag"),x=Object,C="Arguments"===_(function(){return arguments}());s.exports=a?_:function(s){var o,i,a;return void 0===s?"Undefined":null===s?"Null":"string"==typeof(i=function(s,o){try{return s[o]}catch(s){}}(o=x(s),w))?i:C?_(o):"Object"===(a=_(o))&&u(o.callee)?"Arguments":a}},73992:(s,o)=>{"use strict";var i=Object.prototype.hasOwnProperty;function decode(s){try{return decodeURIComponent(s.replace(/\+/g," "))}catch(s){return null}}function encode(s){try{return encodeURIComponent(s)}catch(s){return null}}o.stringify=function querystringify(s,o){o=o||"";var a,u,_=[];for(u in"string"!=typeof o&&(o="?"),s)if(i.call(s,u)){if((a=s[u])||null!=a&&!isNaN(a)||(a=""),u=encode(u),a=encode(a),null===u||null===a)continue;_.push(u+"="+a)}return _.length?o+_.join("&"):""},o.parse=function querystring(s){for(var o,i=/([^=?#&]+)=?([^&]*)/g,a={};o=i.exec(s);){var u=decode(o[1]),_=decode(o[2]);null===u||null===_||u in a||(a[u]=_)}return a}},74218:s=>{s.exports=function isKeyable(s){var o=typeof s;return"string"==o||"number"==o||"symbol"==o||"boolean"==o?"__proto__"!==s:null===s}},74239:(s,o,i)=>{"use strict";var a=i(87136),u=TypeError;s.exports=function(s){if(a(s))throw new u("Can't call method on "+s);return s}},74284:(s,o,i)=>{"use strict";var a=i(39447),u=i(73648),_=i(58661),w=i(36624),x=i(70470),C=TypeError,j=Object.defineProperty,L=Object.getOwnPropertyDescriptor,B="enumerable",$="configurable",U="writable";o.f=a?_?function defineProperty(s,o,i){if(w(s),o=x(o),w(i),"function"==typeof s&&"prototype"===o&&"value"in i&&U in i&&!i[U]){var a=L(s,o);a&&a[U]&&(s[o]=i.value,i={configurable:$ in i?i[$]:a[$],enumerable:B in i?i[B]:a[B],writable:!1})}return j(s,o,i)}:j:function defineProperty(s,o,i){if(w(s),o=x(o),w(i),u)try{return j(s,o,i)}catch(s){}if("get"in i||"set"in i)throw new C("Accessors not supported");return"value"in i&&(s[o]=i.value),s}},74335:s=>{s.exports=function overArg(s,o){return function(i){return s(o(i))}}},74372:(s,o,i)=>{"use strict";var a=i(69675),u=i(36556)("TypedArray.prototype.buffer",!0),_=i(35680);s.exports=u||function typedArrayBuffer(s){if(!_(s))throw new a("Not a Typed Array");return s.buffer}},74436:(s,o,i)=>{"use strict";var a=i(4993),u=i(34849),_=i(20575),createMethod=function(s){return function(o,i,w){var x=a(o),C=_(x);if(0===C)return!s&&-1;var j,L=u(w,C);if(s&&i!=i){for(;C>L;)if((j=x[L++])!=j)return!0}else for(;C>L;L++)if((s||L in x)&&x[L]===i)return s||L||0;return!s&&-1}};s.exports={includes:createMethod(!0),indexOf:createMethod(!1)}},74610:(s,o,i)=>{"use strict";s.exports=Transform;var a=i(86048).F,u=a.ERR_METHOD_NOT_IMPLEMENTED,_=a.ERR_MULTIPLE_CALLBACK,w=a.ERR_TRANSFORM_ALREADY_TRANSFORMING,x=a.ERR_TRANSFORM_WITH_LENGTH_0,C=i(25382);function afterTransform(s,o){var i=this._transformState;i.transforming=!1;var a=i.writecb;if(null===a)return this.emit("error",new _);i.writechunk=null,i.writecb=null,null!=o&&this.push(o),a(s);var u=this._readableState;u.reading=!1,(u.needReadable||u.length{var a=i(21791),u=i(95950);s.exports=function baseAssign(s,o){return s&&a(o,u(o),s)}},75147:(s,o,i)=>{const a=i(85105);s.exports=class JSON06Serialiser extends a{serialise(s){if(!(s instanceof this.namespace.elements.Element))throw new TypeError(`Given element \`${s}\` is not an Element instance`);let o;s._attributes&&s.attributes.get("variable")&&(o=s.attributes.get("variable"));const i={element:s.element};s._meta&&s._meta.length>0&&(i.meta=this.serialiseObject(s.meta));const a="enum"===s.element||-1!==s.attributes.keys().indexOf("enumerations");if(a){const o=this.enumSerialiseAttributes(s);o&&(i.attributes=o)}else if(s._attributes&&s._attributes.length>0){let{attributes:a}=s;a.get("metadata")&&(a=a.clone(),a.set("meta",a.get("metadata")),a.remove("metadata")),"member"===s.element&&o&&(a=a.clone(),a.remove("variable")),a.length>0&&(i.attributes=this.serialiseObject(a))}if(a)i.content=this.enumSerialiseContent(s,i);else if(this[`${s.element}SerialiseContent`])i.content=this[`${s.element}SerialiseContent`](s,i);else if(void 0!==s.content){let a;o&&s.content.key?(a=s.content.clone(),a.key.attributes.set("variable",o),a=this.serialiseContent(a)):a=this.serialiseContent(s.content),this.shouldSerialiseContent(s,a)&&(i.content=a)}else this.shouldSerialiseContent(s,s.content)&&s instanceof this.namespace.elements.Array&&(i.content=[]);return i}shouldSerialiseContent(s,o){return"parseResult"===s.element||"httpRequest"===s.element||"httpResponse"===s.element||"category"===s.element||"link"===s.element||void 0!==o&&(!Array.isArray(o)||0!==o.length)}refSerialiseContent(s,o){return delete o.attributes,{href:s.toValue(),path:s.path.toValue()}}sourceMapSerialiseContent(s){return s.toValue()}dataStructureSerialiseContent(s){return[this.serialiseContent(s.content)]}enumSerialiseAttributes(s){const o=s.attributes.clone(),i=o.remove("enumerations")||new this.namespace.elements.Array([]),a=o.get("default");let u=o.get("samples")||new this.namespace.elements.Array([]);if(a&&a.content&&(a.content.attributes&&a.content.attributes.remove("typeAttributes"),o.set("default",new this.namespace.elements.Array([a.content]))),u.forEach((s=>{s.content&&s.content.element&&s.content.attributes.remove("typeAttributes")})),s.content&&0!==i.length&&u.unshift(s.content),u=u.map((s=>s instanceof this.namespace.elements.Array?[s]:new this.namespace.elements.Array([s.content]))),u.length&&o.set("samples",u),o.length>0)return this.serialiseObject(o)}enumSerialiseContent(s){if(s._attributes){const o=s.attributes.get("enumerations");if(o&&o.length>0)return o.content.map((s=>{const o=s.clone();return o.attributes.remove("typeAttributes"),this.serialise(o)}))}if(s.content){const o=s.content.clone();return o.attributes.remove("typeAttributes"),[this.serialise(o)]}return[]}deserialise(s){if("string"==typeof s)return new this.namespace.elements.String(s);if("number"==typeof s)return new this.namespace.elements.Number(s);if("boolean"==typeof s)return new this.namespace.elements.Boolean(s);if(null===s)return new this.namespace.elements.Null;if(Array.isArray(s))return new this.namespace.elements.Array(s.map(this.deserialise,this));const o=this.namespace.getElementClass(s.element),i=new o;i.element!==s.element&&(i.element=s.element),s.meta&&this.deserialiseObject(s.meta,i.meta),s.attributes&&this.deserialiseObject(s.attributes,i.attributes);const a=this.deserialiseContent(s.content);if(void 0===a&&null!==i.content||(i.content=a),"enum"===i.element){i.content&&i.attributes.set("enumerations",i.content);let s=i.attributes.get("samples");if(i.attributes.remove("samples"),s){const a=s;s=new this.namespace.elements.Array,a.forEach((a=>{a.forEach((a=>{const u=new o(a);u.element=i.element,s.push(u)}))}));const u=s.shift();i.content=u?u.content:void 0,i.attributes.set("samples",s)}else i.content=void 0;let a=i.attributes.get("default");if(a&&a.length>0){a=a.get(0);const s=new o(a);s.element=i.element,i.attributes.set("default",s)}}else if("dataStructure"===i.element&&Array.isArray(i.content))[i.content]=i.content;else if("category"===i.element){const s=i.attributes.get("meta");s&&(i.attributes.set("metadata",s),i.attributes.remove("meta"))}else"member"===i.element&&i.key&&i.key._attributes&&i.key._attributes.getValue("variable")&&(i.attributes.set("variable",i.key.attributes.get("variable")),i.key.attributes.remove("variable"));return i}serialiseContent(s){if(s instanceof this.namespace.elements.Element)return this.serialise(s);if(s instanceof this.namespace.KeyValuePair){const o={key:this.serialise(s.key)};return s.value&&(o.value=this.serialise(s.value)),o}return s&&s.map?s.map(this.serialise,this):s}deserialiseContent(s){if(s){if(s.element)return this.deserialise(s);if(s.key){const o=new this.namespace.KeyValuePair(this.deserialise(s.key));return s.value&&(o.value=this.deserialise(s.value)),o}if(s.map)return s.map(this.deserialise,this)}return s}shouldRefract(s){return!!(s._attributes&&s.attributes.keys().length||s._meta&&s.meta.keys().length)||"enum"!==s.element&&(s.element!==s.primitive()||"member"===s.element)}convertKeyToRefract(s,o){return this.shouldRefract(o)?this.serialise(o):"enum"===o.element?this.serialiseEnum(o):"array"===o.element?o.map((o=>this.shouldRefract(o)||"default"===s?this.serialise(o):"array"===o.element||"object"===o.element||"enum"===o.element?o.children.map((s=>this.serialise(s))):o.toValue())):"object"===o.element?(o.content||[]).map(this.serialise,this):o.toValue()}serialiseEnum(s){return s.children.map((s=>this.serialise(s)))}serialiseObject(s){const o={};return s.forEach(((s,i)=>{if(s){const a=i.toValue();o[a]=this.convertKeyToRefract(a,s)}})),o}deserialiseObject(s,o){Object.keys(s).forEach((i=>{o.set(i,this.deserialise(s[i]))}))}}},75208:s=>{"use strict";var o,i="";s.exports=function repeat(s,a){if("string"!=typeof s)throw new TypeError("expected a string");if(1===a)return s;if(2===a)return s+s;var u=s.length*a;if(o!==s||void 0===o)o=s,i="";else if(i.length>=u)return i.substr(0,u);for(;u>i.length&&a>1;)1&a&&(i+=s),a>>=1,s+=s;return i=(i+=s).substr(0,u)}},75251:s=>{var o=/\{\n\/\* \[wrapped with (.+)\] \*/,i=/,? & /;s.exports=function getWrapDetails(s){var a=s.match(o);return a?a[1].split(i):[]}},75288:s=>{s.exports=function eq(s,o){return s===o||s!=s&&o!=o}},75795:(s,o,i)=>{"use strict";var a=i(6549);if(a)try{a([],"length")}catch(s){a=null}s.exports=a},75817:s=>{"use strict";s.exports=function(s,o){return{enumerable:!(1&s),configurable:!(2&s),writable:!(4&s),value:o}}},75880:s=>{"use strict";s.exports=Math.pow},75896:(s,o,i)=>{"use strict";var a=i(65606);function emitErrorAndCloseNT(s,o){emitErrorNT(s,o),emitCloseNT(s)}function emitCloseNT(s){s._writableState&&!s._writableState.emitClose||s._readableState&&!s._readableState.emitClose||s.emit("close")}function emitErrorNT(s,o){s.emit("error",o)}s.exports={destroy:function destroy(s,o){var i=this,u=this._readableState&&this._readableState.destroyed,_=this._writableState&&this._writableState.destroyed;return u||_?(o?o(s):s&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,a.nextTick(emitErrorNT,this,s)):a.nextTick(emitErrorNT,this,s)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(s||null,(function(s){!o&&s?i._writableState?i._writableState.errorEmitted?a.nextTick(emitCloseNT,i):(i._writableState.errorEmitted=!0,a.nextTick(emitErrorAndCloseNT,i,s)):a.nextTick(emitErrorAndCloseNT,i,s):o?(a.nextTick(emitCloseNT,i),o(s)):a.nextTick(emitCloseNT,i)})),this)},undestroy:function undestroy(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)},errorOrDestroy:function errorOrDestroy(s,o){var i=s._readableState,a=s._writableState;i&&i.autoDestroy||a&&a.autoDestroy?s.destroy(o):s.emit("error",o)}}},75948:(s,o,i)=>{var a=i(83729),u=i(15325),_=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]];s.exports=function updateWrapDetails(s,o){return a(_,(function(i){var a="_."+i[0];o&i[1]&&!u(s,a)&&s.push(a)})),s.sort()}},76024:(s,o,i)=>{"use strict";var a=i(41505),u=Function.prototype,_=u.apply,w=u.call;s.exports="object"==typeof Reflect&&Reflect.apply||(a?w.bind(_):function(){return w.apply(_,arguments)})},76169:(s,o,i)=>{var a=i(49653);s.exports=function cloneDataView(s,o){var i=o?a(s.buffer):s.buffer;return new s.constructor(i,s.byteOffset,s.byteLength)}},76189:s=>{var o=Object.prototype.hasOwnProperty;s.exports=function initCloneArray(s){var i=s.length,a=new s.constructor(i);return i&&"string"==typeof s[0]&&o.call(s,"index")&&(a.index=s.index,a.input=s.input),a}},76264:(s,o,i)=>{"use strict";var a=i(45951),u=i(85816),_=i(49724),w=i(6499),x=i(19846),C=i(51175),j=a.Symbol,L=u("wks"),B=C?j.for||j:j&&j.withoutSetter||w;s.exports=function(s){return _(L,s)||(L[s]=x&&_(j,s)?j[s]:B("Symbol."+s)),L[s]}},76545:(s,o,i)=>{var a=i(56110)(i(9325),"Set");s.exports=a},76578:s=>{"use strict";s.exports=["Float16Array","Float32Array","Float64Array","Int8Array","Int16Array","Int32Array","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array"]},76959:s=>{s.exports=function strictIndexOf(s,o,i){for(var a=i-1,u=s.length;++a{var a=i(91033),u=i(82819),_=i(37471),w=i(18073),x=i(11287),C=i(36306),j=i(9325);s.exports=function createCurry(s,o,i){var L=u(s);return function wrapper(){for(var u=arguments.length,B=Array(u),$=u,U=x(wrapper);$--;)B[$]=arguments[$];var V=u<3&&B[0]!==U&&B[u-1]!==U?[]:C(B,U);return(u-=V.length){var a=i(49653),u=i(76169),_=i(73201),w=i(93736),x=i(71961);s.exports=function initCloneByTag(s,o,i){var C=s.constructor;switch(o){case"[object ArrayBuffer]":return a(s);case"[object Boolean]":case"[object Date]":return new C(+s);case"[object DataView]":return u(s,i);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return x(s,i);case"[object Map]":case"[object Set]":return new C;case"[object Number]":case"[object String]":return new C(s);case"[object RegExp]":return _(s);case"[object Symbol]":return w(s)}}},77556:(s,o,i)=>{var a=i(51873),u=i(34932),_=i(56449),w=i(44394),x=a?a.prototype:void 0,C=x?x.toString:void 0;s.exports=function baseToString(s){if("string"==typeof s)return s;if(_(s))return u(s,baseToString)+"";if(w(s))return C?C.call(s):"";var o=s+"";return"0"==o&&1/s==-1/0?"-0":o}},77731:(s,o,i)=>{var a=i(79920)("set",i(63560));a.placeholder=i(2874),s.exports=a},77797:(s,o,i)=>{var a=i(44394);s.exports=function toKey(s){if("string"==typeof s||a(s))return s;var o=s+"";return"0"==o&&1/s==-1/0?"-0":o}},78004:s=>{"use strict";class SubRange{constructor(s,o){this.low=s,this.high=o,this.length=1+o-s}overlaps(s){return!(this.highs.high)}touches(s){return!(this.high+1s.high)}add(s){return new SubRange(Math.min(this.low,s.low),Math.max(this.high,s.high))}subtract(s){return s.low<=this.low&&s.high>=this.high?[]:s.low>this.low&&s.highs+o.length),0)}add(s,o){var _add=s=>{for(var o=0;o{for(var o=0;o{for(var o=0;o{for(var i=o.low;i<=o.high;)s.push(i),i++;return s}),[])}subranges(){return this.ranges.map((s=>({low:s.low,high:s.high,length:1+s.high-s.low})))}}s.exports=DRange},78096:s=>{s.exports=function baseTimes(s,o){for(var i=-1,a=Array(s);++i{"use strict";i(85160)},79192:(s,o,i)=>{"use strict";var a=i(51871),u=i(46285),_=i(74239),w=i(10043);s.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var s,o=!1,i={};try{(s=a(Object.prototype,"__proto__","set"))(i,[]),o=i instanceof Array}catch(s){}return function setPrototypeOf(i,a){return _(i),w(a),u(i)?(o?s(i,a):i.__proto__=a,i):i}}():void 0)},79290:s=>{"use strict";s.exports=RangeError},79307:(s,o,i)=>{"use strict";var a=i(11091),u=i(44673);a({target:"Function",proto:!0,forced:Function.bind!==u},{bind:u})},79538:s=>{"use strict";s.exports=ReferenceError},79612:s=>{"use strict";s.exports=Object},79770:s=>{s.exports=function arrayFilter(s,o){for(var i=-1,a=null==s?0:s.length,u=0,_=[];++i{},79920:(s,o,i)=>{var a=i(73424),u=i(47934);s.exports=function convert(s,o,i){return a(u,s,o,i)}},80079:(s,o,i)=>{var a=i(63702),u=i(70080),_=i(24739),w=i(48655),x=i(31175);function ListCache(s){var o=-1,i=null==s?0:s.length;for(this.clear();++o{var a=i(13222);s.exports=function toLower(s){return a(s).toLowerCase()}},80257:(s,o,i)=>{var a=i(30980),u=i(56017),_=i(23007);s.exports=function wrapperClone(s){if(s instanceof a)return s.clone();var o=new u(s.__wrapped__,s.__chain__);return o.__actions__=_(s.__actions__),o.__index__=s.__index__,o.__values__=s.__values__,o}},80345:(s,o,i)=>{"use strict";function ownKeys(s,o){var i=Object.keys(s);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(s);o&&(a=a.filter((function(o){return Object.getOwnPropertyDescriptor(s,o).enumerable}))),i.push.apply(i,a)}return i}function _objectSpread(s){for(var o=1;o0?this.tail.next=o:this.head=o,this.tail=o,++this.length}},{key:"unshift",value:function unshift(s){var o={data:s,next:this.head};0===this.length&&(this.tail=o),this.head=o,++this.length}},{key:"shift",value:function shift(){if(0!==this.length){var s=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,s}}},{key:"clear",value:function clear(){this.head=this.tail=null,this.length=0}},{key:"join",value:function join(s){if(0===this.length)return"";for(var o=this.head,i=""+o.data;o=o.next;)i+=s+o.data;return i}},{key:"concat",value:function concat(s){if(0===this.length)return a.alloc(0);for(var o,i,u,_=a.allocUnsafe(s>>>0),w=this.head,x=0;w;)o=w.data,i=_,u=x,a.prototype.copy.call(o,i,u),x+=w.data.length,w=w.next;return _}},{key:"consume",value:function consume(s,o){var i;return su.length?u.length:s;if(_===u.length?a+=u:a+=u.slice(0,s),0===(s-=_)){_===u.length?(++i,o.next?this.head=o.next:this.head=this.tail=null):(this.head=o,o.data=u.slice(_));break}++i}return this.length-=i,a}},{key:"_getBuffer",value:function _getBuffer(s){var o=a.allocUnsafe(s),i=this.head,u=1;for(i.data.copy(o),s-=i.data.length;i=i.next;){var _=i.data,w=s>_.length?_.length:s;if(_.copy(o,o.length-s,0,w),0===(s-=w)){w===_.length?(++u,i.next?this.head=i.next:this.head=this.tail=null):(this.head=i,i.data=_.slice(w));break}++u}return this.length-=u,o}},{key:_,value:function value(s,o){return u(this,_objectSpread(_objectSpread({},o),{},{depth:0,customInspect:!1}))}}]),BufferList}()},80376:s=>{"use strict";s.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},80631:(s,o,i)=>{var a=i(28077),u=i(49326);s.exports=function hasIn(s,o){return null!=s&&u(s,o,a)}},80909:(s,o,i)=>{var a=i(30641),u=i(38329)(a);s.exports=u},80945:(s,o,i)=>{var a=i(80079),u=i(68223),_=i(53661);s.exports=function stackSet(s,o){var i=this.__data__;if(i instanceof a){var w=i.__data__;if(!u||w.length<199)return w.push([s,o]),this.size=++i.size,this;i=this.__data__=new _(w)}return i.set(s,o),this.size=i.size,this}},81042:(s,o,i)=>{var a=i(56110)(Object,"create");s.exports=a},81214:(s,o,i)=>{"use strict";function _typeof(s){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(s){return typeof s}:function(s){return s&&"function"==typeof Symbol&&s.constructor===Symbol&&s!==Symbol.prototype?"symbol":typeof s},_typeof(s)}Object.defineProperty(o,"__esModule",{value:!0}),o.DebounceInput=void 0;var a=_interopRequireDefault(i(96540)),u=_interopRequireDefault(i(20181)),_=["element","onChange","value","minLength","debounceTimeout","forceNotifyByEnter","forceNotifyOnBlur","onKeyDown","onBlur","inputRef"];function _interopRequireDefault(s){return s&&s.__esModule?s:{default:s}}function _objectWithoutProperties(s,o){if(null==s)return{};var i,a,u=function _objectWithoutPropertiesLoose(s,o){if(null==s)return{};var i,a,u={},_=Object.keys(s);for(a=0;a<_.length;a++)i=_[a],o.indexOf(i)>=0||(u[i]=s[i]);return u}(s,o);if(Object.getOwnPropertySymbols){var _=Object.getOwnPropertySymbols(s);for(a=0;a<_.length;a++)i=_[a],o.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(s,i)&&(u[i]=s[i])}return u}function ownKeys(s,o){var i=Object.keys(s);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(s);o&&(a=a.filter((function(o){return Object.getOwnPropertyDescriptor(s,o).enumerable}))),i.push.apply(i,a)}return i}function _objectSpread(s){for(var o=1;o=a?i.notify(s):o.length>u.length&&i.notify(_objectSpread(_objectSpread({},s),{},{target:_objectSpread(_objectSpread({},s.target),{},{value:""})}))}))})),_defineProperty(_assertThisInitialized(i),"onKeyDown",(function(s){"Enter"===s.key&&i.forceNotify(s);var o=i.props.onKeyDown;o&&(s.persist(),o(s))})),_defineProperty(_assertThisInitialized(i),"onBlur",(function(s){i.forceNotify(s);var o=i.props.onBlur;o&&(s.persist(),o(s))})),_defineProperty(_assertThisInitialized(i),"createNotifier",(function(s){if(s<0)i.notify=function(){return null};else if(0===s)i.notify=i.doNotify;else{var o=(0,u.default)((function(s){i.isDebouncing=!1,i.doNotify(s)}),s);i.notify=function(s){i.isDebouncing=!0,o(s)},i.flush=function(){return o.flush()},i.cancel=function(){i.isDebouncing=!1,o.cancel()}}})),_defineProperty(_assertThisInitialized(i),"doNotify",(function(){i.props.onChange.apply(void 0,arguments)})),_defineProperty(_assertThisInitialized(i),"forceNotify",(function(s){var o=i.props.debounceTimeout;if(i.isDebouncing||!(o>0)){i.cancel&&i.cancel();var a=i.state.value,u=i.props.minLength;a.length>=u?i.doNotify(s):i.doNotify(_objectSpread(_objectSpread({},s),{},{target:_objectSpread(_objectSpread({},s.target),{},{value:a})}))}})),i.isDebouncing=!1,i.state={value:void 0===s.value||null===s.value?"":s.value};var a=i.props.debounceTimeout;return i.createNotifier(a),i}return function _createClass(s,o,i){return o&&_defineProperties(s.prototype,o),i&&_defineProperties(s,i),Object.defineProperty(s,"prototype",{writable:!1}),s}(DebounceInput,[{key:"componentDidUpdate",value:function componentDidUpdate(s){if(!this.isDebouncing){var o=this.props,i=o.value,a=o.debounceTimeout,u=s.debounceTimeout,_=s.value,w=this.state.value;void 0!==i&&_!==i&&w!==i&&this.setState({value:i}),a!==u&&this.createNotifier(a)}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.flush&&this.flush()}},{key:"render",value:function render(){var s,o,i=this.props,u=i.element,w=(i.onChange,i.value,i.minLength,i.debounceTimeout,i.forceNotifyByEnter),x=i.forceNotifyOnBlur,C=i.onKeyDown,j=i.onBlur,L=i.inputRef,B=_objectWithoutProperties(i,_),$=this.state.value;s=w?{onKeyDown:this.onKeyDown}:C?{onKeyDown:C}:{},o=x?{onBlur:this.onBlur}:j?{onBlur:j}:{};var U=L?{ref:L}:{};return a.default.createElement(u,_objectSpread(_objectSpread(_objectSpread(_objectSpread({},B),{},{onChange:this.onChange,value:$},s),o),U))}}]),DebounceInput}(a.default.PureComponent);o.DebounceInput=w,_defineProperty(w,"defaultProps",{element:"input",type:"text",onKeyDown:void 0,onBlur:void 0,value:void 0,minLength:0,debounceTimeout:100,forceNotifyByEnter:!0,forceNotifyOnBlur:!0,inputRef:void 0})},81919:(s,o,i)=>{"use strict";var a=i(48287).Buffer;function isSpecificValue(s){return s instanceof a||s instanceof Date||s instanceof RegExp}function cloneSpecificValue(s){if(s instanceof a){var o=a.alloc?a.alloc(s.length):new a(s.length);return s.copy(o),o}if(s instanceof Date)return new Date(s.getTime());if(s instanceof RegExp)return new RegExp(s);throw new Error("Unexpected situation")}function deepCloneArray(s){var o=[];return s.forEach((function(s,i){"object"==typeof s&&null!==s?Array.isArray(s)?o[i]=deepCloneArray(s):isSpecificValue(s)?o[i]=cloneSpecificValue(s):o[i]=u({},s):o[i]=s})),o}function safeGetProperty(s,o){return"__proto__"===o?void 0:s[o]}var u=s.exports=function(){if(arguments.length<1||"object"!=typeof arguments[0])return!1;if(arguments.length<2)return arguments[0];var s,o,i=arguments[0];return Array.prototype.slice.call(arguments,1).forEach((function(a){"object"!=typeof a||null===a||Array.isArray(a)||Object.keys(a).forEach((function(_){return o=safeGetProperty(i,_),(s=safeGetProperty(a,_))===i?void 0:"object"!=typeof s||null===s?void(i[_]=s):Array.isArray(s)?void(i[_]=deepCloneArray(s)):isSpecificValue(s)?void(i[_]=cloneSpecificValue(s)):"object"!=typeof o||null===o||Array.isArray(o)?void(i[_]=u({},s)):void(i[_]=u(o,s))}))})),i}},82048:(s,o,i)=>{"use strict";var a=i(11091),u=i(88280),_=i(15972),w=i(79192),x=i(19595),C=i(58075),j=i(61626),L=i(75817),B=i(39259),$=i(85884),U=i(24823),V=i(32096),z=i(76264)("toStringTag"),Y=Error,Z=[].push,ee=function AggregateError(s,o){var i,a=u(ie,this);w?i=w(new Y,a?_(this):ie):(i=a?this:C(ie),j(i,z,"Error")),void 0!==o&&j(i,"message",V(o)),$(i,ee,i.stack,1),arguments.length>2&&B(i,arguments[2]);var x=[];return U(s,Z,{that:x}),j(i,"errors",x),i};w?w(ee,Y):x(ee,Y,{name:!0});var ie=ee.prototype=C(Y.prototype,{constructor:L(1,ee),message:L(1,""),name:L(1,"AggregateError")});a({global:!0,constructor:!0,arity:2},{AggregateError:ee})},82159:(s,o,i)=>{"use strict";var a=i(62250),u=i(4640),_=TypeError;s.exports=function(s){if(a(s))return s;throw new _(u(s)+" is not a function")}},82199:(s,o,i)=>{var a=i(14528),u=i(56449);s.exports=function baseGetAllKeys(s,o,i){var _=o(s);return u(s)?_:a(_,i(s))}},82261:(s,o,i)=>{"use strict";Object.defineProperty(o,"__esModule",{value:!0});var a=_interopRequireDefault(i(9404)),u=_interopRequireDefault(i(48590));function _interopRequireDefault(s){return s&&s.__esModule?s:{default:s}}o.default=function(s,o,i){var _=Object.keys(o);if(!_.length)return"Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.";var w=(0,u.default)(i);if(a.default.isImmutable?!a.default.isImmutable(s):!a.default.Iterable.isIterable(s))return"The "+w+' is of unexpected type. Expected argument to be an instance of Immutable.Collection or Immutable.Record with the following properties: "'+_.join('", "')+'".';var x=s.toSeq().keySeq().toArray().filter((function(s){return!o.hasOwnProperty(s)}));return x.length>0?"Unexpected "+(1===x.length?"property":"properties")+' "'+x.join('", "')+'" found in '+w+'. Expected to find one of the known reducer property names instead: "'+_.join('", "')+'". Unexpected properties will be ignored.':null},s.exports=o.default},82682:(s,o,i)=>{"use strict";var a=i(69600),u=Object.prototype.toString,_=Object.prototype.hasOwnProperty;s.exports=function forEach(s,o,i){if(!a(o))throw new TypeError("iterator must be a function");var w;arguments.length>=3&&(w=i),function isArray(s){return"[object Array]"===u.call(s)}(s)?function forEachArray(s,o,i){for(var a=0,u=s.length;a{var a=i(39344),u=i(23805);s.exports=function createCtor(s){return function(){var o=arguments;switch(o.length){case 0:return new s;case 1:return new s(o[0]);case 2:return new s(o[0],o[1]);case 3:return new s(o[0],o[1],o[2]);case 4:return new s(o[0],o[1],o[2],o[3]);case 5:return new s(o[0],o[1],o[2],o[3],o[4]);case 6:return new s(o[0],o[1],o[2],o[3],o[4],o[5]);case 7:return new s(o[0],o[1],o[2],o[3],o[4],o[5],o[6])}var i=a(s.prototype),_=s.apply(i,o);return u(_)?_:i}}},82890:(s,o,i)=>{"use strict";var a=i(56698),u=i(90392),_=i(92861).Buffer,w=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],x=new Array(160);function Sha512(){this.init(),this._w=x,u.call(this,128,112)}function Ch(s,o,i){return i^s&(o^i)}function maj(s,o,i){return s&o|i&(s|o)}function sigma0(s,o){return(s>>>28|o<<4)^(o>>>2|s<<30)^(o>>>7|s<<25)}function sigma1(s,o){return(s>>>14|o<<18)^(s>>>18|o<<14)^(o>>>9|s<<23)}function Gamma0(s,o){return(s>>>1|o<<31)^(s>>>8|o<<24)^s>>>7}function Gamma0l(s,o){return(s>>>1|o<<31)^(s>>>8|o<<24)^(s>>>7|o<<25)}function Gamma1(s,o){return(s>>>19|o<<13)^(o>>>29|s<<3)^s>>>6}function Gamma1l(s,o){return(s>>>19|o<<13)^(o>>>29|s<<3)^(s>>>6|o<<26)}function getCarry(s,o){return s>>>0>>0?1:0}a(Sha512,u),Sha512.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this},Sha512.prototype._update=function(s){for(var o=this._w,i=0|this._ah,a=0|this._bh,u=0|this._ch,_=0|this._dh,x=0|this._eh,C=0|this._fh,j=0|this._gh,L=0|this._hh,B=0|this._al,$=0|this._bl,U=0|this._cl,V=0|this._dl,z=0|this._el,Y=0|this._fl,Z=0|this._gl,ee=0|this._hl,ie=0;ie<32;ie+=2)o[ie]=s.readInt32BE(4*ie),o[ie+1]=s.readInt32BE(4*ie+4);for(;ie<160;ie+=2){var ae=o[ie-30],ce=o[ie-30+1],le=Gamma0(ae,ce),pe=Gamma0l(ce,ae),de=Gamma1(ae=o[ie-4],ce=o[ie-4+1]),fe=Gamma1l(ce,ae),ye=o[ie-14],be=o[ie-14+1],_e=o[ie-32],Se=o[ie-32+1],we=pe+be|0,xe=le+ye+getCarry(we,pe)|0;xe=(xe=xe+de+getCarry(we=we+fe|0,fe)|0)+_e+getCarry(we=we+Se|0,Se)|0,o[ie]=xe,o[ie+1]=we}for(var Pe=0;Pe<160;Pe+=2){xe=o[Pe],we=o[Pe+1];var Te=maj(i,a,u),Re=maj(B,$,U),$e=sigma0(i,B),qe=sigma0(B,i),ze=sigma1(x,z),We=sigma1(z,x),He=w[Pe],Ye=w[Pe+1],Xe=Ch(x,C,j),Qe=Ch(z,Y,Z),et=ee+We|0,tt=L+ze+getCarry(et,ee)|0;tt=(tt=(tt=tt+Xe+getCarry(et=et+Qe|0,Qe)|0)+He+getCarry(et=et+Ye|0,Ye)|0)+xe+getCarry(et=et+we|0,we)|0;var rt=qe+Re|0,nt=$e+Te+getCarry(rt,qe)|0;L=j,ee=Z,j=C,Z=Y,C=x,Y=z,x=_+tt+getCarry(z=V+et|0,V)|0,_=u,V=U,u=a,U=$,a=i,$=B,i=tt+nt+getCarry(B=et+rt|0,et)|0}this._al=this._al+B|0,this._bl=this._bl+$|0,this._cl=this._cl+U|0,this._dl=this._dl+V|0,this._el=this._el+z|0,this._fl=this._fl+Y|0,this._gl=this._gl+Z|0,this._hl=this._hl+ee|0,this._ah=this._ah+i+getCarry(this._al,B)|0,this._bh=this._bh+a+getCarry(this._bl,$)|0,this._ch=this._ch+u+getCarry(this._cl,U)|0,this._dh=this._dh+_+getCarry(this._dl,V)|0,this._eh=this._eh+x+getCarry(this._el,z)|0,this._fh=this._fh+C+getCarry(this._fl,Y)|0,this._gh=this._gh+j+getCarry(this._gl,Z)|0,this._hh=this._hh+L+getCarry(this._hl,ee)|0},Sha512.prototype._hash=function(){var s=_.allocUnsafe(64);function writeInt64BE(o,i,a){s.writeInt32BE(o,a),s.writeInt32BE(i,a+4)}return writeInt64BE(this._ah,this._al,0),writeInt64BE(this._bh,this._bl,8),writeInt64BE(this._ch,this._cl,16),writeInt64BE(this._dh,this._dl,24),writeInt64BE(this._eh,this._el,32),writeInt64BE(this._fh,this._fl,40),writeInt64BE(this._gh,this._gl,48),writeInt64BE(this._hh,this._hl,56),s},s.exports=Sha512},83120:(s,o,i)=>{var a=i(14528),u=i(45891);s.exports=function baseFlatten(s,o,i,_,w){var x=-1,C=s.length;for(i||(i=u),w||(w=[]);++x0&&i(j)?o>1?baseFlatten(j,o-1,i,_,w):a(w,j):_||(w[w.length]=j)}return w}},83141:(s,o,i)=>{"use strict";var a=i(92861).Buffer,u=a.isEncoding||function(s){switch((s=""+s)&&s.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function StringDecoder(s){var o;switch(this.encoding=function normalizeEncoding(s){var o=function _normalizeEncoding(s){if(!s)return"utf8";for(var o;;)switch(s){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return s;default:if(o)return;s=(""+s).toLowerCase(),o=!0}}(s);if("string"!=typeof o&&(a.isEncoding===u||!u(s)))throw new Error("Unknown encoding: "+s);return o||s}(s),this.encoding){case"utf16le":this.text=utf16Text,this.end=utf16End,o=4;break;case"utf8":this.fillLast=utf8FillLast,o=4;break;case"base64":this.text=base64Text,this.end=base64End,o=3;break;default:return this.write=simpleWrite,void(this.end=simpleEnd)}this.lastNeed=0,this.lastTotal=0,this.lastChar=a.allocUnsafe(o)}function utf8CheckByte(s){return s<=127?0:s>>5==6?2:s>>4==14?3:s>>3==30?4:s>>6==2?-1:-2}function utf8FillLast(s){var o=this.lastTotal-this.lastNeed,i=function utf8CheckExtraBytes(s,o,i){if(128!=(192&o[0]))return s.lastNeed=0,"�";if(s.lastNeed>1&&o.length>1){if(128!=(192&o[1]))return s.lastNeed=1,"�";if(s.lastNeed>2&&o.length>2&&128!=(192&o[2]))return s.lastNeed=2,"�"}}(this,s);return void 0!==i?i:this.lastNeed<=s.length?(s.copy(this.lastChar,o,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(s.copy(this.lastChar,o,0,s.length),void(this.lastNeed-=s.length))}function utf16Text(s,o){if((s.length-o)%2==0){var i=s.toString("utf16le",o);if(i){var a=i.charCodeAt(i.length-1);if(a>=55296&&a<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=s[s.length-2],this.lastChar[1]=s[s.length-1],i.slice(0,-1)}return i}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=s[s.length-1],s.toString("utf16le",o,s.length-1)}function utf16End(s){var o=s&&s.length?this.write(s):"";if(this.lastNeed){var i=this.lastTotal-this.lastNeed;return o+this.lastChar.toString("utf16le",0,i)}return o}function base64Text(s,o){var i=(s.length-o)%3;return 0===i?s.toString("base64",o):(this.lastNeed=3-i,this.lastTotal=3,1===i?this.lastChar[0]=s[s.length-1]:(this.lastChar[0]=s[s.length-2],this.lastChar[1]=s[s.length-1]),s.toString("base64",o,s.length-i))}function base64End(s){var o=s&&s.length?this.write(s):"";return this.lastNeed?o+this.lastChar.toString("base64",0,3-this.lastNeed):o}function simpleWrite(s){return s.toString(this.encoding)}function simpleEnd(s){return s&&s.length?this.write(s):""}o.I=StringDecoder,StringDecoder.prototype.write=function(s){if(0===s.length)return"";var o,i;if(this.lastNeed){if(void 0===(o=this.fillLast(s)))return"";i=this.lastNeed,this.lastNeed=0}else i=0;return i=0)return u>0&&(s.lastNeed=u-1),u;if(--a=0)return u>0&&(s.lastNeed=u-2),u;if(--a=0)return u>0&&(2===u?u=0:s.lastNeed=u-3),u;return 0}(this,s,o);if(!this.lastNeed)return s.toString("utf8",o);this.lastTotal=i;var a=s.length-(i-this.lastNeed);return s.copy(this.lastChar,0,a),s.toString("utf8",o,a)},StringDecoder.prototype.fillLast=function(s){if(this.lastNeed<=s.length)return s.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);s.copy(this.lastChar,this.lastTotal-this.lastNeed,0,s.length),this.lastNeed-=s.length}},83221:s=>{s.exports=function createBaseFor(s){return function(o,i,a){for(var u=-1,_=Object(o),w=a(o),x=w.length;x--;){var C=w[s?x:++u];if(!1===i(_[C],C,_))break}return o}}},83349:(s,o,i)=>{var a=i(82199),u=i(86375),_=i(37241);s.exports=function getAllKeysIn(s){return a(s,_,u)}},83488:s=>{s.exports=function identity(s){return s}},83693:(s,o,i)=>{var a=i(64894),u=i(40346);s.exports=function isArrayLikeObject(s){return u(s)&&a(s)}},83729:s=>{s.exports=function arrayEach(s,o){for(var i=-1,a=null==s?0:s.length;++i{var a=i(14792),u=i(45539)((function(s,o,i){return o=o.toLowerCase(),s+(i?a(o):o)}));s.exports=u},84195:(s,o,i)=>{var a=i(66977),u=i(38816),_=u((function(s,o){return a(s,256,void 0,void 0,void 0,o)}));s.exports=_},84247:s=>{s.exports=function setToArray(s){var o=-1,i=Array(s.size);return s.forEach((function(s){i[++o]=s})),i}},84629:s=>{s.exports={}},84851:(s,o,i)=>{"use strict";s.exports=i(85401)},84977:(s,o,i)=>{"use strict";Object.defineProperty(o,"__esModule",{value:!0});var a=function _interopRequireDefault(s){return s&&s.__esModule?s:{default:s}}(i(9404)),u=i(55674);o.default=function(s){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:a.default.Map,i=Object.keys(s);return function(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o(),_=arguments[1];return a.withMutations((function(o){i.forEach((function(i){var a=(0,s[i])(o.get(i),_);(0,u.validateNextState)(a,i,_),o.set(i,a)}))}))}},s.exports=o.default},85015:(s,o,i)=>{var a=i(72552),u=i(56449),_=i(40346);s.exports=function isString(s){return"string"==typeof s||!u(s)&&_(s)&&"[object String]"==a(s)}},85087:(s,o,i)=>{var a=i(30980),u=i(37381),_=i(62284),w=i(53758);s.exports=function isLaziable(s){var o=_(s),i=w[o];if("function"!=typeof i||!(o in a.prototype))return!1;if(s===i)return!0;var x=u(i);return!!x&&s===x[0]}},85105:s=>{s.exports=class JSONSerialiser{constructor(s){this.namespace=s||new this.Namespace}serialise(s){if(!(s instanceof this.namespace.elements.Element))throw new TypeError(`Given element \`${s}\` is not an Element instance`);const o={element:s.element};s._meta&&s._meta.length>0&&(o.meta=this.serialiseObject(s.meta)),s._attributes&&s._attributes.length>0&&(o.attributes=this.serialiseObject(s.attributes));const i=this.serialiseContent(s.content);return void 0!==i&&(o.content=i),o}deserialise(s){if(!s.element)throw new Error("Given value is not an object containing an element name");const o=new(this.namespace.getElementClass(s.element));o.element!==s.element&&(o.element=s.element),s.meta&&this.deserialiseObject(s.meta,o.meta),s.attributes&&this.deserialiseObject(s.attributes,o.attributes);const i=this.deserialiseContent(s.content);return void 0===i&&null!==o.content||(o.content=i),o}serialiseContent(s){if(s instanceof this.namespace.elements.Element)return this.serialise(s);if(s instanceof this.namespace.KeyValuePair){const o={key:this.serialise(s.key)};return s.value&&(o.value=this.serialise(s.value)),o}if(s&&s.map){if(0===s.length)return;return s.map(this.serialise,this)}return s}deserialiseContent(s){if(s){if(s.element)return this.deserialise(s);if(s.key){const o=new this.namespace.KeyValuePair(this.deserialise(s.key));return s.value&&(o.value=this.deserialise(s.value)),o}if(s.map)return s.map(this.deserialise,this)}return s}serialiseObject(s){const o={};if(s.forEach(((s,i)=>{s&&(o[i.toValue()]=this.serialise(s))})),0!==Object.keys(o).length)return o}deserialiseObject(s,o){Object.keys(s).forEach((i=>{o.set(i,this.deserialise(s[i]))}))}}},85160:(s,o,i)=>{"use strict";var a=i(96540);var u="function"==typeof Object.is?Object.is:function is(s,o){return s===o&&(0!==s||1/s==1/o)||s!=s&&o!=o},_=a.useSyncExternalStore,w=a.useRef,x=a.useEffect,C=a.useMemo,j=a.useDebugValue},85250:(s,o,i)=>{var a=i(37217),u=i(87805),_=i(86649),w=i(42824),x=i(23805),C=i(37241),j=i(14974);s.exports=function baseMerge(s,o,i,L,B){s!==o&&_(o,(function(_,C){if(B||(B=new a),x(_))w(s,o,C,i,baseMerge,L,B);else{var $=L?L(j(s,C),_,C+"",s,o,B):void 0;void 0===$&&($=_),u(s,C,$)}}),C)}},85401:(s,o,i)=>{"use strict";var a=i(462);s.exports=a},85463:s=>{s.exports=function baseIsNaN(s){return s!=s}},85558:s=>{s.exports=function baseReduce(s,o,i,a,u){return u(s,(function(s,u,_){i=a?(a=!1,s):o(i,s,u,_)})),i}},85582:(s,o,i)=>{"use strict";var a=i(92046),u=i(45951),_=i(62250),aFunction=function(s){return _(s)?s:void 0};s.exports=function(s,o){return arguments.length<2?aFunction(a[s])||aFunction(u[s]):a[s]&&a[s][o]||u[s]&&u[s][o]}},85587:(s,o,i)=>{"use strict";var a=i(26311),u=create(Error);function create(s){return FormattedError.displayName=s.displayName||s.name,FormattedError;function FormattedError(o){return o&&(o=a.apply(null,arguments)),new s(o)}}s.exports=u,u.eval=create(EvalError),u.range=create(RangeError),u.reference=create(ReferenceError),u.syntax=create(SyntaxError),u.type=create(TypeError),u.uri=create(URIError),u.create=create},85762:(s,o,i)=>{"use strict";var a=i(1907),u=Error,_=a("".replace),w=String(new u("zxcasd").stack),x=/\n\s*at [^:]*:[^\n]*/,C=x.test(w);s.exports=function(s,o){if(C&&"string"==typeof s&&!u.prepareStackTrace)for(;o--;)s=_(s,x,"");return s}},85816:(s,o,i)=>{"use strict";var a=i(36128);s.exports=function(s,o){return a[s]||(a[s]=o||{})}},85884:(s,o,i)=>{"use strict";var a=i(61626),u=i(85762),_=i(23888),w=Error.captureStackTrace;s.exports=function(s,o,i,x){_&&(w?w(s,o):a(s,"stack",u(i,x)))}},86009:(s,o,i)=>{s=i.nmd(s);var a=i(34840),u=o&&!o.nodeType&&o,_=u&&s&&!s.nodeType&&s,w=_&&_.exports===u&&a.process,x=function(){try{var s=_&&_.require&&_.require("util").types;return s||w&&w.binding&&w.binding("util")}catch(s){}}();s.exports=x},86048:s=>{"use strict";var o={};function createErrorType(s,i,a){a||(a=Error);var u=function(s){function NodeError(o,a,u){return s.call(this,function getMessage(s,o,a){return"string"==typeof i?i:i(s,o,a)}(o,a,u))||this}return function _inheritsLoose(s,o){s.prototype=Object.create(o.prototype),s.prototype.constructor=s,s.__proto__=o}(NodeError,s),NodeError}(a);u.prototype.name=a.name,u.prototype.code=s,o[s]=u}function oneOf(s,o){if(Array.isArray(s)){var i=s.length;return s=s.map((function(s){return String(s)})),i>2?"one of ".concat(o," ").concat(s.slice(0,i-1).join(", "),", or ")+s[i-1]:2===i?"one of ".concat(o," ").concat(s[0]," or ").concat(s[1]):"of ".concat(o," ").concat(s[0])}return"of ".concat(o," ").concat(String(s))}createErrorType("ERR_INVALID_OPT_VALUE",(function(s,o){return'The value "'+o+'" is invalid for option "'+s+'"'}),TypeError),createErrorType("ERR_INVALID_ARG_TYPE",(function(s,o,i){var a,u;if("string"==typeof o&&function startsWith(s,o,i){return s.substr(!i||i<0?0:+i,o.length)===o}(o,"not ")?(a="must not be",o=o.replace(/^not /,"")):a="must be",function endsWith(s,o,i){return(void 0===i||i>s.length)&&(i=s.length),s.substring(i-o.length,i)===o}(s," argument"))u="The ".concat(s," ").concat(a," ").concat(oneOf(o,"type"));else{var _=function includes(s,o,i){return"number"!=typeof i&&(i=0),!(i+o.length>s.length)&&-1!==s.indexOf(o,i)}(s,".")?"property":"argument";u='The "'.concat(s,'" ').concat(_," ").concat(a," ").concat(oneOf(o,"type"))}return u+=". Received type ".concat(typeof i)}),TypeError),createErrorType("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF"),createErrorType("ERR_METHOD_NOT_IMPLEMENTED",(function(s){return"The "+s+" method is not implemented"})),createErrorType("ERR_STREAM_PREMATURE_CLOSE","Premature close"),createErrorType("ERR_STREAM_DESTROYED",(function(s){return"Cannot call "+s+" after a stream was destroyed"})),createErrorType("ERR_MULTIPLE_CALLBACK","Callback called multiple times"),createErrorType("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable"),createErrorType("ERR_STREAM_WRITE_AFTER_END","write after end"),createErrorType("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),createErrorType("ERR_UNKNOWN_ENCODING",(function(s){return"Unknown encoding: "+s}),TypeError),createErrorType("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event"),s.exports.F=o},86215:function(s,o){var i,a,u;a=[],i=function(){"use strict";var isNativeSmoothScrollEnabledOn=function(s){return s&&"getComputedStyle"in window&&"smooth"===window.getComputedStyle(s)["scroll-behavior"]};if("undefined"==typeof window||!("document"in window))return{};var makeScroller=function(s,o,i){var a;o=o||999,i||0===i||(i=9);var setScrollTimeoutId=function(s){a=s},stopScroll=function(){clearTimeout(a),setScrollTimeoutId(0)},getTopWithEdgeOffset=function(o){return Math.max(0,s.getTopOf(o)-i)},scrollToY=function(i,a,u){if(stopScroll(),0===a||a&&a<0||isNativeSmoothScrollEnabledOn(s.body))s.toY(i),u&&u();else{var _=s.getY(),w=Math.max(0,i)-_,x=(new Date).getTime();a=a||Math.min(Math.abs(w),o),function loopScroll(){setScrollTimeoutId(setTimeout((function(){var o=Math.min(1,((new Date).getTime()-x)/a),i=Math.max(0,Math.floor(_+w*(o<.5?2*o*o:o*(4-2*o)-1)));s.toY(i),o<1&&s.getHeight()+ix?scrollToElem(o,a,u):w+i>j?scrollToY(w-x+i,a,u):u&&u()},scrollToCenterOf=function(o,i,a,u){scrollToY(Math.max(0,s.getTopOf(o)-s.getHeight()/2+(a||o.getBoundingClientRect().height/2)),i,u)};return{setup:function(s,a){return(0===s||s)&&(o=s),(0===a||a)&&(i=a),{defaultDuration:o,edgeOffset:i}},to:scrollToElem,toY:scrollToY,intoView:scrollIntoView,center:scrollToCenterOf,stop:stopScroll,moving:function(){return!!a},getY:s.getY,getTopOf:s.getTopOf}},s=document.documentElement,getDocY=function(){return window.scrollY||s.scrollTop},o=makeScroller({body:document.scrollingElement||document.body,toY:function(s){window.scrollTo(0,s)},getY:getDocY,getHeight:function(){return window.innerHeight||s.clientHeight},getTopOf:function(o){return o.getBoundingClientRect().top+getDocY()-s.offsetTop}});if(o.createScroller=function(o,i,a){return makeScroller({body:o,toY:function(s){o.scrollTop=s},getY:function(){return o.scrollTop},getHeight:function(){return Math.min(o.clientHeight,window.innerHeight||s.clientHeight)},getTopOf:function(s){return s.offsetTop}},i,a)},"addEventListener"in window&&!window.noZensmooth&&!isNativeSmoothScrollEnabledOn(document.body)){var i="history"in window&&"pushState"in history,a=i&&"scrollRestoration"in history;a&&(history.scrollRestoration="auto"),window.addEventListener("load",(function(){a&&(setTimeout((function(){history.scrollRestoration="manual"}),9),window.addEventListener("popstate",(function(s){s.state&&"zenscrollY"in s.state&&o.toY(s.state.zenscrollY)}),!1)),window.location.hash&&setTimeout((function(){var s=o.setup().edgeOffset;if(s){var i=document.getElementById(window.location.href.split("#")[1]);if(i){var a=Math.max(0,o.getTopOf(i)-s),u=o.getY()-a;0<=u&&u<9&&window.scrollTo(0,a)}}}),9)}),!1);var u=new RegExp("(^|\\s)noZensmooth(\\s|$)");window.addEventListener("click",(function(s){for(var _=s.target;_&&"A"!==_.tagName;)_=_.parentNode;if(!(!_||1!==s.which||s.shiftKey||s.metaKey||s.ctrlKey||s.altKey)){if(a){var w=history.state&&"object"==typeof history.state?history.state:{};w.zenscrollY=o.getY();try{history.replaceState(w,"")}catch(s){}}var x=_.getAttribute("href")||"";if(0===x.indexOf("#")&&!u.test(_.className)){var C=0,j=document.getElementById(x.substring(1));if("#"!==x){if(!j)return;C=o.getTopOf(j)}s.preventDefault();var onDone=function(){window.location=x},L=o.setup().edgeOffset;L&&(C=Math.max(0,C-L),i&&(onDone=function(){history.pushState({},"",x)})),o.toY(C,null,onDone)}}}),!1)}return o}(),void 0===(u="function"==typeof i?i.apply(o,a):i)||(s.exports=u)},86238:(s,o,i)=>{"use strict";var a=i(86048).F.ERR_STREAM_PREMATURE_CLOSE;function noop(){}s.exports=function eos(s,o,i){if("function"==typeof o)return eos(s,null,o);o||(o={}),i=function once(s){var o=!1;return function(){if(!o){o=!0;for(var i=arguments.length,a=new Array(i),u=0;u{const a=i(10316);s.exports=class LinkElement extends a{constructor(s,o,i){super(s||[],o,i),this.element="link"}get relation(){return this.attributes.get("relation")}set relation(s){this.attributes.set("relation",s)}get href(){return this.attributes.get("href")}set href(s){this.attributes.set("href",s)}}},86375:(s,o,i)=>{var a=i(14528),u=i(28879),_=i(4664),w=i(63345),x=Object.getOwnPropertySymbols?function(s){for(var o=[];s;)a(o,_(s)),s=u(s);return o}:w;s.exports=x},86649:(s,o,i)=>{var a=i(83221)();s.exports=a},86804:(s,o,i)=>{const a=i(10316),u=i(41067),_=i(71167),w=i(40239),x=i(12242),C=i(6233),j=i(87726),L=i(61045),B=i(86303),$=i(14540),U=i(92340),V=i(10866),z=i(55973);function refract(s){if(s instanceof a)return s;if("string"==typeof s)return new _(s);if("number"==typeof s)return new w(s);if("boolean"==typeof s)return new x(s);if(null===s)return new u;if(Array.isArray(s))return new C(s.map(refract));if("object"==typeof s){return new L(s)}return s}a.prototype.ObjectElement=L,a.prototype.RefElement=$,a.prototype.MemberElement=j,a.prototype.refract=refract,U.prototype.refract=refract,s.exports={Element:a,NullElement:u,StringElement:_,NumberElement:w,BooleanElement:x,ArrayElement:C,MemberElement:j,ObjectElement:L,LinkElement:B,RefElement:$,refract,ArraySlice:U,ObjectSlice:V,KeyValuePair:z}},87068:(s,o,i)=>{var a=i(37217),u=i(25911),_=i(21986),w=i(50689),x=i(5861),C=i(56449),j=i(3656),L=i(37167),B="[object Arguments]",$="[object Array]",U="[object Object]",V=Object.prototype.hasOwnProperty;s.exports=function baseIsEqualDeep(s,o,i,z,Y,Z){var ee=C(s),ie=C(o),ae=ee?$:x(s),ce=ie?$:x(o),le=(ae=ae==B?U:ae)==U,pe=(ce=ce==B?U:ce)==U,de=ae==ce;if(de&&j(s)){if(!j(o))return!1;ee=!0,le=!1}if(de&&!le)return Z||(Z=new a),ee||L(s)?u(s,o,i,z,Y,Z):_(s,o,ae,i,z,Y,Z);if(!(1&i)){var fe=le&&V.call(s,"__wrapped__"),ye=pe&&V.call(o,"__wrapped__");if(fe||ye){var be=fe?s.value():s,_e=ye?o.value():o;return Z||(Z=new a),Y(be,_e,i,z,Z)}}return!!de&&(Z||(Z=new a),w(s,o,i,z,Y,Z))}},87136:s=>{"use strict";s.exports=function(s){return null==s}},87170:(s,o)=>{"use strict";o.f=Object.getOwnPropertySymbols},87296:(s,o,i)=>{var a,u=i(55481),_=(a=/[^.]+$/.exec(u&&u.keys&&u.keys.IE_PROTO||""))?"Symbol(src)_1."+a:"";s.exports=function isMasked(s){return!!_&&_ in s}},87586:(s,o,i)=>{const a=i(6205),u=i(10023),_={0:0,t:9,n:10,v:11,f:12,r:13};o.strToChars=function(s){return s=s.replace(/(\[\\b\])|(\\)?\\(?:u([A-F0-9]{4})|x([A-F0-9]{2})|(0?[0-7]{2})|c([@A-Z[\\\]^?])|([0tnvfr]))/g,(function(s,o,i,a,u,w,x,C){if(i)return s;var j=o?8:a?parseInt(a,16):u?parseInt(u,16):w?parseInt(w,8):x?"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^ ?".indexOf(x):_[C],L=String.fromCharCode(j);return/[[\]{}^$.|?*+()]/.test(L)&&(L="\\"+L),L}))},o.tokenizeClass=(s,i)=>{for(var _,w,x=[],C=/\\(?:(w)|(d)|(s)|(W)|(D)|(S))|((?:(?:\\)(.)|([^\]\\]))-(?:\\)?([^\]]))|(\])|(?:\\)?([^])/g;null!=(_=C.exec(s));)if(_[1])x.push(u.words());else if(_[2])x.push(u.ints());else if(_[3])x.push(u.whitespace());else if(_[4])x.push(u.notWords());else if(_[5])x.push(u.notInts());else if(_[6])x.push(u.notWhitespace());else if(_[7])x.push({type:a.RANGE,from:(_[8]||_[9]).charCodeAt(0),to:_[10].charCodeAt(0)});else{if(!(w=_[12]))return[x,C.lastIndex];x.push({type:a.CHAR,value:w.charCodeAt(0)})}o.error(i,"Unterminated character class")},o.error=(s,o)=>{throw new SyntaxError("Invalid regular expression: /"+s+"/: "+o)}},87726:(s,o,i)=>{const a=i(55973),u=i(10316);s.exports=class MemberElement extends u{constructor(s,o,i,u){super(new a,i,u),this.element="member",this.key=s,this.value=o}get key(){return this.content.key}set key(s){this.content.key=this.refract(s)}get value(){return this.content.value}set value(s){this.content.value=this.refract(s)}}},87730:(s,o,i)=>{var a=i(29172),u=i(27301),_=i(86009),w=_&&_.isMap,x=w?u(w):a;s.exports=x},87805:(s,o,i)=>{var a=i(43360),u=i(75288);s.exports=function assignMergeValue(s,o,i){(void 0!==i&&!u(s[o],i)||void 0===i&&!(o in s))&&a(s,o,i)}},87978:(s,o,i)=>{var a=i(60270),u=i(58156),_=i(80631),w=i(28586),x=i(30756),C=i(67197),j=i(77797);s.exports=function baseMatchesProperty(s,o){return w(s)&&x(o)?C(j(s),o):function(i){var w=u(i,s);return void 0===w&&w===o?_(i,s):a(o,w,3)}}},88280:(s,o,i)=>{"use strict";var a=i(1907);s.exports=a({}.isPrototypeOf)},88310:(s,o,i)=>{s.exports=Stream;var a=i(37007).EventEmitter;function Stream(){a.call(this)}i(56698)(Stream,a),Stream.Readable=i(45412),Stream.Writable=i(16708),Stream.Duplex=i(25382),Stream.Transform=i(74610),Stream.PassThrough=i(63600),Stream.finished=i(86238),Stream.pipeline=i(57758),Stream.Stream=Stream,Stream.prototype.pipe=function(s,o){var i=this;function ondata(o){s.writable&&!1===s.write(o)&&i.pause&&i.pause()}function ondrain(){i.readable&&i.resume&&i.resume()}i.on("data",ondata),s.on("drain",ondrain),s._isStdio||o&&!1===o.end||(i.on("end",onend),i.on("close",onclose));var u=!1;function onend(){u||(u=!0,s.end())}function onclose(){u||(u=!0,"function"==typeof s.destroy&&s.destroy())}function onerror(s){if(cleanup(),0===a.listenerCount(this,"error"))throw s}function cleanup(){i.removeListener("data",ondata),s.removeListener("drain",ondrain),i.removeListener("end",onend),i.removeListener("close",onclose),i.removeListener("error",onerror),s.removeListener("error",onerror),i.removeListener("end",cleanup),i.removeListener("close",cleanup),s.removeListener("close",cleanup)}return i.on("error",onerror),s.on("error",onerror),i.on("end",cleanup),i.on("close",cleanup),s.on("close",cleanup),s.emit("pipe",i),s}},88984:(s,o,i)=>{var a=i(55527),u=i(3650),_=Object.prototype.hasOwnProperty;s.exports=function baseKeys(s){if(!a(s))return u(s);var o=[];for(var i in Object(s))_.call(s,i)&&"constructor"!=i&&o.push(i);return o}},89353:s=>{"use strict";var o=Object.prototype.toString,i=Math.max,a=function concatty(s,o){for(var i=[],a=0;a{"use strict";o.H=void 0;var a=function _interopRequireDefault(s){return s&&s.__esModule?s:{default:s}}(i(84977));o.H=a.default},89935:s=>{s.exports=function stubFalse(){return!1}},90160:(s,o,i)=>{"use strict";var a=i(73948),u=String;s.exports=function(s){if("Symbol"===a(s))throw new TypeError("Cannot convert a Symbol value to a string");return u(s)}},90179:(s,o,i)=>{var a=i(34932),u=i(9999),_=i(19931),w=i(31769),x=i(21791),C=i(53138),j=i(38816),L=i(83349),B=j((function(s,o){var i={};if(null==s)return i;var j=!1;o=a(o,(function(o){return o=w(o,s),j||(j=o.length>1),o})),x(s,L(s),i),j&&(i=u(i,7,C));for(var B=o.length;B--;)_(i,o[B]);return i}));s.exports=B},90181:s=>{s.exports=function nativeKeysIn(s){var o=[];if(null!=s)for(var i in Object(s))o.push(i);return o}},90289:(s,o,i)=>{var a=i(12651);s.exports=function mapCacheGet(s){return a(this,s).get(s)}},90392:(s,o,i)=>{"use strict";var a=i(92861).Buffer,u=i(15377);function Hash(s,o){this._block=a.alloc(s),this._finalSize=o,this._blockSize=s,this._len=0}Hash.prototype.update=function(s,o){s=u(s,o||"utf8");for(var i=this._block,a=this._blockSize,_=s.length,w=this._len,x=0;x<_;){for(var C=w%a,j=Math.min(_-x,a-C),L=0;L=this._finalSize&&(this._update(this._block),this._block.fill(0));var i=8*this._len;if(i<=4294967295)this._block.writeUInt32BE(i,this._blockSize-4);else{var a=(4294967295&i)>>>0,u=(i-a)/4294967296;this._block.writeUInt32BE(u,this._blockSize-8),this._block.writeUInt32BE(a,this._blockSize-4)}this._update(this._block);var _=this._hash();return s?_.toString(s):_},Hash.prototype._update=function(){throw new Error("_update must be implemented by subclass")},s.exports=Hash},90916:(s,o,i)=>{var a=i(80909);s.exports=function baseSome(s,o){var i;return a(s,(function(s,a,u){return!(i=o(s,a,u))})),!!i}},90938:s=>{s.exports=function stackDelete(s){var o=this.__data__,i=o.delete(s);return this.size=o.size,i}},91033:s=>{s.exports=function apply(s,o,i){switch(i.length){case 0:return s.call(o);case 1:return s.call(o,i[0]);case 2:return s.call(o,i[0],i[1]);case 3:return s.call(o,i[0],i[1],i[2])}return s.apply(o,i)}},91596:s=>{var o=Math.max;s.exports=function composeArgs(s,i,a,u){for(var _=-1,w=s.length,x=a.length,C=-1,j=i.length,L=o(w-x,0),B=Array(j+L),$=!u;++C{"use strict";i(64502)},92046:s=>{"use strict";s.exports={}},92063:s=>{"use strict";s.exports=function required(s,o){if(o=o.split(":")[0],!(s=+s))return!1;switch(o){case"http":case"ws":return 80!==s;case"https":case"wss":return 443!==s;case"ftp":return 21!==s;case"gopher":return 70!==s;case"file":return!1}return 0!==s}},92271:(s,o,i)=>{var a=i(21791),u=i(4664);s.exports=function copySymbols(s,o){return a(s,u(s),o)}},92340:(s,o,i)=>{const a=i(6048);function coerceElementMatchingCallback(s){return"string"==typeof s?o=>o.element===s:s.constructor&&s.extend?o=>o instanceof s:s}class ArraySlice{constructor(s){this.elements=s||[]}toValue(){return this.elements.map((s=>s.toValue()))}map(s,o){return this.elements.map(s,o)}flatMap(s,o){return this.map(s,o).reduce(((s,o)=>s.concat(o)),[])}compactMap(s,o){const i=[];return this.forEach((a=>{const u=s.bind(o)(a);u&&i.push(u)})),i}filter(s,o){return s=coerceElementMatchingCallback(s),new ArraySlice(this.elements.filter(s,o))}reject(s,o){return s=coerceElementMatchingCallback(s),new ArraySlice(this.elements.filter(a(s),o))}find(s,o){return s=coerceElementMatchingCallback(s),this.elements.find(s,o)}forEach(s,o){this.elements.forEach(s,o)}reduce(s,o){return this.elements.reduce(s,o)}includes(s){return this.elements.some((o=>o.equals(s)))}shift(){return this.elements.shift()}unshift(s){this.elements.unshift(this.refract(s))}push(s){return this.elements.push(this.refract(s)),this}add(s){this.push(s)}get(s){return this.elements[s]}getValue(s){const o=this.elements[s];if(o)return o.toValue()}get length(){return this.elements.length}get isEmpty(){return 0===this.elements.length}get first(){return this.elements[0]}}"undefined"!=typeof Symbol&&(ArraySlice.prototype[Symbol.iterator]=function symbol(){return this.elements[Symbol.iterator]()}),s.exports=ArraySlice},92361:(s,o,i)=>{"use strict";var a=i(45807),u=i(1907);s.exports=function(s){if("Function"===a(s))return u(s)}},92522:(s,o,i)=>{"use strict";var a=i(85816),u=i(6499),_=a("keys");s.exports=function(s){return _[s]||(_[s]=u(s))}},92861:(s,o,i)=>{var a=i(48287),u=a.Buffer;function copyProps(s,o){for(var i in s)o[i]=s[i]}function SafeBuffer(s,o,i){return u(s,o,i)}u.from&&u.alloc&&u.allocUnsafe&&u.allocUnsafeSlow?s.exports=a:(copyProps(a,o),o.Buffer=SafeBuffer),SafeBuffer.prototype=Object.create(u.prototype),copyProps(u,SafeBuffer),SafeBuffer.from=function(s,o,i){if("number"==typeof s)throw new TypeError("Argument must not be a number");return u(s,o,i)},SafeBuffer.alloc=function(s,o,i){if("number"!=typeof s)throw new TypeError("Argument must be a number");var a=u(s);return void 0!==o?"string"==typeof i?a.fill(o,i):a.fill(o):a.fill(0),a},SafeBuffer.allocUnsafe=function(s){if("number"!=typeof s)throw new TypeError("Argument must be a number");return u(s)},SafeBuffer.allocUnsafeSlow=function(s){if("number"!=typeof s)throw new TypeError("Argument must be a number");return a.SlowBuffer(s)}},93243:(s,o,i)=>{var a=i(56110),u=function(){try{var s=a(Object,"defineProperty");return s({},"",{}),s}catch(s){}}();s.exports=u},93290:(s,o,i)=>{s=i.nmd(s);var a=i(9325),u=o&&!o.nodeType&&o,_=u&&s&&!s.nodeType&&s,w=_&&_.exports===u?a.Buffer:void 0,x=w?w.allocUnsafe:void 0;s.exports=function cloneBuffer(s,o){if(o)return s.slice();var i=s.length,a=x?x(i):new s.constructor(i);return s.copy(a),a}},93427:(s,o,i)=>{"use strict";var a=i(1907);s.exports=a([].slice)},93628:(s,o,i)=>{"use strict";var a=i(48648),u=i(71064),_=i(7176);s.exports=a?function getProto(s){return a(s)}:u?function getProto(s){if(!s||"object"!=typeof s&&"function"!=typeof s)throw new TypeError("getProto: not an object");return u(s)}:_?function getProto(s){return _(s)}:null},93663:(s,o,i)=>{var a=i(41799),u=i(10776),_=i(67197);s.exports=function baseMatches(s){var o=u(s);return 1==o.length&&o[0][2]?_(o[0][0],o[0][1]):function(i){return i===s||a(i,s,o)}}},93700:(s,o,i)=>{"use strict";var a=i(19709);s.exports=a},93736:(s,o,i)=>{var a=i(51873),u=a?a.prototype:void 0,_=u?u.valueOf:void 0;s.exports=function cloneSymbol(s){return _?Object(_.call(s)):{}}},93742:s=>{"use strict";s.exports={}},94033:s=>{s.exports=function baseLodash(){}},94459:s=>{"use strict";s.exports=Number.isNaN||function isNaN(s){return s!=s}},94643:(s,o,i)=>{function config(s){try{if(!i.g.localStorage)return!1}catch(s){return!1}var o=i.g.localStorage[s];return null!=o&&"true"===String(o).toLowerCase()}s.exports=function deprecate(s,o){if(config("noDeprecation"))return s;var i=!1;return function deprecated(){if(!i){if(config("throwDeprecation"))throw new Error(o);config("traceDeprecation")?console.trace(o):console.warn(o),i=!0}return s.apply(this,arguments)}}},95089:s=>{const o="[A-Za-z$_][0-9A-Za-z$_]*",i=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],u=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function lookahead(s){return concat("(?=",s,")")}function concat(...s){return s.map((s=>function source(s){return s?"string"==typeof s?s:s.source:null}(s))).join("")}s.exports=function javascript(s){const _=o,w="<>",x="",C={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(s,o)=>{const i=s[0].length+s.index,a=s.input[i];"<"!==a?">"===a&&(((s,{after:o})=>{const i="",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:s.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:j,contains:ce}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:w,end:x},{begin:C.begin,"on:begin":C.isTrulyOpeningTag,end:C.end}],subLanguage:"xml",contains:[{begin:C.begin,end:C.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:j,contains:["self",s.inherit(s.TITLE_MODE,{begin:_}),le],illegal:/%/},{beginKeywords:"while if switch catch for"},{className:"function",begin:s.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,contains:[le,s.inherit(s.TITLE_MODE,{begin:_})]},{variants:[{begin:"\\."+_},{begin:"\\$"+_}],relevance:0},{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{beginKeywords:"extends"},s.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/,end:/[{;]/,excludeEnd:!0,contains:[s.inherit(s.TITLE_MODE,{begin:_}),"self",le]},{begin:"(get|set)\\s+(?="+_+"\\()",end:/\{/,keywords:"get set",contains:[s.inherit(s.TITLE_MODE,{begin:_}),{begin:/\(\)/},le]},{begin:/\$[(.]/}]}}},95116:(s,o,i)=>{"use strict";var a,u,_,w=i(98828),x=i(62250),C=i(46285),j=i(58075),L=i(15972),B=i(68055),$=i(76264),U=i(7376),V=$("iterator"),z=!1;[].keys&&("next"in(_=[].keys())?(u=L(L(_)))!==Object.prototype&&(a=u):z=!0),!C(a)||w((function(){var s={};return a[V].call(s)!==s}))?a={}:U&&(a=j(a)),x(a[V])||B(a,V,(function(){return this})),s.exports={IteratorPrototype:a,BUGGY_SAFARI_ITERATORS:z}},95950:(s,o,i)=>{var a=i(70695),u=i(88984),_=i(64894);s.exports=function keys(s){return _(s)?a(s):u(s)}},96131:(s,o,i)=>{var a=i(2523),u=i(85463),_=i(76959);s.exports=function baseIndexOf(s,o,i){return o==o?_(s,o,i):a(s,u,i)}},96540:(s,o,i)=>{"use strict";s.exports=i(15287)},96605:(s,o,i)=>{"use strict";var a=i(11091),u=i(45951),_=i(76024),w=i(19358),x="WebAssembly",C=u[x],j=7!==new Error("e",{cause:7}).cause,exportGlobalErrorCauseWrapper=function(s,o){var i={};i[s]=w(s,o,j),a({global:!0,constructor:!0,arity:1,forced:j},i)},exportWebAssemblyErrorCauseWrapper=function(s,o){if(C&&C[s]){var i={};i[s]=w(x+"."+s,o,j),a({target:x,stat:!0,constructor:!0,arity:1,forced:j},i)}};exportGlobalErrorCauseWrapper("Error",(function(s){return function Error(o){return _(s,this,arguments)}})),exportGlobalErrorCauseWrapper("EvalError",(function(s){return function EvalError(o){return _(s,this,arguments)}})),exportGlobalErrorCauseWrapper("RangeError",(function(s){return function RangeError(o){return _(s,this,arguments)}})),exportGlobalErrorCauseWrapper("ReferenceError",(function(s){return function ReferenceError(o){return _(s,this,arguments)}})),exportGlobalErrorCauseWrapper("SyntaxError",(function(s){return function SyntaxError(o){return _(s,this,arguments)}})),exportGlobalErrorCauseWrapper("TypeError",(function(s){return function TypeError(o){return _(s,this,arguments)}})),exportGlobalErrorCauseWrapper("URIError",(function(s){return function URIError(o){return _(s,this,arguments)}})),exportWebAssemblyErrorCauseWrapper("CompileError",(function(s){return function CompileError(o){return _(s,this,arguments)}})),exportWebAssemblyErrorCauseWrapper("LinkError",(function(s){return function LinkError(o){return _(s,this,arguments)}})),exportWebAssemblyErrorCauseWrapper("RuntimeError",(function(s){return function RuntimeError(o){return _(s,this,arguments)}}))},96794:(s,o,i)=>{"use strict";var a=i(45951).navigator,u=a&&a.userAgent;s.exports=u?String(u):""},96897:(s,o,i)=>{"use strict";var a=i(70453),u=i(30041),_=i(30592)(),w=i(75795),x=i(69675),C=a("%Math.floor%");s.exports=function setFunctionLength(s,o){if("function"!=typeof s)throw new x("`fn` is not a function");if("number"!=typeof o||o<0||o>4294967295||C(o)!==o)throw new x("`length` must be a positive 32-bit integer");var i=arguments.length>2&&!!arguments[2],a=!0,j=!0;if("length"in s&&w){var L=w(s,"length");L&&!L.configurable&&(a=!1),L&&!L.writable&&(j=!1)}return(a||j||!i)&&(_?u(s,"length",o,!0,!0):u(s,"length",o)),s}},98023:(s,o,i)=>{var a=i(72552),u=i(40346);s.exports=function isNumber(s){return"number"==typeof s||u(s)&&"[object Number]"==a(s)}},98828:s=>{"use strict";s.exports=function(s){try{return!!s()}catch(s){return!0}}},99363:(s,o,i)=>{"use strict";var a=i(4993),u=i(42156),_=i(93742),w=i(64932),x=i(74284).f,C=i(60183),j=i(59550),L=i(7376),B=i(39447),$="Array Iterator",U=w.set,V=w.getterFor($);s.exports=C(Array,"Array",(function(s,o){U(this,{type:$,target:a(s),index:0,kind:o})}),(function(){var s=V(this),o=s.target,i=s.index++;if(!o||i>=o.length)return s.target=null,j(void 0,!0);switch(s.kind){case"keys":return j(i,!1);case"values":return j(o[i],!1)}return j([i,o[i]],!1)}),"values");var z=_.Arguments=_.Array;if(u("keys"),u("values"),u("entries"),!L&&B&&"values"!==z.name)try{x(z,"name",{value:"values"})}catch(s){}},99374:(s,o,i)=>{var a=i(54128),u=i(23805),_=i(44394),w=/^[-+]0x[0-9a-f]+$/i,x=/^0b[01]+$/i,C=/^0o[0-7]+$/i,j=parseInt;s.exports=function toNumber(s){if("number"==typeof s)return s;if(_(s))return NaN;if(u(s)){var o="function"==typeof s.valueOf?s.valueOf():s;s=u(o)?o+"":o}if("string"!=typeof s)return 0===s?s:+s;s=a(s);var i=x.test(s);return i||C.test(s)?j(s.slice(2),i?2:8):w.test(s)?NaN:+s}}},o={};function __webpack_require__(i){var a=o[i];if(void 0!==a)return a.exports;var u=o[i]={id:i,loaded:!1,exports:{}};return s[i].call(u.exports,u,u.exports,__webpack_require__),u.loaded=!0,u.exports}__webpack_require__.n=s=>{var o=s&&s.__esModule?()=>s.default:()=>s;return __webpack_require__.d(o,{a:o}),o},__webpack_require__.d=(s,o)=>{for(var i in o)__webpack_require__.o(o,i)&&!__webpack_require__.o(s,i)&&Object.defineProperty(s,i,{enumerable:!0,get:o[i]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(s){if("object"==typeof window)return window}}(),__webpack_require__.o=(s,o)=>Object.prototype.hasOwnProperty.call(s,o),__webpack_require__.r=s=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(s,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(s,"__esModule",{value:!0})},__webpack_require__.nmd=s=>(s.paths=[],s.children||(s.children=[]),s);var i={};return(()=>{"use strict";__webpack_require__.d(i,{default:()=>WT});var s={};__webpack_require__.r(s),__webpack_require__.d(s,{CLEAR:()=>at,CLEAR_BY:()=>ct,NEW_AUTH_ERR:()=>it,NEW_SPEC_ERR:()=>st,NEW_SPEC_ERR_BATCH:()=>ot,NEW_THROWN_ERR:()=>rt,NEW_THROWN_ERR_BATCH:()=>nt,clear:()=>clear,clearBy:()=>clearBy,newAuthErr:()=>newAuthErr,newSpecErr:()=>newSpecErr,newSpecErrBatch:()=>newSpecErrBatch,newThrownErr:()=>newThrownErr,newThrownErrBatch:()=>newThrownErrBatch});var o={};__webpack_require__.r(o),__webpack_require__.d(o,{AUTHORIZE:()=>Rt,AUTHORIZE_OAUTH2:()=>Lt,CONFIGURE_AUTH:()=>Ft,LOGOUT:()=>Dt,RESTORE_AUTHORIZATION:()=>Bt,SHOW_AUTH_POPUP:()=>Mt,authPopup:()=>authPopup,authorize:()=>authorize,authorizeAccessCodeWithBasicAuthentication:()=>authorizeAccessCodeWithBasicAuthentication,authorizeAccessCodeWithFormParams:()=>authorizeAccessCodeWithFormParams,authorizeApplication:()=>authorizeApplication,authorizeOauth2:()=>authorizeOauth2,authorizeOauth2WithPersistOption:()=>authorizeOauth2WithPersistOption,authorizePassword:()=>authorizePassword,authorizeRequest:()=>authorizeRequest,authorizeWithPersistOption:()=>authorizeWithPersistOption,configureAuth:()=>configureAuth,logout:()=>logout,logoutWithPersistOption:()=>logoutWithPersistOption,persistAuthorizationIfNeeded:()=>persistAuthorizationIfNeeded,preAuthorizeImplicit:()=>preAuthorizeImplicit,restoreAuthorization:()=>restoreAuthorization,showDefinitions:()=>showDefinitions});var a={};__webpack_require__.r(a),__webpack_require__.d(a,{authorized:()=>Jt,definitionsForRequirements:()=>definitionsForRequirements,definitionsToAuthorize:()=>Wt,getConfigs:()=>Ht,getDefinitionsByNames:()=>getDefinitionsByNames,isAuthorized:()=>isAuthorized,selectAuthPath:()=>selectAuthPath,shownDefinitions:()=>zt});var u={};__webpack_require__.r(u),__webpack_require__.d(u,{TOGGLE_CONFIGS:()=>gn,UPDATE_CONFIGS:()=>mn,downloadConfig:()=>downloadConfig,getConfigByUrl:()=>getConfigByUrl,loaded:()=>actions_loaded,toggle:()=>toggle,update:()=>update});var _={};__webpack_require__.r(_),__webpack_require__.d(_,{get:()=>get});var w={};__webpack_require__.r(w),__webpack_require__.d(w,{transform:()=>transform});var x={};__webpack_require__.r(x),__webpack_require__.d(x,{transform:()=>parameter_oneof_transform});var C={};__webpack_require__.r(C),__webpack_require__.d(C,{allErrors:()=>In,lastError:()=>Tn});var j={};__webpack_require__.r(j),__webpack_require__.d(j,{SHOW:()=>Fn,UPDATE_FILTER:()=>Dn,UPDATE_LAYOUT:()=>Rn,UPDATE_MODE:()=>Ln,changeMode:()=>changeMode,show:()=>actions_show,updateFilter:()=>updateFilter,updateLayout:()=>updateLayout});var L={};__webpack_require__.r(L),__webpack_require__.d(L,{current:()=>current,currentFilter:()=>currentFilter,isShown:()=>isShown,showSummary:()=>$n,whatMode:()=>whatMode});var B={};__webpack_require__.r(B),__webpack_require__.d(B,{taggedOperations:()=>taggedOperations});var $={};__webpack_require__.r($),__webpack_require__.d($,{getActiveLanguage:()=>Vn,getDefaultExpanded:()=>zn,getGenerators:()=>Un,getSnippetGenerators:()=>getSnippetGenerators});var U={};__webpack_require__.r(U),__webpack_require__.d(U,{JsonSchemaArrayItemFile:()=>JsonSchemaArrayItemFile,JsonSchemaArrayItemText:()=>JsonSchemaArrayItemText,JsonSchemaForm:()=>JsonSchemaForm,JsonSchema_array:()=>JsonSchema_array,JsonSchema_boolean:()=>JsonSchema_boolean,JsonSchema_object:()=>JsonSchema_object,JsonSchema_string:()=>JsonSchema_string});var V={};__webpack_require__.r(V),__webpack_require__.d(V,{allowTryItOutFor:()=>allowTryItOutFor,basePath:()=>Hs,canExecuteScheme:()=>canExecuteScheme,consumes:()=>Us,consumesOptionsFor:()=>consumesOptionsFor,contentTypeValues:()=>contentTypeValues,currentProducesFor:()=>currentProducesFor,definitions:()=>Js,externalDocs:()=>Ds,findDefinition:()=>findDefinition,getOAS3RequiredRequestBodyContentType:()=>getOAS3RequiredRequestBodyContentType,getParameter:()=>getParameter,hasHost:()=>ro,host:()=>Ks,info:()=>Rs,isMediaTypeSchemaPropertiesEqual:()=>isMediaTypeSchemaPropertiesEqual,isOAS3:()=>Ms,lastError:()=>Os,mutatedRequestFor:()=>mutatedRequestFor,mutatedRequests:()=>to,operationScheme:()=>operationScheme,operationWithMeta:()=>operationWithMeta,operations:()=>qs,operationsWithRootInherited:()=>Ys,operationsWithTags:()=>Qs,parameterInclusionSettingFor:()=>parameterInclusionSettingFor,parameterValues:()=>parameterValues,parameterWithMeta:()=>parameterWithMeta,parameterWithMetaByIdentity:()=>parameterWithMetaByIdentity,parametersIncludeIn:()=>parametersIncludeIn,parametersIncludeType:()=>parametersIncludeType,paths:()=>Bs,produces:()=>Vs,producesOptionsFor:()=>producesOptionsFor,requestFor:()=>requestFor,requests:()=>eo,responseFor:()=>responseFor,responses:()=>Zs,schemes:()=>Gs,security:()=>zs,securityDefinitions:()=>Ws,semver:()=>Fs,spec:()=>spec,specJS:()=>Is,specJson:()=>Ps,specJsonWithResolvedSubtrees:()=>Ns,specResolved:()=>Ts,specResolvedSubtree:()=>specResolvedSubtree,specSource:()=>js,specStr:()=>Cs,tagDetails:()=>tagDetails,taggedOperations:()=>selectors_taggedOperations,tags:()=>Xs,url:()=>As,validOperationMethods:()=>$s,validateBeforeExecute:()=>validateBeforeExecute,validationErrors:()=>validationErrors,version:()=>Ls});var z={};__webpack_require__.r(z),__webpack_require__.d(z,{CLEAR_REQUEST:()=>wo,CLEAR_RESPONSE:()=>Eo,CLEAR_VALIDATE_PARAMS:()=>xo,LOG_REQUEST:()=>So,SET_MUTATED_REQUEST:()=>_o,SET_REQUEST:()=>bo,SET_RESPONSE:()=>vo,SET_SCHEME:()=>Co,UPDATE_EMPTY_PARAM_INCLUSION:()=>go,UPDATE_JSON:()=>fo,UPDATE_OPERATION_META_VALUE:()=>ko,UPDATE_PARAM:()=>mo,UPDATE_RESOLVED:()=>Oo,UPDATE_RESOLVED_SUBTREE:()=>Ao,UPDATE_SPEC:()=>po,UPDATE_URL:()=>ho,VALIDATE_PARAMS:()=>yo,changeConsumesValue:()=>changeConsumesValue,changeParam:()=>changeParam,changeParamByIdentity:()=>changeParamByIdentity,changeProducesValue:()=>changeProducesValue,clearRequest:()=>clearRequest,clearResponse:()=>clearResponse,clearValidateParams:()=>clearValidateParams,execute:()=>actions_execute,executeRequest:()=>executeRequest,invalidateResolvedSubtreeCache:()=>invalidateResolvedSubtreeCache,logRequest:()=>logRequest,parseToJson:()=>parseToJson,requestResolvedSubtree:()=>requestResolvedSubtree,resolveSpec:()=>resolveSpec,setMutatedRequest:()=>setMutatedRequest,setRequest:()=>setRequest,setResponse:()=>setResponse,setScheme:()=>setScheme,updateEmptyParamInclusion:()=>updateEmptyParamInclusion,updateJsonSpec:()=>updateJsonSpec,updateResolved:()=>updateResolved,updateResolvedSubtree:()=>updateResolvedSubtree,updateSpec:()=>updateSpec,updateUrl:()=>updateUrl,validateParams:()=>validateParams});var Y={};__webpack_require__.r(Y),__webpack_require__.d(Y,{executeRequest:()=>wrap_actions_executeRequest,updateJsonSpec:()=>wrap_actions_updateJsonSpec,updateSpec:()=>wrap_actions_updateSpec,validateParams:()=>wrap_actions_validateParams});var Z={};__webpack_require__.r(Z),__webpack_require__.d(Z,{JsonPatchError:()=>Do,_areEquals:()=>_areEquals,applyOperation:()=>applyOperation,applyPatch:()=>applyPatch,applyReducer:()=>applyReducer,deepClone:()=>Lo,getValueByPointer:()=>getValueByPointer,validate:()=>validate,validator:()=>validator});var ee={};__webpack_require__.r(ee),__webpack_require__.d(ee,{compare:()=>compare,generate:()=>generate,observe:()=>observe,unobserve:()=>unobserve});var ie={};__webpack_require__.r(ie),__webpack_require__.d(ie,{hasElementSourceMap:()=>hasElementSourceMap,includesClasses:()=>includesClasses,includesSymbols:()=>includesSymbols,isAnnotationElement:()=>Fu,isArrayElement:()=>Mu,isBooleanElement:()=>Tu,isCommentElement:()=>Bu,isElement:()=>Cu,isLinkElement:()=>Du,isMemberElement:()=>Ru,isNullElement:()=>Iu,isNumberElement:()=>Pu,isObjectElement:()=>Nu,isParseResultElement:()=>$u,isPrimitiveElement:()=>isPrimitiveElement,isRefElement:()=>Lu,isStringElement:()=>ju});var ae={};__webpack_require__.r(ae),__webpack_require__.d(ae,{isJSONReferenceElement:()=>Ld,isJSONSchemaElement:()=>Dd,isLinkDescriptionElement:()=>Bd,isMediaElement:()=>Fd});var ce={};__webpack_require__.r(ce),__webpack_require__.d(ce,{isBooleanJsonSchemaElement:()=>isBooleanJsonSchemaElement,isCallbackElement:()=>Tm,isComponentsElement:()=>Nm,isContactElement:()=>Mm,isDiscriminatorElement:()=>og,isExampleElement:()=>Rm,isExternalDocumentationElement:()=>Dm,isHeaderElement:()=>Lm,isInfoElement:()=>Fm,isLicenseElement:()=>Bm,isLinkElement:()=>$m,isMediaTypeElement:()=>ng,isOpenApi3_0Element:()=>Um,isOpenapiElement:()=>qm,isOperationElement:()=>Vm,isParameterElement:()=>zm,isPathItemElement:()=>Wm,isPathsElement:()=>Jm,isReferenceElement:()=>Hm,isRequestBodyElement:()=>Km,isResponseElement:()=>Gm,isResponsesElement:()=>Ym,isSchemaElement:()=>Xm,isSecurityRequirementElement:()=>Qm,isSecuritySchemeElement:()=>Zm,isServerElement:()=>eg,isServerVariableElement:()=>rg,isServersElement:()=>sg});var le={};__webpack_require__.r(le),__webpack_require__.d(le,{isJSONReferenceElement:()=>Ld,isJSONSchemaElement:()=>g_,isLinkDescriptionElement:()=>y_,isMediaElement:()=>Fd});var pe={};__webpack_require__.r(pe),__webpack_require__.d(pe,{isJSONReferenceElement:()=>Ld,isJSONSchemaElement:()=>A_,isLinkDescriptionElement:()=>C_});var de={};__webpack_require__.r(de),__webpack_require__.d(de,{isJSONSchemaElement:()=>K_,isLinkDescriptionElement:()=>G_});var fe={};__webpack_require__.r(fe),__webpack_require__.d(fe,{isJSONSchemaElement:()=>oS,isLinkDescriptionElement:()=>iS});var ye={};__webpack_require__.r(ye),__webpack_require__.d(ye,{isBooleanJsonSchemaElement:()=>predicates_isBooleanJsonSchemaElement,isCallbackElement:()=>zS,isComponentsElement:()=>WS,isContactElement:()=>JS,isExampleElement:()=>HS,isExternalDocumentationElement:()=>KS,isHeaderElement:()=>GS,isInfoElement:()=>YS,isJsonSchemaDialectElement:()=>XS,isLicenseElement:()=>QS,isLinkElement:()=>ZS,isMediaTypeElement:()=>mE,isOpenApi3_1Element:()=>tE,isOpenapiElement:()=>eE,isOperationElement:()=>rE,isParameterElement:()=>nE,isPathItemElement:()=>sE,isPathItemElementExternal:()=>isPathItemElementExternal,isPathsElement:()=>oE,isReferenceElement:()=>iE,isReferenceElementExternal:()=>isReferenceElementExternal,isRequestBodyElement:()=>aE,isResponseElement:()=>cE,isResponsesElement:()=>lE,isSchemaElement:()=>uE,isSecurityRequirementElement:()=>pE,isSecuritySchemeElement:()=>hE,isServerElement:()=>dE,isServerVariableElement:()=>fE});var be={};__webpack_require__.r(be),__webpack_require__.d(be,{cookie:()=>cookie,header:()=>parameter_builders_header,path:()=>parameter_builders_path,query:()=>query});var _e={};__webpack_require__.r(_e),__webpack_require__.d(_e,{Button:()=>Button,Col:()=>Col,Collapse:()=>Collapse,Container:()=>Container,Input:()=>Input,Link:()=>layout_utils_Link,Row:()=>Row,Select:()=>Select,TextArea:()=>TextArea});var Se={};__webpack_require__.r(Se),__webpack_require__.d(Se,{basePath:()=>NP,consumes:()=>MP,definitions:()=>jP,findDefinition:()=>CP,hasHost:()=>PP,host:()=>TP,produces:()=>RP,schemes:()=>DP,securityDefinitions:()=>IP,validOperationMethods:()=>wrap_selectors_validOperationMethods});var we={};__webpack_require__.r(we),__webpack_require__.d(we,{definitionsToAuthorize:()=>LP});var xe={};__webpack_require__.r(xe),__webpack_require__.d(xe,{callbacksOperations:()=>$P,findSchema:()=>findSchema,isOAS3:()=>selectors_isOAS3,isOAS30:()=>selectors_isOAS30,isSwagger2:()=>selectors_isSwagger2,servers:()=>BP});var Pe={};__webpack_require__.r(Pe),__webpack_require__.d(Pe,{CLEAR_REQUEST_BODY_VALIDATE_ERROR:()=>iI,CLEAR_REQUEST_BODY_VALUE:()=>aI,SET_REQUEST_BODY_VALIDATE_ERROR:()=>oI,UPDATE_ACTIVE_EXAMPLES_MEMBER:()=>tI,UPDATE_REQUEST_BODY_INCLUSION:()=>eI,UPDATE_REQUEST_BODY_VALUE:()=>QP,UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG:()=>ZP,UPDATE_REQUEST_CONTENT_TYPE:()=>rI,UPDATE_RESPONSE_CONTENT_TYPE:()=>nI,UPDATE_SELECTED_SERVER:()=>XP,UPDATE_SERVER_VARIABLE_VALUE:()=>sI,clearRequestBodyValidateError:()=>clearRequestBodyValidateError,clearRequestBodyValue:()=>clearRequestBodyValue,initRequestBodyValidateError:()=>initRequestBodyValidateError,setActiveExamplesMember:()=>setActiveExamplesMember,setRequestBodyInclusion:()=>setRequestBodyInclusion,setRequestBodyValidateError:()=>setRequestBodyValidateError,setRequestBodyValue:()=>setRequestBodyValue,setRequestContentType:()=>setRequestContentType,setResponseContentType:()=>setResponseContentType,setRetainRequestBodyValueFlag:()=>setRetainRequestBodyValueFlag,setSelectedServer:()=>setSelectedServer,setServerVariableValue:()=>setServerVariableValue});var Te={};__webpack_require__.r(Te),__webpack_require__.d(Te,{activeExamplesMember:()=>gI,hasUserEditedBody:()=>dI,requestBodyErrors:()=>mI,requestBodyInclusionSetting:()=>fI,requestBodyValue:()=>pI,requestContentType:()=>yI,responseContentType:()=>vI,selectDefaultRequestBodyValue:()=>selectDefaultRequestBodyValue,selectedServer:()=>uI,serverEffectiveValue:()=>SI,serverVariableValue:()=>bI,serverVariables:()=>_I,shouldRetainRequestBodyValue:()=>hI,validOperationMethods:()=>wI,validateBeforeExecute:()=>EI,validateShallowRequired:()=>validateShallowRequired});var Re=__webpack_require__(96540);function formatProdErrorMessage(s){return`Minified Redux error #${s}; visit https://redux.js.org/Errors?code=${s} for the full message or use the non-minified dev environment for full errors. `}var $e=(()=>"function"==typeof Symbol&&Symbol.observable||"@@observable")(),randomString=()=>Math.random().toString(36).substring(7).split("").join("."),qe={INIT:`@@redux/INIT${randomString()}`,REPLACE:`@@redux/REPLACE${randomString()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${randomString()}`};function isPlainObject(s){if("object"!=typeof s||null===s)return!1;let o=s;for(;null!==Object.getPrototypeOf(o);)o=Object.getPrototypeOf(o);return Object.getPrototypeOf(s)===o||null===Object.getPrototypeOf(s)}function createStore(s,o,i){if("function"!=typeof s)throw new Error(formatProdErrorMessage(2));if("function"==typeof o&&"function"==typeof i||"function"==typeof i&&"function"==typeof arguments[3])throw new Error(formatProdErrorMessage(0));if("function"==typeof o&&void 0===i&&(i=o,o=void 0),void 0!==i){if("function"!=typeof i)throw new Error(formatProdErrorMessage(1));return i(createStore)(s,o)}let a=s,u=o,_=new Map,w=_,x=0,C=!1;function ensureCanMutateNextListeners(){w===_&&(w=new Map,_.forEach(((s,o)=>{w.set(o,s)})))}function getState(){if(C)throw new Error(formatProdErrorMessage(3));return u}function subscribe(s){if("function"!=typeof s)throw new Error(formatProdErrorMessage(4));if(C)throw new Error(formatProdErrorMessage(5));let o=!0;ensureCanMutateNextListeners();const i=x++;return w.set(i,s),function unsubscribe(){if(o){if(C)throw new Error(formatProdErrorMessage(6));o=!1,ensureCanMutateNextListeners(),w.delete(i),_=null}}}function dispatch(s){if(!isPlainObject(s))throw new Error(formatProdErrorMessage(7));if(void 0===s.type)throw new Error(formatProdErrorMessage(8));if("string"!=typeof s.type)throw new Error(formatProdErrorMessage(17));if(C)throw new Error(formatProdErrorMessage(9));try{C=!0,u=a(u,s)}finally{C=!1}return(_=w).forEach((s=>{s()})),s}dispatch({type:qe.INIT});return{dispatch,subscribe,getState,replaceReducer:function replaceReducer(s){if("function"!=typeof s)throw new Error(formatProdErrorMessage(10));a=s,dispatch({type:qe.REPLACE})},[$e]:function observable(){const s=subscribe;return{subscribe(o){if("object"!=typeof o||null===o)throw new Error(formatProdErrorMessage(11));function observeState(){const s=o;s.next&&s.next(getState())}observeState();return{unsubscribe:s(observeState)}},[$e](){return this}}}}}function bindActionCreator(s,o){return function(...i){return o(s.apply(this,i))}}function compose(...s){return 0===s.length?s=>s:1===s.length?s[0]:s.reduce(((s,o)=>(...i)=>s(o(...i))))}var ze=__webpack_require__(9404),We=__webpack_require__.n(ze),He=__webpack_require__(81919),Ye=__webpack_require__.n(He),Xe=__webpack_require__(89593),Qe=__webpack_require__(20334),et=__webpack_require__(55364),tt=__webpack_require__.n(et);const rt="err_new_thrown_err",nt="err_new_thrown_err_batch",st="err_new_spec_err",ot="err_new_spec_err_batch",it="err_new_auth_err",at="err_clear",ct="err_clear_by";function newThrownErr(s){return{type:rt,payload:(0,Qe.serializeError)(s)}}function newThrownErrBatch(s){return{type:nt,payload:s}}function newSpecErr(s){return{type:st,payload:s}}function newSpecErrBatch(s){return{type:ot,payload:s}}function newAuthErr(s){return{type:it,payload:s}}function clear(s={}){return{type:at,payload:s}}function clearBy(s=()=>!0){return{type:ct,payload:s}}const lt=function makeWindow(){var s={location:{},history:{},open:()=>{},close:()=>{},File:function(){},FormData:function(){}};if("undefined"==typeof window)return s;try{s=window;for(var o of["File","Blob","FormData"])o in window&&(s[o]=window[o])}catch(s){console.error(s)}return s}();__webpack_require__(84058),__webpack_require__(55808);var ut=__webpack_require__(50104),pt=__webpack_require__.n(ut),ht=__webpack_require__(7309),dt=__webpack_require__.n(ht),mt=__webpack_require__(42426),gt=__webpack_require__.n(mt),yt=__webpack_require__(75288),vt=__webpack_require__.n(yt),bt=__webpack_require__(1882),_t=__webpack_require__.n(bt),St=__webpack_require__(2205),Et=__webpack_require__.n(St),wt=__webpack_require__(53209),xt=__webpack_require__.n(wt),kt=__webpack_require__(62802),Ot=__webpack_require__.n(kt);const At=We().Set.of("type","format","items","default","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","maxItems","minItems","uniqueItems","enum","multipleOf");function getParameterSchema(s,{isOAS3:o}={}){if(!We().Map.isMap(s))return{schema:We().Map(),parameterContentMediaType:null};if(!o)return"body"===s.get("in")?{schema:s.get("schema",We().Map()),parameterContentMediaType:null}:{schema:s.filter(((s,o)=>At.includes(o))),parameterContentMediaType:null};if(s.get("content")){const o=s.get("content",We().Map({})).keySeq().first();return{schema:s.getIn(["content",o,"schema"],We().Map()),parameterContentMediaType:o}}return{schema:s.get("schema")?s.get("schema",We().Map()):We().Map(),parameterContentMediaType:null}}var Ct=__webpack_require__(48287).Buffer;const jt="default",isImmutable=s=>We().Iterable.isIterable(s),immutableToJS=s=>isImmutable(s)?s.toJS():s;function objectify(s){return isObject(s)?immutableToJS(s):{}}function fromJSOrdered(s){if(isImmutable(s))return s;if(s instanceof lt.File)return s;if(!isObject(s))return s;if(Array.isArray(s))return We().Seq(s).map(fromJSOrdered).toList();if(_t()(s.entries)){const o=function createObjWithHashedKeys(s){if(!_t()(s.entries))return s;const o={},i="_**[]",a={};for(let u of s.entries())if(o[u[0]]||a[u[0]]&&a[u[0]].containsMultiple){if(!a[u[0]]){a[u[0]]={containsMultiple:!0,length:1},o[`${u[0]}${i}${a[u[0]].length}`]=o[u[0]],delete o[u[0]]}a[u[0]].length+=1,o[`${u[0]}${i}${a[u[0]].length}`]=u[1]}else o[u[0]]=u[1];return o}(s);return We().OrderedMap(o).map(fromJSOrdered)}return We().OrderedMap(s).map(fromJSOrdered)}function normalizeArray(s){return Array.isArray(s)?s:[s]}function isFn(s){return"function"==typeof s}function isObject(s){return!!s&&"object"==typeof s}function isFunc(s){return"function"==typeof s}function isArray(s){return Array.isArray(s)}const Pt=pt();function objMap(s,o){return Object.keys(s).reduce(((i,a)=>(i[a]=o(s[a],a),i)),{})}function objReduce(s,o){return Object.keys(s).reduce(((i,a)=>{let u=o(s[a],a);return u&&"object"==typeof u&&Object.assign(i,u),i}),{})}function systemThunkMiddleware(s){return({dispatch:o,getState:i})=>o=>i=>"function"==typeof i?i(s()):o(i)}function validateValueBySchema(s,o,i,a,u){if(!o)return[];let _=[],w=o.get("nullable"),x=o.get("required"),C=o.get("maximum"),j=o.get("minimum"),L=o.get("type"),B=o.get("format"),$=o.get("maxLength"),U=o.get("minLength"),V=o.get("uniqueItems"),z=o.get("maxItems"),Y=o.get("minItems"),Z=o.get("pattern");const ee=i||!0===x,ie=null!=s,ae=ee||ie&&"array"===L||!(!ee&&!ie),ce=w&&null===s;if(ee&&!ie&&!ce&&!a&&!L)return _.push("Required field is not provided"),_;if(ce||!L||!ae)return[];let le="string"===L&&s,pe="array"===L&&Array.isArray(s)&&s.length,de="array"===L&&We().List.isList(s)&&s.count();const fe=[le,pe,de,"array"===L&&"string"==typeof s&&s,"file"===L&&s instanceof lt.File,"boolean"===L&&(s||!1===s),"number"===L&&(s||0===s),"integer"===L&&(s||0===s),"object"===L&&"object"==typeof s&&null!==s,"object"===L&&"string"==typeof s&&s].some((s=>!!s));if(ee&&!fe&&!a)return _.push("Required field is not provided"),_;if("object"===L&&(null===u||"application/json"===u)){let i=s;if("string"==typeof s)try{i=JSON.parse(s)}catch(s){return _.push("Parameter string value must be valid JSON"),_}o&&o.has("required")&&isFunc(x.isList)&&x.isList()&&x.forEach((s=>{void 0===i[s]&&_.push({propKey:s,error:"Required property not found"})})),o&&o.has("properties")&&o.get("properties").forEach(((s,o)=>{const w=validateValueBySchema(i[o],s,!1,a,u);_.push(...w.map((s=>({propKey:o,error:s}))))}))}if(Z){let o=((s,o)=>{if(!new RegExp(o).test(s))return"Value must follow pattern "+o})(s,Z);o&&_.push(o)}if(Y&&"array"===L){let o=((s,o)=>{if(!s&&o>=1||s&&s.length{if(s&&s.length>o)return`Array must not contain more then ${o} item${1===o?"":"s"}`})(s,z);o&&_.push({needRemove:!0,error:o})}if(V&&"array"===L){let o=((s,o)=>{if(s&&("true"===o||!0===o)){const o=(0,ze.fromJS)(s),i=o.toSet();if(s.length>i.size){let s=(0,ze.Set)();if(o.forEach(((i,a)=>{o.filter((s=>isFunc(s.equals)?s.equals(i):s===i)).size>1&&(s=s.add(a))})),0!==s.size)return s.map((s=>({index:s,error:"No duplicates allowed."}))).toArray()}}})(s,V);o&&_.push(...o)}if($||0===$){let o=((s,o)=>{if(s.length>o)return`Value must be no longer than ${o} character${1!==o?"s":""}`})(s,$);o&&_.push(o)}if(U){let o=((s,o)=>{if(s.length{if(s>o)return`Value must be less than or equal to ${o}`})(s,C);o&&_.push(o)}if(j||0===j){let o=((s,o)=>{if(s{if(isNaN(Date.parse(s)))return"Value must be a DateTime"})(s):"uuid"===B?(s=>{if(s=s.toString().toLowerCase(),!/^[{(]?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}[)}]?$/.test(s))return"Value must be a Guid"})(s):(s=>{if(s&&"string"!=typeof s)return"Value must be a string"})(s),!o)return _;_.push(o)}else if("boolean"===L){let o=(s=>{if("true"!==s&&"false"!==s&&!0!==s&&!1!==s)return"Value must be a boolean"})(s);if(!o)return _;_.push(o)}else if("number"===L){let o=(s=>{if(!/^-?\d+(\.?\d+)?$/.test(s))return"Value must be a number"})(s);if(!o)return _;_.push(o)}else if("integer"===L){let o=(s=>{if(!/^-?\d+$/.test(s))return"Value must be an integer"})(s);if(!o)return _;_.push(o)}else if("array"===L){if(!pe&&!de)return _;s&&s.forEach(((s,i)=>{const w=validateValueBySchema(s,o.get("items"),!1,a,u);_.push(...w.map((s=>({index:i,error:s}))))}))}else if("file"===L){let o=(s=>{if(s&&!(s instanceof lt.File))return"Value must be a file"})(s);if(!o)return _;_.push(o)}return _}const utils_btoa=s=>{let o;return o=s instanceof Ct?s:Ct.from(s.toString(),"utf-8"),o.toString("base64")},It={operationsSorter:{alpha:(s,o)=>s.get("path").localeCompare(o.get("path")),method:(s,o)=>s.get("method").localeCompare(o.get("method"))},tagsSorter:{alpha:(s,o)=>s.localeCompare(o)}},buildFormData=s=>{let o=[];for(let i in s){let a=s[i];void 0!==a&&""!==a&&o.push([i,"=",encodeURIComponent(a).replace(/%20/g,"+")].join(""))}return o.join("&")},shallowEqualKeys=(s,o,i)=>!!dt()(i,(i=>vt()(s[i],o[i])));function requiresValidationURL(s){return!(!s||s.indexOf("localhost")>=0||s.indexOf("127.0.0.1")>=0||"none"===s)}const createDeepLinkPath=s=>"string"==typeof s||s instanceof String?s.trim().replace(/\s/g,"%20"):"",escapeDeepLinkPath=s=>Et()(createDeepLinkPath(s).replace(/%20/g,"_")),isExtension=s=>/^x-/.test(s),getExtensions=s=>ze.Map.isMap(s)?s.filter(((s,o)=>isExtension(o))):Object.keys(s).filter((s=>isExtension(s))),getCommonExtensions=s=>s.filter(((s,o)=>/^pattern|maxLength|minLength|maximum|minimum/.test(o)));function deeplyStripKey(s,o,i=()=>!0){if("object"!=typeof s||Array.isArray(s)||null===s||!o)return s;const a=Object.assign({},s);return Object.keys(a).forEach((s=>{s===o&&i(a[s],s)?delete a[s]:a[s]=deeplyStripKey(a[s],o,i)})),a}function stringify(s){if("string"==typeof s)return s;if(s&&s.toJS&&(s=s.toJS()),"object"==typeof s&&null!==s)try{return JSON.stringify(s,null,2)}catch(o){return String(s)}return null==s?"":s.toString()}function paramToIdentifier(s,{returnAll:o=!1,allowHashes:i=!0}={}){if(!We().Map.isMap(s))throw new Error("paramToIdentifier: received a non-Im.Map parameter as input");const a=s.get("name"),u=s.get("in");let _=[];return s&&s.hashCode&&u&&a&&i&&_.push(`${u}.${a}.hash-${s.hashCode()}`),u&&a&&_.push(`${u}.${a}`),_.push(a),o?_:_[0]||""}function paramToValue(s,o){return paramToIdentifier(s,{returnAll:!0}).map((s=>o[s])).filter((s=>void 0!==s))[0]}function b64toB64UrlEncoded(s){return s.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}const isEmptyValue=s=>!s||!(!isImmutable(s)||!s.isEmpty()),idFn=s=>s;function createStoreWithMiddleware(s,o,i){let a=[systemThunkMiddleware(i)];return createStore(s,o,(lt.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__||compose)(function applyMiddleware(...s){return o=>(i,a)=>{const u=o(i,a);let dispatch=()=>{throw new Error(formatProdErrorMessage(15))};const _={getState:u.getState,dispatch:(s,...o)=>dispatch(s,...o)},w=s.map((s=>s(_)));return dispatch=compose(...w)(u.dispatch),{...u,dispatch}}}(...a)))}class Store{constructor(s={}){Ye()(this,{state:{},plugins:[],system:{configs:{},fn:{},components:{},rootInjects:{},statePlugins:{}},boundSystem:{},toolbox:{}},s),this.getSystem=this._getSystem.bind(this),this.store=function configureStore(s,o,i){return createStoreWithMiddleware(s,o,i)}(idFn,(0,ze.fromJS)(this.state),this.getSystem),this.buildSystem(!1),this.register(this.plugins)}getStore(){return this.store}register(s,o=!0){var i=combinePlugins(s,this.getSystem());systemExtend(this.system,i),o&&this.buildSystem();callAfterLoad.call(this.system,s,this.getSystem())&&this.buildSystem()}buildSystem(s=!0){let o=this.getStore().dispatch,i=this.getStore().getState;this.boundSystem=Object.assign({},this.getRootInjects(),this.getWrappedAndBoundActions(o),this.getWrappedAndBoundSelectors(i,this.getSystem),this.getStateThunks(i),this.getFn(),this.getConfigs()),s&&this.rebuildReducer()}_getSystem(){return this.boundSystem}getRootInjects(){return Object.assign({getSystem:this.getSystem,getStore:this.getStore.bind(this),getComponents:this.getComponents.bind(this),getState:this.getStore().getState,getConfigs:this._getConfigs.bind(this),Im:We(),React:Re},this.system.rootInjects||{})}_getConfigs(){return this.system.configs}getConfigs(){return{configs:this.system.configs}}setConfigs(s){this.system.configs=s}rebuildReducer(){this.store.replaceReducer(function buildReducer(s,o){return function allReducers(s,o){let i=Object.keys(s).reduce(((i,a)=>(i[a]=function makeReducer(s,o){return(i=new ze.Map,a)=>{if(!s)return i;let u=s[a.type];if(u){const s=wrapWithTryCatch(u,o)(i,a);return null===s?i:s}return i}}(s[a],o),i)),{});if(!Object.keys(i).length)return idFn;return(0,Xe.H)(i)}(objMap(s,(s=>s.reducers)),o)}(this.system.statePlugins,this.getSystem))}getType(s){let o=s[0].toUpperCase()+s.slice(1);return objReduce(this.system.statePlugins,((i,a)=>{let u=i[s];if(u)return{[a+o]:u}}))}getSelectors(){return this.getType("selectors")}getActions(){return objMap(this.getType("actions"),(s=>objReduce(s,((s,o)=>{if(isFn(s))return{[o]:s}}))))}getWrappedAndBoundActions(s){return objMap(this.getBoundActions(s),((s,o)=>{let i=this.system.statePlugins[o.slice(0,-7)].wrapActions;return i?objMap(s,((s,o)=>{let a=i[o];return a?(Array.isArray(a)||(a=[a]),a.reduce(((s,o)=>{let newAction=(...i)=>o(s,this.getSystem())(...i);if(!isFn(newAction))throw new TypeError("wrapActions needs to return a function that returns a new function (ie the wrapped action)");return wrapWithTryCatch(newAction,this.getSystem)}),s||Function.prototype)):s})):s}))}getWrappedAndBoundSelectors(s,o){return objMap(this.getBoundSelectors(s,o),((o,i)=>{let a=[i.slice(0,-9)],u=this.system.statePlugins[a].wrapSelectors;return u?objMap(o,((o,i)=>{let _=u[i];return _?(Array.isArray(_)||(_=[_]),_.reduce(((o,i)=>{let wrappedSelector=(...u)=>i(o,this.getSystem())(s().getIn(a),...u);if(!isFn(wrappedSelector))throw new TypeError("wrapSelector needs to return a function that returns a new function (ie the wrapped action)");return wrappedSelector}),o||Function.prototype)):o})):o}))}getStates(s){return Object.keys(this.system.statePlugins).reduce(((o,i)=>(o[i]=s.get(i),o)),{})}getStateThunks(s){return Object.keys(this.system.statePlugins).reduce(((o,i)=>(o[i]=()=>s().get(i),o)),{})}getFn(){return{fn:this.system.fn}}getComponents(s){const o=this.system.components[s];return Array.isArray(o)?o.reduce(((s,o)=>o(s,this.getSystem()))):void 0!==s?this.system.components[s]:this.system.components}getBoundSelectors(s,o){return objMap(this.getSelectors(),((i,a)=>{let u=[a.slice(0,-9)];return objMap(i,(i=>(...a)=>{let _=wrapWithTryCatch(i,this.getSystem).apply(null,[s().getIn(u),...a]);return"function"==typeof _&&(_=wrapWithTryCatch(_,this.getSystem)(o())),_}))}))}getBoundActions(s){s=s||this.getStore().dispatch;const o=this.getActions(),process=s=>"function"!=typeof s?objMap(s,(s=>process(s))):(...o)=>{var i=null;try{i=s(...o)}catch(s){i={type:rt,error:!0,payload:(0,Qe.serializeError)(s)}}finally{return i}};return objMap(o,(o=>function bindActionCreators(s,o){if("function"==typeof s)return bindActionCreator(s,o);if("object"!=typeof s||null===s)throw new Error(formatProdErrorMessage(16));const i={};for(const a in s){const u=s[a];"function"==typeof u&&(i[a]=bindActionCreator(u,o))}return i}(process(o),s)))}getMapStateToProps(){return()=>Object.assign({},this.getSystem())}getMapDispatchToProps(s){return o=>Ye()({},this.getWrappedAndBoundActions(o),this.getFn(),s)}}function combinePlugins(s,o){return isObject(s)&&!isArray(s)?tt()({},s):isFunc(s)?combinePlugins(s(o),o):isArray(s)?s.map((s=>combinePlugins(s,o))).reduce(systemExtend,{components:o.getComponents()}):{}}function callAfterLoad(s,o,{hasLoaded:i}={}){let a=i;return isObject(s)&&!isArray(s)&&"function"==typeof s.afterLoad&&(a=!0,wrapWithTryCatch(s.afterLoad,o.getSystem).call(this,o)),isFunc(s)?callAfterLoad.call(this,s(o),o,{hasLoaded:a}):isArray(s)?s.map((s=>callAfterLoad.call(this,s,o,{hasLoaded:a}))):a}function systemExtend(s={},o={}){if(!isObject(s))return{};if(!isObject(o))return s;o.wrapComponents&&(objMap(o.wrapComponents,((i,a)=>{const u=s.components&&s.components[a];u&&Array.isArray(u)?(s.components[a]=u.concat([i]),delete o.wrapComponents[a]):u&&(s.components[a]=[u,i],delete o.wrapComponents[a])})),Object.keys(o.wrapComponents).length||delete o.wrapComponents);const{statePlugins:i}=s;if(isObject(i))for(let s in i){const a=i[s];if(!isObject(a))continue;const{wrapActions:u,wrapSelectors:_}=a;if(isObject(u))for(let i in u){let a=u[i];Array.isArray(a)||(a=[a],u[i]=a),o&&o.statePlugins&&o.statePlugins[s]&&o.statePlugins[s].wrapActions&&o.statePlugins[s].wrapActions[i]&&(o.statePlugins[s].wrapActions[i]=u[i].concat(o.statePlugins[s].wrapActions[i]))}if(isObject(_))for(let i in _){let a=_[i];Array.isArray(a)||(a=[a],_[i]=a),o&&o.statePlugins&&o.statePlugins[s]&&o.statePlugins[s].wrapSelectors&&o.statePlugins[s].wrapSelectors[i]&&(o.statePlugins[s].wrapSelectors[i]=_[i].concat(o.statePlugins[s].wrapSelectors[i]))}}return Ye()(s,o)}function wrapWithTryCatch(s,o,{logErrors:i=!0}={}){return"function"!=typeof s?s:function(...a){try{return s.call(this,...a)}catch(s){if(i){const{uncaughtExceptionHandler:i}=o().getConfigs();"function"==typeof i?i(s):console.error(s)}return null}}}var Tt=__webpack_require__(61160),Nt=__webpack_require__.n(Tt);const Mt="show_popup",Rt="authorize",Dt="logout",Lt="authorize_oauth2",Ft="configure_auth",Bt="restore_authorization";function showDefinitions(s){return{type:Mt,payload:s}}function authorize(s){return{type:Rt,payload:s}}const authorizeWithPersistOption=s=>({authActions:o})=>{o.authorize(s),o.persistAuthorizationIfNeeded()};function logout(s){return{type:Dt,payload:s}}const logoutWithPersistOption=s=>({authActions:o})=>{o.logout(s),o.persistAuthorizationIfNeeded()},preAuthorizeImplicit=s=>({authActions:o,errActions:i})=>{let{auth:a,token:u,isValid:_}=s,{schema:w,name:x}=a,C=w.get("flow");delete lt.swaggerUIRedirectOauth2,"accessCode"===C||_||i.newAuthErr({authId:x,source:"auth",level:"warning",message:"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"}),u.error?i.newAuthErr({authId:x,source:"auth",level:"error",message:JSON.stringify(u)}):o.authorizeOauth2WithPersistOption({auth:a,token:u})};function authorizeOauth2(s){return{type:Lt,payload:s}}const authorizeOauth2WithPersistOption=s=>({authActions:o})=>{o.authorizeOauth2(s),o.persistAuthorizationIfNeeded()},authorizePassword=s=>({authActions:o})=>{let{schema:i,name:a,username:u,password:_,passwordType:w,clientId:x,clientSecret:C}=s,j={grant_type:"password",scope:s.scopes.join(" "),username:u,password:_},L={};switch(w){case"request-body":!function setClientIdAndSecret(s,o,i){o&&Object.assign(s,{client_id:o});i&&Object.assign(s,{client_secret:i})}(j,x,C);break;case"basic":L.Authorization="Basic "+utils_btoa(x+":"+C);break;default:console.warn(`Warning: invalid passwordType ${w} was passed, not including client id and secret`)}return o.authorizeRequest({body:buildFormData(j),url:i.get("tokenUrl"),name:a,headers:L,query:{},auth:s})};const authorizeApplication=s=>({authActions:o})=>{let{schema:i,scopes:a,name:u,clientId:_,clientSecret:w}=s,x={Authorization:"Basic "+utils_btoa(_+":"+w)},C={grant_type:"client_credentials",scope:a.join(" ")};return o.authorizeRequest({body:buildFormData(C),name:u,url:i.get("tokenUrl"),auth:s,headers:x})},authorizeAccessCodeWithFormParams=({auth:s,redirectUrl:o})=>({authActions:i})=>{let{schema:a,name:u,clientId:_,clientSecret:w,codeVerifier:x}=s,C={grant_type:"authorization_code",code:s.code,client_id:_,client_secret:w,redirect_uri:o,code_verifier:x};return i.authorizeRequest({body:buildFormData(C),name:u,url:a.get("tokenUrl"),auth:s})},authorizeAccessCodeWithBasicAuthentication=({auth:s,redirectUrl:o})=>({authActions:i})=>{let{schema:a,name:u,clientId:_,clientSecret:w,codeVerifier:x}=s,C={Authorization:"Basic "+utils_btoa(_+":"+w)},j={grant_type:"authorization_code",code:s.code,client_id:_,redirect_uri:o,code_verifier:x};return i.authorizeRequest({body:buildFormData(j),name:u,url:a.get("tokenUrl"),auth:s,headers:C})},authorizeRequest=s=>({fn:o,getConfigs:i,authActions:a,errActions:u,oas3Selectors:_,specSelectors:w,authSelectors:x})=>{let C,{body:j,query:L={},headers:B={},name:$,url:U,auth:V}=s,{additionalQueryStringParams:z}=x.getConfigs()||{};if(w.isOAS3()){let s=_.serverEffectiveValue(_.selectedServer());C=Nt()(U,s,!0)}else C=Nt()(U,w.url(),!0);"object"==typeof z&&(C.query=Object.assign({},C.query,z));const Y=C.toString();let Z=Object.assign({Accept:"application/json, text/plain, */*","Content-Type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},B);o.fetch({url:Y,method:"post",headers:Z,query:L,body:j,requestInterceptor:i().requestInterceptor,responseInterceptor:i().responseInterceptor}).then((function(s){let o=JSON.parse(s.data),i=o&&(o.error||""),_=o&&(o.parseError||"");s.ok?i||_?u.newAuthErr({authId:$,level:"error",source:"auth",message:JSON.stringify(o)}):a.authorizeOauth2WithPersistOption({auth:V,token:o}):u.newAuthErr({authId:$,level:"error",source:"auth",message:s.statusText})})).catch((s=>{let o=new Error(s).message;if(s.response&&s.response.data){const i=s.response.data;try{const s="string"==typeof i?JSON.parse(i):i;s.error&&(o+=`, error: ${s.error}`),s.error_description&&(o+=`, description: ${s.error_description}`)}catch(s){}}u.newAuthErr({authId:$,level:"error",source:"auth",message:o})}))};function configureAuth(s){return{type:Ft,payload:s}}function restoreAuthorization(s){return{type:Bt,payload:s}}const persistAuthorizationIfNeeded=()=>({authSelectors:s,getConfigs:o})=>{if(!o().persistAuthorization)return;const i=s.authorized().toJS();localStorage.setItem("authorized",JSON.stringify(i))},authPopup=(s,o)=>()=>{lt.swaggerUIRedirectOauth2=o,lt.open(s)},$t={[Mt]:(s,{payload:o})=>s.set("showDefinitions",o),[Rt]:(s,{payload:o})=>{let i=(0,ze.fromJS)(o),a=s.get("authorized")||(0,ze.Map)();return i.entrySeq().forEach((([o,i])=>{if(!isFunc(i.getIn))return s.set("authorized",a);let u=i.getIn(["schema","type"]);if("apiKey"===u||"http"===u)a=a.set(o,i);else if("basic"===u){let s=i.getIn(["value","username"]),u=i.getIn(["value","password"]);a=a.setIn([o,"value"],{username:s,header:"Basic "+utils_btoa(s+":"+u)}),a=a.setIn([o,"schema"],i.get("schema"))}})),s.set("authorized",a)},[Lt]:(s,{payload:o})=>{let i,{auth:a,token:u}=o;a.token=Object.assign({},u),i=(0,ze.fromJS)(a);let _=s.get("authorized")||(0,ze.Map)();return _=_.set(i.get("name"),i),s.set("authorized",_)},[Dt]:(s,{payload:o})=>{let i=s.get("authorized").withMutations((s=>{o.forEach((o=>{s.delete(o)}))}));return s.set("authorized",i)},[Ft]:(s,{payload:o})=>s.set("configs",o),[Bt]:(s,{payload:o})=>s.set("authorized",(0,ze.fromJS)(o.authorized))};function assertIsFunction(s,o="expected a function, instead received "+typeof s){if("function"!=typeof s)throw new TypeError(o)}var ensureIsArray=s=>Array.isArray(s)?s:[s];function getDependencies(s){const o=Array.isArray(s[0])?s[0]:s;return function assertIsArrayOfFunctions(s,o="expected all items to be functions, instead received the following types: "){if(!s.every((s=>"function"==typeof s))){const i=s.map((s=>"function"==typeof s?`function ${s.name||"unnamed"}()`:typeof s)).join(", ");throw new TypeError(`${o}[${i}]`)}}(o,"createSelector expects all input-selectors to be functions, but received the following types: "),o}Symbol(),Object.getPrototypeOf({});var qt="undefined"!=typeof WeakRef?WeakRef:class{constructor(s){this.value=s}deref(){return this.value}};function weakMapMemoize(s,o={}){let i={s:0,v:void 0,o:null,p:null};const{resultEqualityCheck:a}=o;let u,_=0;function memoized(){let o=i;const{length:w}=arguments;for(let s=0,i=w;s{i={s:0,v:void 0,o:null,p:null},memoized.resetResultsCount()},memoized.resultsCount=()=>_,memoized.resetResultsCount=()=>{_=0},memoized}function createSelectorCreator(s,...o){const i="function"==typeof s?{memoize:s,memoizeOptions:o}:s,createSelector2=(...s)=>{let o,a=0,u=0,_={},w=s.pop();"object"==typeof w&&(_=w,w=s.pop()),assertIsFunction(w,`createSelector expects an output function after the inputs, but received: [${typeof w}]`);const x={...i,..._},{memoize:C,memoizeOptions:j=[],argsMemoize:L=weakMapMemoize,argsMemoizeOptions:B=[],devModeChecks:$={}}=x,U=ensureIsArray(j),V=ensureIsArray(B),z=getDependencies(s),Y=C((function recomputationWrapper(){return a++,w.apply(null,arguments)}),...U);const Z=L((function dependenciesChecker(){u++;const s=function collectInputSelectorResults(s,o){const i=[],{length:a}=s;for(let u=0;uu,resetDependencyRecomputations:()=>{u=0},lastResult:()=>o,recomputations:()=>a,resetRecomputations:()=>{a=0},memoize:C,argsMemoize:L})};return Object.assign(createSelector2,{withTypes:()=>createSelector2}),createSelector2}var Ut=createSelectorCreator(weakMapMemoize),Vt=Object.assign(((s,o=Ut)=>{!function assertIsObject(s,o="expected an object, instead received "+typeof s){if("object"!=typeof s)throw new TypeError(o)}(s,"createStructuredSelector expects first argument to be an object where each property is a selector, instead received a "+typeof s);const i=Object.keys(s);return o(i.map((o=>s[o])),((...s)=>s.reduce(((s,o,a)=>(s[i[a]]=o,s)),{})))}),{withTypes:()=>Vt});const state=s=>s,zt=Ut(state,(s=>s.get("showDefinitions"))),Wt=Ut(state,(()=>({specSelectors:s})=>{let o=s.securityDefinitions()||(0,ze.Map)({}),i=(0,ze.List)();return o.entrySeq().forEach((([s,o])=>{let a=(0,ze.Map)();a=a.set(s,o),i=i.push(a)})),i})),selectAuthPath=(s,o)=>({specSelectors:s})=>(0,ze.List)(s.isOAS3()?["components","securitySchemes",o]:["securityDefinitions",o]),getDefinitionsByNames=(s,o)=>({specSelectors:s})=>{console.warn("WARNING: getDefinitionsByNames is deprecated and will be removed in the next major version.");let i=s.securityDefinitions(),a=(0,ze.List)();return o.valueSeq().forEach((s=>{let o=(0,ze.Map)();s.entrySeq().forEach((([s,a])=>{let u,_=i.get(s);"oauth2"===_.get("type")&&a.size&&(u=_.get("scopes"),u.keySeq().forEach((s=>{a.contains(s)||(u=u.delete(s))})),_=_.set("allowedScopes",u)),o=o.set(s,_)})),a=a.push(o)})),a},definitionsForRequirements=(s,o=(0,ze.List)())=>({authSelectors:s})=>{const i=s.definitionsToAuthorize()||(0,ze.List)();let a=(0,ze.List)();return i.forEach((s=>{let i=o.find((o=>o.get(s.keySeq().first())));i&&(s.forEach(((o,a)=>{if("oauth2"===o.get("type")){const u=i.get(a);let _=o.get("scopes");ze.List.isList(u)&&ze.Map.isMap(_)&&(_.keySeq().forEach((s=>{u.contains(s)||(_=_.delete(s))})),s=s.set(a,o.set("scopes",_)))}})),a=a.push(s))})),a},Jt=Ut(state,(s=>s.get("authorized")||(0,ze.Map)())),isAuthorized=(s,o)=>({authSelectors:s})=>{let i=s.authorized();return ze.List.isList(o)?!!o.toJS().filter((s=>-1===Object.keys(s).map((s=>!!i.get(s))).indexOf(!1))).length:null},Ht=Ut(state,(s=>s.get("configs"))),execute=(s,{authSelectors:o,specSelectors:i})=>({path:a,method:u,operation:_,extras:w})=>{let x={authorized:o.authorized()&&o.authorized().toJS(),definitions:i.securityDefinitions()&&i.securityDefinitions().toJS(),specSecurity:i.security()&&i.security().toJS()};return s({path:a,method:u,operation:_,securities:x,...w})},loaded=(s,o)=>i=>{const{getConfigs:a,authActions:u}=o,_=a();if(s(i),_.persistAuthorization){const s=localStorage.getItem("authorized");s&&u.restoreAuthorization({authorized:JSON.parse(s)})}},wrap_actions_authorize=(s,o)=>i=>{s(i);if(o.getConfigs().persistAuthorization)try{const[{schema:s,value:o}]=Object.values(i),a=(0,ze.fromJS)(s),u="apiKey"===a.get("type"),_="cookie"===a.get("in");u&&_&&(document.cookie=`${a.get("name")}=${o}; SameSite=None; Secure`)}catch(s){console.error("Error persisting cookie based apiKey in document.cookie.",s)}},wrap_actions_logout=(s,o)=>i=>{const a=o.getConfigs(),u=o.authSelectors.authorized();try{a.persistAuthorization&&Array.isArray(i)&&i.forEach((s=>{const o=u.get(s,{}),i="apiKey"===o.getIn(["schema","type"]),a="cookie"===o.getIn(["schema","in"]);if(i&&a){const s=o.getIn(["schema","name"]);document.cookie=`${s}=; Max-Age=-99999999`}}))}catch(s){console.error("Error deleting cookie based apiKey from document.cookie.",s)}s(i)};var Kt=__webpack_require__(90179),Gt=__webpack_require__.n(Kt);class LockAuthIcon extends Re.Component{mapStateToProps(s,o){return{state:s,ownProps:Gt()(o,Object.keys(o.getSystem()))}}render(){const{getComponent:s,ownProps:o}=this.props,i=s("LockIcon");return Re.createElement(i,o)}}const Yt=LockAuthIcon;class UnlockAuthIcon extends Re.Component{mapStateToProps(s,o){return{state:s,ownProps:Gt()(o,Object.keys(o.getSystem()))}}render(){const{getComponent:s,ownProps:o}=this.props,i=s("UnlockIcon");return Re.createElement(i,o)}}const Xt=UnlockAuthIcon;function auth(){return{afterLoad(s){this.rootInjects=this.rootInjects||{},this.rootInjects.initOAuth=s.authActions.configureAuth,this.rootInjects.preauthorizeApiKey=preauthorizeApiKey.bind(null,s),this.rootInjects.preauthorizeBasic=preauthorizeBasic.bind(null,s)},components:{LockAuthIcon:Yt,UnlockAuthIcon:Xt,LockAuthOperationIcon:Yt,UnlockAuthOperationIcon:Xt},statePlugins:{auth:{reducers:$t,actions:o,selectors:a,wrapActions:{authorize:wrap_actions_authorize,logout:wrap_actions_logout}},configs:{wrapActions:{loaded}},spec:{wrapActions:{execute}}}}}function preauthorizeBasic(s,o,i,a){const{authActions:{authorize:u},specSelectors:{specJson:_,isOAS3:w}}=s,x=w()?["components","securitySchemes"]:["securityDefinitions"],C=_().getIn([...x,o]);return C?u({[o]:{value:{username:i,password:a},schema:C.toJS()}}):null}function preauthorizeApiKey(s,o,i){const{authActions:{authorize:a},specSelectors:{specJson:u,isOAS3:_}}=s,w=_()?["components","securitySchemes"]:["securityDefinitions"],x=u().getIn([...w,o]);return x?a({[o]:{value:i,schema:x.toJS()}}):null}function isNothing(s){return null==s}var Qt=function repeat(s,o){var i,a="";for(i=0;ix&&(o=a-x+(_=" ... ").length),i-a>x&&(i=a+x-(w=" ...").length),{str:_+s.slice(o,i).replace(/\t/g,"→")+w,pos:a-o+_.length}}function padStart(s,o){return er.repeat(" ",o-s.length)+s}var rr=function makeSnippet(s,o){if(o=Object.create(o||null),!s.buffer)return null;o.maxLength||(o.maxLength=79),"number"!=typeof o.indent&&(o.indent=1),"number"!=typeof o.linesBefore&&(o.linesBefore=3),"number"!=typeof o.linesAfter&&(o.linesAfter=2);for(var i,a=/\r?\n|\r|\0/g,u=[0],_=[],w=-1;i=a.exec(s.buffer);)_.push(i.index),u.push(i.index+i[0].length),s.position<=i.index&&w<0&&(w=u.length-2);w<0&&(w=u.length-1);var x,C,j="",L=Math.min(s.line+o.linesAfter,_.length).toString().length,B=o.maxLength-(o.indent+L+3);for(x=1;x<=o.linesBefore&&!(w-x<0);x++)C=getLine(s.buffer,u[w-x],_[w-x],s.position-(u[w]-u[w-x]),B),j=er.repeat(" ",o.indent)+padStart((s.line-x+1).toString(),L)+" | "+C.str+"\n"+j;for(C=getLine(s.buffer,u[w],_[w],s.position,B),j+=er.repeat(" ",o.indent)+padStart((s.line+1).toString(),L)+" | "+C.str+"\n",j+=er.repeat("-",o.indent+L+3+C.pos)+"^\n",x=1;x<=o.linesAfter&&!(w+x>=_.length);x++)C=getLine(s.buffer,u[w+x],_[w+x],s.position-(u[w]-u[w+x]),B),j+=er.repeat(" ",o.indent)+padStart((s.line+x+1).toString(),L)+" | "+C.str+"\n";return j.replace(/\n$/,"")},nr=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],sr=["scalar","sequence","mapping"];var ir=function Type$1(s,o){if(o=o||{},Object.keys(o).forEach((function(o){if(-1===nr.indexOf(o))throw new tr('Unknown option "'+o+'" is met in definition of "'+s+'" YAML type.')})),this.options=o,this.tag=s,this.kind=o.kind||null,this.resolve=o.resolve||function(){return!0},this.construct=o.construct||function(s){return s},this.instanceOf=o.instanceOf||null,this.predicate=o.predicate||null,this.represent=o.represent||null,this.representName=o.representName||null,this.defaultStyle=o.defaultStyle||null,this.multi=o.multi||!1,this.styleAliases=function compileStyleAliases(s){var o={};return null!==s&&Object.keys(s).forEach((function(i){s[i].forEach((function(s){o[String(s)]=i}))})),o}(o.styleAliases||null),-1===sr.indexOf(this.kind))throw new tr('Unknown kind "'+this.kind+'" is specified for "'+s+'" YAML type.')};function compileList(s,o){var i=[];return s[o].forEach((function(s){var o=i.length;i.forEach((function(i,a){i.tag===s.tag&&i.kind===s.kind&&i.multi===s.multi&&(o=a)})),i[o]=s})),i}function Schema$1(s){return this.extend(s)}Schema$1.prototype.extend=function extend(s){var o=[],i=[];if(s instanceof ir)i.push(s);else if(Array.isArray(s))i=i.concat(s);else{if(!s||!Array.isArray(s.implicit)&&!Array.isArray(s.explicit))throw new tr("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");s.implicit&&(o=o.concat(s.implicit)),s.explicit&&(i=i.concat(s.explicit))}o.forEach((function(s){if(!(s instanceof ir))throw new tr("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(s.loadKind&&"scalar"!==s.loadKind)throw new tr("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(s.multi)throw new tr("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")})),i.forEach((function(s){if(!(s instanceof ir))throw new tr("Specified list of YAML types (or a single Type object) contains a non-Type object.")}));var a=Object.create(Schema$1.prototype);return a.implicit=(this.implicit||[]).concat(o),a.explicit=(this.explicit||[]).concat(i),a.compiledImplicit=compileList(a,"implicit"),a.compiledExplicit=compileList(a,"explicit"),a.compiledTypeMap=function compileMap(){var s,o,i={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function collectType(s){s.multi?(i.multi[s.kind].push(s),i.multi.fallback.push(s)):i[s.kind][s.tag]=i.fallback[s.tag]=s}for(s=0,o=arguments.length;s=0?"0b"+s.toString(2):"-0b"+s.toString(2).slice(1)},octal:function(s){return s>=0?"0o"+s.toString(8):"-0o"+s.toString(8).slice(1)},decimal:function(s){return s.toString(10)},hexadecimal:function(s){return s>=0?"0x"+s.toString(16).toUpperCase():"-0x"+s.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),gr=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var yr=/^[-+]?[0-9]+e/;var vr=new ir("tag:yaml.org,2002:float",{kind:"scalar",resolve:function resolveYamlFloat(s){return null!==s&&!(!gr.test(s)||"_"===s[s.length-1])},construct:function constructYamlFloat(s){var o,i;return i="-"===(o=s.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(o[0])>=0&&(o=o.slice(1)),".inf"===o?1===i?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===o?NaN:i*parseFloat(o,10)},predicate:function isFloat(s){return"[object Number]"===Object.prototype.toString.call(s)&&(s%1!=0||er.isNegativeZero(s))},represent:function representYamlFloat(s,o){var i;if(isNaN(s))switch(o){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===s)switch(o){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===s)switch(o){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(er.isNegativeZero(s))return"-0.0";return i=s.toString(10),yr.test(i)?i.replace("e",".e"):i},defaultStyle:"lowercase"}),br=pr.extend({implicit:[dr,fr,mr,vr]}),_r=br,Sr=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),Er=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");var wr=new ir("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function resolveYamlTimestamp(s){return null!==s&&(null!==Sr.exec(s)||null!==Er.exec(s))},construct:function constructYamlTimestamp(s){var o,i,a,u,_,w,x,C,j=0,L=null;if(null===(o=Sr.exec(s))&&(o=Er.exec(s)),null===o)throw new Error("Date resolve error");if(i=+o[1],a=+o[2]-1,u=+o[3],!o[4])return new Date(Date.UTC(i,a,u));if(_=+o[4],w=+o[5],x=+o[6],o[7]){for(j=o[7].slice(0,3);j.length<3;)j+="0";j=+j}return o[9]&&(L=6e4*(60*+o[10]+ +(o[11]||0)),"-"===o[9]&&(L=-L)),C=new Date(Date.UTC(i,a,u,_,w,x,j)),L&&C.setTime(C.getTime()-L),C},instanceOf:Date,represent:function representYamlTimestamp(s){return s.toISOString()}});var xr=new ir("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function resolveYamlMerge(s){return"<<"===s||null===s}}),kr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";var Or=new ir("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function resolveYamlBinary(s){if(null===s)return!1;var o,i,a=0,u=s.length,_=kr;for(i=0;i64)){if(o<0)return!1;a+=6}return a%8==0},construct:function constructYamlBinary(s){var o,i,a=s.replace(/[\r\n=]/g,""),u=a.length,_=kr,w=0,x=[];for(o=0;o>16&255),x.push(w>>8&255),x.push(255&w)),w=w<<6|_.indexOf(a.charAt(o));return 0===(i=u%4*6)?(x.push(w>>16&255),x.push(w>>8&255),x.push(255&w)):18===i?(x.push(w>>10&255),x.push(w>>2&255)):12===i&&x.push(w>>4&255),new Uint8Array(x)},predicate:function isBinary(s){return"[object Uint8Array]"===Object.prototype.toString.call(s)},represent:function representYamlBinary(s){var o,i,a="",u=0,_=s.length,w=kr;for(o=0;o<_;o++)o%3==0&&o&&(a+=w[u>>18&63],a+=w[u>>12&63],a+=w[u>>6&63],a+=w[63&u]),u=(u<<8)+s[o];return 0===(i=_%3)?(a+=w[u>>18&63],a+=w[u>>12&63],a+=w[u>>6&63],a+=w[63&u]):2===i?(a+=w[u>>10&63],a+=w[u>>4&63],a+=w[u<<2&63],a+=w[64]):1===i&&(a+=w[u>>2&63],a+=w[u<<4&63],a+=w[64],a+=w[64]),a}}),Ar=Object.prototype.hasOwnProperty,Cr=Object.prototype.toString;var jr=new ir("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function resolveYamlOmap(s){if(null===s)return!0;var o,i,a,u,_,w=[],x=s;for(o=0,i=x.length;o>10),56320+(s-65536&1023))}function setProperty(s,o,i){"__proto__"===o?Object.defineProperty(s,o,{configurable:!0,enumerable:!0,writable:!0,value:i}):s[o]=i}for(var qr=new Array(256),Ur=new Array(256),Vr=0;Vr<256;Vr++)qr[Vr]=simpleEscapeSequence(Vr)?1:0,Ur[Vr]=simpleEscapeSequence(Vr);function State$1(s,o){this.input=s,this.filename=o.filename||null,this.schema=o.schema||Mr,this.onWarning=o.onWarning||null,this.legacy=o.legacy||!1,this.json=o.json||!1,this.listener=o.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=s.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function generateError(s,o){var i={name:s.filename,buffer:s.input.slice(0,-1),position:s.position,line:s.line,column:s.position-s.lineStart};return i.snippet=rr(i),new tr(o,i)}function throwError(s,o){throw generateError(s,o)}function throwWarning(s,o){s.onWarning&&s.onWarning.call(null,generateError(s,o))}var zr={YAML:function handleYamlDirective(s,o,i){var a,u,_;null!==s.version&&throwError(s,"duplication of %YAML directive"),1!==i.length&&throwError(s,"YAML directive accepts exactly one argument"),null===(a=/^([0-9]+)\.([0-9]+)$/.exec(i[0]))&&throwError(s,"ill-formed argument of the YAML directive"),u=parseInt(a[1],10),_=parseInt(a[2],10),1!==u&&throwError(s,"unacceptable YAML version of the document"),s.version=i[0],s.checkLineBreaks=_<2,1!==_&&2!==_&&throwWarning(s,"unsupported YAML version of the document")},TAG:function handleTagDirective(s,o,i){var a,u;2!==i.length&&throwError(s,"TAG directive accepts exactly two arguments"),a=i[0],u=i[1],Br.test(a)||throwError(s,"ill-formed tag handle (first argument) of the TAG directive"),Rr.call(s.tagMap,a)&&throwError(s,'there is a previously declared suffix for "'+a+'" tag handle'),$r.test(u)||throwError(s,"ill-formed tag prefix (second argument) of the TAG directive");try{u=decodeURIComponent(u)}catch(o){throwError(s,"tag prefix is malformed: "+u)}s.tagMap[a]=u}};function captureSegment(s,o,i,a){var u,_,w,x;if(o1&&(s.result+=er.repeat("\n",o-1))}function readBlockSequence(s,o){var i,a,u=s.tag,_=s.anchor,w=[],x=!1;if(-1!==s.firstTabInLine)return!1;for(null!==s.anchor&&(s.anchorMap[s.anchor]=w),a=s.input.charCodeAt(s.position);0!==a&&(-1!==s.firstTabInLine&&(s.position=s.firstTabInLine,throwError(s,"tab characters must not be used in indentation")),45===a)&&is_WS_OR_EOL(s.input.charCodeAt(s.position+1));)if(x=!0,s.position++,skipSeparationSpace(s,!0,-1)&&s.lineIndent<=o)w.push(null),a=s.input.charCodeAt(s.position);else if(i=s.line,composeNode(s,o,3,!1,!0),w.push(s.result),skipSeparationSpace(s,!0,-1),a=s.input.charCodeAt(s.position),(s.line===i||s.lineIndent>o)&&0!==a)throwError(s,"bad indentation of a sequence entry");else if(s.lineIndento?V=1:s.lineIndent===o?V=0:s.lineIndento?V=1:s.lineIndent===o?V=0:s.lineIndento)&&(Z&&(w=s.line,x=s.lineStart,C=s.position),composeNode(s,o,4,!0,u)&&(Z?z=s.result:Y=s.result),Z||(storeMappingPair(s,$,U,V,z,Y,w,x,C),V=z=Y=null),skipSeparationSpace(s,!0,-1),j=s.input.charCodeAt(s.position)),(s.line===_||s.lineIndent>o)&&0!==j)throwError(s,"bad indentation of a mapping entry");else if(s.lineIndent=0))break;0===u?throwError(s,"bad explicit indentation width of a block scalar; it cannot be less than one"):j?throwError(s,"repeat of an indentation width identifier"):(L=o+u-1,j=!0)}if(is_WHITE_SPACE(_)){do{_=s.input.charCodeAt(++s.position)}while(is_WHITE_SPACE(_));if(35===_)do{_=s.input.charCodeAt(++s.position)}while(!is_EOL(_)&&0!==_)}for(;0!==_;){for(readLineBreak(s),s.lineIndent=0,_=s.input.charCodeAt(s.position);(!j||s.lineIndentL&&(L=s.lineIndent),is_EOL(_))B++;else{if(s.lineIndent0){for(u=w,_=0;u>0;u--)(w=fromHexCode(x=s.input.charCodeAt(++s.position)))>=0?_=(_<<4)+w:throwError(s,"expected hexadecimal character");s.result+=charFromCodepoint(_),s.position++}else throwError(s,"unknown escape sequence");i=a=s.position}else is_EOL(x)?(captureSegment(s,i,a,!0),writeFoldedLines(s,skipSeparationSpace(s,!1,o)),i=a=s.position):s.position===s.lineStart&&testDocumentSeparator(s)?throwError(s,"unexpected end of the document within a double quoted scalar"):(s.position++,a=s.position)}throwError(s,"unexpected end of the stream within a double quoted scalar")}(s,$)?Y=!0:!function readAlias(s){var o,i,a;if(42!==(a=s.input.charCodeAt(s.position)))return!1;for(a=s.input.charCodeAt(++s.position),o=s.position;0!==a&&!is_WS_OR_EOL(a)&&!is_FLOW_INDICATOR(a);)a=s.input.charCodeAt(++s.position);return s.position===o&&throwError(s,"name of an alias node must contain at least one character"),i=s.input.slice(o,s.position),Rr.call(s.anchorMap,i)||throwError(s,'unidentified alias "'+i+'"'),s.result=s.anchorMap[i],skipSeparationSpace(s,!0,-1),!0}(s)?function readPlainScalar(s,o,i){var a,u,_,w,x,C,j,L,B=s.kind,$=s.result;if(is_WS_OR_EOL(L=s.input.charCodeAt(s.position))||is_FLOW_INDICATOR(L)||35===L||38===L||42===L||33===L||124===L||62===L||39===L||34===L||37===L||64===L||96===L)return!1;if((63===L||45===L)&&(is_WS_OR_EOL(a=s.input.charCodeAt(s.position+1))||i&&is_FLOW_INDICATOR(a)))return!1;for(s.kind="scalar",s.result="",u=_=s.position,w=!1;0!==L;){if(58===L){if(is_WS_OR_EOL(a=s.input.charCodeAt(s.position+1))||i&&is_FLOW_INDICATOR(a))break}else if(35===L){if(is_WS_OR_EOL(s.input.charCodeAt(s.position-1)))break}else{if(s.position===s.lineStart&&testDocumentSeparator(s)||i&&is_FLOW_INDICATOR(L))break;if(is_EOL(L)){if(x=s.line,C=s.lineStart,j=s.lineIndent,skipSeparationSpace(s,!1,-1),s.lineIndent>=o){w=!0,L=s.input.charCodeAt(s.position);continue}s.position=_,s.line=x,s.lineStart=C,s.lineIndent=j;break}}w&&(captureSegment(s,u,_,!1),writeFoldedLines(s,s.line-x),u=_=s.position,w=!1),is_WHITE_SPACE(L)||(_=s.position+1),L=s.input.charCodeAt(++s.position)}return captureSegment(s,u,_,!1),!!s.result||(s.kind=B,s.result=$,!1)}(s,$,1===i)&&(Y=!0,null===s.tag&&(s.tag="?")):(Y=!0,null===s.tag&&null===s.anchor||throwError(s,"alias node should not have any properties")),null!==s.anchor&&(s.anchorMap[s.anchor]=s.result)):0===V&&(Y=x&&readBlockSequence(s,U))),null===s.tag)null!==s.anchor&&(s.anchorMap[s.anchor]=s.result);else if("?"===s.tag){for(null!==s.result&&"scalar"!==s.kind&&throwError(s,'unacceptable node kind for ! tag; it should be "scalar", not "'+s.kind+'"'),C=0,j=s.implicitTypes.length;C"),null!==s.result&&B.kind!==s.kind&&throwError(s,"unacceptable node kind for !<"+s.tag+'> tag; it should be "'+B.kind+'", not "'+s.kind+'"'),B.resolve(s.result,s.tag)?(s.result=B.construct(s.result,s.tag),null!==s.anchor&&(s.anchorMap[s.anchor]=s.result)):throwError(s,"cannot resolve a node with !<"+s.tag+"> explicit tag")}return null!==s.listener&&s.listener("close",s),null!==s.tag||null!==s.anchor||Y}function readDocument(s){var o,i,a,u,_=s.position,w=!1;for(s.version=null,s.checkLineBreaks=s.legacy,s.tagMap=Object.create(null),s.anchorMap=Object.create(null);0!==(u=s.input.charCodeAt(s.position))&&(skipSeparationSpace(s,!0,-1),u=s.input.charCodeAt(s.position),!(s.lineIndent>0||37!==u));){for(w=!0,u=s.input.charCodeAt(++s.position),o=s.position;0!==u&&!is_WS_OR_EOL(u);)u=s.input.charCodeAt(++s.position);for(a=[],(i=s.input.slice(o,s.position)).length<1&&throwError(s,"directive name must not be less than one character in length");0!==u;){for(;is_WHITE_SPACE(u);)u=s.input.charCodeAt(++s.position);if(35===u){do{u=s.input.charCodeAt(++s.position)}while(0!==u&&!is_EOL(u));break}if(is_EOL(u))break;for(o=s.position;0!==u&&!is_WS_OR_EOL(u);)u=s.input.charCodeAt(++s.position);a.push(s.input.slice(o,s.position))}0!==u&&readLineBreak(s),Rr.call(zr,i)?zr[i](s,i,a):throwWarning(s,'unknown document directive "'+i+'"')}skipSeparationSpace(s,!0,-1),0===s.lineIndent&&45===s.input.charCodeAt(s.position)&&45===s.input.charCodeAt(s.position+1)&&45===s.input.charCodeAt(s.position+2)?(s.position+=3,skipSeparationSpace(s,!0,-1)):w&&throwError(s,"directives end mark is expected"),composeNode(s,s.lineIndent-1,4,!1,!0),skipSeparationSpace(s,!0,-1),s.checkLineBreaks&&Lr.test(s.input.slice(_,s.position))&&throwWarning(s,"non-ASCII line breaks are interpreted as content"),s.documents.push(s.result),s.position===s.lineStart&&testDocumentSeparator(s)?46===s.input.charCodeAt(s.position)&&(s.position+=3,skipSeparationSpace(s,!0,-1)):s.position=55296&&a<=56319&&o+1=56320&&i<=57343?1024*(a-55296)+i-56320+65536:a}function needIndentIndicator(s){return/^\n* /.test(s)}function chooseScalarStyle(s,o,i,a,u,_,w,x){var C,j=0,L=null,B=!1,$=!1,U=-1!==a,V=-1,z=function isPlainSafeFirst(s){return isPrintable(s)&&s!==Kr&&!isWhitespace(s)&&45!==s&&63!==s&&58!==s&&44!==s&&91!==s&&93!==s&&123!==s&&125!==s&&35!==s&&38!==s&&42!==s&&33!==s&&124!==s&&61!==s&&62!==s&&39!==s&&34!==s&&37!==s&&64!==s&&96!==s}(codePointAt(s,0))&&function isPlainSafeLast(s){return!isWhitespace(s)&&58!==s}(codePointAt(s,s.length-1));if(o||w)for(C=0;C=65536?C+=2:C++){if(!isPrintable(j=codePointAt(s,C)))return 5;z=z&&isPlainSafe(j,L,x),L=j}else{for(C=0;C=65536?C+=2:C++){if(10===(j=codePointAt(s,C)))B=!0,U&&($=$||C-V-1>a&&" "!==s[V+1],V=C);else if(!isPrintable(j))return 5;z=z&&isPlainSafe(j,L,x),L=j}$=$||U&&C-V-1>a&&" "!==s[V+1]}return B||$?i>9&&needIndentIndicator(s)?5:w?2===_?5:2:$?4:3:!z||w||u(s)?2===_?5:2:1}function writeScalar(s,o,i,a,u){s.dump=function(){if(0===o.length)return 2===s.quotingType?'""':"''";if(!s.noCompatMode&&(-1!==Yr.indexOf(o)||Xr.test(o)))return 2===s.quotingType?'"'+o+'"':"'"+o+"'";var _=s.indent*Math.max(1,i),w=-1===s.lineWidth?-1:Math.max(Math.min(s.lineWidth,40),s.lineWidth-_),x=a||s.flowLevel>-1&&i>=s.flowLevel;switch(chooseScalarStyle(o,x,s.indent,w,(function testAmbiguity(o){return function testImplicitResolving(s,o){var i,a;for(i=0,a=s.implicitTypes.length;i"+blockHeader(o,s.indent)+dropEndingNewline(indentString(function foldString(s,o){var i,a,u=/(\n+)([^\n]*)/g,_=(x=s.indexOf("\n"),x=-1!==x?x:s.length,u.lastIndex=x,foldLine(s.slice(0,x),o)),w="\n"===s[0]||" "===s[0];var x;for(;a=u.exec(s);){var C=a[1],j=a[2];i=" "===j[0],_+=C+(w||i||""===j?"":"\n")+foldLine(j,o),w=i}return _}(o,w),_));case 5:return'"'+function escapeString(s){for(var o,i="",a=0,u=0;u=65536?u+=2:u++)a=codePointAt(s,u),!(o=Gr[a])&&isPrintable(a)?(i+=s[u],a>=65536&&(i+=s[u+1])):i+=o||encodeHex(a);return i}(o)+'"';default:throw new tr("impossible error: invalid scalar style")}}()}function blockHeader(s,o){var i=needIndentIndicator(s)?String(o):"",a="\n"===s[s.length-1];return i+(a&&("\n"===s[s.length-2]||"\n"===s)?"+":a?"":"-")+"\n"}function dropEndingNewline(s){return"\n"===s[s.length-1]?s.slice(0,-1):s}function foldLine(s,o){if(""===s||" "===s[0])return s;for(var i,a,u=/ [^ ]/g,_=0,w=0,x=0,C="";i=u.exec(s);)(x=i.index)-_>o&&(a=w>_?w:x,C+="\n"+s.slice(_,a),_=a+1),w=x;return C+="\n",s.length-_>o&&w>_?C+=s.slice(_,w)+"\n"+s.slice(w+1):C+=s.slice(_),C.slice(1)}function writeBlockSequence(s,o,i,a){var u,_,w,x="",C=s.tag;for(u=0,_=i.length;u<_;u+=1)w=i[u],s.replacer&&(w=s.replacer.call(i,String(u),w)),(writeNode(s,o+1,w,!0,!0,!1,!0)||void 0===w&&writeNode(s,o+1,null,!0,!0,!1,!0))&&(a&&""===x||(x+=generateNextLine(s,o)),s.dump&&10===s.dump.charCodeAt(0)?x+="-":x+="- ",x+=s.dump);s.tag=C,s.dump=x||"[]"}function detectType(s,o,i){var a,u,_,w,x,C;for(_=0,w=(u=i?s.explicitTypes:s.implicitTypes).length;_ tag resolver accepts not "'+C+'" style');a=x.represent[C](o,C)}s.dump=a}return!0}return!1}function writeNode(s,o,i,a,u,_,w){s.tag=null,s.dump=i,detectType(s,i,!1)||detectType(s,i,!0);var x,C=Jr.call(s.dump),j=a;a&&(a=s.flowLevel<0||s.flowLevel>o);var L,B,$="[object Object]"===C||"[object Array]"===C;if($&&(B=-1!==(L=s.duplicates.indexOf(i))),(null!==s.tag&&"?"!==s.tag||B||2!==s.indent&&o>0)&&(u=!1),B&&s.usedDuplicates[L])s.dump="*ref_"+L;else{if($&&B&&!s.usedDuplicates[L]&&(s.usedDuplicates[L]=!0),"[object Object]"===C)a&&0!==Object.keys(s.dump).length?(!function writeBlockMapping(s,o,i,a){var u,_,w,x,C,j,L="",B=s.tag,$=Object.keys(i);if(!0===s.sortKeys)$.sort();else if("function"==typeof s.sortKeys)$.sort(s.sortKeys);else if(s.sortKeys)throw new tr("sortKeys must be a boolean or a function");for(u=0,_=$.length;u<_;u+=1)j="",a&&""===L||(j+=generateNextLine(s,o)),x=i[w=$[u]],s.replacer&&(x=s.replacer.call(i,w,x)),writeNode(s,o+1,w,!0,!0,!0)&&((C=null!==s.tag&&"?"!==s.tag||s.dump&&s.dump.length>1024)&&(s.dump&&10===s.dump.charCodeAt(0)?j+="?":j+="? "),j+=s.dump,C&&(j+=generateNextLine(s,o)),writeNode(s,o+1,x,!0,C)&&(s.dump&&10===s.dump.charCodeAt(0)?j+=":":j+=": ",L+=j+=s.dump));s.tag=B,s.dump=L||"{}"}(s,o,s.dump,u),B&&(s.dump="&ref_"+L+s.dump)):(!function writeFlowMapping(s,o,i){var a,u,_,w,x,C="",j=s.tag,L=Object.keys(i);for(a=0,u=L.length;a1024&&(x+="? "),x+=s.dump+(s.condenseFlow?'"':"")+":"+(s.condenseFlow?"":" "),writeNode(s,o,w,!1,!1)&&(C+=x+=s.dump));s.tag=j,s.dump="{"+C+"}"}(s,o,s.dump),B&&(s.dump="&ref_"+L+" "+s.dump));else if("[object Array]"===C)a&&0!==s.dump.length?(s.noArrayIndent&&!w&&o>0?writeBlockSequence(s,o-1,s.dump,u):writeBlockSequence(s,o,s.dump,u),B&&(s.dump="&ref_"+L+s.dump)):(!function writeFlowSequence(s,o,i){var a,u,_,w="",x=s.tag;for(a=0,u=i.length;a",s.dump=x+" "+s.dump)}return!0}function getDuplicateReferences(s,o){var i,a,u=[],_=[];for(inspectNode(s,u,_),i=0,a=_.length;i()=>{},downloadConfig=s=>o=>{const{fn:{fetch:i}}=o;return i(s)},getConfigByUrl=(s,o)=>i=>{const{specActions:a,configsActions:u}=i;if(s)return u.downloadConfig(s).then(next,next);function next(u){u instanceof Error||u.status>=400?(a.updateLoadingStatus("failedConfig"),a.updateLoadingStatus("failedConfig"),a.updateUrl(""),console.error(u.statusText+" "+s.url),o(null)):o(((s,o)=>{try{return fn.load(s)}catch(s){return o&&o.errActions.newThrownErr(new Error(s)),{}}})(u.text,i))}},get=(s,o)=>s.getIn(Array.isArray(o)?o:[o]),yn={[mn]:(s,o)=>s.merge((0,ze.fromJS)(o.payload)),[gn]:(s,o)=>{const i=o.payload,a=s.get(i);return s.set(i,!a)}};function configsPlugin(){return{statePlugins:{configs:{reducers:yn,actions:u,selectors:_}}}}const setHash=s=>s?history.pushState(null,null,`#${s}`):window.location.hash="";var vn=__webpack_require__(86215),bn=__webpack_require__.n(vn);const _n="layout_scroll_to",Sn="layout_clear_scroll";const En={fn:{getScrollParent:function getScrollParent(s,o){const i=document.documentElement;let a=getComputedStyle(s);const u="absolute"===a.position,_=o?/(auto|scroll|hidden)/:/(auto|scroll)/;if("fixed"===a.position)return i;for(let o=s;o=o.parentElement;)if(a=getComputedStyle(o),(!u||"static"!==a.position)&&_.test(a.overflow+a.overflowY+a.overflowX))return o;return i}},statePlugins:{layout:{actions:{scrollToElement:(s,o)=>i=>{try{o=o||i.fn.getScrollParent(s),bn().createScroller(o).to(s)}catch(s){console.error(s)}},scrollTo:s=>({type:_n,payload:Array.isArray(s)?s:[s]}),clearScrollTo:()=>({type:Sn}),readyToScroll:(s,o)=>i=>{const a=i.layoutSelectors.getScrollToKey();We().is(a,(0,ze.fromJS)(s))&&(i.layoutActions.scrollToElement(o),i.layoutActions.clearScrollTo())},parseDeepLinkHash:s=>({layoutActions:o,layoutSelectors:i,getConfigs:a})=>{if(a().deepLinking&&s){let a=s.slice(1);"!"===a[0]&&(a=a.slice(1)),"/"===a[0]&&(a=a.slice(1));const u=a.split("/").map((s=>s||"")),_=i.isShownKeyFromUrlHashArray(u),[w,x="",C=""]=_;if("operations"===w){const s=i.isShownKeyFromUrlHashArray([x]);x.indexOf("_")>-1&&(console.warn("Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead."),o.show(s.map((s=>s.replace(/_/g," "))),!0)),o.show(s,!0)}(x.indexOf("_")>-1||C.indexOf("_")>-1)&&(console.warn("Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead."),o.show(_.map((s=>s.replace(/_/g," "))),!0)),o.show(_,!0),o.scrollTo(_)}}},selectors:{getScrollToKey:s=>s.get("scrollToKey"),isShownKeyFromUrlHashArray(s,o){const[i,a]=o;return a?["operations",i,a]:i?["operations-tag",i]:[]},urlHashArrayFromIsShownKey(s,o){let[i,a,u]=o;return"operations"==i?[a,u]:"operations-tag"==i?[a]:[]}},reducers:{[_n]:(s,o)=>s.set("scrollToKey",We().fromJS(o.payload)),[Sn]:s=>s.delete("scrollToKey")},wrapActions:{show:(s,{getConfigs:o,layoutSelectors:i})=>(...a)=>{if(s(...a),o().deepLinking)try{let[s,o]=a;s=Array.isArray(s)?s:[s];const u=i.urlHashArrayFromIsShownKey(s);if(!u.length)return;const[_,w]=u;if(!o)return setHash("/");2===u.length?setHash(createDeepLinkPath(`/${encodeURIComponent(_)}/${encodeURIComponent(w)}`)):1===u.length&&setHash(createDeepLinkPath(`/${encodeURIComponent(_)}`))}catch(s){console.error(s)}}}}}};var wn=__webpack_require__(2209),xn=__webpack_require__.n(wn);const operation_wrapper=(s,o)=>class OperationWrapper extends Re.Component{onLoad=s=>{const{operation:i}=this.props,{tag:a,operationId:u}=i.toObject();let{isShownKey:_}=i.toObject();_=_||["operations",a,u],o.layoutActions.readyToScroll(_,s)};render(){return Re.createElement("span",{ref:this.onLoad},Re.createElement(s,this.props))}},operation_tag_wrapper=(s,o)=>class OperationTagWrapper extends Re.Component{onLoad=s=>{const{tag:i}=this.props,a=["operations-tag",i];o.layoutActions.readyToScroll(a,s)};render(){return Re.createElement("span",{ref:this.onLoad},Re.createElement(s,this.props))}};function deep_linking(){return[En,{statePlugins:{configs:{wrapActions:{loaded:(s,o)=>(...i)=>{s(...i);const a=decodeURIComponent(window.location.hash);o.layoutActions.parseDeepLinkHash(a)}}}},wrapComponents:{operation:operation_wrapper,OperationTag:operation_tag_wrapper}}]}var kn=__webpack_require__(40860),On=__webpack_require__.n(kn);function transform(s){return s.map((s=>{let o="is not of a type(s)",i=s.get("message").indexOf(o);if(i>-1){let o=s.get("message").slice(i+19).split(",");return s.set("message",s.get("message").slice(0,i)+function makeNewMessage(s){return s.reduce(((s,o,i,a)=>i===a.length-1&&a.length>1?s+"or "+o:a[i+1]&&a.length>2?s+o+", ":a[i+1]?s+o+" ":s+o),"should be a")}(o))}return s}))}var An=__webpack_require__(58156),Cn=__webpack_require__.n(An);function parameter_oneof_transform(s,{jsSpec:o}){return s}const jn=[w,x];function transformErrors(s){let o={jsSpec:{}},i=On()(jn,((s,i)=>{try{return i.transform(s,o).filter((s=>!!s))}catch(o){return console.error("Transformer error:",o),s}}),s);return i.filter((s=>!!s)).map((s=>(!s.get("line")&&s.get("path"),s)))}let Pn={line:0,level:"error",message:"Unknown error"};const In=Ut((s=>s),(s=>s.get("errors",(0,ze.List)()))),Tn=Ut(In,(s=>s.last()));function err(o){return{statePlugins:{err:{reducers:{[rt]:(s,{payload:o})=>{let i=Object.assign(Pn,o,{type:"thrown"});return s.update("errors",(s=>(s||(0,ze.List)()).push((0,ze.fromJS)(i)))).update("errors",(s=>transformErrors(s)))},[nt]:(s,{payload:o})=>(o=o.map((s=>(0,ze.fromJS)(Object.assign(Pn,s,{type:"thrown"})))),s.update("errors",(s=>(s||(0,ze.List)()).concat((0,ze.fromJS)(o)))).update("errors",(s=>transformErrors(s)))),[st]:(s,{payload:o})=>{let i=(0,ze.fromJS)(o);return i=i.set("type","spec"),s.update("errors",(s=>(s||(0,ze.List)()).push((0,ze.fromJS)(i)).sortBy((s=>s.get("line"))))).update("errors",(s=>transformErrors(s)))},[ot]:(s,{payload:o})=>(o=o.map((s=>(0,ze.fromJS)(Object.assign(Pn,s,{type:"spec"})))),s.update("errors",(s=>(s||(0,ze.List)()).concat((0,ze.fromJS)(o)))).update("errors",(s=>transformErrors(s)))),[it]:(s,{payload:o})=>{let i=(0,ze.fromJS)(Object.assign({},o));return i=i.set("type","auth"),s.update("errors",(s=>(s||(0,ze.List)()).push((0,ze.fromJS)(i)))).update("errors",(s=>transformErrors(s)))},[at]:(s,{payload:o})=>{if(!o||!s.get("errors"))return s;let i=s.get("errors").filter((s=>s.keySeq().every((i=>{const a=s.get(i),u=o[i];return!u||a!==u}))));return s.merge({errors:i})},[ct]:(s,{payload:o})=>{if(!o||"function"!=typeof o)return s;let i=s.get("errors").filter((s=>o(s)));return s.merge({errors:i})}},actions:s,selectors:C}}}}function opsFilter(s,o){return s.filter(((s,i)=>-1!==i.indexOf(o)))}function filter(){return{fn:{opsFilter}}}var Nn=__webpack_require__(7666),Mn=__webpack_require__.n(Nn);const arrow_up=({className:s=null,width:o=20,height:i=20,...a})=>Re.createElement("svg",Mn()({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",className:s,width:o,height:i,"aria-hidden":"true",focusable:"false"},a),Re.createElement("path",{d:"M 17.418 14.908 C 17.69 15.176 18.127 15.176 18.397 14.908 C 18.667 14.64 18.668 14.207 18.397 13.939 L 10.489 6.109 C 10.219 5.841 9.782 5.841 9.51 6.109 L 1.602 13.939 C 1.332 14.207 1.332 14.64 1.602 14.908 C 1.873 15.176 2.311 15.176 2.581 14.908 L 10 7.767 L 17.418 14.908 Z"})),arrow_down=({className:s=null,width:o=20,height:i=20,...a})=>Re.createElement("svg",Mn()({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",className:s,width:o,height:i,"aria-hidden":"true",focusable:"false"},a),Re.createElement("path",{d:"M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z"})),arrow=({className:s=null,width:o=20,height:i=20,...a})=>Re.createElement("svg",Mn()({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",className:s,width:o,height:i,"aria-hidden":"true",focusable:"false"},a),Re.createElement("path",{d:"M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z"})),components_close=({className:s=null,width:o=20,height:i=20,...a})=>Re.createElement("svg",Mn()({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",className:s,width:o,height:i,"aria-hidden":"true",focusable:"false"},a),Re.createElement("path",{d:"M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z"})),copy=({className:s=null,width:o=15,height:i=16,...a})=>Re.createElement("svg",Mn()({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 15 16",className:s,width:o,height:i,"aria-hidden":"true",focusable:"false"},a),Re.createElement("g",{transform:"translate(2, -1)"},Re.createElement("path",{fill:"#ffffff",fillRule:"evenodd",d:"M2 13h4v1H2v-1zm5-6H2v1h5V7zm2 3V8l-3 3 3 3v-2h5v-2H9zM4.5 9H2v1h2.5V9zM2 12h2.5v-1H2v1zm9 1h1v2c-.02.28-.11.52-.3.7-.19.18-.42.28-.7.3H1c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h3c0-1.11.89-2 2-2 1.11 0 2 .89 2 2h3c.55 0 1 .45 1 1v5h-1V6H1v9h10v-2zM2 5h8c0-.55-.45-1-1-1H8c-.55 0-1-.45-1-1s-.45-1-1-1-1 .45-1 1-.45 1-1 1H3c-.55 0-1 .45-1 1z"}))),lock=({className:s=null,width:o=20,height:i=20,...a})=>Re.createElement("svg",Mn()({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",className:s,width:o,height:i,"aria-hidden":"true",focusable:"false"},a),Re.createElement("path",{d:"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z"})),unlock=({className:s=null,width:o=20,height:i=20,...a})=>Re.createElement("svg",Mn()({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",className:s,width:o,height:i,"aria-hidden":"true",focusable:"false"},a),Re.createElement("path",{d:"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z"})),icons=()=>({components:{ArrowUpIcon:arrow_up,ArrowDownIcon:arrow_down,ArrowIcon:arrow,CloseIcon:components_close,CopyIcon:copy,LockIcon:lock,UnlockIcon:unlock}}),Rn="layout_update_layout",Dn="layout_update_filter",Ln="layout_update_mode",Fn="layout_show";function updateLayout(s){return{type:Rn,payload:s}}function updateFilter(s){return{type:Dn,payload:s}}function actions_show(s,o=!0){return s=normalizeArray(s),{type:Fn,payload:{thing:s,shown:o}}}function changeMode(s,o=""){return s=normalizeArray(s),{type:Ln,payload:{thing:s,mode:o}}}const Bn={[Rn]:(s,o)=>s.set("layout",o.payload),[Dn]:(s,o)=>s.set("filter",o.payload),[Fn]:(s,o)=>{const i=o.payload.shown,a=(0,ze.fromJS)(o.payload.thing);return s.update("shown",(0,ze.fromJS)({}),(s=>s.set(a,i)))},[Ln]:(s,o)=>{let i=o.payload.thing,a=o.payload.mode;return s.setIn(["modes"].concat(i),(a||"")+"")}},current=s=>s.get("layout"),currentFilter=s=>s.get("filter"),isShown=(s,o,i)=>(o=normalizeArray(o),s.get("shown",(0,ze.fromJS)({})).get((0,ze.fromJS)(o),i)),whatMode=(s,o,i="")=>(o=normalizeArray(o),s.getIn(["modes",...o],i)),$n=Ut((s=>s),(s=>!isShown(s,"editor"))),taggedOperations=(s,o)=>(i,...a)=>{let u=s(i,...a);const{fn:_,layoutSelectors:w,getConfigs:x}=o.getSystem(),C=x(),{maxDisplayedTags:j}=C;let L=w.currentFilter();return L&&!0!==L&&(u=_.opsFilter(u,L)),j>=0&&(u=u.slice(0,j)),u};function plugins_layout(){return{statePlugins:{layout:{reducers:Bn,actions:j,selectors:L},spec:{wrapSelectors:B}}}}function logs({configs:s}){const o={debug:0,info:1,log:2,warn:3,error:4},getLevel=s=>o[s]||-1;let{logLevel:i}=s,a=getLevel(i);function log(s,...o){getLevel(s)>=a&&console[s](...o)}return log.warn=log.bind(null,"warn"),log.error=log.bind(null,"error"),log.info=log.bind(null,"info"),log.debug=log.bind(null,"debug"),{rootInjects:{log}}}let qn=!1;function on_complete(){return{statePlugins:{spec:{wrapActions:{updateSpec:s=>(...o)=>(qn=!0,s(...o)),updateJsonSpec:(s,o)=>(...i)=>{const a=o.getConfigs().onComplete;return qn&&"function"==typeof a&&(setTimeout(a,0),qn=!1),s(...i)}}}}}}const extractKey=s=>{const o="_**[]";return s.indexOf(o)<0?s:s.split(o)[0].trim()},escapeShell=s=>"-d "===s||/^[_\/-]/g.test(s)?s:"'"+s.replace(/'/g,"'\\''")+"'",escapeCMD=s=>"-d "===(s=s.replace(/\^/g,"^^").replace(/\\"/g,'\\\\"').replace(/"/g,'""').replace(/\n/g,"^\n"))?s.replace(/-d /g,"-d ^\n"):/^[_\/-]/g.test(s)?s:'"'+s+'"',escapePowershell=s=>{if("-d "===s)return s;if(/\n/.test(s)){return`@"\n${s.replace(/`/g,"``").replace(/\$/g,"`$")}\n"@`}if(!/^[_\/-]/.test(s)){return`'${s.replace(/'/g,"''")}'`}return s};const curlify=(s,o,i,a="")=>{let u=!1,_="";const addWords=(...s)=>_+=" "+s.map(o).join(" "),addWordsWithoutLeadingSpace=(...s)=>_+=s.map(o).join(" "),addNewLine=()=>_+=` ${i}`,addIndent=(s=1)=>_+=" ".repeat(s);let w=s.get("headers");_+="curl"+a;const x=s.get("curlOptions");if(ze.List.isList(x)&&!x.isEmpty()&&addWords(...s.get("curlOptions")),addWords("-X",s.get("method")),addNewLine(),addIndent(),addWordsWithoutLeadingSpace(`${s.get("url")}`),w&&w.size)for(let o of s.get("headers").entries()){addNewLine(),addIndent();let[s,i]=o;addWordsWithoutLeadingSpace("-H",`${s}: ${i}`),u=u||/^content-type$/i.test(s)&&/^multipart\/form-data$/i.test(i)}const C=s.get("body");if(C)if(u&&["POST","PUT","PATCH"].includes(s.get("method")))for(let[s,o]of C.entrySeq()){let i=extractKey(s);addNewLine(),addIndent(),addWordsWithoutLeadingSpace("-F"),o instanceof lt.File&&"string"==typeof o.valueOf()?addWords(`${i}=${o.data}${o.type?`;type=${o.type}`:""}`):o instanceof lt.File?addWords(`${i}=@${o.name}${o.type?`;type=${o.type}`:""}`):addWords(`${i}=${o}`)}else if(C instanceof lt.File)addNewLine(),addIndent(),addWordsWithoutLeadingSpace(`--data-binary '@${C.name}'`);else{addNewLine(),addIndent(),addWordsWithoutLeadingSpace("-d ");let o=C;ze.Map.isMap(o)?addWordsWithoutLeadingSpace(function getStringBodyOfMap(s){let o=[];for(let[i,a]of s.get("body").entrySeq()){let s=extractKey(i);a instanceof lt.File?o.push(` "${s}": {\n "name": "${a.name}"${a.type?`,\n "type": "${a.type}"`:""}\n }`):o.push(` "${s}": ${JSON.stringify(a,null,2).replace(/(\r\n|\r|\n)/g,"\n ")}`)}return`{\n${o.join(",\n")}\n}`}(s)):("string"!=typeof o&&(o=JSON.stringify(o)),addWordsWithoutLeadingSpace(o))}else C||"POST"!==s.get("method")||(addNewLine(),addIndent(),addWordsWithoutLeadingSpace("-d ''"));return _},requestSnippetGenerator_curl_powershell=s=>curlify(s,escapePowershell,"`\n",".exe"),requestSnippetGenerator_curl_bash=s=>curlify(s,escapeShell,"\\\n"),requestSnippetGenerator_curl_cmd=s=>curlify(s,escapeCMD,"^\n"),request_snippets_selectors_state=s=>s||(0,ze.Map)(),Un=Ut(request_snippets_selectors_state,(s=>{const o=s.get("languages"),i=s.get("generators",(0,ze.Map)());return!o||o.isEmpty()?i:i.filter(((s,i)=>o.includes(i)))})),getSnippetGenerators=s=>({fn:o})=>Un(s).map(((s,i)=>{const a=(s=>o[`requestSnippetGenerator_${s}`])(i);return"function"!=typeof a?null:s.set("fn",a)})).filter((s=>s)),Vn=Ut(request_snippets_selectors_state,(s=>s.get("activeLanguage"))),zn=Ut(request_snippets_selectors_state,(s=>s.get("defaultExpanded")));var Wn=__webpack_require__(46942),Jn=__webpack_require__.n(Wn),Hn=__webpack_require__(59399);const Kn={cursor:"pointer",lineHeight:1,display:"inline-flex",backgroundColor:"rgb(250, 250, 250)",paddingBottom:"0",paddingTop:"0",border:"1px solid rgb(51, 51, 51)",borderRadius:"4px 4px 0 0",boxShadow:"none",borderBottom:"none"},Gn={cursor:"pointer",lineHeight:1,display:"inline-flex",backgroundColor:"rgb(51, 51, 51)",boxShadow:"none",border:"1px solid rgb(51, 51, 51)",paddingBottom:"0",paddingTop:"0",borderRadius:"4px 4px 0 0",marginTop:"-5px",marginRight:"-5px",marginLeft:"-5px",zIndex:"9999",borderBottom:"none"},request_snippets=({request:s,requestSnippetsSelectors:o,getComponent:i})=>{const a=(0,Re.useRef)(null),u=i("ArrowUpIcon"),_=i("ArrowDownIcon"),w=i("SyntaxHighlighter",!0),[x,C]=(0,Re.useState)(o.getSnippetGenerators()?.keySeq().first()),[j,L]=(0,Re.useState)(o?.getDefaultExpanded()),B=o.getSnippetGenerators(),$=B.get(x),U=$.get("fn")(s),handleSetIsExpanded=()=>{L(!j)},handleGetBtnStyle=s=>s===x?Gn:Kn,handlePreventYScrollingBeyondElement=s=>{const{target:o,deltaY:i}=s,{scrollHeight:a,offsetHeight:u,scrollTop:_}=o;a>u&&(0===_&&i<0||u+_>=a&&i>0)&&s.preventDefault()};return(0,Re.useEffect)((()=>{}),[]),(0,Re.useEffect)((()=>{const s=Array.from(a.current.childNodes).filter((s=>!!s.nodeType&&s.classList?.contains("curl-command")));return s.forEach((s=>s.addEventListener("mousewheel",handlePreventYScrollingBeyondElement,{passive:!1}))),()=>{s.forEach((s=>s.removeEventListener("mousewheel",handlePreventYScrollingBeyondElement)))}}),[s]),Re.createElement("div",{className:"request-snippets",ref:a},Re.createElement("div",{style:{width:"100%",display:"flex",justifyContent:"flex-start",alignItems:"center",marginBottom:"15px"}},Re.createElement("h4",{onClick:()=>handleSetIsExpanded(),style:{cursor:"pointer"}},"Snippets"),Re.createElement("button",{onClick:()=>handleSetIsExpanded(),style:{border:"none",background:"none"},title:j?"Collapse operation":"Expand operation"},j?Re.createElement(_,{className:"arrow",width:"10",height:"10"}):Re.createElement(u,{className:"arrow",width:"10",height:"10"}))),j&&Re.createElement("div",{className:"curl-command"},Re.createElement("div",{style:{paddingLeft:"15px",paddingRight:"10px",width:"100%",display:"flex"}},B.entrySeq().map((([s,o])=>Re.createElement("div",{className:Jn()("btn",{active:s===x}),style:handleGetBtnStyle(s),key:s,onClick:()=>(s=>{x!==s&&C(s)})(s)},Re.createElement("h4",{style:s===x?{color:"white"}:{}},o.get("title")))))),Re.createElement("div",{className:"copy-to-clipboard"},Re.createElement(Hn.CopyToClipboard,{text:U},Re.createElement("button",null))),Re.createElement("div",null,Re.createElement(w,{language:$.get("syntax"),className:"curl microlight",renderPlainText:({children:s,PlainTextViewer:o})=>Re.createElement(o,{className:"curl"},s)},U))))},plugins_request_snippets=()=>({components:{RequestSnippets:request_snippets},fn:{requestSnippetGenerator_curl_bash,requestSnippetGenerator_curl_cmd,requestSnippetGenerator_curl_powershell},statePlugins:{requestSnippets:{selectors:$}}});class ModelCollapse extends Re.Component{static defaultProps={collapsedContent:"{...}",expanded:!1,title:null,onToggle:()=>{},hideSelfOnExpand:!1,specPath:We().List([])};constructor(s,o){super(s,o);let{expanded:i,collapsedContent:a}=this.props;this.state={expanded:i,collapsedContent:a||ModelCollapse.defaultProps.collapsedContent}}componentDidMount(){const{hideSelfOnExpand:s,expanded:o,modelName:i}=this.props;s&&o&&this.props.onToggle(i,o)}UNSAFE_componentWillReceiveProps(s){this.props.expanded!==s.expanded&&this.setState({expanded:s.expanded})}toggleCollapsed=()=>{this.props.onToggle&&this.props.onToggle(this.props.modelName,!this.state.expanded),this.setState({expanded:!this.state.expanded})};onLoad=s=>{if(s&&this.props.layoutSelectors){const o=this.props.layoutSelectors.getScrollToKey();We().is(o,this.props.specPath)&&this.toggleCollapsed(),this.props.layoutActions.readyToScroll(this.props.specPath,s.parentElement)}};render(){const{title:s,classes:o}=this.props;return this.state.expanded&&this.props.hideSelfOnExpand?Re.createElement("span",{className:o||""},this.props.children):Re.createElement("span",{className:o||"",ref:this.onLoad},Re.createElement("button",{"aria-expanded":this.state.expanded,className:"model-box-control",onClick:this.toggleCollapsed},s&&Re.createElement("span",{className:"pointer"},s),Re.createElement("span",{className:"model-toggle"+(this.state.expanded?"":" collapsed")}),!this.state.expanded&&Re.createElement("span",null,this.state.collapsedContent)),this.state.expanded&&this.props.children)}}const useTabs=({initialTab:s,isExecute:o,schema:i,example:a})=>{const u=(0,Re.useMemo)((()=>({example:"example",model:"model"})),[]),_=(0,Re.useMemo)((()=>Object.keys(u)),[u]).includes(s)&&i&&!o?s:u.example,w=(s=>{const o=(0,Re.useRef)();return(0,Re.useEffect)((()=>{o.current=s})),o.current})(o),[x,C]=(0,Re.useState)(_),j=(0,Re.useCallback)((s=>{C(s.target.dataset.name)}),[]);return(0,Re.useEffect)((()=>{w&&!o&&a&&C(u.example)}),[w,o,a]),{activeTab:x,onTabChange:j,tabs:u}},model_example=({schema:s,example:o,isExecute:i=!1,specPath:a,includeWriteOnly:u=!1,includeReadOnly:_=!1,getComponent:w,getConfigs:x,specSelectors:C})=>{const{defaultModelRendering:j,defaultModelExpandDepth:L}=x(),B=w("ModelWrapper"),$=w("HighlightCode",!0),U=xt()(5).toString("base64"),V=xt()(5).toString("base64"),z=xt()(5).toString("base64"),Y=xt()(5).toString("base64"),Z=C.isOAS3(),{activeTab:ee,tabs:ie,onTabChange:ae}=useTabs({initialTab:j,isExecute:i,schema:s,example:o});return Re.createElement("div",{className:"model-example"},Re.createElement("ul",{className:"tab",role:"tablist"},Re.createElement("li",{className:Jn()("tabitem",{active:ee===ie.example}),role:"presentation"},Re.createElement("button",{"aria-controls":V,"aria-selected":ee===ie.example,className:"tablinks","data-name":"example",id:U,onClick:ae,role:"tab"},i?"Edit Value":"Example Value")),s&&Re.createElement("li",{className:Jn()("tabitem",{active:ee===ie.model}),role:"presentation"},Re.createElement("button",{"aria-controls":Y,"aria-selected":ee===ie.model,className:Jn()("tablinks",{inactive:i}),"data-name":"model",id:z,onClick:ae,role:"tab"},Z?"Schema":"Model"))),ee===ie.example&&Re.createElement("div",{"aria-hidden":ee!==ie.example,"aria-labelledby":U,"data-name":"examplePanel",id:V,role:"tabpanel",tabIndex:"0"},o||Re.createElement($,null,"(no example available")),ee===ie.model&&Re.createElement("div",{className:"model-container","aria-hidden":ee===ie.example,"aria-labelledby":z,"data-name":"modelPanel",id:Y,role:"tabpanel",tabIndex:"0"},Re.createElement(B,{schema:s,getComponent:w,getConfigs:x,specSelectors:C,expandDepth:L,specPath:a,includeReadOnly:_,includeWriteOnly:u})))};class ModelWrapper extends Re.Component{onToggle=(s,o)=>{this.props.layoutActions&&this.props.layoutActions.show(this.props.fullPath,o)};render(){let{getComponent:s,getConfigs:o}=this.props;const i=s("Model");let a;return this.props.layoutSelectors&&(a=this.props.layoutSelectors.isShown(this.props.fullPath)),Re.createElement("div",{className:"model-box"},Re.createElement(i,Mn()({},this.props,{getConfigs:o,expanded:a,depth:1,onToggle:this.onToggle,expandDepth:this.props.expandDepth||0})))}}function _typeof(s){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(s){return typeof s}:function(s){return s&&"function"==typeof Symbol&&s.constructor===Symbol&&s!==Symbol.prototype?"symbol":typeof s},_typeof(s)}function _defineProperties(s,o){for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=function createChecker(s,o){return function(i){if("string"==typeof i)return(0,ze.is)(o[i],s[i]);if(Array.isArray(i))return(0,ze.is)(getIn(o,i),getIn(s,i));throw new TypeError("Invalid key: expected Array or string: "+i)}}(o,i),u=s||Object.keys(function _objectSpread2(s){for(var o=1;o1&&void 0!==arguments[1]?arguments[1]:{};return!check(this.updateOnProps,this.props,s,"updateOnProps")||!check(this.updateOnStates,this.state,o,"updateOnStates")}}]),ImmutablePureComponent}(Re.Component);var Qn,Zn=__webpack_require__(5556),es=__webpack_require__.n(Zn);function _extends(){return _extends=Object.assign?Object.assign.bind():function(s){for(var o=1;oRe.createElement("svg",_extends({xmlns:"http://www.w3.org/2000/svg",width:200,height:200,className:"rolling-load_svg__lds-rolling",preserveAspectRatio:"xMidYMid",style:{backgroundImage:"none",backgroundPosition:"initial initial",backgroundRepeat:"initial initial"},viewBox:"0 0 100 100"},s),Qn||(Qn=Re.createElement("circle",{cx:50,cy:50,r:35,fill:"none",stroke:"#555",strokeDasharray:"164.93361431346415 56.97787143782138",strokeWidth:10},Re.createElement("animateTransform",{attributeName:"transform",begin:"0s",calcMode:"linear",dur:"1s",keyTimes:"0;1",repeatCount:"indefinite",type:"rotate",values:"0 50 50;360 50 50"})))),decodeRefName=s=>{const o=s.replace(/~1/g,"/").replace(/~0/g,"~");try{return decodeURIComponent(o)}catch{return o}};class Model extends Xn{static propTypes={schema:xn().map.isRequired,getComponent:es().func.isRequired,getConfigs:es().func.isRequired,specSelectors:es().object.isRequired,name:es().string,displayName:es().string,isRef:es().bool,required:es().bool,expandDepth:es().number,depth:es().number,specPath:xn().list.isRequired,includeReadOnly:es().bool,includeWriteOnly:es().bool};getModelName=s=>-1!==s.indexOf("#/definitions/")?decodeRefName(s.replace(/^.*#\/definitions\//,"")):-1!==s.indexOf("#/components/schemas/")?decodeRefName(s.replace(/^.*#\/components\/schemas\//,"")):void 0;getRefSchema=s=>{let{specSelectors:o}=this.props;return o.findDefinition(s)};render(){let{getComponent:s,getConfigs:o,specSelectors:i,schema:a,required:u,name:_,isRef:w,specPath:x,displayName:C,includeReadOnly:j,includeWriteOnly:L}=this.props;const B=s("ObjectModel"),$=s("ArrayModel"),U=s("PrimitiveModel");let V="object",z=a&&a.get("$$ref"),Y=a&&a.get("$ref");if(!_&&z&&(_=this.getModelName(z)),Y){const s=this.getModelName(Y),o=this.getRefSchema(s);ze.Map.isMap(o)?(a=o.mergeDeep(a),z||(a=a.set("$$ref",Y),z=Y)):ze.Map.isMap(a)&&1===a.size&&(a=null,_=Y)}if(!a)return Re.createElement("span",{className:"model model-title"},Re.createElement("span",{className:"model-title__text"},C||_),!Y&&Re.createElement(rolling_load,{height:"20px",width:"20px"}));const Z=i.isOAS3()&&a.get("deprecated");switch(w=void 0!==w?w:!!z,V=a&&a.get("type")||V,V){case"object":return Re.createElement(B,Mn()({className:"object"},this.props,{specPath:x,getConfigs:o,schema:a,name:_,deprecated:Z,isRef:w,includeReadOnly:j,includeWriteOnly:L}));case"array":return Re.createElement($,Mn()({className:"array"},this.props,{getConfigs:o,schema:a,name:_,deprecated:Z,required:u,includeReadOnly:j,includeWriteOnly:L}));default:return Re.createElement(U,Mn()({},this.props,{getComponent:s,getConfigs:o,schema:a,name:_,deprecated:Z,required:u}))}}}class Models extends Re.Component{getSchemaBasePath=()=>this.props.specSelectors.isOAS3()?["components","schemas"]:["definitions"];getCollapsedContent=()=>" ";handleToggle=(s,o)=>{const{layoutActions:i}=this.props;i.show([...this.getSchemaBasePath(),s],o),o&&this.props.specActions.requestResolvedSubtree([...this.getSchemaBasePath(),s])};onLoadModels=s=>{s&&this.props.layoutActions.readyToScroll(this.getSchemaBasePath(),s)};onLoadModel=s=>{if(s){const o=s.getAttribute("data-name");this.props.layoutActions.readyToScroll([...this.getSchemaBasePath(),o],s)}};render(){let{specSelectors:s,getComponent:o,layoutSelectors:i,layoutActions:a,getConfigs:u}=this.props,_=s.definitions(),{docExpansion:w,defaultModelsExpandDepth:x}=u();if(!_.size||x<0)return null;const C=this.getSchemaBasePath();let j=i.isShown(C,x>0&&"none"!==w);const L=s.isOAS3(),B=o("ModelWrapper"),$=o("Collapse"),U=o("ModelCollapse"),V=o("JumpToPath",!0),z=o("ArrowUpIcon"),Y=o("ArrowDownIcon");return Re.createElement("section",{className:j?"models is-open":"models",ref:this.onLoadModels},Re.createElement("h4",null,Re.createElement("button",{"aria-expanded":j,className:"models-control",onClick:()=>a.show(C,!j)},Re.createElement("span",null,L?"Schemas":"Models"),j?Re.createElement(z,null):Re.createElement(Y,null))),Re.createElement($,{isOpened:j},_.entrySeq().map((([_])=>{const w=[...C,_],j=We().List(w),L=s.specResolvedSubtree(w),$=s.specJson().getIn(w),z=ze.Map.isMap(L)?L:We().Map(),Y=ze.Map.isMap($)?$:We().Map(),Z=z.get("title")||Y.get("title")||_,ee=i.isShown(w,!1);ee&&0===z.size&&Y.size>0&&this.props.specActions.requestResolvedSubtree(w);const ie=Re.createElement(B,{name:_,expandDepth:x,schema:z||We().Map(),displayName:Z,fullPath:w,specPath:j,getComponent:o,specSelectors:s,getConfigs:u,layoutSelectors:i,layoutActions:a,includeReadOnly:!0,includeWriteOnly:!0}),ae=Re.createElement("span",{className:"model-box"},Re.createElement("span",{className:"model model-title"},Z));return Re.createElement("div",{id:`model-${_}`,className:"model-container",key:`models-section-${_}`,"data-name":_,ref:this.onLoadModel},Re.createElement("span",{className:"models-jump-to-path"},Re.createElement(V,{path:j})),Re.createElement(U,{classes:"model-box",collapsedContent:this.getCollapsedContent(_),onToggle:this.handleToggle,title:ae,displayName:Z,modelName:_,specPath:j,layoutSelectors:i,layoutActions:a,hideSelfOnExpand:!0,expanded:x>0&&ee},ie))})).toArray()))}}const enum_model=({value:s,getComponent:o})=>{let i=o("ModelCollapse"),a=Re.createElement("span",null,"Array [ ",s.count()," ]");return Re.createElement("span",{className:"prop-enum"},"Enum:",Re.createElement("br",null),Re.createElement(i,{collapsedContent:a},"[ ",s.map(String).join(", ")," ]"))};function isAbsoluteUrl(s){return s.match(/^(?:[a-z]+:)?\/\//i)}function buildBaseUrl(s,o){return s?isAbsoluteUrl(s)?function addProtocol(s){return s.match(/^\/\//i)?`${window.location.protocol}${s}`:s}(s):new URL(s,o).href:o}function safeBuildUrl(s,o,{selectedServer:i=""}={}){try{return function buildUrl(s,o,{selectedServer:i=""}={}){if(!s)return;if(isAbsoluteUrl(s))return s;const a=buildBaseUrl(i,o);return isAbsoluteUrl(a)?new URL(s,a).href:new URL(s,window.location.href).href}(s,o,{selectedServer:i})}catch{return}}function sanitizeUrl(s){if("string"!=typeof s||""===s.trim())return"";const o=s.trim(),i="about:blank";try{const s=`https://base${String(Math.random()).slice(2)}`,a=new URL(o,s),u=a.protocol.slice(0,-1);if(["javascript","data","vbscript"].includes(u.toLowerCase()))return i;if(a.origin===s){if(o.startsWith("/"))return`${a.pathname}${a.search}${a.hash}`;if(o.startsWith("./")||o.startsWith("../")){const s=o.match(/^(\.\.?\/)+/)[0];return`${s}${a.pathname.substring(1)}${a.search}${a.hash}`}return`${a.pathname.substring(1)}${a.search}${a.hash}`}return String(a)}catch{return i}}class ObjectModel extends Re.Component{render(){let{schema:s,name:o,displayName:i,isRef:a,getComponent:u,getConfigs:_,depth:w,onToggle:x,expanded:C,specPath:j,...L}=this.props,{specSelectors:B,expandDepth:$,includeReadOnly:U,includeWriteOnly:V}=L;const{isOAS3:z}=B,Y=w>2||2===w&&"items"!==j.last();if(!s)return null;const{showExtensions:Z}=_(),ee=Z?getExtensions(s):(0,ze.List)();let ie=s.get("description"),ae=s.get("properties"),ce=s.get("additionalProperties"),le=s.get("title")||i||o,pe=s.get("required"),de=s.filter(((s,o)=>-1!==["maxProperties","minProperties","nullable","example"].indexOf(o))),fe=s.get("deprecated"),ye=s.getIn(["externalDocs","url"]),be=s.getIn(["externalDocs","description"]);const _e=u("JumpToPath",!0),Se=u("Markdown",!0),we=u("Model"),xe=u("ModelCollapse"),Pe=u("Property"),Te=u("Link"),$e=u("ModelExtensions"),JumpToPathSection=()=>Re.createElement("span",{className:"model-jump-to-path"},Re.createElement(_e,{path:j})),qe=Re.createElement("span",null,Re.createElement("span",null,"{"),"...",Re.createElement("span",null,"}"),a?Re.createElement(JumpToPathSection,null):""),We=B.isOAS3()?s.get("allOf"):null,He=B.isOAS3()?s.get("anyOf"):null,Ye=B.isOAS3()?s.get("oneOf"):null,Xe=B.isOAS3()?s.get("not"):null,Qe=le&&Re.createElement("span",{className:"model-title"},a&&s.get("$$ref")&&Re.createElement("span",{className:Jn()("model-hint",{"model-hint--embedded":Y})},s.get("$$ref")),Re.createElement("span",{className:"model-title__text"},le));return Re.createElement("span",{className:"model"},Re.createElement(xe,{modelName:o,title:Qe,onToggle:x,expanded:!!C||w<=$,collapsedContent:qe},Re.createElement("span",{className:"brace-open object"},"{"),a?Re.createElement(JumpToPathSection,null):null,Re.createElement("span",{className:"inner-object"},Re.createElement("table",{className:"model"},Re.createElement("tbody",null,ie?Re.createElement("tr",{className:"description"},Re.createElement("td",null,"description:"),Re.createElement("td",null,Re.createElement(Se,{source:ie}))):null,ye&&Re.createElement("tr",{className:"external-docs"},Re.createElement("td",null,"externalDocs:"),Re.createElement("td",null,Re.createElement(Te,{target:"_blank",href:sanitizeUrl(ye)},be||ye))),fe?Re.createElement("tr",{className:"property"},Re.createElement("td",null,"deprecated:"),Re.createElement("td",null,"true")):null,ae&&ae.size?ae.entrySeq().filter((([,s])=>(!s.get("readOnly")||U)&&(!s.get("writeOnly")||V))).map((([s,i])=>{let a=z()&&i.get("deprecated"),x=ze.List.isList(pe)&&pe.contains(s),C=["property-row"];return a&&C.push("deprecated"),x&&C.push("required"),Re.createElement("tr",{key:s,className:C.join(" ")},Re.createElement("td",null,s,x&&Re.createElement("span",{className:"star"},"*")),Re.createElement("td",null,Re.createElement(we,Mn()({key:`object-${o}-${s}_${i}`},L,{required:x,getComponent:u,specPath:j.push("properties",s),getConfigs:_,schema:i,depth:w+1}))))})).toArray():null,0===ee.size?null:Re.createElement(Re.Fragment,null,Re.createElement("tr",null,Re.createElement("td",null," ")),Re.createElement($e,{extensions:ee,propClass:"extension"})),ce&&ce.size?Re.createElement("tr",null,Re.createElement("td",null,"< * >:"),Re.createElement("td",null,Re.createElement(we,Mn()({},L,{required:!1,getComponent:u,specPath:j.push("additionalProperties"),getConfigs:_,schema:ce,depth:w+1})))):null,We?Re.createElement("tr",null,Re.createElement("td",null,"allOf ->"),Re.createElement("td",null,We.map(((s,o)=>Re.createElement("div",{key:o},Re.createElement(we,Mn()({},L,{required:!1,getComponent:u,specPath:j.push("allOf",o),getConfigs:_,schema:s,depth:w+1}))))))):null,He?Re.createElement("tr",null,Re.createElement("td",null,"anyOf ->"),Re.createElement("td",null,He.map(((s,o)=>Re.createElement("div",{key:o},Re.createElement(we,Mn()({},L,{required:!1,getComponent:u,specPath:j.push("anyOf",o),getConfigs:_,schema:s,depth:w+1}))))))):null,Ye?Re.createElement("tr",null,Re.createElement("td",null,"oneOf ->"),Re.createElement("td",null,Ye.map(((s,o)=>Re.createElement("div",{key:o},Re.createElement(we,Mn()({},L,{required:!1,getComponent:u,specPath:j.push("oneOf",o),getConfigs:_,schema:s,depth:w+1}))))))):null,Xe?Re.createElement("tr",null,Re.createElement("td",null,"not ->"),Re.createElement("td",null,Re.createElement("div",null,Re.createElement(we,Mn()({},L,{required:!1,getComponent:u,specPath:j.push("not"),getConfigs:_,schema:Xe,depth:w+1}))))):null))),Re.createElement("span",{className:"brace-close"},"}")),de.size?de.entrySeq().map((([s,o])=>Re.createElement(Pe,{key:`${s}-${o}`,propKey:s,propVal:o,propClass:"property"}))):null)}}class ArrayModel extends Re.Component{render(){let{getComponent:s,getConfigs:o,schema:i,depth:a,expandDepth:u,name:_,displayName:w,specPath:x}=this.props,C=i.get("description"),j=i.get("items"),L=i.get("title")||w||_,B=i.filter(((s,o)=>-1===["type","items","description","$$ref","externalDocs"].indexOf(o))),$=i.getIn(["externalDocs","url"]),U=i.getIn(["externalDocs","description"]);const V=s("Markdown",!0),z=s("ModelCollapse"),Y=s("Model"),Z=s("Property"),ee=s("Link"),ie=L&&Re.createElement("span",{className:"model-title"},Re.createElement("span",{className:"model-title__text"},L));return Re.createElement("span",{className:"model"},Re.createElement(z,{title:ie,expanded:a<=u,collapsedContent:"[...]"},"[",B.size?B.entrySeq().map((([s,o])=>Re.createElement(Z,{key:`${s}-${o}`,propKey:s,propVal:o,propClass:"property"}))):null,C?Re.createElement(V,{source:C}):B.size?Re.createElement("div",{className:"markdown"}):null,$&&Re.createElement("div",{className:"external-docs"},Re.createElement(ee,{target:"_blank",href:sanitizeUrl($)},U||$)),Re.createElement("span",null,Re.createElement(Y,Mn()({},this.props,{getConfigs:o,specPath:x.push("items"),name:null,schema:j,required:!1,depth:a+1}))),"]"))}}const ts="property primitive";class Primitive extends Re.Component{render(){let{schema:s,getComponent:o,getConfigs:i,name:a,displayName:u,depth:_,expandDepth:w}=this.props;const{showExtensions:x}=i();if(!s||!s.get)return Re.createElement("div",null);let C=s.get("type"),j=s.get("format"),L=s.get("xml"),B=s.get("enum"),$=s.get("title")||u||a,U=s.get("description");const V=getExtensions(s);let z=s.filter(((s,o)=>-1===["enum","type","format","description","$$ref","externalDocs"].indexOf(o))).filterNot(((s,o)=>V.has(o))),Y=s.getIn(["externalDocs","url"]),Z=s.getIn(["externalDocs","description"]);const ee=o("Markdown",!0),ie=o("EnumModel"),ae=o("Property"),ce=o("ModelCollapse"),le=o("Link"),pe=o("ModelExtensions"),de=$&&Re.createElement("span",{className:"model-title"},Re.createElement("span",{className:"model-title__text"},$));return Re.createElement("span",{className:"model"},Re.createElement(ce,{title:de,expanded:_<=w,collapsedContent:"[...]"},Re.createElement("span",{className:"prop"},a&&_>1&&Re.createElement("span",{className:"prop-name"},$),Re.createElement("span",{className:"prop-type"},C),j&&Re.createElement("span",{className:"prop-format"},"($",j,")"),z.size?z.entrySeq().map((([s,o])=>Re.createElement(ae,{key:`${s}-${o}`,propKey:s,propVal:o,propClass:ts}))):null,x&&V.size>0?Re.createElement(pe,{extensions:V,propClass:`${ts} extension`}):null,U?Re.createElement(ee,{source:U}):null,Y&&Re.createElement("div",{className:"external-docs"},Re.createElement(le,{target:"_blank",href:sanitizeUrl(Y)},Z||Y)),L&&L.size?Re.createElement("span",null,Re.createElement("br",null),Re.createElement("span",{className:ts},"xml:"),L.entrySeq().map((([s,o])=>Re.createElement("span",{key:`${s}-${o}`,className:ts},Re.createElement("br",null),"   ",s,": ",String(o)))).toArray()):null,B&&Re.createElement(ie,{value:B,getComponent:o}))))}}class Schemes extends Re.Component{UNSAFE_componentWillMount(){let{schemes:s}=this.props;this.setScheme(s.first())}UNSAFE_componentWillReceiveProps(s){this.props.currentScheme&&s.schemes.includes(this.props.currentScheme)||this.setScheme(s.schemes.first())}onChange=s=>{this.setScheme(s.target.value)};setScheme=s=>{let{path:o,method:i,specActions:a}=this.props;a.setScheme(s,o,i)};render(){let{schemes:s,currentScheme:o}=this.props;return Re.createElement("label",{htmlFor:"schemes"},Re.createElement("span",{className:"schemes-title"},"Schemes"),Re.createElement("select",{onChange:this.onChange,value:o,id:"schemes"},s.valueSeq().map((s=>Re.createElement("option",{value:s,key:s},s))).toArray()))}}class SchemesContainer extends Re.Component{render(){const{specActions:s,specSelectors:o,getComponent:i}=this.props,a=o.operationScheme(),u=o.schemes(),_=i("schemes");return u&&u.size?Re.createElement(_,{currentScheme:a,schemes:u,specActions:s}):null}}var rs=__webpack_require__(24677),ns=__webpack_require__.n(rs);const ss={value:"",onChange:()=>{},schema:{},keyName:"",required:!1,errors:(0,ze.List)()};class JsonSchemaForm extends Re.Component{static defaultProps=ss;componentDidMount(){const{dispatchInitialValue:s,value:o,onChange:i}=this.props;s?i(o):!1===s&&i("")}render(){let{schema:s,errors:o,value:i,onChange:a,getComponent:u,fn:_,disabled:w}=this.props;const x=s&&s.get?s.get("format"):null,C=s&&s.get?s.get("type"):null,j=_.getSchemaObjectType(s),L=_.isFileUploadIntended(s);let getComponentSilently=s=>u(s,!1,{failSilently:!0}),B=C?getComponentSilently(x?`JsonSchema_${C}_${x}`:`JsonSchema_${C}`):u("JsonSchema_string");return L||!ze.List.isList(C)||"array"!==j&&"object"!==j||(B=u("JsonSchema_object")),B||(B=u("JsonSchema_string")),Re.createElement(B,Mn()({},this.props,{errors:o,fn:_,getComponent:u,value:i,onChange:a,schema:s,disabled:w}))}}class JsonSchema_string extends Re.Component{static defaultProps=ss;onChange=s=>{const o=this.props.schema&&"file"===this.props.schema.get("type")?s.target.files[0]:s.target.value;this.props.onChange(o,this.props.keyName)};onEnumChange=s=>this.props.onChange(s);render(){let{getComponent:s,value:o,schema:i,errors:a,required:u,description:_,disabled:w}=this.props;const x=i&&i.get?i.get("enum"):null,C=i&&i.get?i.get("format"):null,j=i&&i.get?i.get("type"):null,L=i&&i.get?i.get("in"):null;if(o?(isImmutable(o)||"object"==typeof o)&&(o=stringify(o)):o="",a=a.toJS?a.toJS():[],x){const i=s("Select");return Re.createElement(i,{className:a.length?"invalid":"",title:a.length?a:"",allowedValues:[...x],value:o,allowEmptyValue:!u,disabled:w,onChange:this.onEnumChange})}const B=w||L&&"formData"===L&&!("FormData"in window),$=s("Input");return j&&"file"===j?Re.createElement($,{type:"file",className:a.length?"invalid":"",title:a.length?a:"",onChange:this.onChange,disabled:B}):Re.createElement(ns(),{type:C&&"password"===C?"password":"text",className:a.length?"invalid":"",title:a.length?a:"",value:o,minLength:0,debounceTimeout:350,placeholder:_,onChange:this.onChange,disabled:B})}}class JsonSchema_array extends Re.PureComponent{static defaultProps=ss;constructor(s,o){super(s,o),this.state={value:valueOrEmptyList(s.value),schema:s.schema}}UNSAFE_componentWillReceiveProps(s){const o=valueOrEmptyList(s.value);o!==this.state.value&&this.setState({value:o}),s.schema!==this.state.schema&&this.setState({schema:s.schema})}onChange=()=>{this.props.onChange(this.state.value)};onItemChange=(s,o)=>{this.setState((({value:i})=>({value:i.set(o,s)})),this.onChange)};removeItem=s=>{this.setState((({value:o})=>({value:o.delete(s)})),this.onChange)};addItem=()=>{const{fn:s}=this.props;let o=valueOrEmptyList(this.state.value);this.setState((()=>({value:o.push(s.getSampleSchema(this.state.schema.get("items"),!1,{includeWriteOnly:!0}))})),this.onChange)};onEnumChange=s=>{this.setState((()=>({value:s})),this.onChange)};render(){let{getComponent:s,required:o,schema:i,errors:a,fn:u,disabled:_}=this.props;a=a.toJS?a.toJS():Array.isArray(a)?a:[];const w=a.filter((s=>"string"==typeof s)),x=a.filter((s=>void 0!==s.needRemove)).map((s=>s.error)),C=this.state.value,j=!!(C&&C.count&&C.count()>0),L=i.getIn(["items","enum"]),B=i.get("items"),$=u.getSchemaObjectType(B),U=u.getSchemaObjectTypeLabel(B),V=i.getIn(["items","format"]),z=i.get("items");let Y,Z=!1,ee="file"===$||"string"===$&&"binary"===V;if($&&V?Y=s(`JsonSchema_${$}_${V}`):"boolean"!==$&&"array"!==$&&"object"!==$||(Y=s(`JsonSchema_${$}`)),!ze.List.isList(B?.get("type"))||"array"!==$&&"object"!==$||(Y=s("JsonSchema_object")),Y||ee||(Z=!0),L){const i=s("Select");return Re.createElement(i,{className:a.length?"invalid":"",title:a.length?a:"",multiple:!0,value:C,disabled:_,allowedValues:L,allowEmptyValue:!o,onChange:this.onEnumChange})}const ie=s("Button");return Re.createElement("div",{className:"json-schema-array"},j?C.map(((o,i)=>{const w=(0,ze.fromJS)([...a.filter((s=>s.index===i)).map((s=>s.error))]);return Re.createElement("div",{key:i,className:"json-schema-form-item"},ee?Re.createElement(JsonSchemaArrayItemFile,{value:o,onChange:s=>this.onItemChange(s,i),disabled:_,errors:w,getComponent:s}):Z?Re.createElement(JsonSchemaArrayItemText,{value:o,onChange:s=>this.onItemChange(s,i),disabled:_,errors:w}):Re.createElement(Y,Mn()({},this.props,{value:o,onChange:s=>this.onItemChange(s,i),disabled:_,errors:w,schema:z,getComponent:s,fn:u})),_?null:Re.createElement(ie,{className:`btn btn-sm json-schema-form-item-remove ${x.length?"invalid":null}`,title:x.length?x:"",onClick:()=>this.removeItem(i)}," - "))})):null,_?null:Re.createElement(ie,{className:`btn btn-sm json-schema-form-item-add ${w.length?"invalid":null}`,title:w.length?w:"",onClick:this.addItem},"Add ",U," item"))}}class JsonSchemaArrayItemText extends Re.Component{static defaultProps=ss;onChange=s=>{const o=s.target.value;this.props.onChange(o,this.props.keyName)};render(){let{value:s,errors:o,description:i,disabled:a}=this.props;return s?(isImmutable(s)||"object"==typeof s)&&(s=stringify(s)):s="",o=o.toJS?o.toJS():[],Re.createElement(ns(),{type:"text",className:o.length?"invalid":"",title:o.length?o:"",value:s,minLength:0,debounceTimeout:350,placeholder:i,onChange:this.onChange,disabled:a})}}class JsonSchemaArrayItemFile extends Re.Component{static defaultProps=ss;onFileChange=s=>{const o=s.target.files[0];this.props.onChange(o,this.props.keyName)};render(){let{getComponent:s,errors:o,disabled:i}=this.props;const a=s("Input"),u=i||!("FormData"in window);return Re.createElement(a,{type:"file",className:o.length?"invalid":"",title:o.length?o:"",onChange:this.onFileChange,disabled:u})}}class JsonSchema_boolean extends Re.Component{static defaultProps=ss;onEnumChange=s=>this.props.onChange(s);render(){let{getComponent:s,value:o,errors:i,schema:a,required:u,disabled:_}=this.props;i=i.toJS?i.toJS():[];let w=a&&a.get?a.get("enum"):null,x=!w||!u,C=!w&&["true","false"];const j=s("Select");return Re.createElement(j,{className:i.length?"invalid":"",title:i.length?i:"",value:String(o),disabled:_,allowedValues:w?[...w]:C,allowEmptyValue:x,onChange:this.onEnumChange})}}const stringifyObjectErrors=s=>s.map((s=>{const o=void 0!==s.propKey?s.propKey:s.index;let i="string"==typeof s?s:"string"==typeof s.error?s.error:null;if(!o&&i)return i;let a=s.error,u=`/${s.propKey}`;for(;"object"==typeof a;){const s=void 0!==a.propKey?a.propKey:a.index;if(void 0===s)break;if(u+=`/${s}`,!a.error)break;a=a.error}return`${u}: ${a}`}));class JsonSchema_object extends Re.PureComponent{constructor(){super()}static defaultProps=ss;onChange=s=>{this.props.onChange(s)};handleOnChange=s=>{const o=s.target.value;this.onChange(o)};render(){let{getComponent:s,value:o,errors:i,disabled:a}=this.props;const u=s("TextArea");return i=i.toJS?i.toJS():Array.isArray(i)?i:[],Re.createElement("div",null,Re.createElement(u,{className:Jn()({invalid:i.length}),title:i.length?stringifyObjectErrors(i).join(", "):"",value:stringify(o),disabled:a,onChange:this.handleOnChange}))}}function valueOrEmptyList(s){return ze.List.isList(s)?s:Array.isArray(s)?(0,ze.fromJS)(s):(0,ze.List)()}const ModelExtensions=({extensions:s,propClass:o=""})=>s.entrySeq().map((([s,i])=>{const a=immutableToJS(i)??null;return Re.createElement("tr",{key:s,className:o},Re.createElement("td",null,s),Re.createElement("td",null,JSON.stringify(a)))})).toArray();var os=__webpack_require__(11331),as=__webpack_require__.n(os);const hasSchemaType=(s,o)=>{const i=ze.Map.isMap(s);if(!i&&!as()(s))return!1;const a=i?s.get("type"):s.type;return o===a||Array.isArray(o)&&o.includes(a)},getType=(s,o=new WeakSet)=>{if(null==s)return"any";if(o.has(s))return"any";o.add(s);const{type:i,items:a}=s;return Object.hasOwn(s,"items")?(()=>{if(a)return`array<${getType(a,o)}>`;return"array"})():i},getSchemaObjectTypeLabel=s=>getType(immutableToJS(s)),json_schema_5=()=>({components:{modelExample:model_example,ModelWrapper,ModelCollapse,Model,Models,EnumModel:enum_model,ObjectModel,ArrayModel,PrimitiveModel:Primitive,ModelExtensions,schemes:Schemes,SchemesContainer,...U},fn:{hasSchemaType,getSchemaObjectTypeLabel}});var cs=__webpack_require__(19123),ls=__webpack_require__.n(cs),us=__webpack_require__(41859),ps=__webpack_require__.n(us),hs=__webpack_require__(62193),ds=__webpack_require__.n(hs);const shallowArrayEquals=s=>o=>Array.isArray(s)&&Array.isArray(o)&&s.length===o.length&&s.every(((s,i)=>s===o[i])),list=(...s)=>s;class Cache extends Map{delete(s){const o=Array.from(this.keys()).find(shallowArrayEquals(s));return super.delete(o)}get(s){const o=Array.from(this.keys()).find(shallowArrayEquals(s));return super.get(o)}has(s){return-1!==Array.from(this.keys()).findIndex(shallowArrayEquals(s))}}const utils_memoizeN=(s,o=list)=>{const{Cache:i}=pt();pt().Cache=Cache;const a=pt()(s,o);return pt().Cache=i,a},fs={string:s=>s.pattern?(s=>{try{const o=/(?<=(?"user@example.com","string_date-time":()=>(new Date).toISOString(),string_date:()=>(new Date).toISOString().substring(0,10),string_time:()=>(new Date).toISOString().substring(11),string_uuid:()=>"3fa85f64-5717-4562-b3fc-2c963f66afa6",string_hostname:()=>"example.com",string_ipv4:()=>"198.51.100.42",string_ipv6:()=>"2001:0db8:5b96:0000:0000:426f:8e17:642a",number:()=>0,number_float:()=>0,integer:()=>0,boolean:s=>"boolean"!=typeof s.default||s.default},primitive=s=>{s=objectify(s);let{type:o,format:i}=s,a=fs[`${o}_${i}`]||fs[o];return isFunc(a)?a(s):"Unknown Type: "+s.type},sanitizeRef=s=>deeplyStripKey(s,"$$ref",(s=>"string"==typeof s&&s.indexOf("#")>-1)),ms=["maxProperties","minProperties"],gs=["minItems","maxItems"],ys=["minimum","maximum","exclusiveMinimum","exclusiveMaximum"],vs=["minLength","maxLength"],mergeJsonSchema=(s,o,i={})=>{const a={...s};if(["example","default","enum","xml","type",...ms,...gs,...ys,...vs].forEach((s=>(s=>{void 0===a[s]&&void 0!==o[s]&&(a[s]=o[s])})(s))),void 0!==o.required&&Array.isArray(o.required)&&(void 0!==a.required&&a.required.length||(a.required=[]),o.required.forEach((s=>{a.required.includes(s)||a.required.push(s)}))),o.properties){a.properties||(a.properties={});let s=objectify(o.properties);for(let u in s)Object.prototype.hasOwnProperty.call(s,u)&&(s[u]&&s[u].deprecated||s[u]&&s[u].readOnly&&!i.includeReadOnly||s[u]&&s[u].writeOnly&&!i.includeWriteOnly||a.properties[u]||(a.properties[u]=s[u],!o.required&&Array.isArray(o.required)&&-1!==o.required.indexOf(u)&&(a.required?a.required.push(u):a.required=[u])))}return o.items&&(a.items||(a.items={}),a.items=mergeJsonSchema(a.items,o.items,i)),a},sampleFromSchemaGeneric=(s,o={},i=void 0,a=!1)=>{s&&isFunc(s.toJS)&&(s=s.toJS());let u=void 0!==i||s&&void 0!==s.example||s&&void 0!==s.default;const _=!u&&s&&s.oneOf&&s.oneOf.length>0,w=!u&&s&&s.anyOf&&s.anyOf.length>0;if(!u&&(_||w)){const i=objectify(_?s.oneOf[0]:s.anyOf[0]);if(!(s=mergeJsonSchema(s,i,o)).xml&&i.xml&&(s.xml=i.xml),void 0!==s.example&&void 0!==i.example)u=!0;else if(i.properties){s.properties||(s.properties={});let a=objectify(i.properties);for(let u in a)Object.prototype.hasOwnProperty.call(a,u)&&(a[u]&&a[u].deprecated||a[u]&&a[u].readOnly&&!o.includeReadOnly||a[u]&&a[u].writeOnly&&!o.includeWriteOnly||s.properties[u]||(s.properties[u]=a[u],!i.required&&Array.isArray(i.required)&&-1!==i.required.indexOf(u)&&(s.required?s.required.push(u):s.required=[u])))}}const x={};let{xml:C,type:j,example:L,properties:B,additionalProperties:$,items:U}=s||{},{includeReadOnly:V,includeWriteOnly:z}=o;C=C||{};let Y,{name:Z,prefix:ee,namespace:ie}=C,ae={};if(a&&(Z=Z||"notagname",Y=(ee?ee+":":"")+Z,ie)){x[ee?"xmlns:"+ee:"xmlns"]=ie}a&&(ae[Y]=[]);const schemaHasAny=o=>o.some((o=>Object.prototype.hasOwnProperty.call(s,o)));s&&!j&&(B||$||schemaHasAny(ms)?j="object":U||schemaHasAny(gs)?j="array":schemaHasAny(ys)?(j="number",s.type="number"):u||s.enum||(j="string",s.type="string"));const handleMinMaxItems=o=>{if(null!=s?.maxItems&&(o=o.slice(0,s?.maxItems)),null!=s?.minItems){let i=0;for(;o.lengths&&null!==s.maxProperties&&void 0!==s.maxProperties&&pe>=s.maxProperties,canAddProperty=o=>!s||null===s.maxProperties||void 0===s.maxProperties||!hasExceededMaxProperties()&&(!(o=>!(s&&s.required&&s.required.length&&s.required.includes(o)))(o)||s.maxProperties-pe-(()=>{if(!s||!s.required)return 0;let o=0;return a?s.required.forEach((s=>o+=void 0===ae[s]?0:1)):s.required.forEach((s=>o+=void 0===ae[Y]?.find((o=>void 0!==o[s]))?0:1)),s.required.length-o})()>0);if(le=a?(i,u=void 0)=>{if(s&&ce[i]){if(ce[i].xml=ce[i].xml||{},ce[i].xml.attribute){const s=Array.isArray(ce[i].enum)?ce[i].enum[0]:void 0,o=ce[i].example,a=ce[i].default;return void(x[ce[i].xml.name||i]=void 0!==o?o:void 0!==a?a:void 0!==s?s:primitive(ce[i]))}ce[i].xml.name=ce[i].xml.name||i}else ce[i]||!1===$||(ce[i]={xml:{name:i}});let _=sampleFromSchemaGeneric(s&&ce[i]||void 0,o,u,a);canAddProperty(i)&&(pe++,Array.isArray(_)?ae[Y]=ae[Y].concat(_):ae[Y].push(_))}:(i,u)=>{if(canAddProperty(i)){if(Object.prototype.hasOwnProperty.call(s,"discriminator")&&s.discriminator&&Object.prototype.hasOwnProperty.call(s.discriminator,"mapping")&&s.discriminator.mapping&&Object.prototype.hasOwnProperty.call(s,"$$ref")&&s.$$ref&&s.discriminator.propertyName===i){for(let o in s.discriminator.mapping)if(-1!==s.$$ref.search(s.discriminator.mapping[o])){ae[i]=o;break}}else ae[i]=sampleFromSchemaGeneric(ce[i],o,u,a);pe++}},u){let u;if(u=sanitizeRef(void 0!==i?i:void 0!==L?L:s.default),!a){if("number"==typeof u&&"string"===j)return`${u}`;if("string"!=typeof u||"string"===j)return u;try{return JSON.parse(u)}catch(s){return u}}if(s||(j=Array.isArray(u)?"array":typeof u),"array"===j){if(!Array.isArray(u)){if("string"==typeof u)return u;u=[u]}const i=s?s.items:void 0;i&&(i.xml=i.xml||C||{},i.xml.name=i.xml.name||C.name);let _=u.map((s=>sampleFromSchemaGeneric(i,o,s,a)));return _=handleMinMaxItems(_),C.wrapped?(ae[Y]=_,ds()(x)||ae[Y].push({_attr:x})):ae=_,ae}if("object"===j){if("string"==typeof u)return u;for(let o in u)Object.prototype.hasOwnProperty.call(u,o)&&(s&&ce[o]&&ce[o].readOnly&&!V||s&&ce[o]&&ce[o].writeOnly&&!z||(s&&ce[o]&&ce[o].xml&&ce[o].xml.attribute?x[ce[o].xml.name||o]=u[o]:le(o,u[o])));return ds()(x)||ae[Y].push({_attr:x}),ae}return ae[Y]=ds()(x)?u:[{_attr:x},u],ae}if("object"===j){for(let s in ce)Object.prototype.hasOwnProperty.call(ce,s)&&(ce[s]&&ce[s].deprecated||ce[s]&&ce[s].readOnly&&!V||ce[s]&&ce[s].writeOnly&&!z||le(s));if(a&&x&&ae[Y].push({_attr:x}),hasExceededMaxProperties())return ae;if(!0===$)a?ae[Y].push({additionalProp:"Anything can be here"}):ae.additionalProp1={},pe++;else if($){const i=objectify($),u=sampleFromSchemaGeneric(i,o,void 0,a);if(a&&i.xml&&i.xml.name&&"notagname"!==i.xml.name)ae[Y].push(u);else{const o=i["x-additionalPropertiesName"]||"additionalProp",_=null!==s.minProperties&&void 0!==s.minProperties&&pesampleFromSchemaGeneric(mergeJsonSchema(s,U,o),o,void 0,a)));else if(Array.isArray(U.oneOf))i=U.oneOf.map((s=>sampleFromSchemaGeneric(mergeJsonSchema(s,U,o),o,void 0,a)));else{if(!(!a||a&&C.wrapped))return sampleFromSchemaGeneric(U,o,void 0,a);i=[sampleFromSchemaGeneric(U,o,void 0,a)]}return i=handleMinMaxItems(i),a&&C.wrapped?(ae[Y]=i,ds()(x)||ae[Y].push({_attr:x}),ae):i}let de;if(s&&Array.isArray(s.enum))de=normalizeArray(s.enum)[0];else{if(!s)return;if(de=primitive(s),"number"==typeof de){let o=s.minimum;null!=o&&(s.exclusiveMinimum&&o++,de=o);let i=s.maximum;null!=i&&(s.exclusiveMaximum&&i--,de=i)}if("string"==typeof de&&(null!==s.maxLength&&void 0!==s.maxLength&&(de=de.slice(0,s.maxLength)),null!==s.minLength&&void 0!==s.minLength)){let o=0;for(;de.length(s.schema&&(s=s.schema),s.properties&&(s.type="object"),s),createXMLExample=(s,o,i)=>{const a=sampleFromSchemaGeneric(s,o,i,!0);if(a)return"string"==typeof a?a:ls()(a,{declaration:!0,indent:"\t"})},sampleFromSchema=(s,o,i)=>sampleFromSchemaGeneric(s,o,i,!1),resolver=(s,o,i)=>[s,JSON.stringify(o),JSON.stringify(i)],bs=utils_memoizeN(createXMLExample,resolver),_s=utils_memoizeN(sampleFromSchema,resolver),getSchemaObjectType=s=>immutableToJS(s)?.type??"string",Ss=[{when:/json/,shouldStringifyTypes:["string"]}],Es=["object"],get_json_sample_schema=s=>(o,i,a,u)=>{const{fn:_}=s(),w=_.memoizedSampleFromSchema(o,i,u),x=typeof w,C=Ss.reduce(((s,o)=>o.when.test(a)?[...s,...o.shouldStringifyTypes]:s),Es);return gt()(C,(s=>s===x))?JSON.stringify(w,null,2):w},get_yaml_sample_schema=s=>(o,i,a,u)=>{const{fn:_}=s(),w=_.getJsonSampleSchema(o,i,a,u);let x;try{x=fn.dump(fn.load(w),{lineWidth:-1},{schema:rn}),"\n"===x[x.length-1]&&(x=x.slice(0,x.length-1))}catch(s){return console.error(s),"error: could not generate yaml example"}return x.replace(/\t/g," ")},get_xml_sample_schema=s=>(o,i,a)=>{const{fn:u}=s();if(o&&!o.xml&&(o.xml={}),o&&!o.xml.name){if(!o.$$ref&&(o.type||o.items||o.properties||o.additionalProperties))return'\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e';if(o.$$ref){let s=o.$$ref.match(/\S*\/(\S+)$/);o.xml.name=s[1]}}return u.memoizedCreateXMLExample(o,i,a)},get_sample_schema=s=>(o,i="",a={},u=void 0)=>{const{fn:_}=s();return"function"==typeof o?.toJS&&(o=o.toJS()),"function"==typeof u?.toJS&&(u=u.toJS()),/xml/.test(i)?_.getXmlSampleSchema(o,a,u):/(yaml|yml)/.test(i)?_.getYamlSampleSchema(o,a,i,u):_.getJsonSampleSchema(o,a,i,u)},json_schema_5_samples=({getSystem:s})=>{const o=get_json_sample_schema(s),i=get_yaml_sample_schema(s),a=get_xml_sample_schema(s),u=get_sample_schema(s);return{fn:{jsonSchema5:{inferSchema,sampleFromSchema,sampleFromSchemaGeneric,createXMLExample,memoizedSampleFromSchema:_s,memoizedCreateXMLExample:bs,getJsonSampleSchema:o,getYamlSampleSchema:i,getXmlSampleSchema:a,getSampleSchema:u,mergeJsonSchema},inferSchema,sampleFromSchema,sampleFromSchemaGeneric,createXMLExample,memoizedSampleFromSchema:_s,memoizedCreateXMLExample:bs,getJsonSampleSchema:o,getYamlSampleSchema:i,getXmlSampleSchema:a,getSampleSchema:u,mergeJsonSchema,getSchemaObjectType}}};var ws=__webpack_require__(37334),xs=__webpack_require__.n(ws);const ks=["get","put","post","delete","options","head","patch","trace"],spec_selectors_state=s=>s||(0,ze.Map)(),Os=Ut(spec_selectors_state,(s=>s.get("lastError"))),As=Ut(spec_selectors_state,(s=>s.get("url"))),Cs=Ut(spec_selectors_state,(s=>s.get("spec")||"")),js=Ut(spec_selectors_state,(s=>s.get("specSource")||"not-editor")),Ps=Ut(spec_selectors_state,(s=>s.get("json",(0,ze.Map)()))),Is=Ut(Ps,(s=>s.toJS())),Ts=Ut(spec_selectors_state,(s=>s.get("resolved",(0,ze.Map)()))),specResolvedSubtree=(s,o)=>s.getIn(["resolvedSubtrees",...o],void 0),mergerFn=(s,o)=>ze.Map.isMap(s)&&ze.Map.isMap(o)?o.get("$$ref")?o:(0,ze.OrderedMap)().mergeWith(mergerFn,s,o):o,Ns=Ut(spec_selectors_state,(s=>(0,ze.OrderedMap)().mergeWith(mergerFn,s.get("json"),s.get("resolvedSubtrees")))),spec=s=>Ps(s),Ms=Ut(spec,(()=>!1)),Rs=Ut(spec,(s=>returnSelfOrNewMap(s&&s.get("info")))),Ds=Ut(spec,(s=>returnSelfOrNewMap(s&&s.get("externalDocs")))),Ls=Ut(Rs,(s=>s&&s.get("version"))),Fs=Ut(Ls,(s=>/v?([0-9]*)\.([0-9]*)\.([0-9]*)/i.exec(s).slice(1))),Bs=Ut(Ns,(s=>s.get("paths"))),$s=xs()(["get","put","post","delete","options","head","patch"]),qs=Ut(Bs,(s=>{let o=(0,ze.List)();return!ze.Map.isMap(s)||s.isEmpty()||s.forEach(((s,i)=>{if(!s||!s.forEach)return{};s.forEach(((s,a)=>{ks.indexOf(a)<0||(o=o.push((0,ze.fromJS)({path:i,method:a,operation:s,id:`${a}-${i}`})))}))})),o})),Us=Ut(spec,(s=>(0,ze.Set)(s.get("consumes")))),Vs=Ut(spec,(s=>(0,ze.Set)(s.get("produces")))),zs=Ut(spec,(s=>s.get("security",(0,ze.List)()))),Ws=Ut(spec,(s=>s.get("securityDefinitions"))),findDefinition=(s,o)=>{const i=s.getIn(["resolvedSubtrees","definitions",o],null),a=s.getIn(["json","definitions",o],null);return i||a||null},Js=Ut(spec,(s=>{const o=s.get("definitions");return ze.Map.isMap(o)?o:(0,ze.Map)()})),Hs=Ut(spec,(s=>s.get("basePath"))),Ks=Ut(spec,(s=>s.get("host"))),Gs=Ut(spec,(s=>s.get("schemes",(0,ze.Map)()))),Ys=Ut([qs,Us,Vs],((s,o,i)=>s.map((s=>s.update("operation",(s=>ze.Map.isMap(s)?s.withMutations((s=>(s.get("consumes")||s.update("consumes",(s=>(0,ze.Set)(s).merge(o))),s.get("produces")||s.update("produces",(s=>(0,ze.Set)(s).merge(i))),s))):(0,ze.Map)())))))),Xs=Ut(spec,(s=>{const o=s.get("tags",(0,ze.List)());return ze.List.isList(o)?o.filter((s=>ze.Map.isMap(s))):(0,ze.List)()})),tagDetails=(s,o)=>(Xs(s)||(0,ze.List)()).filter(ze.Map.isMap).find((s=>s.get("name")===o),(0,ze.Map)()),Qs=Ut(Ys,Xs,((s,o)=>s.reduce(((s,o)=>{let i=(0,ze.Set)(o.getIn(["operation","tags"]));return i.count()<1?s.update("default",(0,ze.List)(),(s=>s.push(o))):i.reduce(((s,i)=>s.update(i,(0,ze.List)(),(s=>s.push(o)))),s)}),o.reduce(((s,o)=>s.set(o.get("name"),(0,ze.List)())),(0,ze.OrderedMap)())))),selectors_taggedOperations=s=>({getConfigs:o})=>{let{tagsSorter:i,operationsSorter:a}=o();return Qs(s).sortBy(((s,o)=>o),((s,o)=>{let a="function"==typeof i?i:It.tagsSorter[i];return a?a(s,o):null})).map(((o,i)=>{let u="function"==typeof a?a:It.operationsSorter[a],_=u?o.sort(u):o;return(0,ze.Map)({tagDetails:tagDetails(s,i),operations:_})}))},Zs=Ut(spec_selectors_state,(s=>s.get("responses",(0,ze.Map)()))),eo=Ut(spec_selectors_state,(s=>s.get("requests",(0,ze.Map)()))),to=Ut(spec_selectors_state,(s=>s.get("mutatedRequests",(0,ze.Map)()))),responseFor=(s,o,i)=>Zs(s).getIn([o,i],null),requestFor=(s,o,i)=>eo(s).getIn([o,i],null),mutatedRequestFor=(s,o,i)=>to(s).getIn([o,i],null),allowTryItOutFor=()=>!0,parameterWithMetaByIdentity=(s,o,i)=>{const a=Ns(s).getIn(["paths",...o,"parameters"],(0,ze.OrderedMap)()),u=s.getIn(["meta","paths",...o,"parameters"],(0,ze.OrderedMap)());return a.map((s=>{const o=u.get(`${i.get("in")}.${i.get("name")}`),a=u.get(`${i.get("in")}.${i.get("name")}.hash-${i.hashCode()}`);return(0,ze.OrderedMap)().merge(s,o,a)})).find((s=>s.get("in")===i.get("in")&&s.get("name")===i.get("name")),(0,ze.OrderedMap)())},parameterInclusionSettingFor=(s,o,i,a)=>{const u=`${a}.${i}`;return s.getIn(["meta","paths",...o,"parameter_inclusions",u],!1)},parameterWithMeta=(s,o,i,a)=>{const u=Ns(s).getIn(["paths",...o,"parameters"],(0,ze.OrderedMap)()).find((s=>s.get("in")===a&&s.get("name")===i),(0,ze.OrderedMap)());return parameterWithMetaByIdentity(s,o,u)},operationWithMeta=(s,o,i)=>{const a=Ns(s).getIn(["paths",o,i],(0,ze.OrderedMap)()),u=s.getIn(["meta","paths",o,i],(0,ze.OrderedMap)()),_=a.get("parameters",(0,ze.List)()).map((a=>parameterWithMetaByIdentity(s,[o,i],a)));return(0,ze.OrderedMap)().merge(a,u).set("parameters",_)};function getParameter(s,o,i,a){return o=o||[],s.getIn(["meta","paths",...o,"parameters"],(0,ze.fromJS)([])).find((s=>ze.Map.isMap(s)&&s.get("name")===i&&s.get("in")===a))||(0,ze.Map)()}const ro=Ut(spec,(s=>{const o=s.get("host");return"string"==typeof o&&o.length>0&&"/"!==o[0]}));function parameterValues(s,o,i){return o=o||[],operationWithMeta(s,...o).get("parameters",(0,ze.List)()).reduce(((s,o)=>{let a=i&&"body"===o.get("in")?o.get("value_xml"):o.get("value");return ze.List.isList(a)&&(a=a.filter((s=>""!==s))),s.set(paramToIdentifier(o,{allowHashes:!1}),a)}),(0,ze.fromJS)({}))}function parametersIncludeIn(s,o=""){if(ze.List.isList(s))return s.some((s=>ze.Map.isMap(s)&&s.get("in")===o))}function parametersIncludeType(s,o=""){if(ze.List.isList(s))return s.some((s=>ze.Map.isMap(s)&&s.get("type")===o))}function contentTypeValues(s,o){o=o||[];let i=Ns(s).getIn(["paths",...o],(0,ze.fromJS)({})),a=s.getIn(["meta","paths",...o],(0,ze.fromJS)({})),u=currentProducesFor(s,o);const _=i.get("parameters")||new ze.List,w=a.get("consumes_value")?a.get("consumes_value"):parametersIncludeType(_,"file")?"multipart/form-data":parametersIncludeType(_,"formData")?"application/x-www-form-urlencoded":void 0;return(0,ze.fromJS)({requestContentType:w,responseContentType:u})}function currentProducesFor(s,o){o=o||[];const i=Ns(s).getIn(["paths",...o],null);if(null===i)return;const a=s.getIn(["meta","paths",...o,"produces_value"],null),u=i.getIn(["produces",0],null);return a||u||"application/json"}function producesOptionsFor(s,o){o=o||[];const i=Ns(s),a=i.getIn(["paths",...o],null);if(null===a)return;const[u]=o,_=a.get("produces",null),w=i.getIn(["paths",u,"produces"],null),x=i.getIn(["produces"],null);return _||w||x}function consumesOptionsFor(s,o){o=o||[];const i=Ns(s),a=i.getIn(["paths",...o],null);if(null===a)return;const[u]=o,_=a.get("consumes",null),w=i.getIn(["paths",u,"consumes"],null),x=i.getIn(["consumes"],null);return _||w||x}const operationScheme=(s,o,i)=>{let a=s.get("url").match(/^([a-z][a-z0-9+\-.]*):/),u=Array.isArray(a)?a[1]:null;return s.getIn(["scheme",o,i])||s.getIn(["scheme","_defaultScheme"])||u||""},canExecuteScheme=(s,o,i)=>["http","https"].indexOf(operationScheme(s,o,i))>-1,validationErrors=(s,o)=>{o=o||[];const i=s.getIn(["meta","paths",...o,"parameters"],(0,ze.fromJS)([])),a=[];if(0===i.length)return a;const getErrorsWithPaths=(s,o=[])=>{const getNestedErrorsWithPaths=(s,o)=>{const i=[...o,s.get("propKey")||s.get("index")];return ze.Map.isMap(s.get("error"))?getErrorsWithPaths(s.get("error"),i):{error:s.get("error"),path:i}};return ze.List.isList(s)?s.map((s=>ze.Map.isMap(s)?getNestedErrorsWithPaths(s,o):{error:s,path:o})):getNestedErrorsWithPaths(s,o)};return i.forEach(((s,o)=>{const i=o.split(".").slice(1,-1).join("."),u=s.get("errors");if(u&&u.count()){getErrorsWithPaths(u).forEach((({error:s,path:o})=>{a.push(((s,o,i)=>`For '${i}'${(o=o.reduce(((s,o)=>"number"==typeof o?`${s}[${o}]`:s?`${s}.${o}`:o),""))?` at path '${o}'`:""}: ${s}.`)(s,o,i))}))}})),a},validateBeforeExecute=(s,o)=>0===validationErrors(s,o).length,getOAS3RequiredRequestBodyContentType=(s,o)=>{let i={requestBody:!1,requestContentType:{}},a=s.getIn(["resolvedSubtrees","paths",...o,"requestBody"],(0,ze.fromJS)([]));return a.size<1||(a.getIn(["required"])&&(i.requestBody=a.getIn(["required"])),a.getIn(["content"]).entrySeq().forEach((s=>{const o=s[0];if(s[1].getIn(["schema","required"])){const a=s[1].getIn(["schema","required"]).toJS();i.requestContentType[o]=a}}))),i},isMediaTypeSchemaPropertiesEqual=(s,o,i,a)=>{if((i||a)&&i===a)return!0;let u=s.getIn(["resolvedSubtrees","paths",...o,"requestBody","content"],(0,ze.fromJS)([]));if(u.size<2||!i||!a)return!1;let _=u.getIn([i,"schema","properties"],(0,ze.fromJS)([])),w=u.getIn([a,"schema","properties"],(0,ze.fromJS)([]));return!!_.equals(w)};function returnSelfOrNewMap(s){return ze.Map.isMap(s)?s:new ze.Map}var no=__webpack_require__(85015),so=__webpack_require__.n(no),oo=__webpack_require__(38221),io=__webpack_require__.n(oo),ao=__webpack_require__(63560),co=__webpack_require__.n(ao),lo=__webpack_require__(56367),uo=__webpack_require__.n(lo);const po="spec_update_spec",ho="spec_update_url",fo="spec_update_json",mo="spec_update_param",go="spec_update_empty_param_inclusion",yo="spec_validate_param",vo="spec_set_response",bo="spec_set_request",_o="spec_set_mutated_request",So="spec_log_request",Eo="spec_clear_response",wo="spec_clear_request",xo="spec_clear_validate_param",ko="spec_update_operation_meta_value",Oo="spec_update_resolved",Ao="spec_update_resolved_subtree",Co="set_scheme",toStr=s=>so()(s)?s:"";function updateSpec(s){const o=toStr(s).replace(/\t/g," ");if("string"==typeof s)return{type:po,payload:o}}function updateResolved(s){return{type:Oo,payload:s}}function updateUrl(s){return{type:ho,payload:s}}function updateJsonSpec(s){return{type:fo,payload:s}}const parseToJson=s=>({specActions:o,specSelectors:i,errActions:a})=>{let{specStr:u}=i,_=null;try{s=s||u(),a.clear({source:"parser"}),_=fn.load(s,{schema:rn})}catch(s){return console.error(s),a.newSpecErr({source:"parser",level:"error",message:s.reason,line:s.mark&&s.mark.line?s.mark.line+1:void 0})}return _&&"object"==typeof _?o.updateJsonSpec(_):o.updateJsonSpec({})};let jo=!1;const resolveSpec=(s,o)=>({specActions:i,specSelectors:a,errActions:u,fn:{fetch:_,resolve:w,AST:x={}},getConfigs:C})=>{jo||(console.warn("specActions.resolveSpec is deprecated since v3.10.0 and will be removed in v4.0.0; use requestResolvedSubtree instead!"),jo=!0);const{modelPropertyMacro:j,parameterMacro:L,requestInterceptor:B,responseInterceptor:$}=C();void 0===s&&(s=a.specJson()),void 0===o&&(o=a.url());let U=x.getLineNumberForPath?x.getLineNumberForPath:()=>{},V=a.specStr();return w({fetch:_,spec:s,baseDoc:String(new URL(o,document.baseURI)),modelPropertyMacro:j,parameterMacro:L,requestInterceptor:B,responseInterceptor:$}).then((({spec:s,errors:o})=>{if(u.clear({type:"thrown"}),Array.isArray(o)&&o.length>0){let s=o.map((s=>(console.error(s),s.line=s.fullPath?U(V,s.fullPath):null,s.path=s.fullPath?s.fullPath.join("."):null,s.level="error",s.type="thrown",s.source="resolver",Object.defineProperty(s,"message",{enumerable:!0,value:s.message}),s)));u.newThrownErrBatch(s)}return i.updateResolved(s)}))};let Po=[];const Io=io()((()=>{const s=Po.reduce(((s,{path:o,system:i})=>(s.has(i)||s.set(i,[]),s.get(i).push(o),s)),new Map);Po=[],s.forEach((async(s,o)=>{if(!o)return void console.error("debResolveSubtrees: don't have a system to operate on, aborting.");if(!o.fn.resolveSubtree)return void console.error("Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing.");const{errActions:i,errSelectors:a,fn:{resolveSubtree:u,fetch:_,AST:w={}},specSelectors:x,specActions:C}=o,j=w.getLineNumberForPath??xs()(void 0),L=x.specStr(),{modelPropertyMacro:B,parameterMacro:$,requestInterceptor:U,responseInterceptor:V}=o.getConfigs();try{const o=await s.reduce((async(s,o)=>{let{resultMap:w,specWithCurrentSubtrees:C}=await s;const{errors:z,spec:Y}=await u(C,o,{baseDoc:String(new URL(x.url(),document.baseURI)),modelPropertyMacro:B,parameterMacro:$,requestInterceptor:U,responseInterceptor:V});if(a.allErrors().size&&i.clearBy((s=>"thrown"!==s.get("type")||"resolver"!==s.get("source")||!s.get("fullPath")?.every(((s,i)=>s===o[i]||void 0===o[i])))),Array.isArray(z)&&z.length>0){let s=z.map((s=>(s.line=s.fullPath?j(L,s.fullPath):null,s.path=s.fullPath?s.fullPath.join("."):null,s.level="error",s.type="thrown",s.source="resolver",Object.defineProperty(s,"message",{enumerable:!0,value:s.message}),s)));i.newThrownErrBatch(s)}return Y&&x.isOAS3()&&"components"===o[0]&&"securitySchemes"===o[1]&&await Promise.all(Object.values(Y).filter((s=>"openIdConnect"===s?.type)).map((async s=>{const o={url:s.openIdConnectUrl,requestInterceptor:U,responseInterceptor:V};try{const i=await _(o);i instanceof Error||i.status>=400?console.error(i.statusText+" "+o.url):s.openIdConnectData=JSON.parse(i.text)}catch(s){console.error(s)}}))),co()(w,o,Y),C=uo()(o,Y,C),{resultMap:w,specWithCurrentSubtrees:C}}),Promise.resolve({resultMap:(x.specResolvedSubtree([])||(0,ze.Map)()).toJS(),specWithCurrentSubtrees:x.specJS()}));C.updateResolvedSubtree([],o.resultMap)}catch(s){console.error(s)}}))}),35),requestResolvedSubtree=s=>o=>{Po.find((({path:i,system:a})=>a===o&&i.toString()===s.toString()))||(Po.push({path:s,system:o}),Io())};function changeParam(s,o,i,a,u){return{type:mo,payload:{path:s,value:a,paramName:o,paramIn:i,isXml:u}}}function changeParamByIdentity(s,o,i,a){return{type:mo,payload:{path:s,param:o,value:i,isXml:a}}}const updateResolvedSubtree=(s,o)=>({type:Ao,payload:{path:s,value:o}}),invalidateResolvedSubtreeCache=()=>({type:Ao,payload:{path:[],value:(0,ze.Map)()}}),validateParams=(s,o)=>({type:yo,payload:{pathMethod:s,isOAS3:o}}),updateEmptyParamInclusion=(s,o,i,a)=>({type:go,payload:{pathMethod:s,paramName:o,paramIn:i,includeEmptyValue:a}});function clearValidateParams(s){return{type:xo,payload:{pathMethod:s}}}function changeConsumesValue(s,o){return{type:ko,payload:{path:s,value:o,key:"consumes_value"}}}function changeProducesValue(s,o){return{type:ko,payload:{path:s,value:o,key:"produces_value"}}}const setResponse=(s,o,i)=>({payload:{path:s,method:o,res:i},type:vo}),setRequest=(s,o,i)=>({payload:{path:s,method:o,req:i},type:bo}),setMutatedRequest=(s,o,i)=>({payload:{path:s,method:o,req:i},type:_o}),logRequest=s=>({payload:s,type:So}),executeRequest=s=>({fn:o,specActions:i,specSelectors:a,getConfigs:u,oas3Selectors:_})=>{let{pathName:w,method:x,operation:C}=s,{requestInterceptor:j,responseInterceptor:L}=u(),B=C.toJS();if(C&&C.get("parameters")&&C.get("parameters").filter((s=>s&&!0===s.get("allowEmptyValue"))).forEach((o=>{if(a.parameterInclusionSettingFor([w,x],o.get("name"),o.get("in"))){s.parameters=s.parameters||{};const i=paramToValue(o,s.parameters);(!i||i&&0===i.size)&&(s.parameters[o.get("name")]="")}})),s.contextUrl=Nt()(a.url()).toString(),B&&B.operationId?s.operationId=B.operationId:B&&w&&x&&(s.operationId=o.opId(B,w,x)),a.isOAS3()){const o=`${w}:${x}`;s.server=_.selectedServer(o)||_.selectedServer();const i=_.serverVariables({server:s.server,namespace:o}).toJS(),a=_.serverVariables({server:s.server}).toJS();s.serverVariables=Object.keys(i).length?i:a,s.requestContentType=_.requestContentType(w,x),s.responseContentType=_.responseContentType(w,x)||"*/*";const u=_.requestBodyValue(w,x),C=_.requestBodyInclusionSetting(w,x);u&&u.toJS?s.requestBody=u.map((s=>ze.Map.isMap(s)?s.get("value"):s)).filter(((s,o)=>(Array.isArray(s)?0!==s.length:!isEmptyValue(s))||C.get(o))).toJS():s.requestBody=u}let $=Object.assign({},s);$=o.buildRequest($),i.setRequest(s.pathName,s.method,$);s.requestInterceptor=async o=>{let a=await j.apply(void 0,[o]),u=Object.assign({},a);return i.setMutatedRequest(s.pathName,s.method,u),a},s.responseInterceptor=L;const U=Date.now();return o.execute(s).then((o=>{o.duration=Date.now()-U,i.setResponse(s.pathName,s.method,o)})).catch((o=>{"Failed to fetch"===o.message&&(o.name="",o.message='**Failed to fetch.** \n**Possible Reasons:** \n - CORS \n - Network Failure \n - URL scheme must be "http" or "https" for CORS request.'),i.setResponse(s.pathName,s.method,{error:!0,err:o})}))},actions_execute=({path:s,method:o,...i}={})=>a=>{let{fn:{fetch:u},specSelectors:_,specActions:w}=a,x=_.specJsonWithResolvedSubtrees().toJS(),C=_.operationScheme(s,o),{requestContentType:j,responseContentType:L}=_.contentTypeValues([s,o]).toJS(),B=/xml/i.test(j),$=_.parameterValues([s,o],B).toJS();return w.executeRequest({...i,fetch:u,spec:x,pathName:s,method:o,parameters:$,requestContentType:j,scheme:C,responseContentType:L})};function clearResponse(s,o){return{type:Eo,payload:{path:s,method:o}}}function clearRequest(s,o){return{type:wo,payload:{path:s,method:o}}}function setScheme(s,o,i){return{type:Co,payload:{scheme:s,path:o,method:i}}}const To={[po]:(s,o)=>"string"==typeof o.payload?s.set("spec",o.payload):s,[ho]:(s,o)=>s.set("url",o.payload+""),[fo]:(s,o)=>s.set("json",fromJSOrdered(o.payload)),[Oo]:(s,o)=>s.setIn(["resolved"],fromJSOrdered(o.payload)),[Ao]:(s,o)=>{const{value:i,path:a}=o.payload;return s.setIn(["resolvedSubtrees",...a],fromJSOrdered(i))},[mo]:(s,{payload:o})=>{let{path:i,paramName:a,paramIn:u,param:_,value:w,isXml:x}=o,C=_?paramToIdentifier(_):`${u}.${a}`;const j=x?"value_xml":"value";return s.setIn(["meta","paths",...i,"parameters",C,j],(0,ze.fromJS)(w))},[go]:(s,{payload:o})=>{let{pathMethod:i,paramName:a,paramIn:u,includeEmptyValue:_}=o;if(!a||!u)return console.warn("Warning: UPDATE_EMPTY_PARAM_INCLUSION could not generate a paramKey."),s;const w=`${u}.${a}`;return s.setIn(["meta","paths",...i,"parameter_inclusions",w],_)},[yo]:(s,{payload:{pathMethod:o,isOAS3:i}})=>{const a=Ns(s).getIn(["paths",...o]),u=parameterValues(s,o).toJS();return s.updateIn(["meta","paths",...o,"parameters"],(0,ze.fromJS)({}),(_=>a.get("parameters",(0,ze.List)()).reduce(((a,_)=>{const w=paramToValue(_,u),x=parameterInclusionSettingFor(s,o,_.get("name"),_.get("in")),C=((s,o,{isOAS3:i=!1,bypassRequiredCheck:a=!1}={})=>{let u=s.get("required"),{schema:_,parameterContentMediaType:w}=getParameterSchema(s,{isOAS3:i});return validateValueBySchema(o,_,u,a,w)})(_,w,{bypassRequiredCheck:x,isOAS3:i});return a.setIn([paramToIdentifier(_),"errors"],(0,ze.fromJS)(C))}),_)))},[xo]:(s,{payload:{pathMethod:o}})=>s.updateIn(["meta","paths",...o,"parameters"],(0,ze.fromJS)([]),(s=>s.map((s=>s.set("errors",(0,ze.fromJS)([])))))),[vo]:(s,{payload:{res:o,path:i,method:a}})=>{let u;u=o.error?Object.assign({error:!0,name:o.err.name,message:o.err.message,statusCode:o.err.statusCode},o.err.response):o,u.headers=u.headers||{};let _=s.setIn(["responses",i,a],fromJSOrdered(u));return lt.Blob&&u.data instanceof lt.Blob&&(_=_.setIn(["responses",i,a,"text"],u.data)),_},[bo]:(s,{payload:{req:o,path:i,method:a}})=>s.setIn(["requests",i,a],fromJSOrdered(o)),[_o]:(s,{payload:{req:o,path:i,method:a}})=>s.setIn(["mutatedRequests",i,a],fromJSOrdered(o)),[ko]:(s,{payload:{path:o,value:i,key:a}})=>{let u=["paths",...o],_=["meta","paths",...o];return s.getIn(["json",...u])||s.getIn(["resolved",...u])||s.getIn(["resolvedSubtrees",...u])?s.setIn([..._,a],(0,ze.fromJS)(i)):s},[Eo]:(s,{payload:{path:o,method:i}})=>s.deleteIn(["responses",o,i]),[wo]:(s,{payload:{path:o,method:i}})=>s.deleteIn(["requests",o,i]),[Co]:(s,{payload:{scheme:o,path:i,method:a}})=>i&&a?s.setIn(["scheme",i,a],o):i||a?void 0:s.setIn(["scheme","_defaultScheme"],o)},wrap_actions_updateSpec=(s,{specActions:o})=>(...i)=>{s(...i),o.parseToJson(...i)},wrap_actions_updateJsonSpec=(s,{specActions:o})=>(...i)=>{s(...i),o.invalidateResolvedSubtreeCache();const[a]=i,u=Cn()(a,["paths"])||{};Object.keys(u).forEach((s=>{const i=Cn()(u,[s]);as()(i)&&i.$ref&&o.requestResolvedSubtree(["paths",s])})),o.requestResolvedSubtree(["components","securitySchemes"])},wrap_actions_executeRequest=(s,{specActions:o})=>i=>(o.logRequest(i),s(i)),wrap_actions_validateParams=(s,{specSelectors:o})=>i=>s(i,o.isOAS3()),plugins_spec=()=>({statePlugins:{spec:{wrapActions:{...Y},reducers:{...To},actions:{...z},selectors:{...V}}}});var No=function(){var extendStatics=function(s,o){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(s,o){s.__proto__=o}||function(s,o){for(var i in o)o.hasOwnProperty(i)&&(s[i]=o[i])},extendStatics(s,o)};return function(s,o){function __(){this.constructor=s}extendStatics(s,o),s.prototype=null===o?Object.create(o):(__.prototype=o.prototype,new __)}}(),Mo=Object.prototype.hasOwnProperty;function module_helpers_hasOwnProperty(s,o){return Mo.call(s,o)}function _objectKeys(s){if(Array.isArray(s)){for(var o=new Array(s.length),i=0;i=48&&o<=57))return!1;i++}return!0}function escapePathComponent(s){return-1===s.indexOf("/")&&-1===s.indexOf("~")?s:s.replace(/~/g,"~0").replace(/\//g,"~1")}function unescapePathComponent(s){return s.replace(/~1/g,"/").replace(/~0/g,"~")}function hasUndefined(s){if(void 0===s)return!0;if(s)if(Array.isArray(s)){for(var o=0,i=s.length;o0&&"constructor"==x[j-1]))throw new TypeError("JSON-Patch: modifying `__proto__` or `constructor/prototype` prop is banned for security reasons, if this was on purpose, please set `banPrototypeModifications` flag false and pass it to this function. More info in fast-json-patch README");if(i&&void 0===B&&(void 0===C[$]?B=x.slice(0,j).join("/"):j==L-1&&(B=o.path),void 0!==B&&U(o,0,s,B)),j++,Array.isArray(C)){if("-"===$)$=C.length;else{if(i&&!helpers_isInteger($))throw new Do("Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index","OPERATION_PATH_ILLEGAL_ARRAY_INDEX",_,o,s);helpers_isInteger($)&&($=~~$)}if(j>=L){if(i&&"add"===o.op&&$>C.length)throw new Do("The specified index MUST NOT be greater than the number of elements in the array","OPERATION_VALUE_OUT_OF_BOUNDS",_,o,s);if(!1===(w=Bo[o.op].call(o,C,$,s)).test)throw new Do("Test operation failed","TEST_OPERATION_FAILED",_,o,s);return w}}else if(j>=L){if(!1===(w=Fo[o.op].call(o,C,$,s)).test)throw new Do("Test operation failed","TEST_OPERATION_FAILED",_,o,s);return w}if(C=C[$],i&&j0)throw new Do('Operation `path` property must start with "/"',"OPERATION_PATH_INVALID",o,s,i);if(("move"===s.op||"copy"===s.op)&&"string"!=typeof s.from)throw new Do("Operation `from` property is not present (applicable in `move` and `copy` operations)","OPERATION_FROM_REQUIRED",o,s,i);if(("add"===s.op||"replace"===s.op||"test"===s.op)&&void 0===s.value)throw new Do("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_REQUIRED",o,s,i);if(("add"===s.op||"replace"===s.op||"test"===s.op)&&hasUndefined(s.value))throw new Do("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED",o,s,i);if(i)if("add"==s.op){var u=s.path.split("/").length,_=a.split("/").length;if(u!==_+1&&u!==_)throw new Do("Cannot perform an `add` operation at the desired path","OPERATION_PATH_CANNOT_ADD",o,s,i)}else if("replace"===s.op||"remove"===s.op||"_get"===s.op){if(s.path!==a)throw new Do("Cannot perform the operation at a path that does not exist","OPERATION_PATH_UNRESOLVABLE",o,s,i)}else if("move"===s.op||"copy"===s.op){var w=validate([{op:"_get",path:s.from,value:void 0}],i);if(w&&"OPERATION_PATH_UNRESOLVABLE"===w.name)throw new Do("Cannot perform the operation from a path that does not exist","OPERATION_FROM_UNRESOLVABLE",o,s,i)}}function validate(s,o,i){try{if(!Array.isArray(s))throw new Do("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");if(o)applyPatch(_deepClone(o),_deepClone(s),i||!0);else{i=i||validator;for(var a=0;a0&&(s.patches=[],s.callback&&s.callback(a)),a}function _generate(s,o,i,a,u){if(o!==s){"function"==typeof o.toJSON&&(o=o.toJSON());for(var _=_objectKeys(o),w=_objectKeys(s),x=!1,C=w.length-1;C>=0;C--){var j=s[B=w[C]];if(!module_helpers_hasOwnProperty(o,B)||void 0===o[B]&&void 0!==j&&!1===Array.isArray(o))Array.isArray(s)===Array.isArray(o)?(u&&i.push({op:"test",path:a+"/"+escapePathComponent(B),value:_deepClone(j)}),i.push({op:"remove",path:a+"/"+escapePathComponent(B)}),x=!0):(u&&i.push({op:"test",path:a,value:s}),i.push({op:"replace",path:a,value:o}),!0);else{var L=o[B];"object"==typeof j&&null!=j&&"object"==typeof L&&null!=L&&Array.isArray(j)===Array.isArray(L)?_generate(j,L,i,a+"/"+escapePathComponent(B),u):j!==L&&(u&&i.push({op:"test",path:a+"/"+escapePathComponent(B),value:_deepClone(j)}),i.push({op:"replace",path:a+"/"+escapePathComponent(B),value:_deepClone(L)}))}}if(x||_.length!=w.length)for(C=0;C<_.length;C++){var B;module_helpers_hasOwnProperty(s,B=_[C])||void 0===o[B]||i.push({op:"add",path:a+"/"+escapePathComponent(B),value:_deepClone(o[B])})}}}function compare(s,o,i){void 0===i&&(i=!1);var a=[];return _generate(s,o,a,"",i),a}Object.assign({},Z,ee,{JsonPatchError:Ro,deepClone:_deepClone,escapePathComponent,unescapePathComponent});var Vo=__webpack_require__(14744),zo=__webpack_require__.n(Vo);const Wo={add:function add(s,o){return{op:"add",path:s,value:o}},replace,remove:function remove(s){return{op:"remove",path:s}},merge:function lib_merge(s,o){return{type:"mutation",op:"merge",path:s,value:o}},mergeDeep:function mergeDeep(s,o){return{type:"mutation",op:"mergeDeep",path:s,value:o}},context:function context(s,o){return{type:"context",path:s,value:o}},getIn:function lib_getIn(s,o){return o.reduce(((s,o)=>void 0!==o&&s?s[o]:s),s)},applyPatch:function lib_applyPatch(s,o,i){if(i=i||{},"merge"===(o={...o,path:o.path&&normalizeJSONPath(o.path)}).op){const i=getInByJsonPath(s,o.path);Object.assign(i,o.value),applyPatch(s,[replace(o.path,i)])}else if("mergeDeep"===o.op){const i=getInByJsonPath(s,o.path),a=zo()(i,o.value,{customMerge:s=>{if("enum"===s)return(s,o)=>Array.isArray(s)&&Array.isArray(o)?[...new Set([...s,...o])]:zo()(s,o)}});s=applyPatch(s,[replace(o.path,a)]).newDocument}else if("add"===o.op&&""===o.path&&lib_isObject(o.value)){applyPatch(s,Object.keys(o.value).reduce(((s,i)=>(s.push({op:"add",path:`/${normalizeJSONPath(i)}`,value:o.value[i]}),s)),[]))}else if("replace"===o.op&&""===o.path){let{value:a}=o;i.allowMetaPatches&&o.meta&&isAdditiveMutation(o)&&(Array.isArray(o.value)||lib_isObject(o.value))&&(a={...a,...o.meta}),s=a}else if(applyPatch(s,[o]),i.allowMetaPatches&&o.meta&&isAdditiveMutation(o)&&(Array.isArray(o.value)||lib_isObject(o.value))){const i={...getInByJsonPath(s,o.path),...o.meta};applyPatch(s,[replace(o.path,i)])}return s},parentPathMatch:function parentPathMatch(s,o){if(!Array.isArray(o))return!1;for(let i=0,a=o.length;i(s+"").replace(/~/g,"~0").replace(/\//g,"~1"))).join("/")}`:s}function replace(s,o,i){return{op:"replace",path:s,value:o,meta:i}}function forEachNewPatch(s,o,i){return cleanArray(flatten(s.filter(isAdditiveMutation).map((s=>o(s.value,i,s.path)))||[]))}function forEachPrimitive(s,o,i){return i=i||[],Array.isArray(s)?s.map(((s,a)=>forEachPrimitive(s,o,i.concat(a)))):lib_isObject(s)?Object.keys(s).map((a=>forEachPrimitive(s[a],o,i.concat(a)))):o(s,i[i.length-1],i)}function forEach(s,o,i){let a=[];if((i=i||[]).length>0){const u=o(s,i[i.length-1],i);u&&(a=a.concat(u))}if(Array.isArray(s)){const u=s.map(((s,a)=>forEach(s,o,i.concat(a))));u&&(a=a.concat(u))}else if(lib_isObject(s)){const u=Object.keys(s).map((a=>forEach(s[a],o,i.concat(a))));u&&(a=a.concat(u))}return a=flatten(a),a}function lib_normalizeArray(s){return Array.isArray(s)?s:[s]}function flatten(s){return[].concat(...s.map((s=>Array.isArray(s)?flatten(s):s)))}function cleanArray(s){return s.filter((s=>void 0!==s))}function lib_isObject(s){return s&&"object"==typeof s}function lib_isFunction(s){return s&&"function"==typeof s}function isJsonPatch(s){if(isPatch(s)){const{op:o}=s;return"add"===o||"remove"===o||"replace"===o}return!1}function isMutation(s){return isJsonPatch(s)||isPatch(s)&&"mutation"===s.type}function isAdditiveMutation(s){return isMutation(s)&&("add"===s.op||"replace"===s.op||"merge"===s.op||"mergeDeep"===s.op)}function isPatch(s){return s&&"object"==typeof s}function getInByJsonPath(s,o){try{return getValueByPointer(s,o)}catch(s){return console.error(s),{}}}var Jo=__webpack_require__(48675);const Ho=class ApiDOMAggregateError extends Jo{constructor(s,o,i){if(super(s,o,i),this.name=this.constructor.name,"string"==typeof o&&(this.message=o),"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error(o).stack,null!=i&&"object"==typeof i&&Object.hasOwn(i,"cause")&&!("cause"in this)){const{cause:s}=i;this.cause=s,s instanceof Error&&"stack"in s&&(this.stack=`${this.stack}\nCAUSE: ${s.stack}`)}}};class ApiDOMError extends Error{static[Symbol.hasInstance](s){return super[Symbol.hasInstance](s)||Function.prototype[Symbol.hasInstance].call(Ho,s)}constructor(s,o){if(super(s,o),this.name=this.constructor.name,"string"==typeof s&&(this.message=s),"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error(s).stack,null!=o&&"object"==typeof o&&Object.hasOwn(o,"cause")&&!("cause"in this)){const{cause:s}=o;this.cause=s,s instanceof Error&&"stack"in s&&(this.stack=`${this.stack}\nCAUSE: ${s.stack}`)}}}const Ko=ApiDOMError;const Go=class ApiDOMStructuredError extends Ko{constructor(s,o){if(super(s,o),null!=o&&"object"==typeof o){const{cause:s,...i}=o;Object.assign(this,i)}}};var Yo=__webpack_require__(65606);function _isPlaceholder(s){return null!=s&&"object"==typeof s&&!0===s["@@functional/placeholder"]}function _curry1(s){return function f1(o){return 0===arguments.length||_isPlaceholder(o)?f1:s.apply(this,arguments)}}function _curry2(s){return function f2(o,i){switch(arguments.length){case 0:return f2;case 1:return _isPlaceholder(o)?f2:_curry1((function(i){return s(o,i)}));default:return _isPlaceholder(o)&&_isPlaceholder(i)?f2:_isPlaceholder(o)?_curry1((function(o){return s(o,i)})):_isPlaceholder(i)?_curry1((function(i){return s(o,i)})):s(o,i)}}}function _curry3(s){return function f3(o,i,a){switch(arguments.length){case 0:return f3;case 1:return _isPlaceholder(o)?f3:_curry2((function(i,a){return s(o,i,a)}));case 2:return _isPlaceholder(o)&&_isPlaceholder(i)?f3:_isPlaceholder(o)?_curry2((function(o,a){return s(o,i,a)})):_isPlaceholder(i)?_curry2((function(i,a){return s(o,i,a)})):_curry1((function(a){return s(o,i,a)}));default:return _isPlaceholder(o)&&_isPlaceholder(i)&&_isPlaceholder(a)?f3:_isPlaceholder(o)&&_isPlaceholder(i)?_curry2((function(o,i){return s(o,i,a)})):_isPlaceholder(o)&&_isPlaceholder(a)?_curry2((function(o,a){return s(o,i,a)})):_isPlaceholder(i)&&_isPlaceholder(a)?_curry2((function(i,a){return s(o,i,a)})):_isPlaceholder(o)?_curry1((function(o){return s(o,i,a)})):_isPlaceholder(i)?_curry1((function(i){return s(o,i,a)})):_isPlaceholder(a)?_curry1((function(a){return s(o,i,a)})):s(o,i,a)}}}const Xo=Number.isInteger||function _isInteger(s){return(s|0)===s};function _isString(s){return"[object String]"===Object.prototype.toString.call(s)}function _nth(s,o){var i=s<0?o.length+s:s;return _isString(o)?o.charAt(i):o[i]}function _path(s,o){for(var i=o,a=0;a=0;)_has(o=Pi[i],s)&&!Ri(a,o)&&(a[a.length]=o),i-=1;return a})):_curry1((function keys(s){return Object(s)!==s?[]:Object.keys(s)}));const ea=Wi;const ra=_curry1((function type(s){return null===s?"Null":void 0===s?"Undefined":Object.prototype.toString.call(s).slice(8,-1)}));function _uniqContentEquals(s,o,i,a){var u=_arrayFromIterator(s);function eq(s,o){return _equals(s,o,i.slice(),a.slice())}return!_includesWith((function(s,o){return!_includesWith(eq,o,s)}),_arrayFromIterator(o),u)}function _equals(s,o,i,a){if(Zo(s,o))return!0;var u=ra(s);if(u!==ra(o))return!1;if("function"==typeof s["fantasy-land/equals"]||"function"==typeof o["fantasy-land/equals"])return"function"==typeof s["fantasy-land/equals"]&&s["fantasy-land/equals"](o)&&"function"==typeof o["fantasy-land/equals"]&&o["fantasy-land/equals"](s);if("function"==typeof s.equals||"function"==typeof o.equals)return"function"==typeof s.equals&&s.equals(o)&&"function"==typeof o.equals&&o.equals(s);switch(u){case"Arguments":case"Array":case"Object":if("function"==typeof s.constructor&&"Promise"===function _functionName(s){var o=String(s).match(/^function (\w*)/);return null==o?"":o[1]}(s.constructor))return s===o;break;case"Boolean":case"Number":case"String":if(typeof s!=typeof o||!Zo(s.valueOf(),o.valueOf()))return!1;break;case"Date":if(!Zo(s.valueOf(),o.valueOf()))return!1;break;case"Error":return s.name===o.name&&s.message===o.message;case"RegExp":if(s.source!==o.source||s.global!==o.global||s.ignoreCase!==o.ignoreCase||s.multiline!==o.multiline||s.sticky!==o.sticky||s.unicode!==o.unicode)return!1}for(var _=i.length-1;_>=0;){if(i[_]===s)return a[_]===o;_-=1}switch(u){case"Map":return s.size===o.size&&_uniqContentEquals(s.entries(),o.entries(),i.concat([s]),a.concat([o]));case"Set":return s.size===o.size&&_uniqContentEquals(s.values(),o.values(),i.concat([s]),a.concat([o]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var w=ea(s);if(w.length!==ea(o).length)return!1;var x=i.concat([s]),C=a.concat([o]);for(_=w.length-1;_>=0;){var j=w[_];if(!_has(j,o)||!_equals(o[j],s[j],x,C))return!1;_-=1}return!0}const na=_curry2((function equals(s,o){return _equals(s,o,[],[])}));function _includes(s,o){return function _indexOf(s,o,i){var a,u;if("function"==typeof s.indexOf)switch(typeof o){case"number":if(0===o){for(a=1/o;i=0}function _map(s,o){for(var i=0,a=o.length,u=Array(a);i=0&&"[object Array]"===Object.prototype.toString.call(s)};function _dispatchable(s,o,i){return function(){if(0===arguments.length)return i();var a=arguments[arguments.length-1];if(!ca(a)){for(var u=0;u":_toString_toString(i,a)},mapPairs=function(s,o){return _map((function(o){return _quote(o)+": "+i(s[o])}),o.slice().sort())};switch(Object.prototype.toString.call(s)){case"[object Arguments]":return"(function() { return arguments; }("+_map(i,s).join(", ")+"))";case"[object Array]":return"["+_map(i,s).concat(mapPairs(s,ma((function(s){return/^\d+$/.test(s)}),ea(s)))).join(", ")+"]";case"[object Boolean]":return"object"==typeof s?"new Boolean("+i(s.valueOf())+")":s.toString();case"[object Date]":return"new Date("+(isNaN(s.valueOf())?i(NaN):_quote(aa(s)))+")";case"[object Map]":return"new Map("+i(Array.from(s))+")";case"[object Null]":return"null";case"[object Number]":return"object"==typeof s?"new Number("+i(s.valueOf())+")":1/s==-1/0?"-0":s.toString(10);case"[object Set]":return"new Set("+i(Array.from(s).sort())+")";case"[object String]":return"object"==typeof s?"new String("+i(s.valueOf())+")":_quote(s);case"[object Undefined]":return"undefined";default:if("function"==typeof s.toString){var a=s.toString();if("[object Object]"!==a)return a}return"{"+mapPairs(s,ea(s)).join(", ")+"}"}}const ga=_curry1((function toString(s){return _toString_toString(s,[])}));var ya=_curry2((function test(s,o){if(!function _isRegExp(s){return"[object RegExp]"===Object.prototype.toString.call(s)}(s))throw new TypeError("‘test’ requires a value of type RegExp as its first argument; received "+ga(s));return _cloneRegExp(s).test(o)}));const va=ya;function _arity(s,o){switch(s){case 0:return function(){return o.apply(this,arguments)};case 1:return function(s){return o.apply(this,arguments)};case 2:return function(s,i){return o.apply(this,arguments)};case 3:return function(s,i,a){return o.apply(this,arguments)};case 4:return function(s,i,a,u){return o.apply(this,arguments)};case 5:return function(s,i,a,u,_){return o.apply(this,arguments)};case 6:return function(s,i,a,u,_,w){return o.apply(this,arguments)};case 7:return function(s,i,a,u,_,w,x){return o.apply(this,arguments)};case 8:return function(s,i,a,u,_,w,x,C){return o.apply(this,arguments)};case 9:return function(s,i,a,u,_,w,x,C,j){return o.apply(this,arguments)};case 10:return function(s,i,a,u,_,w,x,C,j,L){return o.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}function _pipe(s,o){return function(){return o.call(this,s.apply(this,arguments))}}const ba=_curry1((function isArrayLike(s){return!!ca(s)||!!s&&("object"==typeof s&&(!_isString(s)&&(0===s.length||s.length>0&&(s.hasOwnProperty(0)&&s.hasOwnProperty(s.length-1)))))}));var _a="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";function _createReduce(s,o,i){return function _reduce(a,u,_){if(ba(_))return s(a,u,_);if(null==_)return u;if("function"==typeof _["fantasy-land/reduce"])return o(a,u,_,"fantasy-land/reduce");if(null!=_[_a])return i(a,u,_[_a]());if("function"==typeof _.next)return i(a,u,_);if("function"==typeof _.reduce)return o(a,u,_,"reduce");throw new TypeError("reduce: list must be array or iterable")}}function _xArrayReduce(s,o,i){for(var a=0,u=i.length;a=arguments.length)?C=o[w]:(C=arguments[u],u+=1),a[w]=C,_isPlaceholder(C)?x=!0:_-=1,w+=1}return!x&&_<=0?i.apply(this,a):_arity(Math.max(0,_),_curryN(s,a,i))}}const $a=_curry2((function curryN(s,o){return 1===s?_curry1(o):_arity(s,_curryN(s,[],o))}));const za=_curry1((function curry(s){return $a(s.length,s)}));function _isFunction(s){var o=Object.prototype.toString.call(s);return"[object Function]"===o||"[object AsyncFunction]"===o||"[object GeneratorFunction]"===o||"[object AsyncGeneratorFunction]"===o}const Ja=_curry2((function invoker(s,o){return $a(s+1,(function(){var i=arguments[s];if(null!=i&&_isFunction(i[o]))return i[o].apply(i,Array.prototype.slice.call(arguments,0,s));throw new TypeError(ga(i)+' does not have a method named "'+o+'"')}))}));const Ha=Ja(1,"split");function dropLastWhile(s,o){for(var i=o.length-1;i>=0&&s(o[i]);)i-=1;return ja(0,i+1,o)}var Ga=function(){function XDropLastWhile(s,o){this.f=s,this.retained=[],this.xf=o}return XDropLastWhile.prototype["@@transducer/init"]=_xfBase_init,XDropLastWhile.prototype["@@transducer/result"]=function(s){return this.retained=null,this.xf["@@transducer/result"](s)},XDropLastWhile.prototype["@@transducer/step"]=function(s,o){return this.f(o)?this.retain(s,o):this.flush(s,o)},XDropLastWhile.prototype.flush=function(s,o){return s=wa(this.xf,s,this.retained),this.retained=[],this.xf["@@transducer/step"](s,o)},XDropLastWhile.prototype.retain=function(s,o){return this.retained.push(o),s},XDropLastWhile}();function _xdropLastWhile(s){return function(o){return new Ga(s,o)}}const ec=_curry2(_dispatchable([],_xdropLastWhile,dropLastWhile));const rc=Ja(1,"join");const sc=_curry1((function flip(s){return $a(s.length,(function(o,i){var a=Array.prototype.slice.call(arguments,0);return a[0]=i,a[1]=o,s.apply(this,a)}))}))(_curry2(_includes));const oc=za((function(s,o){return pipe(Ha(""),ec(sc(s)),rc(""))(o)}));function _iterableReduce(s,o,i){for(var a=i.next();!a.done;)o=s(o,a.value),a=i.next();return o}function _methodReduce(s,o,i,a){return i[a](s,o)}const ic=_createReduce(_arrayReduce,_methodReduce,_iterableReduce);var ac=function(){function XMap(s,o){this.xf=o,this.f=s}return XMap.prototype["@@transducer/init"]=_xfBase_init,XMap.prototype["@@transducer/result"]=_xfBase_result,XMap.prototype["@@transducer/step"]=function(s,o){return this.xf["@@transducer/step"](s,this.f(o))},XMap}();const cc=_curry2(_dispatchable(["fantasy-land/map","map"],(function _xmap(s){return function(o){return new ac(s,o)}}),(function map(s,o){switch(Object.prototype.toString.call(o)){case"[object Function]":return $a(o.length,(function(){return s.call(this,o.apply(this,arguments))}));case"[object Object]":return _arrayReduce((function(i,a){return i[a]=s(o[a]),i}),{},ea(o));default:return _map(s,o)}})));const lc=_curry2((function ap(s,o){return"function"==typeof o["fantasy-land/ap"]?o["fantasy-land/ap"](s):"function"==typeof s.ap?s.ap(o):"function"==typeof s?function(i){return s(i)(o(i))}:ic((function(s,i){return function _concat(s,o){var i;o=o||[];var a=(s=s||[]).length,u=o.length,_=[];for(i=0;io!=o>s)return o>s?o:s}var i=safeMax(s,o);if(void 0!==i)return i;var a=safeMax(typeof s,typeof o);if(void 0!==a)return a===typeof s?s:o;var u=ga(s),_=safeMax(u,ga(o));return void 0!==_&&_===u?s:o}));var kc=_curry2((function pluck(s,o){return cc(Da(s),o)}));const Oc=kc;const jc=_curry1((function anyPass(s){return $a(Aa(Ec,0,Oc("length",s)),(function(){for(var o=0,i=s.length;oQo(va(/^win/),["platform"],Yo),getProtocol=s=>{try{const o=new URL(s);return oc(":",o.protocol)}catch{return}},ul=(pipe(getProtocol,_c),s=>{if(Yo.browser)return!1;const o=getProtocol(s);return bc(o)||"file"===o||/^[a-zA-Z]$/.test(o)}),isHttpUrl=s=>{const o=getProtocol(s);return"http"===o||"https"===o},toFileSystemPath=(s,o)=>{const i=[/%23/g,"#",/%24/g,"$",/%26/g,"&",/%2C/g,",",/%40/g,"@"],a=La(!1,"keepFileProtocol",o),u=La(isWindows,"isWindows",o);let _=decodeURI(s);for(let s=0;s{const o=s.indexOf("#");return-1!==o?s.substring(o):"#"},stripHash=s=>{const o=s.indexOf("#");let i=s;return o>=0&&(i=s.substring(0,o)),i},url_cwd=()=>{if(Yo.browser)return stripHash(globalThis.location.href);const s=Yo.cwd(),o=Ba(s);return["/","\\"].includes(o)?s:s+(isWindows()?"\\":"/")},resolve=(s,o)=>{const i=new URL(o,new URL(s,"resolve://"));if("resolve:"===i.protocol){const{pathname:s,search:o,hash:a}=i;return s+o+a}return i.toString()},sanitize=s=>{if(ul(s))return(s=>{const o=[/\?/g,"%3F",/#/g,"%23"];let i=s;isWindows()&&(i=i.replace(/\\/g,"/")),i=encodeURI(i);for(let s=0;sul(s)?toFileSystemPath(s):decodeURI(s),{fetch:yl,Response:vl,Headers:_l,Request:Sl,FormData:El,File:wl,Blob:xl}=globalThis;function _array_like_to_array(s,o){(null==o||o>s.length)&&(o=s.length);for(var i=0,a=new Array(o);i2&&void 0!==arguments[2]?arguments[2]:Nl,a=[],u=[],_=!0,w=i.includeSymbols?own_enumerable_keys:Object.keys,x=!!i.immutable;return function walker(s){var C=x?legacy_copy(s,i):s,j={},L=!0,B={node:C,node_:s,path:[].concat(a),parent:u[u.length-1],parents:u,key:a[a.length-1],isRoot:0===a.length,level:a.length,circular:void 0,isLeaf:!1,notLeaf:!0,notRoot:!0,isFirst:!1,isLast:!1,update:function update(s){var o=arguments.length>1&&void 0!==arguments[1]&&arguments[1];B.isRoot||(B.parent.node[B.key]=s),B.node=s,o&&(L=!1)},delete:function _delete(s){delete B.parent.node[B.key],s&&(L=!1)},remove:function remove(s){kl(B.parent.node)?B.parent.node.splice(B.key,1):delete B.parent.node[B.key],s&&(L=!1)},keys:null,before:function before(s){j.before=s},after:function after(s){j.after=s},pre:function pre(s){j.pre=s},post:function post(s){j.post=s},stop:function stop(){_=!1},block:function block(){L=!1}};if(!_)return B;function update_state(){if("object"===_type_of(B.node)&&null!==B.node){B.keys&&B.node_===B.node||(B.keys=w(B.node)),B.isLeaf=0===B.keys.length;for(var o=0;o1&&void 0!==arguments[1]?arguments[1]:Nl;!function _class_call_check(s,o){if(!(s instanceof o))throw new TypeError("Cannot call a class as a function")}(this,Traverse),__privateAdd(this,Il),__privateAdd(this,Tl),__privateSet(this,Il,s),__privateSet(this,Tl,o)}return function _create_class(s,o,i){return o&&legacy_defineProperties(s.prototype,o),i&&legacy_defineProperties(s,i),s}(Traverse,[{key:"get",value:function get(s){for(var o=__privateGet(this,Il),i=0;o&&i-1&&-1===Ul.indexOf(i)||Vl.indexOf(a)>-1||zl.some((s=>a.indexOf(s)>-1))}function absolutifyPointer(s,o){const[i,a]=s.split("#"),u=null!=o?o:"",_=null!=i?i:"";let w;if(isHttpUrl(u))w=resolve(u,_);else{const s=resolve(Ll,u),o=resolve(s,_).replace(Ll,"");w=_.startsWith("/")?o:o.substring(1)}return a?`${w}#${a}`:w}const Wl=/^([a-z]+:\/\/|\/\/)/i;class JSONRefError extends Go{}const Jl={},Hl=new WeakMap,Kl=[s=>"paths"===s[0]&&"responses"===s[3]&&"examples"===s[5],s=>"paths"===s[0]&&"responses"===s[3]&&"content"===s[5]&&"example"===s[7],s=>"paths"===s[0]&&"responses"===s[3]&&"content"===s[5]&&"examples"===s[7]&&"value"===s[9],s=>"paths"===s[0]&&"requestBody"===s[3]&&"content"===s[4]&&"example"===s[6],s=>"paths"===s[0]&&"requestBody"===s[3]&&"content"===s[4]&&"examples"===s[6]&&"value"===s[8],s=>"paths"===s[0]&&"parameters"===s[2]&&"example"===s[4],s=>"paths"===s[0]&&"parameters"===s[3]&&"example"===s[5],s=>"paths"===s[0]&&"parameters"===s[2]&&"examples"===s[4]&&"value"===s[6],s=>"paths"===s[0]&&"parameters"===s[3]&&"examples"===s[5]&&"value"===s[7],s=>"paths"===s[0]&&"parameters"===s[2]&&"content"===s[4]&&"example"===s[6],s=>"paths"===s[0]&&"parameters"===s[2]&&"content"===s[4]&&"examples"===s[6]&&"value"===s[8],s=>"paths"===s[0]&&"parameters"===s[3]&&"content"===s[4]&&"example"===s[7],s=>"paths"===s[0]&&"parameters"===s[3]&&"content"===s[5]&&"examples"===s[7]&&"value"===s[9]],Gl={key:"$ref",plugin:(s,o,i,a)=>{const u=a.getInstance(),_=i.slice(0,-1);if(isFreelyNamed(_)||(s=>Kl.some((o=>o(s))))(_))return;const{baseDoc:w}=a.getContext(i);if("string"!=typeof s)return new JSONRefError("$ref: must be a string (JSON-Ref)",{$ref:s,baseDoc:w,fullPath:i});const x=refs_split(s),C=x[0],j=x[1]||"";let L,B,$;try{L=w||C?absoluteify(C,w):null}catch(o){return wrapError(o,{pointer:j,$ref:s,basePath:L,fullPath:i})}if(function pointerAlreadyInPath(s,o,i,a){let u=Hl.get(a);u||(u={},Hl.set(a,u));const _=function arrayToJsonPointer(s){if(0===s.length)return"";return`/${s.map(escapeJsonPointerToken).join("/")}`}(i),w=`${o||""}#${s}`,x=_.replace(/allOf\/\d+\/?/g,""),C=a.contextTree.get([]).baseDoc;if(o===C&&pointerIsAParent(x,s))return!0;let j="";const L=i.some((s=>(j=`${j}/${escapeJsonPointerToken(s)}`,u[j]&&u[j].some((s=>pointerIsAParent(s,w)||pointerIsAParent(w,s))))));if(L)return!0;return void(u[x]=(u[x]||[]).concat(w))}(j,L,_,a)&&!u.useCircularStructures){const o=absolutifyPointer(s,L);return s===o?null:Wo.replace(i,o)}if(null==L?($=jsonPointerToArray(j),B=a.get($),void 0===B&&(B=new JSONRefError(`Could not resolve reference: ${s}`,{pointer:j,$ref:s,baseDoc:w,fullPath:i}))):(B=extractFromDoc(L,j),B=null!=B.__value?B.__value:B.catch((o=>{throw wrapError(o,{pointer:j,$ref:s,baseDoc:w,fullPath:i})}))),B instanceof Error)return[Wo.remove(i),B];const U=absolutifyPointer(s,L),V=Wo.replace(_,B,{$$ref:U});if(L&&L!==w)return[V,Wo.context(_,{baseDoc:L})];try{if(!function patchValueAlreadyInPath(s,o){const i=[s];return o.path.reduce(((s,o)=>(i.push(s[o]),s[o])),s),pointToAncestor(o.value);function pointToAncestor(s){return Wo.isObject(s)&&(i.indexOf(s)>=0||Object.keys(s).some((o=>pointToAncestor(s[o]))))}}(a.state,V)||u.useCircularStructures)return V}catch(s){return null}}},Yl=Object.assign(Gl,{docCache:Jl,absoluteify,clearCache:function clearCache(s){void 0!==s?delete Jl[s]:Object.keys(Jl).forEach((s=>{delete Jl[s]}))},JSONRefError,wrapError,getDoc,split:refs_split,extractFromDoc,fetchJSON:function fetchJSON(s){return fetch(s,{headers:{Accept:Dl},loadSpec:!0}).then((s=>s.text())).then((s=>fn.load(s)))},extract,jsonPointerToArray,unescapeJsonPointerToken}),Xl=Yl;function absoluteify(s,o){if(!Wl.test(s)){if(!o)throw new JSONRefError(`Tried to resolve a relative URL, without having a basePath. path: '${s}' basePath: '${o}'`);return resolve(o,s)}return s}function wrapError(s,o){let i;return i=s&&s.response&&s.response.body?`${s.response.body.code} ${s.response.body.message}`:s.message,new JSONRefError(`Could not resolve reference: ${i}`,{...o,cause:s})}function refs_split(s){return(s+"").split("#")}function extractFromDoc(s,o){const i=Jl[s];if(i&&!Wo.isPromise(i))try{const s=extract(o,i);return Object.assign(Promise.resolve(s),{__value:s})}catch(s){return Promise.reject(s)}return getDoc(s).then((s=>extract(o,s)))}function getDoc(s){const o=Jl[s];return o?Wo.isPromise(o)?o:Promise.resolve(o):(Jl[s]=Yl.fetchJSON(s).then((o=>(Jl[s]=o,o))),Jl[s])}function extract(s,o){const i=jsonPointerToArray(s);if(i.length<1)return o;const a=Wo.getIn(o,i);if(void 0===a)throw new JSONRefError(`Could not resolve pointer: ${s} does not exist in document`,{pointer:s});return a}function jsonPointerToArray(s){if("string"!=typeof s)throw new TypeError("Expected a string, got a "+typeof s);return"/"===s[0]&&(s=s.substr(1)),""===s?[]:s.split("/").map(unescapeJsonPointerToken)}function unescapeJsonPointerToken(s){if("string"!=typeof s)return s;return new URLSearchParams(`=${s.replace(/~1/g,"/").replace(/~0/g,"~")}`).get("")}function escapeJsonPointerToken(s){return new URLSearchParams([["",s.replace(/~/g,"~0").replace(/\//g,"~1")]]).toString().slice(1)}const pointerBoundaryChar=s=>!s||"/"===s||"#"===s;function pointerIsAParent(s,o){if(pointerBoundaryChar(o))return!0;const i=s.charAt(o.length),a=o.slice(-1);return 0===s.indexOf(o)&&(!i||"/"===i||"#"===i)&&"#"!==a}const Ql={key:"allOf",plugin:(s,o,i,a,u)=>{if(u.meta&&u.meta.$$ref)return;const _=i.slice(0,-1);if(isFreelyNamed(_))return;if(!Array.isArray(s)){const s=new TypeError("allOf must be an array");return s.fullPath=i,s}let w=!1,x=u.value;if(_.forEach((s=>{x&&(x=x[s])})),x={...x},0===Object.keys(x).length)return;delete x.allOf;const C=[];return C.push(a.replace(_,{})),s.forEach(((s,o)=>{if(!a.isObject(s)){if(w)return null;w=!0;const s=new TypeError("Elements in allOf must be objects");return s.fullPath=i,C.push(s)}C.push(a.mergeDeep(_,s));const u=function generateAbsoluteRefPatches(s,o,{specmap:i,getBaseUrlForNodePath:a=s=>i.getContext([...o,...s]).baseDoc,targetKeys:u=["$ref","$$ref"]}={}){const _=[];return Rl(s).forEach((function callback(){if(u.includes(this.key)&&"string"==typeof this.node){const s=this.path,u=o.concat(this.path),w=absolutifyPointer(this.node,a(s));_.push(i.replace(u,w))}})),_}(s,i.slice(0,-1),{getBaseUrlForNodePath:s=>a.getContext([...i,o,...s]).baseDoc,specmap:a});C.push(...u)})),x.example&&C.push(a.remove([].concat(_,"example"))),C.push(a.mergeDeep(_,x)),x.$$ref||C.push(a.remove([].concat(_,"$$ref"))),C}},Zl={key:"parameters",plugin:(s,o,i,a)=>{if(Array.isArray(s)&&s.length){const o=Object.assign([],s),u=i.slice(0,-1),_={...Wo.getIn(a.spec,u)};for(let u=0;u{const u={...s};for(const o in s)try{u[o].default=a.modelPropertyMacro(u[o])}catch(s){const o=new Error(s);return o.fullPath=i,o}return Wo.replace(i,u)}};class ContextTree{constructor(s){this.root=context_tree_createNode(s||{})}set(s,o){const i=this.getParent(s,!0);if(!i)return void context_tree_updateNode(this.root,o,null);const a=s[s.length-1],{children:u}=i;u[a]?context_tree_updateNode(u[a],o,i):u[a]=context_tree_createNode(o,i)}get(s){if((s=s||[]).length<1)return this.root.value;let o,i,a=this.root;for(let u=0;u{if(!s)return s;const{children:a}=s;return!a[i]&&o&&(a[i]=context_tree_createNode(null,s)),a[i]}),this.root)}}function context_tree_createNode(s,o){return context_tree_updateNode({children:{}},s,o)}function context_tree_updateNode(s,o,i){return s.value=o||{},s.protoValue=i?{...i.protoValue,...s.value}:s.value,Object.keys(s.children).forEach((o=>{const i=s.children[o];s.children[o]=context_tree_updateNode(i,i.value,s)})),s}const specmap_noop=()=>{};class SpecMap{static getPluginName(s){return s.pluginName}static getPatchesOfType(s,o){return s.filter(o)}constructor(s){Object.assign(this,{spec:"",debugLevel:"info",plugins:[],pluginHistory:{},errors:[],mutations:[],promisedPatches:[],state:{},patches:[],context:{},contextTree:new ContextTree,showDebug:!1,allPatches:[],pluginProp:"specMap",libMethods:Object.assign(Object.create(this),Wo,{getInstance:()=>this}),allowMetaPatches:!1},s),this.get=this._get.bind(this),this.getContext=this._getContext.bind(this),this.hasRun=this._hasRun.bind(this),this.wrappedPlugins=this.plugins.map(this.wrapPlugin.bind(this)).filter(Wo.isFunction),this.patches.push(Wo.add([],this.spec)),this.patches.push(Wo.context([],this.context)),this.updatePatches(this.patches)}debug(s,...o){this.debugLevel===s&&console.log(...o)}verbose(s,...o){"verbose"===this.debugLevel&&console.log(`[${s}] `,...o)}wrapPlugin(s,o){const{pathDiscriminator:i}=this;let a,u=null;return s[this.pluginProp]?(u=s,a=s[this.pluginProp]):Wo.isFunction(s)?a=s:Wo.isObject(s)&&(a=function createKeyBasedPlugin(s){const isSubPath=(s,o)=>!Array.isArray(s)||s.every(((s,i)=>s===o[i]));return function*generator(o,a){const u={};for(const[s,i]of o.filter(Wo.isAdditiveMutation).entries()){if(!(sthis.getMutationsForPlugin(s).length>0))}nextPromisedPatch(){if(this.promisedPatches.length>0)return Promise.race(this.promisedPatches.map((s=>s.value)))}getPluginHistory(s){const o=this.constructor.getPluginName(s);return this.pluginHistory[o]||[]}getPluginRunCount(s){return this.getPluginHistory(s).length}getPluginHistoryTip(s){const o=this.getPluginHistory(s);return o&&o[o.length-1]||{}}getPluginMutationIndex(s){const o=this.getPluginHistoryTip(s).mutationIndex;return"number"!=typeof o?-1:o}updatePluginHistory(s,o){const i=this.constructor.getPluginName(s);this.pluginHistory[i]=this.pluginHistory[i]||[],this.pluginHistory[i].push(o)}updatePatches(s){Wo.normalizeArray(s).forEach((s=>{if(s instanceof Error)this.errors.push(s);else try{if(!Wo.isObject(s))return void this.debug("updatePatches","Got a non-object patch",s);if(this.showDebug&&this.allPatches.push(s),Wo.isPromise(s.value))return this.promisedPatches.push(s),void this.promisedPatchThen(s);if(Wo.isContextPatch(s))return void this.setContext(s.path,s.value);Wo.isMutation(s)&&this.updateMutations(s)}catch(s){console.error(s),this.errors.push(s)}}))}updateMutations(s){"object"==typeof s.value&&!Array.isArray(s.value)&&this.allowMetaPatches&&(s.value={...s.value});const o=Wo.applyPatch(this.state,s,{allowMetaPatches:this.allowMetaPatches});o&&(this.mutations.push(s),this.state=o)}removePromisedPatch(s){const o=this.promisedPatches.indexOf(s);o<0?this.debug("Tried to remove a promisedPatch that isn't there!"):this.promisedPatches.splice(o,1)}promisedPatchThen(s){return s.value=s.value.then((o=>{const i={...s,value:o};this.removePromisedPatch(s),this.updatePatches(i)})).catch((o=>{this.removePromisedPatch(s),this.updatePatches(o)})),s.value}getMutations(s,o){return s=s||0,"number"!=typeof o&&(o=this.mutations.length),this.mutations.slice(s,o)}getCurrentMutations(){return this.getMutationsForPlugin(this.getCurrentPlugin())}getMutationsForPlugin(s){const o=this.getPluginMutationIndex(s);return this.getMutations(o+1)}getCurrentPlugin(){return this.currentPlugin}getLib(){return this.libMethods}_get(s){return Wo.getIn(this.state,s)}_getContext(s){return this.contextTree.get(s)}setContext(s,o){return this.contextTree.set(s,o)}_hasRun(s){return this.getPluginRunCount(this.getCurrentPlugin())>(s||0)}dispatch(){const s=this,o=this.nextPlugin();if(!o){const s=this.nextPromisedPatch();if(s)return s.then((()=>this.dispatch())).catch((()=>this.dispatch()));const o={spec:this.state,errors:this.errors};return this.showDebug&&(o.patches=this.allPatches),Promise.resolve(o)}if(s.pluginCount=s.pluginCount||new WeakMap,s.pluginCount.set(o,(s.pluginCount.get(o)||0)+1),s.pluginCount[o]>100)return Promise.resolve({spec:s.state,errors:s.errors.concat(new Error("We've reached a hard limit of 100 plugin runs"))});if(o!==this.currentPlugin&&this.promisedPatches.length){const s=this.promisedPatches.map((s=>s.value));return Promise.all(s.map((s=>s.then(specmap_noop,specmap_noop)))).then((()=>this.dispatch()))}return function executePlugin(){s.currentPlugin=o;const i=s.getCurrentMutations(),a=s.mutations.length-1;try{if(o.isGenerator)for(const a of o(i,s.getLib()))updatePatches(a);else{updatePatches(o(i,s.getLib()))}}catch(s){console.error(s),updatePatches([Object.assign(Object.create(s),{plugin:o})])}finally{s.updatePluginHistory(o,{mutationIndex:a})}return s.dispatch()}();function updatePatches(i){i&&(i=Wo.fullyNormalizeArray(i),s.updatePatches(i,o))}}}const tu={refs:Xl,allOf:Ql,parameters:Zl,properties:eu};function makeFetchJSON(s,o={}){const{requestInterceptor:i,responseInterceptor:a}=o,u=s.withCredentials?"include":"same-origin";return o=>s({url:o,loadSpec:!0,requestInterceptor:i,responseInterceptor:a,headers:{Accept:Dl},credentials:u}).then((s=>s.body))}function isFile(s,o){return o||"undefined"==typeof navigator||(o=navigator),o&&"ReactNative"===o.product?!(!s||"object"!=typeof s||"string"!=typeof s.uri):"undefined"!=typeof File&&s instanceof File||("undefined"!=typeof Blob&&s instanceof Blob||(!!ArrayBuffer.isView(s)||null!==s&&"object"==typeof s&&"function"==typeof s.pipe))}function isArrayOfFile(s,o){return Array.isArray(s)&&s.some((s=>isFile(s,o)))}class FileWithData extends File{constructor(s,o="",i={}){super([s],o,i),this.data=s}valueOf(){return this.data}toString(){return this.valueOf()}}const isRfc3986Reserved=s=>":/?#[]@!$&'()*+,;=".indexOf(s)>-1,isRfc3986Unreserved=s=>/^[a-z0-9\-._~]+$/i.test(s);function encodeCharacters(s,o="reserved"){return[...s].map((s=>{if(isRfc3986Unreserved(s))return s;if(isRfc3986Reserved(s)&&"unsafe"===o)return s;const i=new TextEncoder;return Array.from(i.encode(s)).map((s=>`0${s.toString(16).toUpperCase()}`.slice(-2))).map((s=>`%${s}`)).join("")})).join("")}function stylize(s){const{value:o}=s;return Array.isArray(o)?function encodeArray({key:s,value:o,style:i,explode:a,escape:u}){if("simple"===i)return o.map((s=>valueEncoder(s,u))).join(",");if("label"===i)return`.${o.map((s=>valueEncoder(s,u))).join(".")}`;if("matrix"===i)return o.map((s=>valueEncoder(s,u))).reduce(((o,i)=>!o||a?`${o||""};${s}=${i}`:`${o},${i}`),"");if("form"===i){const i=a?`&${s}=`:",";return o.map((s=>valueEncoder(s,u))).join(i)}if("spaceDelimited"===i){const i=a?`${s}=`:"";return o.map((s=>valueEncoder(s,u))).join(` ${i}`)}if("pipeDelimited"===i){const i=a?`${s}=`:"";return o.map((s=>valueEncoder(s,u))).join(`|${i}`)}return}(s):"object"==typeof o?function encodeObject({key:s,value:o,style:i,explode:a,escape:u}){const _=Object.keys(o);if("simple"===i)return _.reduce(((s,i)=>{const _=valueEncoder(o[i],u);return`${s?`${s},`:""}${i}${a?"=":","}${_}`}),"");if("label"===i)return _.reduce(((s,i)=>{const _=valueEncoder(o[i],u);return`${s?`${s}.`:"."}${i}${a?"=":"."}${_}`}),"");if("matrix"===i&&a)return _.reduce(((s,i)=>`${s?`${s};`:";"}${i}=${valueEncoder(o[i],u)}`),"");if("matrix"===i)return _.reduce(((i,a)=>{const _=valueEncoder(o[a],u);return`${i?`${i},`:`;${s}=`}${a},${_}`}),"");if("form"===i)return _.reduce(((s,i)=>{const _=valueEncoder(o[i],u);return`${s?`${s}${a?"&":","}`:""}${i}${a?"=":","}${_}`}),"");return}(s):function encodePrimitive({key:s,value:o,style:i,escape:a}){if("simple"===i)return valueEncoder(o,a);if("label"===i)return`.${valueEncoder(o,a)}`;if("matrix"===i)return`;${s}=${valueEncoder(o,a)}`;if("form"===i)return valueEncoder(o,a);if("deepObject"===i)return valueEncoder(o,a);return}(s)}function valueEncoder(s,o=!1){return Array.isArray(s)||null!==s&&"object"==typeof s?s=JSON.stringify(s):"number"!=typeof s&&"boolean"!=typeof s||(s=String(s)),o&&"string"==typeof s&&s.length>0?encodeCharacters(s,o):null!=s?s:""}const ru={form:",",spaceDelimited:"%20",pipeDelimited:"|"},nu={csv:",",ssv:"%20",tsv:"%09",pipes:"|"};function formatKeyValue(s,o,i=!1){const{collectionFormat:a,allowEmptyValue:u,serializationOption:_,encoding:w}=o,x="object"!=typeof o||Array.isArray(o)?o:o.value,C=i?s=>s.toString():s=>encodeURIComponent(s),j=C(s);if(void 0===x&&u)return[[j,""]];if(isFile(x)||isArrayOfFile(x))return[[j,x]];if(_)return formatKeyValueBySerializationOption(s,x,i,_);if(w){if([typeof w.style,typeof w.explode,typeof w.allowReserved].some((s=>"undefined"!==s))){const{style:o,explode:a,allowReserved:u}=w;return formatKeyValueBySerializationOption(s,x,i,{style:o,explode:a,allowReserved:u})}if("string"==typeof w.contentType){if(w.contentType.startsWith("application/json")){const s=C("string"==typeof x?x:JSON.stringify(x));return[[j,new FileWithData(s,"blob",{type:w.contentType})]]}const s=C(String(x));return[[j,new FileWithData(s,"blob",{type:w.contentType})]]}return"object"!=typeof x?[[j,C(x)]]:Array.isArray(x)&&x.every((s=>"object"!=typeof s))?[[j,x.map(C).join(",")]]:[[j,C(JSON.stringify(x))]]}return"object"!=typeof x?[[j,C(x)]]:Array.isArray(x)?"multi"===a?[[j,x.map(C)]]:[[j,x.map(C).join(nu[a||"csv"])]]:[[j,""]]}function formatKeyValueBySerializationOption(s,o,i,a){const u=a.style||"form",_=void 0===a.explode?"form"===u:a.explode,w=!i&&(a&&a.allowReserved?"unsafe":"reserved"),encodeFn=s=>valueEncoder(s,w),x=i?s=>s:s=>encodeFn(s);return"object"!=typeof o?[[x(s),encodeFn(o)]]:Array.isArray(o)?_?[[x(s),o.map(encodeFn)]]:[[x(s),o.map(encodeFn).join(ru[u])]]:"deepObject"===u?Object.keys(o).map((i=>[x(`${s}[${i}]`),encodeFn(o[i])])):_?Object.keys(o).map((s=>[x(s),encodeFn(o[s])])):[[x(s),Object.keys(o).map((s=>[`${x(s)},${encodeFn(o[s])}`])).join(",")]]}function encodeFormOrQuery(s){return((s,{encode:o=!0}={})=>{const buildNestedParams=(s,o,i)=>(Array.isArray(i)?i.reduce(((i,a)=>buildNestedParams(s,o,a)),s):i instanceof Date?s.append(o,i.toISOString()):"object"==typeof i?Object.entries(i).reduce(((i,[a,u])=>buildNestedParams(s,`${o}[${a}]`,u)),s):s.append(o,i),s),i=Object.entries(s).reduce(((s,[o,i])=>buildNestedParams(s,o,i)),new URLSearchParams),a=String(i);return o?a:decodeURIComponent(a)})(Object.keys(s).reduce(((o,i)=>{for(const[a,u]of formatKeyValue(i,s[i]))o[a]=u instanceof FileWithData?u.valueOf():u;return o}),{}),{encode:!1})}function serializeRequest(s={}){const{url:o="",query:i,form:a}=s;if(a){const o=Object.keys(a).some((s=>{const{value:o}=a[s];return isFile(o)||isArrayOfFile(o)})),i=s.headers["content-type"]||s.headers["Content-Type"];if(o||/multipart\/form-data/i.test(i)){const o=function request_buildFormData(s){return Object.entries(s).reduce(((s,[o,i])=>{for(const[a,u]of formatKeyValue(o,i,!0))if(Array.isArray(u))for(const o of u)if(ArrayBuffer.isView(o)){const i=new Blob([o]);s.append(a,i)}else s.append(a,o);else if(ArrayBuffer.isView(u)){const o=new Blob([u]);s.append(a,o)}else s.append(a,u);return s}),new FormData)}(s.form);s.formdata=o,s.body=o}else s.body=encodeFormOrQuery(a);delete s.form}if(i){const[a,u]=o.split("?");let _="";if(u){const s=new URLSearchParams(u);Object.keys(i).forEach((o=>s.delete(o))),_=String(s)}const w=((...s)=>{const o=s.filter((s=>s)).join("&");return o?`?${o}`:""})(_,encodeFormOrQuery(i));s.url=a+w,delete s.query}return s}function serializeHeaders(s={}){return"function"!=typeof s.entries?{}:Array.from(s.entries()).reduce(((s,[o,i])=>(s[o]=function serializeHeaderValue(s){return s.includes(", ")?s.split(", "):s}(i),s)),{})}function serializeResponse(s,o,{loadSpec:i=!1}={}){const a={ok:s.ok,url:s.url||o,status:s.status,statusText:s.statusText,headers:serializeHeaders(s.headers)},u=a.headers["content-type"],_=i||((s="")=>/(json|xml|yaml|text)\b/.test(s))(u);return(_?s.text:s.blob||s.buffer).call(s).then((s=>{if(a.text=s,a.data=s,_)try{const o=function parseBody(s,o){if(o){if(0===o.indexOf("application/json")||o.indexOf("+json")>0)return JSON.parse(s);if(0===o.indexOf("application/xml")||o.indexOf("+xml")>0)return s}return fn.load(s)}(s,u);a.body=o,a.obj=o}catch(s){a.parseError=s}return a}))}async function http_http(s,o={}){"object"==typeof s&&(s=(o=s).url),o.headers=o.headers||{},(o=serializeRequest(o)).headers&&Object.keys(o.headers).forEach((s=>{const i=o.headers[s];"string"==typeof i&&(o.headers[s]=i.replace(/\n+/g," "))})),o.requestInterceptor&&(o=await o.requestInterceptor(o)||o);const i=o.headers["content-type"]||o.headers["Content-Type"];let a;/multipart\/form-data/i.test(i)&&(delete o.headers["content-type"],delete o.headers["Content-Type"]);try{a=await(o.userFetch||fetch)(o.url,o),a=await serializeResponse(a,s,o),o.responseInterceptor&&(a=await o.responseInterceptor(a)||a)}catch(s){if(!a)throw s;const o=new Error(a.statusText||`response status is ${a.status}`);throw o.status=a.status,o.statusCode=a.status,o.responseError=s,o}if(!a.ok){const s=new Error(a.statusText||`response status is ${a.status}`);throw s.status=a.status,s.statusCode=a.status,s.response=a,s}return a}const options_retrievalURI=s=>{var o,i;const{baseDoc:a,url:u}=s,_=null!==(o=null!=a?a:u)&&void 0!==o?o:"";return"string"==typeof(null===(i=globalThis.document)||void 0===i?void 0:i.baseURI)?String(new URL(_,globalThis.document.baseURI)):_},options_httpClient=s=>{const{fetch:o,http:i}=s;return o||i||http_http};async function resolveGenericStrategy(s){const{spec:o,mode:i,allowMetaPatches:a=!0,pathDiscriminator:u,modelPropertyMacro:_,parameterMacro:w,requestInterceptor:x,responseInterceptor:C,skipNormalization:j=!1,useCircularStructures:L,strategies:B}=s,$=options_retrievalURI(s),U=options_httpClient(s),V=B.find((s=>s.match(o)));return async function doResolve(s){$&&(tu.refs.docCache[$]=s);tu.refs.fetchJSON=makeFetchJSON(U,{requestInterceptor:x,responseInterceptor:C});const o=[tu.refs];"function"==typeof w&&o.push(tu.parameters);"function"==typeof _&&o.push(tu.properties);"strict"!==i&&o.push(tu.allOf);const B=await function mapSpec(s){return new SpecMap(s).dispatch()}({spec:s,context:{baseDoc:$},plugins:o,allowMetaPatches:a,pathDiscriminator:u,parameterMacro:w,modelPropertyMacro:_,useCircularStructures:L});j||(B.spec=V.normalize(B.spec));return B}(o)}const su=_curry2((function and(s,o){return s&&o}));const ou=_curry2((function both(s,o){return _isFunction(s)?function _both(){return s.apply(this,arguments)&&o.apply(this,arguments)}:hc(su)(s,o)}));const iu=na(null);const au=dc(iu);function isOfTypeObject_typeof(s){return isOfTypeObject_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(s){return typeof s}:function(s){return s&&"function"==typeof Symbol&&s.constructor===Symbol&&s!==Symbol.prototype?"symbol":typeof s},isOfTypeObject_typeof(s)}const cu=function isOfTypeObject(s){return"object"===isOfTypeObject_typeof(s)};const lu=$a(1,ou(au,cu));var uu=pipe(ra,Pc("Object")),pu=pipe(ga,na(ga(Object))),hu=Qo(ou(Mc,pu),["constructor"]),du=$a(1,(function(s){if(!lu(s)||!uu(s))return!1;var o=Object.getPrototypeOf(s);return!!iu(o)||hu(o)}));const fu=du,replace_special_chars_with_underscore=s=>s.replace(/\W/gi,"_");function opId(s,o,i="",{v2OperationIdCompatibilityMode:a}={}){if(!s||"object"!=typeof s)return null;return(s.operationId||"").replace(/\s/g,"").length?replace_special_chars_with_underscore(s.operationId):function idFromPathMethod(s,o,{v2OperationIdCompatibilityMode:i}={}){if(i){let i=`${o.toLowerCase()}_${s}`.replace(/[\s!@#$%^&*()_+=[{\]};:<>|./?,\\'""-]/g,"_");return i=i||`${s.substring(1)}_${o}`,i.replace(/((_){2,})/g,"_").replace(/^(_)*/g,"").replace(/([_])*$/g,"")}return`${o.toLowerCase()}${replace_special_chars_with_underscore(s)}`}(o,i,{v2OperationIdCompatibilityMode:a})}function normalize_normalize(s){const{spec:o}=s,{paths:i}=o,a={};if(!i||o.$$normalized)return s;for(const s in i){const u=i[s];if(null==u||!["object","function"].includes(typeof u))continue;const _=u.parameters;for(const i in u){const w=u[i];if(null==w||!["object","function"].includes(typeof w))continue;const x=opId(w,s,i);if(x){a[x]?a[x].push(w):a[x]=[w];const s=a[x];if(s.length>1)s.forEach(((s,o)=>{s.__originalOperationId=s.__originalOperationId||s.operationId,s.operationId=`${x}${o+1}`}));else if(void 0!==w.operationId){const o=s[0];o.__originalOperationId=o.__originalOperationId||w.operationId,o.operationId=x}}if("parameters"!==i){const s=[],i={};for(const a in o)"produces"!==a&&"consumes"!==a&&"security"!==a||(i[a]=o[a],s.push(i));if(_&&(i.parameters=_,s.push(i)),s.length)for(const o of s)for(const s in o)if(Array.isArray(w[s])){if("parameters"===s)for(const i of o[s]){w[s].some((s=>!(!fu(s)&&!fu(i))&&(s===i||["name","$ref","$$ref"].some((o=>"string"==typeof s[o]&&"string"==typeof i[o]&&s[o]===i[o])))))||w[s].push(i)}}else w[s]=o[s]}}}return o.$$normalized=!0,s}const mu={name:"generic",match:()=>!0,normalize(s){const{spec:o}=normalize_normalize({spec:s});return o},resolve:async s=>resolveGenericStrategy(s)},gu=mu;const isOpenAPI30=s=>{try{const{openapi:o}=s;return"string"==typeof o&&/^3\.0\.(?:[1-9]\d*|0)$/.test(o)}catch{return!1}},isOpenAPI31=s=>{try{const{openapi:o}=s;return"string"==typeof o&&/^3\.1\.(?:[1-9]\d*|0)$/.test(o)}catch{return!1}},isOpenAPI3=s=>isOpenAPI30(s)||isOpenAPI31(s),yu={name:"openapi-2",match:s=>(s=>{try{const{swagger:o}=s;return"2.0"===o}catch{return!1}})(s),normalize(s){const{spec:o}=normalize_normalize({spec:s});return o},resolve:async s=>async function resolveOpenAPI2Strategy(s){return resolveGenericStrategy(s)}(s)},vu=yu;const bu={name:"openapi-3-0",match:s=>isOpenAPI30(s),normalize(s){const{spec:o}=normalize_normalize({spec:s});return o},resolve:async s=>async function resolveOpenAPI30Strategy(s){return resolveGenericStrategy(s)}(s)},_u=bu;var Su=__webpack_require__(34035);function _reduced(s){return s&&s["@@transducer/reduced"]?s:{"@@transducer/value":s,"@@transducer/reduced":!0}}var Eu=function(){function XAll(s,o){this.xf=o,this.f=s,this.all=!0}return XAll.prototype["@@transducer/init"]=_xfBase_init,XAll.prototype["@@transducer/result"]=function(s){return this.all&&(s=this.xf["@@transducer/step"](s,!0)),this.xf["@@transducer/result"](s)},XAll.prototype["@@transducer/step"]=function(s,o){return this.f(o)||(this.all=!1,s=_reduced(this.xf["@@transducer/step"](s,!1))),s},XAll}();function _xall(s){return function(o){return new Eu(s,o)}}var wu=_curry2(_dispatchable(["all"],_xall,(function all(s,o){for(var i=0;is.classes.contains("api"))).first}get results(){return this.children.filter((s=>s.classes.contains("result")))}get result(){return this.results.first}get annotations(){return this.children.filter((s=>"annotation"===s.element))}get warnings(){return this.children.filter((s=>"annotation"===s.element&&s.classes.contains("warning")))}get errors(){return this.children.filter((s=>"annotation"===s.element&&s.classes.contains("error")))}get isEmpty(){return this.children.reject((s=>"annotation"===s.element)).isEmpty}replaceResult(s){const{result:o}=this;if(bc(o))return!1;const i=this.content.findIndex((s=>s===o));return-1!==i&&(this.content[i]=s,!0)}}const Au=ParseResult,hasMethod=(s,o)=>"object"==typeof o&&null!==o&&s in o&&"function"==typeof o[s],hasBasicElementProps=s=>"object"==typeof s&&null!=s&&"_storedElement"in s&&"string"==typeof s._storedElement&&"_content"in s,primitiveEq=(s,o)=>"object"==typeof o&&null!==o&&"primitive"in o&&("function"==typeof o.primitive&&o.primitive()===s),hasClass=(s,o)=>"object"==typeof o&&null!==o&&"classes"in o&&(Array.isArray(o.classes)||o.classes instanceof Su.wE)&&o.classes.includes(s),isElementType=(s,o)=>"object"==typeof o&&null!==o&&"element"in o&&o.element===s,helpers=s=>s({hasMethod,hasBasicElementProps,primitiveEq,isElementType,hasClass}),Cu=helpers((({hasBasicElementProps:s,primitiveEq:o})=>i=>i instanceof Su.Hg||s(i)&&o(void 0,i))),ju=helpers((({hasBasicElementProps:s,primitiveEq:o})=>i=>i instanceof Su.Om||s(i)&&o("string",i))),Pu=helpers((({hasBasicElementProps:s,primitiveEq:o})=>i=>i instanceof Su.kT||s(i)&&o("number",i))),Iu=helpers((({hasBasicElementProps:s,primitiveEq:o})=>i=>i instanceof Su.Os||s(i)&&o("null",i))),Tu=helpers((({hasBasicElementProps:s,primitiveEq:o})=>i=>i instanceof Su.bd||s(i)&&o("boolean",i))),Nu=helpers((({hasBasicElementProps:s,primitiveEq:o,hasMethod:i})=>a=>a instanceof Su.Sh||s(a)&&o("object",a)&&i("keys",a)&&i("values",a)&&i("items",a))),Mu=helpers((({hasBasicElementProps:s,primitiveEq:o,hasMethod:i})=>a=>a instanceof Su.wE&&!(a instanceof Su.Sh)||s(a)&&o("array",a)&&i("push",a)&&i("unshift",a)&&i("map",a)&&i("reduce",a))),Ru=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Su.Pr||s(a)&&o("member",a)&&i(void 0,a))),Du=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Su.Ft||s(a)&&o("link",a)&&i(void 0,a))),Lu=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Su.sI||s(a)&&o("ref",a)&&i(void 0,a))),Fu=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof ku||s(a)&&o("annotation",a)&&i("array",a))),Bu=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Ou||s(a)&&o("comment",a)&&i("string",a))),$u=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Au||s(a)&&o("parseResult",a)&&i("array",a))),isPrimitiveElement=s=>isElementType("object",s)||isElementType("array",s)||isElementType("boolean",s)||isElementType("number",s)||isElementType("string",s)||isElementType("null",s)||isElementType("member",s),hasElementSourceMap=s=>!!Cu(s)&&(Number.isInteger(s.startPositionRow)&&Number.isInteger(s.startPositionColumn)&&Number.isInteger(s.startIndex)&&Number.isInteger(s.endPositionRow)&&Number.isInteger(s.endPositionColumn)&&Number.isInteger(s.endIndex)),includesSymbols=(s,o)=>{if(0===s.length)return!0;const i=o.attributes.get("symbols");return!!Mu(i)&&xu(sc(i.toValue()),s)},includesClasses=(s,o)=>0===s.length||xu(sc(o.classes.toValue()),s);const es_T=function(){return!0};const es_F=function(){return!1},getVisitFn=(s,o,i)=>{const a=s[o];if(null!=a){if(!i&&"function"==typeof a)return a;const s=i?a.leave:a.enter;if("function"==typeof s)return s}else{const a=i?s.leave:s.enter;if(null!=a){if("function"==typeof a)return a;const s=a[o];if("function"==typeof s)return s}}return null},qu={},getNodeType=s=>null==s?void 0:s.type,isNode=s=>"string"==typeof getNodeType(s),cloneNode=s=>Object.create(Object.getPrototypeOf(s),Object.getOwnPropertyDescriptors(s)),mergeAll=(s,{visitFnGetter:o=getVisitFn,nodeTypeGetter:i=getNodeType,breakSymbol:a=qu,deleteNodeSymbol:u=null,skipVisitingNodeSymbol:_=!1,exposeEdits:w=!1}={})=>{const x=Symbol("skip"),C=new Array(s.length).fill(x);return{enter(j,L,B,$,U,V){let z=j,Y=!1;const Z={...V,replaceWith(s,o){V.replaceWith(s,o),z=s}};for(let j=0;j{const x=Symbol("skip"),C=new Array(s.length).fill(x);return{async enter(j,L,B,$,U,V){let z=j,Y=!1;const Z={...V,replaceWith(s,o){V.replaceWith(s,o),z=s}};for(let j=0;j{const U=i||{};let V,z,Y=Array.isArray(s),Z=[s],ee=-1,ie=[],ae=s;const ce=[],le=[];do{ee+=1;const s=ee===Z.length;let i;const fe=s&&0!==ie.length;if(s){if(i=0===le.length?void 0:ce.pop(),ae=z,z=le.pop(),fe)if(Y){ae=ae.slice();let s=0;for(const[o,i]of ie){const a=o-s;i===_?(ae.splice(a,1),s+=1):ae[a]=i}}else{ae=L(ae);for(const[s,o]of ie)ae[s]=o}ee=V.index,Z=V.keys,ie=V.edits,Y=V.inArray,V=V.prev}else if(z!==_&&void 0!==z){if(i=Y?ee:Z[ee],ae=z[i],ae===_||void 0===ae)continue;ce.push(i)}let ye;if(!Array.isArray(ae)){var pe;if(!j(ae))throw new Go(`Invalid AST Node: ${String(ae)}`,{node:ae});if(B&&le.includes(ae)){"function"==typeof $&&$(ae,i,z,ce,le),ce.pop();continue}const _=x(o,C(ae),s);if(_){for(const[s,i]of Object.entries(a))o[s]=i;const u={replaceWith(o,a){"function"==typeof a?a(o,ae,i,z,ce,le):z&&(z[i]=o),s||(ae=o)}};ye=_.call(o,ae,i,z,ce,le,u)}if("function"==typeof(null===(pe=ye)||void 0===pe?void 0:pe.then))throw new Go("Async visitor not supported in sync mode",{visitor:o,visitFn:_});if(ye===u)break;if(ye===w){if(!s){ce.pop();continue}}else if(void 0!==ye&&(ie.push([i,ye]),!s)){if(!j(ye)){ce.pop();continue}ae=ye}}var de;if(void 0===ye&&fe&&ie.push([i,ae]),!s)V={inArray:Y,index:ee,keys:Z,edits:ie,prev:V},Y=Array.isArray(ae),Z=Y?ae:null!==(de=U[C(ae)])&&void 0!==de?de:[],ee=-1,ie=[],z!==_&&void 0!==z&&le.push(z),z=ae}while(void 0!==V);return 0!==ie.length?ie[ie.length-1][1]:s};visit[Symbol.for("nodejs.util.promisify.custom")]=async(s,o,{keyMap:i=null,state:a={},breakSymbol:u=qu,deleteNodeSymbol:_=null,skipVisitingNodeSymbol:w=!1,visitFnGetter:x=getVisitFn,nodeTypeGetter:C=getNodeType,nodePredicate:j=isNode,nodeCloneFn:L=cloneNode,detectCycles:B=!0,detectCyclesCallback:$=null}={})=>{const U=i||{};let V,z,Y=Array.isArray(s),Z=[s],ee=-1,ie=[],ae=s;const ce=[],le=[];do{ee+=1;const s=ee===Z.length;let i;const de=s&&0!==ie.length;if(s){if(i=0===le.length?void 0:ce.pop(),ae=z,z=le.pop(),de)if(Y){ae=ae.slice();let s=0;for(const[o,i]of ie){const a=o-s;i===_?(ae.splice(a,1),s+=1):ae[a]=i}}else{ae=L(ae);for(const[s,o]of ie)ae[s]=o}ee=V.index,Z=V.keys,ie=V.edits,Y=V.inArray,V=V.prev}else if(z!==_&&void 0!==z){if(i=Y?ee:Z[ee],ae=z[i],ae===_||void 0===ae)continue;ce.push(i)}let fe;if(!Array.isArray(ae)){if(!j(ae))throw new Go(`Invalid AST Node: ${String(ae)}`,{node:ae});if(B&&le.includes(ae)){"function"==typeof $&&$(ae,i,z,ce,le),ce.pop();continue}const _=x(o,C(ae),s);if(_){for(const[s,i]of Object.entries(a))o[s]=i;const u={replaceWith(o,a){"function"==typeof a?a(o,ae,i,z,ce,le):z&&(z[i]=o),s||(ae=o)}};fe=await _.call(o,ae,i,z,ce,le,u)}if(fe===u)break;if(fe===w){if(!s){ce.pop();continue}}else if(void 0!==fe&&(ie.push([i,fe]),!s)){if(!j(fe)){ce.pop();continue}ae=fe}}var pe;if(void 0===fe&&de&&ie.push([i,ae]),!s)V={inArray:Y,index:ee,keys:Z,edits:ie,prev:V},Y=Array.isArray(ae),Z=Y?ae:null!==(pe=U[C(ae)])&&void 0!==pe?pe:[],ee=-1,ie=[],z!==_&&void 0!==z&&le.push(z),z=ae}while(void 0!==V);return 0!==ie.length?ie[ie.length-1][1]:s};const Uu=class CloneError extends Go{value;constructor(s,o){super(s,o),void 0!==o&&(this.value=o.value)}};const Vu=class DeepCloneError extends Uu{};const zu=class ShallowCloneError extends Uu{};const Wu=_curry2((function mapObjIndexed(s,o){return _arrayReduce((function(i,a){return i[a]=s(o[a],a,o),i}),{},ea(o))}));const Ju=_curry1((function isNil(s){return null==s}));var Hu=_curry2((function hasPath(s,o){if(0===s.length||Ju(o))return!1;for(var i=o,a=0;a{const i=Na(s,o);return Wu((s=>{if(fu(s)&&Yu("$ref",s)&&Xu(Jc,"$ref",s)){const o=Qu(["$ref"],s),a=tp("#/",o);return Qu(a.split("/"),i)}return fu(s)?dereference(s,i):s}),s)},assignSourceMap=(s,o)=>(s.startPositionRow=null==o?void 0:o.startPositionRow,s.startPositionColumn=null==o?void 0:o.startPositionColumn,s.startIndex=null==o?void 0:o.startIndex,s.endPositionRow=null==o?void 0:o.endPositionRow,s.endPositionColumn=null==o?void 0:o.endPositionColumn,s.endIndex=null==o?void 0:o.endIndex,s),cloneDeep=(s,o={})=>{const{visited:i=new WeakMap}=o,a={...o,visited:i};if(i.has(s))return i.get(s);if(s instanceof Su.KeyValuePair){const{key:o,value:u}=s,_=Cu(o)?cloneDeep(o,a):o,w=Cu(u)?cloneDeep(u,a):u,x=new Su.KeyValuePair(_,w);return i.set(s,x),x}if(s instanceof Su.ot){const mapper=s=>cloneDeep(s,a),o=[...s].map(mapper),u=new Su.ot(o);return i.set(s,u),u}if(s instanceof Su.G6){const mapper=s=>cloneDeep(s,a),o=[...s].map(mapper),u=new Su.G6(o);return i.set(s,u),u}if(Cu(s)){const o=cloneShallow(s);if(i.set(s,o),s.content)if(Cu(s.content))o.content=cloneDeep(s.content,a);else if(s.content instanceof Su.KeyValuePair)o.content=cloneDeep(s.content,a);else if(Array.isArray(s.content)){const mapper=s=>cloneDeep(s,a);o.content=s.content.map(mapper)}else o.content=s.content;else o.content=s.content;return o}throw new Vu("Value provided to cloneDeep function couldn't be cloned",{value:s})};cloneDeep.safe=s=>{try{return cloneDeep(s)}catch{return s}};const cloneShallowKeyValuePair=s=>{const{key:o,value:i}=s;return new Su.KeyValuePair(o,i)},cloneShallowElement=s=>{const o=new s.constructor;if(o.element=s.element,hasElementSourceMap(s)&&assignSourceMap(o,s),s.meta.length>0&&(o._meta=cloneDeep(s.meta)),s.attributes.length>0&&(o._attributes=cloneDeep(s.attributes)),Cu(s.content)){const i=s.content;o.content=cloneShallowElement(i)}else Array.isArray(s.content)?o.content=[...s.content]:s.content instanceof Su.KeyValuePair?o.content=cloneShallowKeyValuePair(s.content):o.content=s.content;return o},cloneShallow=s=>{if(s instanceof Su.KeyValuePair)return cloneShallowKeyValuePair(s);if(s instanceof Su.ot)return(s=>{const o=[...s];return new Su.ot(o)})(s);if(s instanceof Su.G6)return(s=>{const o=[...s];return new Su.G6(o)})(s);if(Cu(s))return cloneShallowElement(s);throw new zu("Value provided to cloneShallow function couldn't be cloned",{value:s})};cloneShallow.safe=s=>{try{return cloneShallow(s)}catch{return s}};const visitor_getNodeType=s=>Nu(s)?"ObjectElement":Mu(s)?"ArrayElement":Ru(s)?"MemberElement":ju(s)?"StringElement":Tu(s)?"BooleanElement":Pu(s)?"NumberElement":Iu(s)?"NullElement":Du(s)?"LinkElement":Lu(s)?"RefElement":void 0,visitor_cloneNode=s=>Cu(s)?cloneShallow(s):cloneNode(s),rp=pipe(visitor_getNodeType,Jc),np={ObjectElement:["content"],ArrayElement:["content"],MemberElement:["key","value"],StringElement:[],BooleanElement:[],NumberElement:[],NullElement:[],RefElement:[],LinkElement:[],Annotation:[],Comment:[],ParseResultElement:["content"]};class PredicateVisitor{result;predicate;returnOnTrue;returnOnFalse;constructor({predicate:s=es_F,returnOnTrue:o,returnOnFalse:i}={}){this.result=[],this.predicate=s,this.returnOnTrue=o,this.returnOnFalse=i}enter(s){return this.predicate(s)?(this.result.push(s),this.returnOnTrue):this.returnOnFalse}}const visitor_visit=(s,o,{keyMap:i=np,...a}={})=>visit(s,o,{keyMap:i,nodeTypeGetter:visitor_getNodeType,nodePredicate:rp,nodeCloneFn:visitor_cloneNode,...a});visitor_visit[Symbol.for("nodejs.util.promisify.custom")]=async(s,o,{keyMap:i=np,...a}={})=>visit[Symbol.for("nodejs.util.promisify.custom")](s,o,{keyMap:i,nodeTypeGetter:visitor_getNodeType,nodePredicate:rp,nodeCloneFn:visitor_cloneNode,...a});const nodeTypeGetter=s=>"string"==typeof(null==s?void 0:s.type)?s.type:visitor_getNodeType(s),sp={EphemeralObject:["content"],EphemeralArray:["content"],...np},value_visitor_visit=(s,o,{keyMap:i=sp,...a}={})=>visitor_visit(s,o,{keyMap:i,nodeTypeGetter,nodePredicate:es_T,detectCycles:!1,deleteNodeSymbol:Symbol.for("delete-node"),skipVisitingNodeSymbol:Symbol.for("skip-visiting-node"),...a});value_visitor_visit[Symbol.for("nodejs.util.promisify.custom")]=async(s,{keyMap:o=sp,...i}={})=>visitor_visit[Symbol.for("nodejs.util.promisify.custom")](s,visitor,{keyMap:o,nodeTypeGetter,nodePredicate:es_T,detectCycles:!1,deleteNodeSymbol:Symbol.for("delete-node"),skipVisitingNodeSymbol:Symbol.for("skip-visiting-node"),...i});const op=class EphemeralArray{type="EphemeralArray";content=[];reference=void 0;constructor(s){this.content=s,this.reference=[]}toReference(){return this.reference}toArray(){return this.reference.push(...this.content),this.reference}};const ip=class EphemeralObject{type="EphemeralObject";content=[];reference=void 0;constructor(s){this.content=s,this.reference={}}toReference(){return this.reference}toObject(){return Object.assign(this.reference,Object.fromEntries(this.content))}};class Visitor{ObjectElement={enter:s=>{if(this.references.has(s))return this.references.get(s).toReference();const o=new ip(s.content);return this.references.set(s,o),o}};EphemeralObject={leave:s=>s.toObject()};MemberElement={enter:s=>[s.key,s.value]};ArrayElement={enter:s=>{if(this.references.has(s))return this.references.get(s).toReference();const o=new op(s.content);return this.references.set(s,o),o}};EphemeralArray={leave:s=>s.toArray()};references=new WeakMap;BooleanElement(s){return s.toValue()}NumberElement(s){return s.toValue()}StringElement(s){return s.toValue()}NullElement(){return null}RefElement(s,...o){var i;const a=o[3];return"EphemeralObject"===(null===(i=a[a.length-1])||void 0===i?void 0:i.type)?Symbol.for("delete-node"):String(s.toValue())}LinkElement(s){return ju(s.href)?s.href.toValue():""}}const serializers_value=s=>Cu(s)?ju(s)||Pu(s)||Tu(s)||Iu(s)?s.toValue():value_visitor_visit(s,new Visitor):s;const cp=_curry3((function mergeWithKey(s,o,i){var a,u={};for(a in i=i||{},o=o||{})_has(a,o)&&(u[a]=_has(a,i)?s(a,o[a],i[a]):o[a]);for(a in i)_has(a,i)&&!_has(a,u)&&(u[a]=i[a]);return u}));const lp=_curry3((function mergeDeepWithKey(s,o,i){return cp((function(o,i,a){return _isObject(i)&&_isObject(a)?mergeDeepWithKey(s,i,a):s(o,i,a)}),o,i)}));const up=_curry2((function mergeDeepRight(s,o){return lp((function(s,o,i){return i}),s,o)}));const pp=ja(0,-1);const hp=_curry2((function apply(s,o){return s.apply(this,o)}));const dp=dc(Mc);var fp=_curry1((function empty(s){return null!=s&&"function"==typeof s["fantasy-land/empty"]?s["fantasy-land/empty"]():null!=s&&null!=s.constructor&&"function"==typeof s.constructor["fantasy-land/empty"]?s.constructor["fantasy-land/empty"]():null!=s&&"function"==typeof s.empty?s.empty():null!=s&&null!=s.constructor&&"function"==typeof s.constructor.empty?s.constructor.empty():ca(s)?[]:_isString(s)?"":_isObject(s)?{}:Ei(s)?function(){return arguments}():function _isTypedArray(s){var o=Object.prototype.toString.call(s);return"[object Uint8ClampedArray]"===o||"[object Int8Array]"===o||"[object Uint8Array]"===o||"[object Int16Array]"===o||"[object Uint16Array]"===o||"[object Int32Array]"===o||"[object Uint32Array]"===o||"[object Float32Array]"===o||"[object Float64Array]"===o||"[object BigInt64Array]"===o||"[object BigUint64Array]"===o}(s)?s.constructor.from(""):void 0}));const mp=fp;const gp=_curry1((function isEmpty(s){return null!=s&&na(s,mp(s))}));const yp=$a(1,Mc(Array.isArray)?Array.isArray:pipe(ra,Pc("Array")));const vp=ou(yp,gp);var bp=$a(3,(function(s,o,i){var a=Qu(s,i),u=Qu(pp(s),i);if(!dp(a)&&!vp(s)){var _=Ea(a,u);return hp(_,o)}}));const _p=bp;class Namespace extends Su.g${constructor(){super(),this.register("annotation",ku),this.register("comment",Ou),this.register("parseResult",Au)}}const Sp=new Namespace,createNamespace=s=>{const o=new Namespace;return fu(s)&&o.use(s),o},Ep=Sp,toolbox=()=>({predicates:{...ie},namespace:Ep}),wp={toolboxCreator:toolbox,visitorOptions:{nodeTypeGetter:visitor_getNodeType,exposeEdits:!0}},dispatchPluginsSync=(s,o,i={})=>{if(0===o.length)return s;const a=up(wp,i),{toolboxCreator:u,visitorOptions:_}=a,w=u(),x=o.map((s=>s(w))),C=mergeAll(x.map(La({},"visitor")),{..._});x.forEach(_p(["pre"],[]));const j=visitor_visit(s,C,_);return x.forEach(_p(["post"],[])),j};dispatchPluginsSync[Symbol.for("nodejs.util.promisify.custom")]=async(s,o,i={})=>{if(0===o.length)return s;const a=up(wp,i),{toolboxCreator:u,visitorOptions:_}=a,w=u(),x=o.map((s=>s(w))),C=mergeAll[Symbol.for("nodejs.util.promisify.custom")],j=visitor_visit[Symbol.for("nodejs.util.promisify.custom")],L=C(x.map(La({},"visitor")),{..._});await Promise.allSettled(x.map(_p(["pre"],[])));const B=await j(s,L,_);return await Promise.allSettled(x.map(_p(["post"],[]))),B};const refract=(s,{Type:o,plugins:i=[]})=>{const a=new o(s);return Cu(s)&&(s.meta.length>0&&(a.meta=cloneDeep(s.meta)),s.attributes.length>0&&(a.attributes=cloneDeep(s.attributes))),dispatchPluginsSync(a,i,{toolboxCreator:toolbox,visitorOptions:{nodeTypeGetter:visitor_getNodeType}})},createRefractor=s=>(o,i={})=>refract(o,{...i,Type:s});Su.Sh.refract=createRefractor(Su.Sh),Su.wE.refract=createRefractor(Su.wE),Su.Om.refract=createRefractor(Su.Om),Su.bd.refract=createRefractor(Su.bd),Su.Os.refract=createRefractor(Su.Os),Su.kT.refract=createRefractor(Su.kT),Su.Ft.refract=createRefractor(Su.Ft),Su.sI.refract=createRefractor(Su.sI),ku.refract=createRefractor(ku),Ou.refract=createRefractor(Ou),Au.refract=createRefractor(Au);const computeEdges=(s,o=new WeakMap)=>(Ru(s)?(o.set(s.key,s),computeEdges(s.key,o),o.set(s.value,s),computeEdges(s.value,o)):s.children.forEach((i=>{o.set(i,s),computeEdges(i,o)})),o);const xp=class Transcluder_Transcluder{element;edges;constructor({element:s}){this.element=s}transclude(s,o){var i;if(s===this.element)return o;if(s===o)return this.element;this.edges=null!==(i=this.edges)&&void 0!==i?i:computeEdges(this.element);const a=this.edges.get(s);return bc(a)?void 0:(Nu(a)?((s,o,i)=>{const a=i.get(s);Nu(a)&&(a.content=a.map(((u,_,w)=>w===s?(i.delete(s),i.set(o,a),o):w)))})(s,o,this.edges):Mu(a)?((s,o,i)=>{const a=i.get(s);Mu(a)&&(a.content=a.map((u=>u===s?(i.delete(s),i.set(o,a),o):u)))})(s,o,this.edges):Ru(a)&&((s,o,i)=>{const a=i.get(s);Ru(a)&&(a.key===s&&(a.key=o,i.delete(s),i.set(o,a)),a.value===s&&(a.value=o,i.delete(s),i.set(o,a)))})(s,o,this.edges),this.element)}},fromURIReference=s=>{const o=s.indexOf("#");return(s=>{try{const o=s.startsWith("#")?s.slice(1):s;return decodeURIComponent(o)}catch{return s}})(-1===o?"#":s.substring(o))},kp=function fnparser(){const s=Pp,o=jp,i=this,a="parser.js: Parser(): ";i.ast=void 0,i.stats=void 0,i.trace=void 0,i.callbacks=[];let u,_,w,x,C,j,L,B=0,$=0,U=0,V=0,z=0,Y=new function systemData(){this.state=s.ACTIVE,this.phraseLength=0,this.refresh=()=>{this.state=s.ACTIVE,this.phraseLength=0}};i.parse=(Z,ee,ie,ae)=>{const ce=`${a}parse(): `;B=0,$=0,U=0,V=0,z=0,u=void 0,_=void 0,w=void 0,x=void 0,Y.refresh(),C=void 0,j=void 0,L=void 0,x=o.stringToChars(ie),u=Z.rules,_=Z.udts;const le=ee.toLowerCase();let pe;for(const s in u)if(u.hasOwnProperty(s)&&le===u[s].lower){pe=u[s].index;break}if(void 0===pe)throw new Error(`${ce}start rule name '${startRule}' not recognized`);(()=>{const s=`${a}initializeCallbacks(): `;let o,w;for(C=[],j=[],o=0;o{if(i.phraseLength>u){let s=`${a}opRNM(${o.name}): callback function error: `;throw s+=`sysData.phraseLength: ${i.phraseLength}`,s+=` must be <= remaining chars: ${u}`,new Error(s)}switch(i.state){case s.ACTIVE:if(!_)throw new Error(`${a}opRNM(${o.name}): callback function return error. ACTIVE state not allowed.`);break;case s.EMPTY:i.phraseLength=0;break;case s.MATCH:0===i.phraseLength&&(i.state=s.EMPTY);break;case s.NOMATCH:i.phraseLength=0;break;default:throw new Error(`${a}opRNM(${o.name}): callback function return error. Unrecognized return state: ${i.state}`)}},opUDT=(o,C)=>{let $,U,V;const z=w[o],Z=_[z.index];Y.UdtIndex=Z.index,B||(V=i.ast&&i.ast.udtDefined(z.index),V&&(U=u.length+z.index,$=i.ast.getLength(),i.ast.down(U,Z.name)));const ee=x.length-C;j[z.index](Y,x,C,L),((o,i,u)=>{if(i.phraseLength>u){let s=`${a}opUDT(${o.name}): callback function error: `;throw s+=`sysData.phraseLength: ${i.phraseLength}`,s+=` must be <= remaining chars: ${u}`,new Error(s)}switch(i.state){case s.ACTIVE:throw new Error(`${a}opUDT(${o.name}) ACTIVE state return not allowed.`);case s.EMPTY:if(!o.empty)throw new Error(`${a}opUDT(${o.name}) may not return EMPTY.`);i.phraseLength=0;break;case s.MATCH:if(0===i.phraseLength){if(!o.empty)throw new Error(`${a}opUDT(${o.name}) may not return EMPTY.`);i.state=s.EMPTY}break;case s.NOMATCH:i.phraseLength=0;break;default:throw new Error(`${a}opUDT(${o.name}): callback function return error. Unrecognized return state: ${i.state}`)}})(Z,Y,ee),B||V&&(Y.state===s.NOMATCH?i.ast.setLength($):i.ast.up(U,Z.name,C,Y.phraseLength))},opExecute=(o,_)=>{const j=`${a}opExecute(): `,Z=w[o];switch(V+=1,$>U&&(U=$),$+=1,Y.refresh(),i.trace&&i.trace.down(Z,_),Z.type){case s.ALT:((o,i)=>{const a=w[o];for(let o=0;o{let u,_,x,C;const j=w[o];i.ast&&(_=i.ast.getLength()),u=!0,x=a,C=0;for(let o=0;o{let u,_,C,j;const L=w[o];if(0===L.max)return Y.state=s.EMPTY,void(Y.phraseLength=0);for(_=a,C=0,j=0,i.ast&&(u=i.ast.getLength());!(_>=x.length)&&(opExecute(o+1,_),Y.state!==s.NOMATCH)&&Y.state!==s.EMPTY&&(j+=1,C+=Y.phraseLength,_+=Y.phraseLength,j!==L.max););Y.state===s.EMPTY||j>=L.min?(Y.state=0===C?s.EMPTY:s.MATCH,Y.phraseLength=C):(Y.state=s.NOMATCH,Y.phraseLength=0,i.ast&&i.ast.setLength(u))})(o,_);break;case s.RNM:((o,a)=>{let _,j,$;const U=w[o],V=u[U.index],z=C[V.index];if(B||(j=i.ast&&i.ast.ruleDefined(U.index),j&&(_=i.ast.getLength(),i.ast.down(U.index,u[U.index].name))),z){const o=x.length-a;z(Y,x,a,L),validateRnmCallbackResult(V,Y,o,!0),Y.state===s.ACTIVE&&($=w,w=V.opcodes,opExecute(0,a),w=$,z(Y,x,a,L),validateRnmCallbackResult(V,Y,o,!1))}else $=w,w=V.opcodes,opExecute(0,a,Y),w=$;B||j&&(Y.state===s.NOMATCH?i.ast.setLength(_):i.ast.up(U.index,V.name,a,Y.phraseLength))})(o,_);break;case s.TRG:((o,i)=>{const a=w[o];Y.state=s.NOMATCH,i{const a=w[o],u=a.string.length;if(Y.state=s.NOMATCH,i+u<=x.length){for(let s=0;s{let a;const u=w[o];Y.state=s.NOMATCH;const _=u.string.length;if(0!==_){if(i+_<=x.length){for(let s=0;s<_;s+=1)if(a=x[i+s],a>=65&&a<=90&&(a+=32),a!==u.string[s])return;Y.state=s.MATCH,Y.phraseLength=_}}else Y.state=s.EMPTY})(o,_);break;case s.UDT:opUDT(o,_);break;case s.AND:((o,i)=>{switch(B+=1,opExecute(o+1,i),B-=1,Y.phraseLength=0,Y.state){case s.EMPTY:case s.MATCH:Y.state=s.EMPTY;break;case s.NOMATCH:Y.state=s.NOMATCH;break;default:throw new Error(`opAND: invalid state ${Y.state}`)}})(o,_);break;case s.NOT:((o,i)=>{switch(B+=1,opExecute(o+1,i),B-=1,Y.phraseLength=0,Y.state){case s.EMPTY:case s.MATCH:Y.state=s.NOMATCH;break;case s.NOMATCH:Y.state=s.EMPTY;break;default:throw new Error(`opNOT: invalid state ${Y.state}`)}})(o,_);break;default:throw new Error(`${j}unrecognized operator`)}B||_+Y.phraseLength>z&&(z=_+Y.phraseLength),i.stats&&i.stats.collect(Z,Y),i.trace&&i.trace.up(Z,Y.state,_,Y.phraseLength),$-=1}},Op=function fnast(){const s=Pp,o=jp,i=this;let a,u,_,w=0;const x=[],C=[],j=[];function indent(s){let o="";for(;s-- >0;)o+=" ";return o}i.callbacks=[],i.init=(s,o,L)=>{let B;C.length=0,j.length=0,w=0,a=s,u=o,_=L;const $=[];for(B=0;B!!x[s],i.udtDefined=s=>!!x[a.length+s],i.down=(o,i)=>{const a=j.length;return C.push(a),j.push({name:i,thisIndex:a,thatIndex:void 0,state:s.SEM_PRE,callbackIndex:o,phraseIndex:void 0,phraseLength:void 0,stack:C.length}),a},i.up=(o,i,a,u)=>{const _=j.length,w=C.pop();return j.push({name:i,thisIndex:_,thatIndex:w,state:s.SEM_POST,callbackIndex:o,phraseIndex:a,phraseLength:u,stack:C.length}),j[w].thatIndex=_,j[w].phraseIndex=a,j[w].phraseLength=u,_},i.translate=o=>{let i,a;for(let u=0;u{j.length=s,C.length=s>0?j[s-1].stack:0},i.getLength=()=>j.length,i.toXml=()=>{let i="",a=0;return i+='\n',i+=`\n`,i+="\x3c!-- input string --\x3e\n",i+=indent(a+2),i+=o.charsToString(_),i+="\n",j.forEach((u=>{u.state===s.SEM_PRE?(a+=1,i+=indent(a),i+=`\n`,i+=indent(a+2),i+=o.charsToString(_,u.phraseIndex,u.phraseLength),i+="\n"):(i+=indent(a),i+=`\x3c!-- name="${u.name}" --\x3e\n`,a-=1)})),i+="\n",i}},Ap=function fntrace(){const s=Pp,o=jp,i="parser.js: Trace(): ";let a,u,_,w="",x=0;const C=this,indent=s=>{let o="",i=0;if(s>=0)for(;s--;)i+=1,5===i?(o+="|",i=0):o+=".";return o};C.init=(s,o,i)=>{u=s,_=o,a=i};const opName=a=>{let w;switch(a.type){case s.ALT:w="ALT";break;case s.CAT:w="CAT";break;case s.REP:w=a.max===1/0?`REP(${a.min},inf)`:`REP(${a.min},${a.max})`;break;case s.RNM:w=`RNM(${u[a.index].name})`;break;case s.TRG:w=`TRG(${a.min},${a.max})`;break;case s.TBS:w=a.string.length>6?`TBS(${o.charsToString(a.string,0,3)}...)`:`TBS(${o.charsToString(a.string,0,6)})`;break;case s.TLS:w=a.string.length>6?`TLS(${o.charsToString(a.string,0,3)}...)`:`TLS(${o.charsToString(a.string,0,6)})`;break;case s.UDT:w=`UDT(${_[a.index].name})`;break;case s.AND:w="AND";break;case s.NOT:w="NOT";break;default:throw new Error(`${i}Trace: opName: unrecognized opcode`)}return w};C.down=(s,i)=>{const u=indent(x),_=Math.min(100,a.length-i);let C=o.charsToString(a,i,_);_{const L=`${i}trace.up: `;x-=1;const B=indent(x);let $,U,V;switch(_){case s.EMPTY:V="|E|",U="''";break;case s.MATCH:V="|M|",$=Math.min(100,j),U=$w},Cp=function fnstats(){const s=Pp;let o,i,a;const u=[],_=[],w=[];this.init=(s,a)=>{o=s,i=a,clear()},this.collect=(o,i)=>{incStat(a,i.state,i.phraseLength),incStat(u[o.type],i.state,i.phraseLength),o.type===s.RNM&&incStat(_[o.index],i.state,i.phraseLength),o.type===s.UDT&&incStat(w[o.index],i.state,i.phraseLength)},this.displayStats=()=>{let o="";const i={match:0,empty:0,nomatch:0,total:0},displayRow=(s,o,a,u,_)=>{i.match+=o,i.empty+=a,i.nomatch+=u,i.total+=_;return`${s} | ${normalize(o)} | ${normalize(a)} | ${normalize(u)} | ${normalize(_)} |\n`};return o+=" OPERATOR STATS\n",o+=" | MATCH | EMPTY | NOMATCH | TOTAL |\n",o+=displayRow(" ALT",u[s.ALT].match,u[s.ALT].empty,u[s.ALT].nomatch,u[s.ALT].total),o+=displayRow(" CAT",u[s.CAT].match,u[s.CAT].empty,u[s.CAT].nomatch,u[s.CAT].total),o+=displayRow(" REP",u[s.REP].match,u[s.REP].empty,u[s.REP].nomatch,u[s.REP].total),o+=displayRow(" RNM",u[s.RNM].match,u[s.RNM].empty,u[s.RNM].nomatch,u[s.RNM].total),o+=displayRow(" TRG",u[s.TRG].match,u[s.TRG].empty,u[s.TRG].nomatch,u[s.TRG].total),o+=displayRow(" TBS",u[s.TBS].match,u[s.TBS].empty,u[s.TBS].nomatch,u[s.TBS].total),o+=displayRow(" TLS",u[s.TLS].match,u[s.TLS].empty,u[s.TLS].nomatch,u[s.TLS].total),o+=displayRow(" UDT",u[s.UDT].match,u[s.UDT].empty,u[s.UDT].nomatch,u[s.UDT].total),o+=displayRow(" AND",u[s.AND].match,u[s.AND].empty,u[s.AND].nomatch,u[s.AND].total),o+=displayRow(" NOT",u[s.NOT].match,u[s.NOT].empty,u[s.NOT].nomatch,u[s.NOT].total),o+=displayRow("TOTAL",i.match,i.empty,i.nomatch,i.total),o},this.displayHits=s=>{let o="";const displayRow=(s,o,i,u,_)=>{a.match+=s,a.empty+=o,a.nomatch+=i,a.total+=u;return`| ${normalize(s)} | ${normalize(o)} | ${normalize(i)} | ${normalize(u)} | ${_}\n`};"string"==typeof s&&"a"===s.toLowerCase()[0]?(_.sort(sortAlpha),w.sort(sortAlpha),o+=" RULES/UDTS ALPHABETICALLY\n"):"string"==typeof s&&"i"===s.toLowerCase()[0]?(_.sort(sortIndex),w.sort(sortIndex),o+=" RULES/UDTS BY INDEX\n"):(_.sort(sortHits),w.sort(sortHits),o+=" RULES/UDTS BY HIT COUNT\n"),o+="| MATCH | EMPTY | NOMATCH | TOTAL | NAME\n";for(let s=0;s<_.length;s+=1){let i=_[s];i.total&&(o+=displayRow(i.match,i.empty,i.nomatch,i.total,i.name))}for(let s=0;ss<10?` ${s}`:s<100?` ${s}`:s<1e3?` ${s}`:s<1e4?` ${s}`:s<1e5?` ${s}`:s<1e6?` ${s}`:`${s}`,sortAlpha=(s,o)=>s.lowero.lower?1:0,sortHits=(s,o)=>s.totalo.total?-1:sortAlpha(s,o),sortIndex=(s,o)=>s.indexo.index?1:0,x=function fnempty(){this.empty=0,this.match=0,this.nomatch=0,this.total=0},clear=()=>{u.length=0,a=new x,u[s.ALT]=new x,u[s.CAT]=new x,u[s.REP]=new x,u[s.RNM]=new x,u[s.TRG]=new x,u[s.TBS]=new x,u[s.TLS]=new x,u[s.UDT]=new x,u[s.AND]=new x,u[s.NOT]=new x,_.length=0;for(let s=0;s0){w.length=0;for(let s=0;s{switch(o.total+=1,i){case s.EMPTY:o.empty+=1;break;case s.MATCH:o.match+=1;break;case s.NOMATCH:o.nomatch+=1;break;default:throw new Error(`parser.js: Stats(): collect(): incStat(): unrecognized state: ${i}`)}}},jp={stringToChars:s=>[...s].map((s=>s.codePointAt(0))),charsToString:(s,o,i)=>{let a=s;for(;!(void 0===o||o<0);){if(void 0===i){a=s.slice(o);break}if(i<=0)return"";a=s.slice(o,o+i);break}return String.fromCodePoint(...a)}},Pp={ALT:1,CAT:2,REP:3,RNM:4,TRG:5,TBS:6,TLS:7,UDT:11,AND:12,NOT:13,ACTIVE:100,MATCH:101,EMPTY:102,NOMATCH:103,SEM_PRE:200,SEM_POST:201,SEM_OK:300,idName:s=>{switch(s){case Pp.ALT:return"ALT";case Pp.CAT:return"CAT";case Pp.REP:return"REP";case Pp.RNM:return"RNM";case Pp.TRG:return"TRG";case Pp.TBS:return"TBS";case Pp.TLS:return"TLS";case Pp.UDT:return"UDT";case Pp.AND:return"AND";case Pp.NOT:return"NOT";case Pp.ACTIVE:return"ACTIVE";case Pp.EMPTY:return"EMPTY";case Pp.MATCH:return"MATCH";case Pp.NOMATCH:return"NOMATCH";case Pp.SEM_PRE:return"SEM_PRE";case Pp.SEM_POST:return"SEM_POST";case Pp.SEM_OK:return"SEM_OK";default:return"UNRECOGNIZED STATE"}}};function grammar(){this.grammarObject="grammarObject",this.rules=[],this.rules[0]={name:"json-pointer",lower:"json-pointer",index:0,isBkr:!1},this.rules[1]={name:"reference-token",lower:"reference-token",index:1,isBkr:!1},this.rules[2]={name:"unescaped",lower:"unescaped",index:2,isBkr:!1},this.rules[3]={name:"escaped",lower:"escaped",index:3,isBkr:!1},this.rules[4]={name:"array-location",lower:"array-location",index:4,isBkr:!1},this.rules[5]={name:"array-index",lower:"array-index",index:5,isBkr:!1},this.rules[6]={name:"array-dash",lower:"array-dash",index:6,isBkr:!1},this.rules[7]={name:"slash",lower:"slash",index:7,isBkr:!1},this.udts=[],this.rules[0].opcodes=[],this.rules[0].opcodes[0]={type:3,min:0,max:1/0},this.rules[0].opcodes[1]={type:2,children:[2,3]},this.rules[0].opcodes[2]={type:4,index:7},this.rules[0].opcodes[3]={type:4,index:1},this.rules[1].opcodes=[],this.rules[1].opcodes[0]={type:3,min:0,max:1/0},this.rules[1].opcodes[1]={type:1,children:[2,3]},this.rules[1].opcodes[2]={type:4,index:2},this.rules[1].opcodes[3]={type:4,index:3},this.rules[2].opcodes=[],this.rules[2].opcodes[0]={type:1,children:[1,2,3]},this.rules[2].opcodes[1]={type:5,min:0,max:46},this.rules[2].opcodes[2]={type:5,min:48,max:125},this.rules[2].opcodes[3]={type:5,min:127,max:1114111},this.rules[3].opcodes=[],this.rules[3].opcodes[0]={type:2,children:[1,2]},this.rules[3].opcodes[1]={type:7,string:[126]},this.rules[3].opcodes[2]={type:1,children:[3,4]},this.rules[3].opcodes[3]={type:7,string:[48]},this.rules[3].opcodes[4]={type:7,string:[49]},this.rules[4].opcodes=[],this.rules[4].opcodes[0]={type:1,children:[1,2]},this.rules[4].opcodes[1]={type:4,index:5},this.rules[4].opcodes[2]={type:4,index:6},this.rules[5].opcodes=[],this.rules[5].opcodes[0]={type:1,children:[1,2]},this.rules[5].opcodes[1]={type:6,string:[48]},this.rules[5].opcodes[2]={type:2,children:[3,4]},this.rules[5].opcodes[3]={type:5,min:49,max:57},this.rules[5].opcodes[4]={type:3,min:0,max:1/0},this.rules[5].opcodes[5]={type:5,min:48,max:57},this.rules[6].opcodes=[],this.rules[6].opcodes[0]={type:7,string:[45]},this.rules[7].opcodes=[],this.rules[7].opcodes[0]={type:7,string:[47]},this.toString=function toString(){let s="";return s+="; JavaScript Object Notation (JSON) Pointer ABNF syntax\n",s+="; https://datatracker.ietf.org/doc/html/rfc6901\n",s+="json-pointer = *( slash reference-token ) ; MODIFICATION: surrogate text rule used\n",s+="reference-token = *( unescaped / escaped )\n",s+="unescaped = %x00-2E / %x30-7D / %x7F-10FFFF\n",s+=" ; %x2F ('/') and %x7E ('~') are excluded from 'unescaped'\n",s+='escaped = "~" ( "0" / "1" )\n',s+=" ; representing '~' and '/', respectively\n",s+="\n",s+="; https://datatracker.ietf.org/doc/html/rfc6901#section-4\n",s+="array-location = array-index / array-dash\n",s+="array-index = %x30 / ( %x31-39 *(%x30-39) )\n",s+=' ; "0", or digits without a leading "0"\n',s+='array-dash = "-"\n',s+="\n",s+="; Surrogate named rules\n",s+='slash = "/"\n','; JavaScript Object Notation (JSON) Pointer ABNF syntax\n; https://datatracker.ietf.org/doc/html/rfc6901\njson-pointer = *( slash reference-token ) ; MODIFICATION: surrogate text rule used\nreference-token = *( unescaped / escaped )\nunescaped = %x00-2E / %x30-7D / %x7F-10FFFF\n ; %x2F (\'/\') and %x7E (\'~\') are excluded from \'unescaped\'\nescaped = "~" ( "0" / "1" )\n ; representing \'~\' and \'/\', respectively\n\n; https://datatracker.ietf.org/doc/html/rfc6901#section-4\narray-location = array-index / array-dash\narray-index = %x30 / ( %x31-39 *(%x30-39) )\n ; "0", or digits without a leading "0"\narray-dash = "-"\n\n; Surrogate named rules\nslash = "/"\n'}}class JSONPointerError extends Error{constructor(s,o=void 0){if(super(s,o),this.name=this.constructor.name,"string"==typeof s&&(this.message=s),"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error(s).stack,null!=o&&"object"==typeof o&&Object.prototype.hasOwnProperty.call(o,"cause")&&!("cause"in this)){const{cause:s}=o;this.cause=s,s instanceof Error&&"stack"in s&&(this.stack=`${this.stack}\nCAUSE: ${s.stack}`)}if(null!=o&&"object"==typeof o){const{cause:s,...i}=o;Object.assign(this,i)}}}const Ip=JSONPointerError;const Tp=class JSONPointerParseError extends Ip{},callbacks_cst=s=>(o,i,a,u,_)=>{if("object"!=typeof _||null===_||Array.isArray(_))throw new Tp("parser's user data must be an object");if(o===Pp.SEM_PRE){const o={type:s,text:jp.charsToString(i,a,u),start:a,length:u,children:[]};if(_.stack.length>0){_.stack[_.stack.length-1].children.push(o)}else _.root=o;_.stack.push(o)}o===Pp.SEM_POST&&_.stack.pop()};const Np=class CSTTranslator_CSTTranslator extends Op{constructor(){super(),this.callbacks["json-pointer"]=callbacks_cst("json-pointer"),this.callbacks["reference-token"]=callbacks_cst("reference-token"),this.callbacks.slash=callbacks_cst("text")}getTree(){const s={stack:[],root:null};return this.translate(s),delete s.stack,s}},es_unescape=s=>{if("string"!=typeof s)throw new TypeError("Reference token must be a string");return s.replace(/~1/g,"/").replace(/~0/g,"~")};const Mp=class ASTTranslator extends Np{getTree(){const{root:s}=super.getTree();return s.children.filter((({type:s})=>"reference-token"===s)).map((({text:s})=>es_unescape(s)))}};const Rp=class Expectations extends Array{toString(){return this.map((s=>`"${String(s)}"`)).join(", ")}};const Dp=class Trace extends Ap{inferExpectations(){const s=this.displayTrace().split("\n"),o=new Set;let i=-1;for(let a=0;ai){const s=u.match(/N\|\[TLS\(([^)]+)\)]/);s&&o.add(s[1])}}return new Rp(...o)}},Lp=new grammar,es_parse=(s,{translator:o=new Mp,stats:i=!1,trace:a=!1}={})=>{if("string"!=typeof s)throw new TypeError("JSON Pointer must be a string");try{const u=new kp;o&&(u.ast=o),i&&(u.stats=new Cp),a&&(u.trace=new Dp);const _=u.parse(Lp,"json-pointer",s);return{result:_,tree:_.success&&o?u.ast.getTree():void 0,stats:u.stats,trace:u.trace}}catch(o){throw new Tp("Unexpected error during JSON Pointer parsing",{cause:o,jsonPointer:s})}};new grammar,new kp,new grammar,new kp;const Fp=new grammar,Bp=new kp,array_index=s=>{if("string"!=typeof s)return!1;try{return Bp.parse(Fp,"array-index",s).success}catch{return!1}},$p=new grammar,qp=new kp,array_dash=s=>{if("string"!=typeof s)return!1;try{return qp.parse($p,"array-dash",s).success}catch{return!1}},es_escape=s=>{if("string"!=typeof s&&"number"!=typeof s)throw new TypeError("Reference token must be a string or number");return String(s).replace(/~/g,"~0").replace(/\//g,"~1")};const Up=class JSONPointerCompileError extends Ip{},es_compile=s=>{if(!Array.isArray(s))throw new TypeError("Reference tokens must be a list of strings or numbers");try{return 0===s.length?"":`/${s.map((s=>{if("string"!=typeof s&&"number"!=typeof s)throw new TypeError("Reference token must be a string or number");return es_escape(String(s))})).join("/")}`}catch(o){throw new Up("Unexpected error during JSON Pointer compilation",{cause:o,referenceTokens:s})}};const Vp=class TraceBuilder{#e;#t;#r;constructor(s,o={}){this.#e=s,this.#e.steps=[],this.#e.failed=!1,this.#e.failedAt=-1,this.#e.message=`JSON Pointer "${o.jsonPointer}" was successfully evaluated against the provided value`,this.#e.context={...o,realm:o.realm.name},this.#t=[],this.#r=o.realm}step({referenceToken:s,input:o,output:i,success:a=!0,reason:u}){const _=this.#t.length;this.#t.push(s);const w={referenceToken:s,referenceTokenPosition:_,input:o,inputType:this.#r.isObject(o)?"object":this.#r.isArray(o)?"array":"unrecognized",output:i,success:a};u&&(w.reason=u),this.#e.steps.push(w),a||(this.#e.failed=!0,this.#e.failedAt=_,this.#e.message=u)}};const zp=class EvaluationRealm{name="";isArray(s){throw new Ip("Realm.isArray(node) must be implemented in a subclass")}isObject(s){throw new Ip("Realm.isObject(node) must be implemented in a subclass")}sizeOf(s){throw new Ip("Realm.sizeOf(node) must be implemented in a subclass")}has(s,o){throw new Ip("Realm.has(node) must be implemented in a subclass")}evaluate(s,o){throw new Ip("Realm.evaluate(node) must be implemented in a subclass")}};const Wp=class JSONPointerEvaluateError extends Ip{};const Jp=class JSONPointerIndexError extends Wp{};const Hp=class JSONEvaluationRealm extends zp{name="json";isArray(s){return Array.isArray(s)}isObject(s){return"object"==typeof s&&null!==s&&!this.isArray(s)}sizeOf(s){return this.isArray(s)?s.length:this.isObject(s)?Object.keys(s).length:0}has(s,o){if(this.isArray(s)){const i=Number(o),a=i>>>0;if(i!==a)throw new Jp(`Invalid array index "${o}": index must be an unsinged 32-bit integer`,{referenceToken:o,currentValue:s,realm:this.name});return a{const{result:w,tree:x,trace:C}=es_parse(o,{trace:!!_}),j="object"==typeof _&&null!==_?new Vp(_,{jsonPointer:o,referenceTokens:x,strictArrays:i,strictObjects:a,realm:u,value:s}):null;try{let _;if(!w.success){let i=`Invalid JSON Pointer: "${o}". Syntax error at position ${w.maxMatched}`;throw i+=C?`, expected ${C.inferExpectations()}`:"",new Wp(i,{jsonPointer:o,currentValue:s,realm:u.name})}return x.reduce(((s,w,C)=>{if(u.isArray(s)){if(array_dash(w)){if(i)throw new Jp(`Invalid array index "-" at position ${C} in "${o}". The "-" token always refers to a nonexistent element during evaluation`,{jsonPointer:o,referenceTokens:x,referenceToken:w,referenceTokenPosition:C,currentValue:s,realm:u.name});return _=u.evaluate(s,String(u.sizeOf(s))),null==j||j.step({referenceToken:w,input:s,output:_}),_}if(!array_index(w))throw new Jp(`Invalid array index "${w}" at position ${C} in "${o}": index MUST be "0", or digits without a leading "0"`,{jsonPointer:o,referenceTokens:x,referenceToken:w,referenceTokenPosition:C,currentValue:s,realm:u.name});const a=Number(w);if(!Number.isSafeInteger(a))throw new Jp(`Invalid array index "${w}" at position ${C} in "${o}": index must be a safe integer`,{jsonPointer:o,referenceTokens:x,referenceToken:w,referenceTokenPosition:C,currentValue:s,realm:u.name});if(!u.has(s,w)&&i)throw new Jp(`Invalid array index "${w}" at position ${C} in "${o}": index not found in array`,{jsonPointer:o,referenceTokens:x,referenceToken:w,referenceTokenPosition:C,currentValue:s,realm:u.name});return _=u.evaluate(s,w),null==j||j.step({referenceToken:w,input:s,output:_}),_}if(u.isObject(s)){if(!u.has(s,w)&&a)throw new Gp(`Invalid object key "${w}" at position ${C} in "${o}": key not found in object`,{jsonPointer:o,referenceTokens:x,referenceToken:w,referenceTokenPosition:C,currentValue:s,realm:u.name});return _=u.evaluate(s,w),null==j||j.step({referenceToken:w,input:s,output:_}),_}throw new Kp(`Invalid reference token "${w}" at position ${C} in "${o}": cannot be applied to a non-object/non-array value`,{jsonPointer:o,referenceTokens:x,referenceToken:w,referenceTokenPosition:C,currentValue:s,realm:u.name})}),s)}catch(s){if(null==j||j.step({referenceToken:s.referenceToken,input:s.currentValue,success:!1,reason:s.message}),s instanceof Wp)throw s;throw new Wp("Unexpected error during JSON Pointer evaluation",{cause:s,jsonPointer:o,referenceTokens:x})}};const Yp=class ApiDOMEvaluationRealm extends zp{name="apidom";isArray(s){return Mu(s)}isObject(s){return Nu(s)}sizeOf(s){return this.isArray(s)||this.isObject(s)?s.length:0}has(s,o){if(this.isArray(s)){const i=Number(o),a=i>>>0;if(i!==a)throw new Jp(`Invalid array index "${o}": index must be an unsinged 32-bit integer`,{referenceToken:o,currentValue:s,realm:this.name});return aes_evaluate(s,o,{...i,realm:new Yp});class Callback extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="callback"}}const Xp=Callback;class Components extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="components"}get schemas(){return this.get("schemas")}set schemas(s){this.set("schemas",s)}get responses(){return this.get("responses")}set responses(s){this.set("responses",s)}get parameters(){return this.get("parameters")}set parameters(s){this.set("parameters",s)}get examples(){return this.get("examples")}set examples(s){this.set("examples",s)}get requestBodies(){return this.get("requestBodies")}set requestBodies(s){this.set("requestBodies",s)}get headers(){return this.get("headers")}set headers(s){this.set("headers",s)}get securitySchemes(){return this.get("securitySchemes")}set securitySchemes(s){this.set("securitySchemes",s)}get links(){return this.get("links")}set links(s){this.set("links",s)}get callbacks(){return this.get("callbacks")}set callbacks(s){this.set("callbacks",s)}}const Qp=Components;class Contact extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="contact"}get name(){return this.get("name")}set name(s){this.set("name",s)}get url(){return this.get("url")}set url(s){this.set("url",s)}get email(){return this.get("email")}set email(s){this.set("email",s)}}const Zp=Contact;class Discriminator extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="discriminator"}get propertyName(){return this.get("propertyName")}set propertyName(s){this.set("propertyName",s)}get mapping(){return this.get("mapping")}set mapping(s){this.set("mapping",s)}}const th=Discriminator;class Encoding extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="encoding"}get contentType(){return this.get("contentType")}set contentType(s){this.set("contentType",s)}get headers(){return this.get("headers")}set headers(s){this.set("headers",s)}get style(){return this.get("style")}set style(s){this.set("style",s)}get explode(){return this.get("explode")}set explode(s){this.set("explode",s)}get allowedReserved(){return this.get("allowedReserved")}set allowedReserved(s){this.set("allowedReserved",s)}}const rh=Encoding;class Example extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="example"}get summary(){return this.get("summary")}set summary(s){this.set("summary",s)}get description(){return this.get("description")}set description(s){this.set("description",s)}get value(){return this.get("value")}set value(s){this.set("value",s)}get externalValue(){return this.get("externalValue")}set externalValue(s){this.set("externalValue",s)}}const uh=Example;class ExternalDocumentation extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="externalDocumentation"}get description(){return this.get("description")}set description(s){this.set("description",s)}get url(){return this.get("url")}set url(s){this.set("url",s)}}const dh=ExternalDocumentation;class Header extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="header"}get required(){return this.hasKey("required")?this.get("required"):new Su.bd(!1)}set required(s){this.set("required",s)}get deprecated(){return this.hasKey("deprecated")?this.get("deprecated"):new Su.bd(!1)}set deprecated(s){this.set("deprecated",s)}get allowEmptyValue(){return this.get("allowEmptyValue")}set allowEmptyValue(s){this.set("allowEmptyValue",s)}get style(){return this.get("style")}set style(s){this.set("style",s)}get explode(){return this.get("explode")}set explode(s){this.set("explode",s)}get allowReserved(){return this.get("allowReserved")}set allowReserved(s){this.set("allowReserved",s)}get schema(){return this.get("schema")}set schema(s){this.set("schema",s)}get example(){return this.get("example")}set example(s){this.set("example",s)}get examples(){return this.get("examples")}set examples(s){this.set("examples",s)}get contentProp(){return this.get("content")}set contentProp(s){this.set("content",s)}}Object.defineProperty(Header.prototype,"description",{get(){return this.get("description")},set(s){this.set("description",s)},enumerable:!0});const fh=Header;class Info extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="info",this.classes.push("info")}get title(){return this.get("title")}set title(s){this.set("title",s)}get description(){return this.get("description")}set description(s){this.set("description",s)}get termsOfService(){return this.get("termsOfService")}set termsOfService(s){this.set("termsOfService",s)}get contact(){return this.get("contact")}set contact(s){this.set("contact",s)}get license(){return this.get("license")}set license(s){this.set("license",s)}get version(){return this.get("version")}set version(s){this.set("version",s)}}const vh=Info;class License extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="license"}get name(){return this.get("name")}set name(s){this.set("name",s)}get url(){return this.get("url")}set url(s){this.set("url",s)}}const _h=License;class Link extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="link"}get operationRef(){return this.get("operationRef")}set operationRef(s){this.set("operationRef",s)}get operationId(){return this.get("operationId")}set operationId(s){this.set("operationId",s)}get operation(){var s,o;return ju(this.operationRef)?null===(s=this.operationRef)||void 0===s?void 0:s.meta.get("operation"):ju(this.operationId)?null===(o=this.operationId)||void 0===o?void 0:o.meta.get("operation"):void 0}set operation(s){this.set("operation",s)}get parameters(){return this.get("parameters")}set parameters(s){this.set("parameters",s)}get requestBody(){return this.get("requestBody")}set requestBody(s){this.set("requestBody",s)}get description(){return this.get("description")}set description(s){this.set("description",s)}get server(){return this.get("server")}set server(s){this.set("server",s)}}const wh=Link;class MediaType extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="mediaType"}get schema(){return this.get("schema")}set schema(s){this.set("schema",s)}get example(){return this.get("example")}set example(s){this.set("example",s)}get examples(){return this.get("examples")}set examples(s){this.set("examples",s)}get encoding(){return this.get("encoding")}set encoding(s){this.set("encoding",s)}}const Oh=MediaType;class OAuthFlow extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="oAuthFlow"}get authorizationUrl(){return this.get("authorizationUrl")}set authorizationUrl(s){this.set("authorizationUrl",s)}get tokenUrl(){return this.get("tokenUrl")}set tokenUrl(s){this.set("tokenUrl",s)}get refreshUrl(){return this.get("refreshUrl")}set refreshUrl(s){this.set("refreshUrl",s)}get scopes(){return this.get("scopes")}set scopes(s){this.set("scopes",s)}}const jh=OAuthFlow;class OAuthFlows extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="oAuthFlows"}get implicit(){return this.get("implicit")}set implicit(s){this.set("implicit",s)}get password(){return this.get("password")}set password(s){this.set("password",s)}get clientCredentials(){return this.get("clientCredentials")}set clientCredentials(s){this.set("clientCredentials",s)}get authorizationCode(){return this.get("authorizationCode")}set authorizationCode(s){this.set("authorizationCode",s)}}const Ph=OAuthFlows;class Openapi extends Su.Om{constructor(s,o,i){super(s,o,i),this.element="openapi",this.classes.push("spec-version"),this.classes.push("version")}}const Ih=Openapi;class OpenApi3_0 extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="openApi3_0",this.classes.push("api")}get openapi(){return this.get("openapi")}set openapi(s){this.set("openapi",s)}get info(){return this.get("info")}set info(s){this.set("info",s)}get servers(){return this.get("servers")}set servers(s){this.set("servers",s)}get paths(){return this.get("paths")}set paths(s){this.set("paths",s)}get components(){return this.get("components")}set components(s){this.set("components",s)}get security(){return this.get("security")}set security(s){this.set("security",s)}get tags(){return this.get("tags")}set tags(s){this.set("tags",s)}get externalDocs(){return this.get("externalDocs")}set externalDocs(s){this.set("externalDocs",s)}}const Rh=OpenApi3_0;class Operation extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="operation"}get tags(){return this.get("tags")}set tags(s){this.set("tags",s)}get summary(){return this.get("summary")}set summary(s){this.set("summary",s)}get description(){return this.get("description")}set description(s){this.set("description",s)}set externalDocs(s){this.set("externalDocs",s)}get externalDocs(){return this.get("externalDocs")}get operationId(){return this.get("operationId")}set operationId(s){this.set("operationId",s)}get parameters(){return this.get("parameters")}set parameters(s){this.set("parameters",s)}get requestBody(){return this.get("requestBody")}set requestBody(s){this.set("requestBody",s)}get responses(){return this.get("responses")}set responses(s){this.set("responses",s)}get callbacks(){return this.get("callbacks")}set callbacks(s){this.set("callbacks",s)}get deprecated(){return this.hasKey("deprecated")?this.get("deprecated"):new Su.bd(!1)}set deprecated(s){this.set("deprecated",s)}get security(){return this.get("security")}set security(s){this.set("security",s)}get servers(){return this.get("severs")}set servers(s){this.set("servers",s)}}const Dh=Operation;class Parameter extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="parameter"}get name(){return this.get("name")}set name(s){this.set("name",s)}get in(){return this.get("in")}set in(s){this.set("in",s)}get required(){return this.hasKey("required")?this.get("required"):new Su.bd(!1)}set required(s){this.set("required",s)}get deprecated(){return this.hasKey("deprecated")?this.get("deprecated"):new Su.bd(!1)}set deprecated(s){this.set("deprecated",s)}get allowEmptyValue(){return this.get("allowEmptyValue")}set allowEmptyValue(s){this.set("allowEmptyValue",s)}get style(){return this.get("style")}set style(s){this.set("style",s)}get explode(){return this.get("explode")}set explode(s){this.set("explode",s)}get allowReserved(){return this.get("allowReserved")}set allowReserved(s){this.set("allowReserved",s)}get schema(){return this.get("schema")}set schema(s){this.set("schema",s)}get example(){return this.get("example")}set example(s){this.set("example",s)}get examples(){return this.get("examples")}set examples(s){this.set("examples",s)}get contentProp(){return this.get("content")}set contentProp(s){this.set("content",s)}}Object.defineProperty(Parameter.prototype,"description",{get(){return this.get("description")},set(s){this.set("description",s)},enumerable:!0});const Lh=Parameter;class PathItem extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="pathItem"}get $ref(){return this.get("$ref")}set $ref(s){this.set("$ref",s)}get summary(){return this.get("summary")}set summary(s){this.set("summary",s)}get description(){return this.get("description")}set description(s){this.set("description",s)}get GET(){return this.get("get")}set GET(s){this.set("GET",s)}get PUT(){return this.get("put")}set PUT(s){this.set("PUT",s)}get POST(){return this.get("post")}set POST(s){this.set("POST",s)}get DELETE(){return this.get("delete")}set DELETE(s){this.set("DELETE",s)}get OPTIONS(){return this.get("options")}set OPTIONS(s){this.set("OPTIONS",s)}get HEAD(){return this.get("head")}set HEAD(s){this.set("HEAD",s)}get PATCH(){return this.get("patch")}set PATCH(s){this.set("PATCH",s)}get TRACE(){return this.get("trace")}set TRACE(s){this.set("TRACE",s)}get servers(){return this.get("servers")}set servers(s){this.set("servers",s)}get parameters(){return this.get("parameters")}set parameters(s){this.set("parameters",s)}}const Fh=PathItem;class Paths extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="paths"}}const Jh=Paths;class Reference extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="reference",this.classes.push("openapi-reference")}get $ref(){return this.get("$ref")}set $ref(s){this.set("$ref",s)}}const Hh=Reference;class RequestBody extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="requestBody"}get description(){return this.get("description")}set description(s){this.set("description",s)}get contentProp(){return this.get("content")}set contentProp(s){this.set("content",s)}get required(){return this.hasKey("required")?this.get("required"):new Su.bd(!1)}set required(s){this.set("required",s)}}const Kh=RequestBody;class Response_Response extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="response"}get description(){return this.get("description")}set description(s){this.set("description",s)}get headers(){return this.get("headers")}set headers(s){this.set("headers",s)}get contentProp(){return this.get("content")}set contentProp(s){this.set("content",s)}get links(){return this.get("links")}set links(s){this.set("links",s)}}const Gh=Response_Response;class Responses extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="responses"}get default(){return this.get("default")}set default(s){this.set("default",s)}}const Qh=Responses;const td=class UnsupportedOperationError extends Ko{};class JSONSchema extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="JSONSchemaDraft4"}get idProp(){return this.get("id")}set idProp(s){this.set("id",s)}get $schema(){return this.get("$schema")}set $schema(s){this.set("$schema",s)}get multipleOf(){return this.get("multipleOf")}set multipleOf(s){this.set("multipleOf",s)}get maximum(){return this.get("maximum")}set maximum(s){this.set("maximum",s)}get exclusiveMaximum(){return this.get("exclusiveMaximum")}set exclusiveMaximum(s){this.set("exclusiveMaximum",s)}get minimum(){return this.get("minimum")}set minimum(s){this.set("minimum",s)}get exclusiveMinimum(){return this.get("exclusiveMinimum")}set exclusiveMinimum(s){this.set("exclusiveMinimum",s)}get maxLength(){return this.get("maxLength")}set maxLength(s){this.set("maxLength",s)}get minLength(){return this.get("minLength")}set minLength(s){this.set("minLength",s)}get pattern(){return this.get("pattern")}set pattern(s){this.set("pattern",s)}get additionalItems(){return this.get("additionalItems")}set additionalItems(s){this.set("additionalItems",s)}get items(){return this.get("items")}set items(s){this.set("items",s)}get maxItems(){return this.get("maxItems")}set maxItems(s){this.set("maxItems",s)}get minItems(){return this.get("minItems")}set minItems(s){this.set("minItems",s)}get uniqueItems(){return this.get("uniqueItems")}set uniqueItems(s){this.set("uniqueItems",s)}get maxProperties(){return this.get("maxProperties")}set maxProperties(s){this.set("maxProperties",s)}get minProperties(){return this.get("minProperties")}set minProperties(s){this.set("minProperties",s)}get required(){return this.get("required")}set required(s){this.set("required",s)}get properties(){return this.get("properties")}set properties(s){this.set("properties",s)}get additionalProperties(){return this.get("additionalProperties")}set additionalProperties(s){this.set("additionalProperties",s)}get patternProperties(){return this.get("patternProperties")}set patternProperties(s){this.set("patternProperties",s)}get dependencies(){return this.get("dependencies")}set dependencies(s){this.set("dependencies",s)}get enum(){return this.get("enum")}set enum(s){this.set("enum",s)}get type(){return this.get("type")}set type(s){this.set("type",s)}get allOf(){return this.get("allOf")}set allOf(s){this.set("allOf",s)}get anyOf(){return this.get("anyOf")}set anyOf(s){this.set("anyOf",s)}get oneOf(){return this.get("oneOf")}set oneOf(s){this.set("oneOf",s)}get not(){return this.get("not")}set not(s){this.set("not",s)}get definitions(){return this.get("definitions")}set definitions(s){this.set("definitions",s)}get title(){return this.get("title")}set title(s){this.set("title",s)}get description(){return this.get("description")}set description(s){this.set("description",s)}get default(){return this.get("default")}set default(s){this.set("default",s)}get format(){return this.get("format")}set format(s){this.set("format",s)}get base(){return this.get("base")}set base(s){this.set("base",s)}get links(){return this.get("links")}set links(s){this.set("links",s)}get media(){return this.get("media")}set media(s){this.set("media",s)}get readOnly(){return this.get("readOnly")}set readOnly(s){this.set("readOnly",s)}}const sd=JSONSchema;class JSONReference extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="JSONReference",this.classes.push("json-reference")}get $ref(){return this.get("$ref")}set $ref(s){this.set("$ref",s)}}const id=JSONReference;class Media extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="media"}get binaryEncoding(){return this.get("binaryEncoding")}set binaryEncoding(s){this.set("binaryEncoding",s)}get type(){return this.get("type")}set type(s){this.set("type",s)}}const cd=Media;class LinkDescription extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="linkDescription"}get href(){return this.get("href")}set href(s){this.set("href",s)}get rel(){return this.get("rel")}set rel(s){this.set("rel",s)}get title(){return this.get("title")}set title(s){this.set("title",s)}get targetSchema(){return this.get("targetSchema")}set targetSchema(s){this.set("targetSchema",s)}get mediaType(){return this.get("mediaType")}set mediaType(s){this.set("mediaType",s)}get method(){return this.get("method")}set method(s){this.set("method",s)}get encType(){return this.get("encType")}set encType(s){this.set("encType",s)}get schema(){return this.get("schema")}set schema(s){this.set("schema",s)}}const ld=LinkDescription,emptyElement=s=>{const o=s.meta.length>0?cloneDeep(s.meta):void 0,i=s.attributes.length>0?cloneDeep(s.attributes):void 0;return new s.constructor(void 0,o,i)},cloneUnlessOtherwiseSpecified=(s,o)=>o.clone&&o.isMergeableElement(s)?deepmerge(emptyElement(s),s,o):s,ud={clone:!0,isMergeableElement:s=>Nu(s)||Mu(s),arrayElementMerge:(s,o,i)=>s.concat(o)["fantasy-land/map"]((s=>cloneUnlessOtherwiseSpecified(s,i))),objectElementMerge:(s,o,i)=>{const a=Nu(s)?emptyElement(s):emptyElement(o);return Nu(s)&&s.forEach(((s,o,u)=>{const _=cloneShallow(u);_.value=cloneUnlessOtherwiseSpecified(s,i),a.content.push(_)})),o.forEach(((o,u,_)=>{const w=serializers_value(u);let x;if(Nu(s)&&s.hasKey(w)&&i.isMergeableElement(o)){const a=s.get(w);x=cloneShallow(_),x.value=((s,o)=>{if("function"!=typeof o.customMerge)return deepmerge;const i=o.customMerge(s,o);return"function"==typeof i?i:deepmerge})(u,i)(a,o,i)}else x=cloneShallow(_),x.value=cloneUnlessOtherwiseSpecified(o,i);a.remove(w),a.content.push(x)})),a},customMerge:void 0,customMetaMerge:void 0,customAttributesMerge:void 0},deepmerge=(s,o,i)=>{var a,u,_;const w={...ud,...i};w.isMergeableElement=null!==(a=w.isMergeableElement)&&void 0!==a?a:ud.isMergeableElement,w.arrayElementMerge=null!==(u=w.arrayElementMerge)&&void 0!==u?u:ud.arrayElementMerge,w.objectElementMerge=null!==(_=w.objectElementMerge)&&void 0!==_?_:ud.objectElementMerge;const x=Mu(o);if(!(x===Mu(s)))return cloneUnlessOtherwiseSpecified(o,w);const C=x&&"function"==typeof w.arrayElementMerge?w.arrayElementMerge(s,o,w):w.objectElementMerge(s,o,w);return C.meta=(s=>"function"!=typeof s.customMetaMerge?s=>cloneDeep(s):s.customMetaMerge)(w)(s.meta,o.meta),C.attributes=(s=>"function"!=typeof s.customAttributesMerge?s=>cloneDeep(s):s.customAttributesMerge)(w)(s.attributes,o.attributes),C};deepmerge.all=(s,o)=>{if(!Array.isArray(s))throw new TypeError("First argument of deepmerge should be an array.");return 0===s.length?new Su.Sh:s.reduce(((s,i)=>deepmerge(s,i,o)),emptyElement(s[0]))};const dd=deepmerge;const md=class Visitor_Visitor{element;constructor(s){Object.assign(this,s)}copyMetaAndAttributes(s,o){(s.meta.length>0||o.meta.length>0)&&(o.meta=dd(o.meta,s.meta)),hasElementSourceMap(s)&&assignSourceMap(o,s),(s.attributes.length>0||s.meta.length>0)&&(o.attributes=dd(o.attributes,s.attributes))}};const yd=class FallbackVisitor extends md{enter(s){return this.element=cloneDeep(s),qu}},copyProps=(s,o,i=[])=>{const a=Object.getOwnPropertyDescriptors(o);for(let s of i)delete a[s];Object.defineProperties(s,a)},protoChain=(s,o=[s])=>{const i=Object.getPrototypeOf(s);return null===i?o:protoChain(i,[...o,i])},hardMixProtos=(s,o,i=[])=>{var a;const u=null!==(a=((...s)=>{if(0===s.length)return;let o;const i=s.map((s=>protoChain(s)));for(;i.every((s=>s.length>0));){const s=i.map((s=>s.pop())),a=s[0];if(!s.every((s=>s===a)))break;o=a}return o})(...s))&&void 0!==a?a:Object.prototype,_=Object.create(u),w=protoChain(u);for(let o of s){let s=protoChain(o);for(let o=s.length-1;o>=0;o--){let a=s[o];-1===w.indexOf(a)&&(copyProps(_,a,["constructor",...i]),w.push(a))}}return _.constructor=o,_},unique=s=>s.filter(((o,i)=>s.indexOf(o)==i)),getIngredientWithProp=(s,o)=>{const i=o.map((s=>protoChain(s)));let a=0,u=!0;for(;u;){u=!1;for(let _=o.length-1;_>=0;_--){const o=i[_][a];if(null!=o&&(u=!0,null!=Object.getOwnPropertyDescriptor(o,s)))return i[_][0]}a++}},proxyMix=(s,o=Object.prototype)=>new Proxy({},{getPrototypeOf:()=>o,setPrototypeOf(){throw Error("Cannot set prototype of Proxies created by ts-mixer")},getOwnPropertyDescriptor:(o,i)=>Object.getOwnPropertyDescriptor(getIngredientWithProp(i,s)||{},i),defineProperty(){throw new Error("Cannot define new properties on Proxies created by ts-mixer")},has:(i,a)=>void 0!==getIngredientWithProp(a,s)||void 0!==o[a],get:(i,a)=>(getIngredientWithProp(a,s)||o)[a],set(o,i,a){const u=getIngredientWithProp(i,s);if(void 0===u)throw new Error("Cannot set new properties on Proxies created by ts-mixer");return u[i]=a,!0},deleteProperty(){throw new Error("Cannot delete properties on Proxies created by ts-mixer")},ownKeys:()=>s.map(Object.getOwnPropertyNames).reduce(((s,o)=>o.concat(s.filter((s=>o.indexOf(s)<0)))))}),vd=null,_d="copy",Sd="copy",Ed="deep",wd=new WeakMap,getMixinsForClass=s=>wd.get(s),mergeObjectsOfDecorators=(s,o)=>{var i,a;const u=unique([...Object.getOwnPropertyNames(s),...Object.getOwnPropertyNames(o)]),_={};for(let w of u)_[w]=unique([...null!==(i=null==s?void 0:s[w])&&void 0!==i?i:[],...null!==(a=null==o?void 0:o[w])&&void 0!==a?a:[]]);return _},mergePropertyAndMethodDecorators=(s,o)=>{var i,a,u,_;return{property:mergeObjectsOfDecorators(null!==(i=null==s?void 0:s.property)&&void 0!==i?i:{},null!==(a=null==o?void 0:o.property)&&void 0!==a?a:{}),method:mergeObjectsOfDecorators(null!==(u=null==s?void 0:s.method)&&void 0!==u?u:{},null!==(_=null==o?void 0:o.method)&&void 0!==_?_:{})}},mergeDecorators=(s,o)=>{var i,a,u,_,w,x;return{class:unique([...null!==(i=null==s?void 0:s.class)&&void 0!==i?i:[],...null!==(a=null==o?void 0:o.class)&&void 0!==a?a:[]]),static:mergePropertyAndMethodDecorators(null!==(u=null==s?void 0:s.static)&&void 0!==u?u:{},null!==(_=null==o?void 0:o.static)&&void 0!==_?_:{}),instance:mergePropertyAndMethodDecorators(null!==(w=null==s?void 0:s.instance)&&void 0!==w?w:{},null!==(x=null==o?void 0:o.instance)&&void 0!==x?x:{})}},xd=new Map,deepDecoratorSearch=(...s)=>{const o=((...s)=>{var o;const i=new Set,a=new Set([...s]);for(;a.size>0;)for(let s of a){const u=protoChain(s.prototype).map((s=>s.constructor)),_=[...u,...null!==(o=getMixinsForClass(s))&&void 0!==o?o:[]].filter((s=>!i.has(s)));for(let s of _)a.add(s);i.add(s),a.delete(s)}return[...i]})(...s).map((s=>xd.get(s))).filter((s=>!!s));return 0==o.length?{}:1==o.length?o[0]:o.reduce(((s,o)=>mergeDecorators(s,o)))},getDecoratorsForClass=s=>{let o=xd.get(s);return o||(o={},xd.set(s,o)),o};function Mixin(...s){var o,i,a;const u=s.map((s=>s.prototype)),_=vd;if(null!==_){const s=u.map((s=>s[_])).filter((s=>"function"==typeof s)),combinedInitFunction=function(...o){for(let i of s)i.apply(this,o)},o={[_]:combinedInitFunction};u.push(o)}function MixedClass(...o){for(const i of s)copyProps(this,new i(...o));null!==_&&"function"==typeof this[_]&&this[_].apply(this,o)}var w,x;MixedClass.prototype="copy"===Sd?hardMixProtos(u,MixedClass):(w=u,x=MixedClass,proxyMix([...w,{constructor:x}])),Object.setPrototypeOf(MixedClass,"copy"===_d?hardMixProtos(s,null,["prototype"]):proxyMix(s,Function.prototype));let C=MixedClass;if("none"!==Ed){const u="deep"===Ed?deepDecoratorSearch(...s):((...s)=>{const o=s.map((s=>getDecoratorsForClass(s)));return 0===o.length?{}:1===o.length?o[0]:o.reduce(((s,o)=>mergeDecorators(s,o)))})(...s);for(let s of null!==(o=null==u?void 0:u.class)&&void 0!==o?o:[]){const o=s(C);o&&(C=o)}applyPropAndMethodDecorators(null!==(i=null==u?void 0:u.static)&&void 0!==i?i:{},C),applyPropAndMethodDecorators(null!==(a=null==u?void 0:u.instance)&&void 0!==a?a:{},C.prototype)}var j,L;return j=C,L=s,wd.set(j,L),C}const applyPropAndMethodDecorators=(s,o)=>{const i=s.property,a=s.method;if(i)for(let s in i)for(let a of i[s])a(o,s);if(a)for(let s in a)for(let i of a[s])i(o,s,Object.getOwnPropertyDescriptor(o,s))};const kd=_curry1((function allPass(s){return $a(Aa(Ec,0,Oc("length",s)),(function(){for(var o=0,i=s.length;o{if(ju(a)&&i.includes(serializers_value(a))&&!this.ignoredFields.includes(serializers_value(a))){const i=this.toRefractedElement([...o,"fixedFields",serializers_value(a)],s),_=new Su.Pr(cloneDeep(a),i);this.copyMetaAndAttributes(u,_),_.classes.push("fixed-field"),this.element.content.push(_)}else this.ignoredFields.includes(serializers_value(a))||this.element.content.push(cloneDeep(u))})),this.copyMetaAndAttributes(s,this.element),qu}};const Rd=class ParentSchemaAwareVisitor{parent;constructor({parent:s}){this.parent=s}},Dd=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof sd||s(a)&&o("JSONSchemaDraft4",a)&&i("object",a))),Ld=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof id||s(a)&&o("JSONReference",a)&&i("object",a))),Fd=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof cd||s(a)&&o("media",a)&&i("object",a))),Bd=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof ld||s(a)&&o("linkDescription",a)&&i("object",a)));class JSONSchemaVisitor extends(Mixin(Md,Rd,yd)){constructor(s){super(s),this.element=new sd,this.specPath=fc(["document","objects","JSONSchema"])}get defaultDialectIdentifier(){return"http://json-schema.org/draft-04/schema#"}ObjectElement(s){return this.handleDialectIdentifier(s),this.handleSchemaIdentifier(s),this.parent=this.element,Md.prototype.ObjectElement.call(this,s)}handleDialectIdentifier(s){if(bc(this.parent)&&!ju(s.get("$schema")))this.element.setMetaProperty("inheritedDialectIdentifier",this.defaultDialectIdentifier);else if(Dd(this.parent)&&!ju(s.get("$schema"))){const s=Na(serializers_value(this.parent.meta.get("inheritedDialectIdentifier")),serializers_value(this.parent.$schema));this.element.setMetaProperty("inheritedDialectIdentifier",s)}}handleSchemaIdentifier(s,o="id"){const i=void 0!==this.parent?cloneDeep(this.parent.getMetaProperty("ancestorsSchemaIdentifiers",[])):new Su.wE,a=serializers_value(s.get(o));Id(a)&&i.push(a),this.element.setMetaProperty("ancestorsSchemaIdentifiers",i)}}const $d=JSONSchemaVisitor,isJSONReferenceLikeElement=s=>Nu(s)&&s.hasKey("$ref");class ItemsVisitor extends(Mixin(Nd,Rd,yd)){ObjectElement(s){const o=isJSONReferenceLikeElement(s)?["document","objects","JSONReference"]:["document","objects","JSONSchema"];return this.element=this.toRefractedElement(o,s),qu}ArrayElement(s){return this.element=new Su.wE,this.element.classes.push("json-schema-items"),s.forEach((s=>{const o=isJSONReferenceLikeElement(s)?["document","objects","JSONReference"]:["document","objects","JSONSchema"],i=this.toRefractedElement(o,s);this.element.push(i)})),this.copyMetaAndAttributes(s,this.element),qu}}const Ud=ItemsVisitor;const Vd=class RequiredVisitor extends yd{ArrayElement(s){const o=this.enter(s);return this.element.classes.push("json-schema-required"),o}};const Wd=class PatternedFieldsVisitor extends Nd{specPath;ignoredFields;fieldPatternPredicate=es_F;constructor({specPath:s,ignoredFields:o,fieldPatternPredicate:i,...a}){super({...a}),this.specPath=s,this.ignoredFields=o||[],"function"==typeof i&&(this.fieldPatternPredicate=i)}ObjectElement(s){return s.forEach(((s,o,i)=>{if(!this.ignoredFields.includes(serializers_value(o))&&this.fieldPatternPredicate(serializers_value(o))){const a=this.specPath(s),u=this.toRefractedElement(a,s),_=new Su.Pr(cloneDeep(o),u);this.copyMetaAndAttributes(i,_),_.classes.push("patterned-field"),this.element.content.push(_)}else this.ignoredFields.includes(serializers_value(o))||this.element.content.push(cloneDeep(i))})),this.copyMetaAndAttributes(s,this.element),qu}};const Jd=class MapVisitor extends Wd{constructor(s){super(s),this.fieldPatternPredicate=Id}};class PropertiesVisitor extends(Mixin(Jd,Rd,yd)){constructor(s){super(s),this.element=new Su.Sh,this.element.classes.push("json-schema-properties"),this.specPath=s=>isJSONReferenceLikeElement(s)?["document","objects","JSONReference"]:["document","objects","JSONSchema"]}}const Hd=PropertiesVisitor;class PatternPropertiesVisitor extends(Mixin(Jd,Rd,yd)){constructor(s){super(s),this.element=new Su.Sh,this.element.classes.push("json-schema-patternProperties"),this.specPath=s=>isJSONReferenceLikeElement(s)?["document","objects","JSONReference"]:["document","objects","JSONSchema"]}}const Kd=PatternPropertiesVisitor;class DependenciesVisitor extends(Mixin(Jd,Rd,yd)){constructor(s){super(s),this.element=new Su.Sh,this.element.classes.push("json-schema-dependencies"),this.specPath=s=>isJSONReferenceLikeElement(s)?["document","objects","JSONReference"]:["document","objects","JSONSchema"]}}const Gd=DependenciesVisitor;const Yd=class EnumVisitor extends yd{ArrayElement(s){const o=this.enter(s);return this.element.classes.push("json-schema-enum"),o}};const Xd=class TypeVisitor extends yd{StringElement(s){const o=this.enter(s);return this.element.classes.push("json-schema-type"),o}ArrayElement(s){const o=this.enter(s);return this.element.classes.push("json-schema-type"),o}};class AllOfVisitor extends(Mixin(Nd,Rd,yd)){constructor(s){super(s),this.element=new Su.wE,this.element.classes.push("json-schema-allOf")}ArrayElement(s){return s.forEach((s=>{const o=isJSONReferenceLikeElement(s)?["document","objects","JSONReference"]:["document","objects","JSONSchema"],i=this.toRefractedElement(o,s);this.element.push(i)})),this.copyMetaAndAttributes(s,this.element),qu}}const Qd=AllOfVisitor;class AnyOfVisitor extends(Mixin(Nd,Rd,yd)){constructor(s){super(s),this.element=new Su.wE,this.element.classes.push("json-schema-anyOf")}ArrayElement(s){return s.forEach((s=>{const o=isJSONReferenceLikeElement(s)?["document","objects","JSONReference"]:["document","objects","JSONSchema"],i=this.toRefractedElement(o,s);this.element.push(i)})),this.copyMetaAndAttributes(s,this.element),qu}}const Zd=AnyOfVisitor;class OneOfVisitor extends(Mixin(Nd,Rd,yd)){constructor(s){super(s),this.element=new Su.wE,this.element.classes.push("json-schema-oneOf")}ArrayElement(s){return s.forEach((s=>{const o=isJSONReferenceLikeElement(s)?["document","objects","JSONReference"]:["document","objects","JSONSchema"],i=this.toRefractedElement(o,s);this.element.push(i)})),this.copyMetaAndAttributes(s,this.element),qu}}const ef=OneOfVisitor;class DefinitionsVisitor extends(Mixin(Jd,Rd,yd)){constructor(s){super(s),this.element=new Su.Sh,this.element.classes.push("json-schema-definitions"),this.specPath=s=>isJSONReferenceLikeElement(s)?["document","objects","JSONReference"]:["document","objects","JSONSchema"]}}const rf=DefinitionsVisitor;class LinksVisitor extends(Mixin(Nd,Rd,yd)){constructor(s){super(s),this.element=new Su.wE,this.element.classes.push("json-schema-links")}ArrayElement(s){return s.forEach((s=>{const o=this.toRefractedElement(["document","objects","LinkDescription"],s);this.element.push(o)})),this.copyMetaAndAttributes(s,this.element),qu}}const of=LinksVisitor;class JSONReferenceVisitor extends(Mixin(Md,yd)){constructor(s){super(s),this.element=new id,this.specPath=fc(["document","objects","JSONReference"])}ObjectElement(s){const o=Md.prototype.ObjectElement.call(this,s);return ju(this.element.$ref)&&this.element.classes.push("reference-element"),o}}const af=JSONReferenceVisitor;const cf=class $RefVisitor extends yd{StringElement(s){const o=this.enter(s);return this.element.classes.push("reference-value"),o}};const lf=_curry3((function ifElse(s,o,i){return $a(Math.max(s.length,o.length,i.length),(function _ifElse(){return s.apply(this,arguments)?o.apply(this,arguments):i.apply(this,arguments)}))}));const uf=_curry1((function comparator(s){return function(o,i){return s(o,i)?-1:s(i,o)?1:0}}));var hf=_curry2((function sort(s,o){return Array.prototype.slice.call(o,0).sort(s)}));const df=hf;var mf=_curry1((function(s){return _nth(0,s)}));const gf=mf;const yf=_curry1(_reduced);const bf=dc(Ju);const _f=ou(yp,Od);function _toConsumableArray(s){return function _arrayWithoutHoles(s){if(Array.isArray(s))return _arrayLikeToArray(s)}(s)||function _iterableToArray(s){if("undefined"!=typeof Symbol&&null!=s[Symbol.iterator]||null!=s["@@iterator"])return Array.from(s)}(s)||function _unsupportedIterableToArray(s,o){if(s){if("string"==typeof s)return _arrayLikeToArray(s,o);var i={}.toString.call(s).slice(8,-1);return"Object"===i&&s.constructor&&(i=s.constructor.name),"Map"===i||"Set"===i?Array.from(s):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?_arrayLikeToArray(s,o):void 0}}(s)||function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _arrayLikeToArray(s,o){(null==o||o>s.length)&&(o=s.length);for(var i=0,a=Array(o);io.length}))),gf,Da("length")),xf=za((function(s,o,i){var a=i.apply(void 0,_toConsumableArray(s));return bf(a)?yf(a):o}));const kf=lf(_f,(function dispatchImpl(s){var o=Sf(s);return $a(o,(function(){for(var o=arguments.length,i=new Array(o),a=0;alf(s,fc(o),gc))),i=kf(o)(s);return this.element=this.toRefractedElement(i,s),qu}};const Cf=class SchemaOrReferenceVisitor extends Of{constructor(s){super(s),this.alternator=[{predicate:isJSONReferenceLikeElement,specPath:["document","objects","JSONReference"]},{predicate:es_T,specPath:["document","objects","JSONSchema"]}]}};class MediaVisitor extends(Mixin(Md,yd)){constructor(s){super(s),this.element=new cd,this.specPath=fc(["document","objects","Media"])}}const jf=MediaVisitor;class LinkDescriptionVisitor extends(Mixin(Md,yd)){constructor(s){super(s),this.element=new ld,this.specPath=fc(["document","objects","LinkDescription"])}}const Pf=LinkDescriptionVisitor,Tf={visitors:{value:yd,JSONSchemaOrJSONReferenceVisitor:Cf,document:{objects:{JSONSchema:{$visitor:$d,fixedFields:{id:{$ref:"#/visitors/value"},$schema:{$ref:"#/visitors/value"},multipleOf:{$ref:"#/visitors/value"},maximum:{$ref:"#/visitors/value"},exclusiveMaximum:{$ref:"#/visitors/value"},minimum:{$ref:"#/visitors/value"},exclusiveMinimum:{$ref:"#/visitors/value"},maxLength:{$ref:"#/visitors/value"},minLength:{$ref:"#/visitors/value"},pattern:{$ref:"#/visitors/value"},additionalItems:Cf,items:Ud,maxItems:{$ref:"#/visitors/value"},minItems:{$ref:"#/visitors/value"},uniqueItems:{$ref:"#/visitors/value"},maxProperties:{$ref:"#/visitors/value"},minProperties:{$ref:"#/visitors/value"},required:Vd,properties:Hd,additionalProperties:Cf,patternProperties:Kd,dependencies:Gd,enum:Yd,type:Xd,allOf:Qd,anyOf:Zd,oneOf:ef,not:Cf,definitions:rf,title:{$ref:"#/visitors/value"},description:{$ref:"#/visitors/value"},default:{$ref:"#/visitors/value"},format:{$ref:"#/visitors/value"},base:{$ref:"#/visitors/value"},links:of,media:{$ref:"#/visitors/document/objects/Media"},readOnly:{$ref:"#/visitors/value"}}},JSONReference:{$visitor:af,fixedFields:{$ref:cf}},Media:{$visitor:jf,fixedFields:{binaryEncoding:{$ref:"#/visitors/value"},type:{$ref:"#/visitors/value"}}},LinkDescription:{$visitor:Pf,fixedFields:{href:{$ref:"#/visitors/value"},rel:{$ref:"#/visitors/value"},title:{$ref:"#/visitors/value"},targetSchema:Cf,mediaType:{$ref:"#/visitors/value"},method:{$ref:"#/visitors/value"},encType:{$ref:"#/visitors/value"},schema:Cf}}}}}},traversal_visitor_getNodeType=s=>{if(Cu(s))return`${s.element.charAt(0).toUpperCase()+s.element.slice(1)}Element`},Nf={JSONSchemaDraft4Element:["content"],JSONReferenceElement:["content"],MediaElement:["content"],LinkDescriptionElement:["content"],...np},Rf={namespace:s=>{const{base:o}=s;return o.register("jSONSchemaDraft4",sd),o.register("jSONReference",id),o.register("media",cd),o.register("linkDescription",ld),o}},Df=Rf,refractor_toolbox=()=>{const s=createNamespace(Df);return{predicates:{...ae,isStringElement:ju},namespace:s}},refractor_refract=(s,{specPath:o=["visitors","document","objects","JSONSchema","$visitor"],plugins:i=[],specificationObj:a=Tf}={})=>{const u=(0,Su.e)(s),_=dereference(a),w=new(Qu(o,_))({specObj:_});return visitor_visit(u,w),dispatchPluginsSync(w.element,i,{toolboxCreator:refractor_toolbox,visitorOptions:{keyMap:Nf,nodeTypeGetter:traversal_visitor_getNodeType}})},refractor_createRefractor=s=>(o,i={})=>refractor_refract(o,{specPath:s,...i});sd.refract=refractor_createRefractor(["visitors","document","objects","JSONSchema","$visitor"]),id.refract=refractor_createRefractor(["visitors","document","objects","JSONReference","$visitor"]),cd.refract=refractor_createRefractor(["visitors","document","objects","Media","$visitor"]),ld.refract=refractor_createRefractor(["visitors","document","objects","LinkDescription","$visitor"]);const Ff=class Schema_Schema extends sd{constructor(s,o,i){super(s,o,i),this.element="schema",this.classes.push("json-schema-draft-4")}get idProp(){throw new td("idProp getter in Schema class is not not supported.")}set idProp(s){throw new td("idProp setter in Schema class is not not supported.")}get $schema(){throw new td("$schema getter in Schema class is not not supported.")}set $schema(s){throw new td("$schema setter in Schema class is not not supported.")}get additionalItems(){return this.get("additionalItems")}set additionalItems(s){this.set("additionalItems",s)}get items(){return this.get("items")}set items(s){this.set("items",s)}get additionalProperties(){return this.get("additionalProperties")}set additionalProperties(s){this.set("additionalProperties",s)}get patternProperties(){throw new td("patternProperties getter in Schema class is not not supported.")}set patternProperties(s){throw new td("patternProperties setter in Schema class is not not supported.")}get dependencies(){throw new td("dependencies getter in Schema class is not not supported.")}set dependencies(s){throw new td("dependencies setter in Schema class is not not supported.")}get type(){return this.get("type")}set type(s){this.set("type",s)}get not(){return this.get("not")}set not(s){this.set("not",s)}get definitions(){throw new td("definitions getter in Schema class is not not supported.")}set definitions(s){throw new td("definitions setter in Schema class is not not supported.")}get base(){throw new td("base getter in Schema class is not not supported.")}set base(s){throw new td("base setter in Schema class is not not supported.")}get links(){throw new td("links getter in Schema class is not not supported.")}set links(s){throw new td("links setter in Schema class is not not supported.")}get media(){throw new td("media getter in Schema class is not not supported.")}set media(s){throw new td("media setter in Schema class is not not supported.")}get nullable(){return this.get("nullable")}set nullable(s){this.set("nullable",s)}get discriminator(){return this.get("discriminator")}set discriminator(s){this.set("discriminator",s)}get writeOnly(){return this.get("writeOnly")}set writeOnly(s){this.set("writeOnly",s)}get xml(){return this.get("xml")}set xml(s){this.set("xml",s)}get externalDocs(){return this.get("externalDocs")}set externalDocs(s){this.set("externalDocs",s)}get example(){return this.get("example")}set example(s){this.set("example",s)}get deprecated(){return this.get("deprecated")}set deprecated(s){this.set("deprecated",s)}};class SecurityRequirement extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="securityRequirement"}}const Vf=SecurityRequirement;class SecurityScheme extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="securityScheme"}get type(){return this.get("type")}set type(s){this.set("type",s)}get description(){return this.get("description")}set description(s){this.set("description",s)}get name(){return this.get("name")}set name(s){this.set("name",s)}get in(){return this.get("in")}set in(s){this.set("in",s)}get scheme(){return this.get("scheme")}set scheme(s){this.set("scheme",s)}get bearerFormat(){return this.get("bearerFormat")}set bearerFormat(s){this.set("bearerFormat",s)}get flows(){return this.get("flows")}set flows(s){this.set("flows",s)}get openIdConnectUrl(){return this.get("openIdConnectUrl")}set openIdConnectUrl(s){this.set("openIdConnectUrl",s)}}const Wf=SecurityScheme;class Server extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="server"}get url(){return this.get("url")}set url(s){this.set("url",s)}get description(){return this.get("description")}set description(s){this.set("description",s)}get variables(){return this.get("variables")}set variables(s){this.set("variables",s)}}const Jf=Server;class ServerVariable extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="serverVariable"}get enum(){return this.get("enum")}set enum(s){this.set("enum",s)}get default(){return this.get("default")}set default(s){this.set("default",s)}get description(){return this.get("description")}set description(s){this.set("description",s)}}const Hf=ServerVariable;class Tag extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="tag"}get name(){return this.get("name")}set name(s){this.set("name",s)}get description(){return this.get("description")}set description(s){this.set("description",s)}get externalDocs(){return this.get("externalDocs")}set externalDocs(s){this.set("externalDocs",s)}}const Gf=Tag;class Xml extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="xml"}get name(){return this.get("name")}set name(s){this.set("name",s)}get namespace(){return this.get("namespace")}set namespace(s){this.set("namespace",s)}get prefix(){return this.get("prefix")}set prefix(s){this.set("prefix",s)}get attribute(){return this.get("attribute")}set attribute(s){this.set("attribute",s)}get wrapped(){return this.get("wrapped")}set wrapped(s){this.set("wrapped",s)}}const Xf=Xml;const Qf=class visitors_Visitor_Visitor{element;constructor(s={}){Object.assign(this,s)}copyMetaAndAttributes(s,o){(s.meta.length>0||o.meta.length>0)&&(o.meta=dd(o.meta,s.meta)),hasElementSourceMap(s)&&assignSourceMap(o,s),(s.attributes.length>0||s.meta.length>0)&&(o.attributes=dd(o.attributes,s.attributes))}};const em=class FallbackVisitor_FallbackVisitor extends Qf{enter(s){return this.element=cloneDeep(s),qu}};const tm=class SpecificationVisitor_SpecificationVisitor extends Qf{specObj;passingOptionsNames=["specObj","openApiGenericElement","openApiSemanticElement"];openApiGenericElement;openApiSemanticElement;constructor({specObj:s,passingOptionsNames:o,openApiGenericElement:i,openApiSemanticElement:a,...u}){super({...u}),this.specObj=s,this.openApiGenericElement=i,this.openApiSemanticElement=a,Array.isArray(o)&&(this.passingOptionsNames=o)}retrievePassingOptions(){return Td(this.passingOptionsNames,this)}retrieveFixedFields(s){const o=Qu(["visitors",...s,"fixedFields"],this.specObj);return"object"==typeof o&&null!==o?Object.keys(o):[]}retrieveVisitor(s){return Qo(Mc,["visitors",...s],this.specObj)?Qu(["visitors",...s],this.specObj):Qu(["visitors",...s,"$visitor"],this.specObj)}retrieveVisitorInstance(s,o={}){const i=this.retrievePassingOptions();return new(this.retrieveVisitor(s))({...i,...o})}toRefractedElement(s,o,i={}){const a=this.retrieveVisitorInstance(s,i);return a instanceof em&&(null==a?void 0:a.constructor)===em?cloneDeep(o):(visitor_visit(o,a,i),a.element)}};var rm=function(){function XTake(s,o){this.xf=o,this.n=s,this.i=0}return XTake.prototype["@@transducer/init"]=_xfBase_init,XTake.prototype["@@transducer/result"]=_xfBase_result,XTake.prototype["@@transducer/step"]=function(s,o){this.i+=1;var i=0===this.n?s:this.xf["@@transducer/step"](s,o);return this.n>=0&&this.i>=this.n?_reduced(i):i},XTake}();function _xtake(s){return function(o){return new rm(s,o)}}const nm=_curry2(_dispatchable(["take"],_xtake,(function take(s,o){return ja(0,s<0?1/0:s,o)})));var sm=_curry2((function(s,o){return na(nm(s.length,o),s)}));const om=sm,isReferenceLikeElement=s=>Nu(s)&&s.hasKey("$ref"),im=Nu,am=Nu,isOpenApiExtension=s=>ju(s.key)&&om("x-",serializers_value(s.key));const cm=class FixedFieldsVisitor_FixedFieldsVisitor extends tm{specPath;ignoredFields;canSupportSpecificationExtensions=!0;specificationExtensionPredicate=isOpenApiExtension;constructor({specPath:s,ignoredFields:o,canSupportSpecificationExtensions:i,specificationExtensionPredicate:a,...u}){super({...u}),this.specPath=s,this.ignoredFields=o||[],"boolean"==typeof i&&(this.canSupportSpecificationExtensions=i),"function"==typeof a&&(this.specificationExtensionPredicate=a)}ObjectElement(s){const o=this.specPath(s),i=this.retrieveFixedFields(o);return s.forEach(((s,a,u)=>{if(ju(a)&&i.includes(serializers_value(a))&&!this.ignoredFields.includes(serializers_value(a))){const i=this.toRefractedElement([...o,"fixedFields",serializers_value(a)],s),_=new Su.Pr(cloneDeep(a),i);this.copyMetaAndAttributes(u,_),_.classes.push("fixed-field"),this.element.content.push(_)}else if(this.canSupportSpecificationExtensions&&this.specificationExtensionPredicate(u)){const s=this.toRefractedElement(["document","extension"],u);this.element.content.push(s)}else this.ignoredFields.includes(serializers_value(a))||this.element.content.push(cloneDeep(u))})),this.copyMetaAndAttributes(s,this.element),qu}};class OpenApi3_0Visitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Rh,this.specPath=fc(["document","objects","OpenApi"]),this.canSupportSpecificationExtensions=!0}ObjectElement(s){return cm.prototype.ObjectElement.call(this,s)}}const lm=OpenApi3_0Visitor;class OpenapiVisitor extends(Mixin(tm,em)){StringElement(s){const o=new Ih(serializers_value(s));return this.copyMetaAndAttributes(s,o),this.element=o,qu}}const um=OpenapiVisitor;const pm=class SpecificationExtensionVisitor extends tm{MemberElement(s){return this.element=cloneDeep(s),this.element.classes.push("specification-extension"),qu}};class InfoVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new vh,this.specPath=fc(["document","objects","Info"]),this.canSupportSpecificationExtensions=!0}}const hm=InfoVisitor;const dm=class VersionVisitor extends em{StringElement(s){const o=super.enter(s);return this.element.classes.push("api-version"),this.element.classes.push("version"),o}};class ContactVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Zp,this.specPath=fc(["document","objects","Contact"]),this.canSupportSpecificationExtensions=!0}}const fm=ContactVisitor;class LicenseVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new _h,this.specPath=fc(["document","objects","License"]),this.canSupportSpecificationExtensions=!0}}const mm=LicenseVisitor;class LinkVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new wh,this.specPath=fc(["document","objects","Link"]),this.canSupportSpecificationExtensions=!0}ObjectElement(s){const o=cm.prototype.ObjectElement.call(this,s);return(ju(this.element.operationId)||ju(this.element.operationRef))&&this.element.classes.push("reference-element"),o}}const gm=LinkVisitor;const ym=class OperationRefVisitor extends em{StringElement(s){const o=super.enter(s);return this.element.classes.push("reference-value"),o}};const vm=class OperationIdVisitor extends em{StringElement(s){const o=super.enter(s);return this.element.classes.push("reference-value"),o}};const bm=class PatternedFieldsVisitor_PatternedFieldsVisitor extends tm{specPath;ignoredFields;fieldPatternPredicate=es_F;canSupportSpecificationExtensions=!1;specificationExtensionPredicate=isOpenApiExtension;constructor({specPath:s,ignoredFields:o,fieldPatternPredicate:i,canSupportSpecificationExtensions:a,specificationExtensionPredicate:u,..._}){super({..._}),this.specPath=s,this.ignoredFields=o||[],"function"==typeof i&&(this.fieldPatternPredicate=i),"boolean"==typeof a&&(this.canSupportSpecificationExtensions=a),"function"==typeof u&&(this.specificationExtensionPredicate=u)}ObjectElement(s){return s.forEach(((s,o,i)=>{if(this.canSupportSpecificationExtensions&&this.specificationExtensionPredicate(i)){const s=this.toRefractedElement(["document","extension"],i);this.element.content.push(s)}else if(!this.ignoredFields.includes(serializers_value(o))&&this.fieldPatternPredicate(serializers_value(o))){const a=this.specPath(s),u=this.toRefractedElement(a,s),_=new Su.Pr(cloneDeep(o),u);this.copyMetaAndAttributes(i,_),_.classes.push("patterned-field"),this.element.content.push(_)}else this.ignoredFields.includes(serializers_value(o))||this.element.content.push(cloneDeep(i))})),this.copyMetaAndAttributes(s,this.element),qu}};const _m=class MapVisitor_MapVisitor extends bm{constructor(s){super(s),this.fieldPatternPredicate=Id}};class LinkParameters extends Su.Sh{static primaryClass="link-parameters";constructor(s,o,i){super(s,o,i),this.classes.push(LinkParameters.primaryClass)}}const Sm=LinkParameters;class ParametersVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new Sm,this.specPath=fc(["value"])}}const Em=ParametersVisitor;class ServerVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Jf,this.specPath=fc(["document","objects","Server"]),this.canSupportSpecificationExtensions=!0}}const wm=ServerVisitor;const xm=class UrlVisitor extends em{StringElement(s){const o=super.enter(s);return this.element.classes.push("server-url"),o}};class Servers extends Su.wE{static primaryClass="servers";constructor(s,o,i){super(s,o,i),this.classes.push(Servers.primaryClass)}}const km=Servers;class ServersVisitor extends(Mixin(tm,em)){constructor(s){super(s),this.element=new km}ArrayElement(s){return s.forEach((s=>{const o=im(s)?["document","objects","Server"]:["value"],i=this.toRefractedElement(o,s);this.element.push(i)})),this.copyMetaAndAttributes(s,this.element),qu}}const Om=ServersVisitor;class ServerVariableVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Hf,this.specPath=fc(["document","objects","ServerVariable"]),this.canSupportSpecificationExtensions=!0}}const Am=ServerVariableVisitor;class ServerVariables extends Su.Sh{static primaryClass="server-variables";constructor(s,o,i){super(s,o,i),this.classes.push(ServerVariables.primaryClass)}}const Cm=ServerVariables;class VariablesVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new Cm,this.specPath=fc(["document","objects","ServerVariable"])}}const jm=VariablesVisitor;class MediaTypeVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Oh,this.specPath=fc(["document","objects","MediaType"]),this.canSupportSpecificationExtensions=!0}}const Pm=MediaTypeVisitor;const Im=class AlternatingVisitor_AlternatingVisitor extends tm{alternator;constructor({alternator:s,...o}){super({...o}),this.alternator=s||[]}enter(s){const o=this.alternator.map((({predicate:s,specPath:o})=>lf(s,fc(o),gc))),i=kf(o)(s);return this.element=this.toRefractedElement(i,s),qu}},Tm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Xp||s(a)&&o("callback",a)&&i("object",a))),Nm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Qp||s(a)&&o("components",a)&&i("object",a))),Mm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Zp||s(a)&&o("contact",a)&&i("object",a))),Rm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof uh||s(a)&&o("example",a)&&i("object",a))),Dm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof dh||s(a)&&o("externalDocumentation",a)&&i("object",a))),Lm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof fh||s(a)&&o("header",a)&&i("object",a))),Fm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof vh||s(a)&&o("info",a)&&i("object",a))),Bm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof _h||s(a)&&o("license",a)&&i("object",a))),$m=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof wh||s(a)&&o("link",a)&&i("object",a))),qm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Ih||s(a)&&o("openapi",a)&&i("string",a))),Um=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i,hasClass:a})=>u=>u instanceof Rh||s(u)&&o("openApi3_0",u)&&i("object",u)&&a("api",u))),Vm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Dh||s(a)&&o("operation",a)&&i("object",a))),zm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Lh||s(a)&&o("parameter",a)&&i("object",a))),Wm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Fh||s(a)&&o("pathItem",a)&&i("object",a))),Jm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Jh||s(a)&&o("paths",a)&&i("object",a))),Hm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Hh||s(a)&&o("reference",a)&&i("object",a))),Km=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Kh||s(a)&&o("requestBody",a)&&i("object",a))),Gm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Gh||s(a)&&o("response",a)&&i("object",a))),Ym=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Qh||s(a)&&o("responses",a)&&i("object",a))),Xm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Ff||s(a)&&o("schema",a)&&i("object",a))),isBooleanJsonSchemaElement=s=>Tu(s)&&s.classes.includes("boolean-json-schema"),Qm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Vf||s(a)&&o("securityRequirement",a)&&i("object",a))),Zm=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Wf||s(a)&&o("securityScheme",a)&&i("object",a))),eg=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Jf||s(a)&&o("server",a)&&i("object",a))),rg=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Hf||s(a)&&o("serverVariable",a)&&i("object",a))),ng=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Oh||s(a)&&o("mediaType",a)&&i("object",a))),sg=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i,hasClass:a})=>u=>u instanceof km||s(u)&&o("array",u)&&i("array",u)&&a("servers",u))),og=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof th||s(a)&&o("discriminator",a)&&i("object",a)));class SchemaVisitor extends(Mixin(Im,em)){constructor(s){super(s),this.alternator=[{predicate:isReferenceLikeElement,specPath:["document","objects","Reference"]},{predicate:es_T,specPath:["document","objects","Schema"]}]}ObjectElement(s){const o=Im.prototype.enter.call(this,s);return Hm(this.element)&&this.element.setMetaProperty("referenced-element","schema"),o}}const lg=SchemaVisitor;class ExamplesVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new Su.Sh,this.element.classes.push("examples"),this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","Example"],this.canSupportSpecificationExtensions=!0}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","example")})),o}}const pg=ExamplesVisitor;class MediaTypeExamples extends Su.Sh{static primaryClass="media-type-examples";constructor(s,o,i){super(s,o,i),this.classes.push(MediaTypeExamples.primaryClass),this.classes.push("examples")}}const fg=MediaTypeExamples;const mg=class ExamplesVisitor_ExamplesVisitor extends pg{constructor(s){super(s),this.element=new fg}};class MediaTypeEncoding extends Su.Sh{static primaryClass="media-type-encoding";constructor(s,o,i){super(s,o,i),this.classes.push(MediaTypeEncoding.primaryClass)}}const gg=MediaTypeEncoding;class EncodingVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new gg,this.specPath=fc(["document","objects","Encoding"])}}const yg=EncodingVisitor;class SecurityRequirementVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new Vf,this.specPath=fc(["value"])}}const _g=SecurityRequirementVisitor;class Security extends Su.wE{static primaryClass="security";constructor(s,o,i){super(s,o,i),this.classes.push(Security.primaryClass)}}const xg=Security;class SecurityVisitor extends(Mixin(tm,em)){constructor(s){super(s),this.element=new xg}ArrayElement(s){return s.forEach((s=>{if(Nu(s)){const o=this.toRefractedElement(["document","objects","SecurityRequirement"],s);this.element.push(o)}else this.element.push(cloneDeep(s))})),this.copyMetaAndAttributes(s,this.element),qu}}const kg=SecurityVisitor;class ComponentsVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Qp,this.specPath=fc(["document","objects","Components"]),this.canSupportSpecificationExtensions=!0}}const qg=ComponentsVisitor;class TagVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Gf,this.specPath=fc(["document","objects","Tag"]),this.canSupportSpecificationExtensions=!0}}const Ug=TagVisitor;class ReferenceVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Hh,this.specPath=fc(["document","objects","Reference"]),this.canSupportSpecificationExtensions=!1}ObjectElement(s){const o=cm.prototype.ObjectElement.call(this,s);return ju(this.element.$ref)&&this.element.classes.push("reference-element"),o}}const Vg=ReferenceVisitor;const zg=class $RefVisitor_$RefVisitor extends em{StringElement(s){const o=super.enter(s);return this.element.classes.push("reference-value"),o}};class ParameterVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Lh,this.specPath=fc(["document","objects","Parameter"]),this.canSupportSpecificationExtensions=!0}ObjectElement(s){const o=cm.prototype.ObjectElement.call(this,s);return Nu(this.element.contentProp)&&this.element.contentProp.filter(ng).forEach(((s,o)=>{s.setMetaProperty("media-type",serializers_value(o))})),o}}const Wg=ParameterVisitor;class SchemaVisitor_SchemaVisitor extends(Mixin(Im,em)){constructor(s){super(s),this.alternator=[{predicate:isReferenceLikeElement,specPath:["document","objects","Reference"]},{predicate:es_T,specPath:["document","objects","Schema"]}]}ObjectElement(s){const o=Im.prototype.enter.call(this,s);return Hm(this.element)&&this.element.setMetaProperty("referenced-element","schema"),o}}const Kg=SchemaVisitor_SchemaVisitor;class HeaderVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new fh,this.specPath=fc(["document","objects","Header"]),this.canSupportSpecificationExtensions=!0}}const Yg=HeaderVisitor;class header_SchemaVisitor_SchemaVisitor extends(Mixin(Im,em)){constructor(s){super(s),this.alternator=[{predicate:isReferenceLikeElement,specPath:["document","objects","Reference"]},{predicate:es_T,specPath:["document","objects","Schema"]}]}ObjectElement(s){const o=Im.prototype.enter.call(this,s);return Hm(this.element)&&this.element.setMetaProperty("referenced-element","schema"),o}}const Xg=header_SchemaVisitor_SchemaVisitor;class HeaderExamples extends Su.Sh{static primaryClass="header-examples";constructor(s,o,i){super(s,o,i),this.classes.push(HeaderExamples.primaryClass),this.classes.push("examples")}}const Zg=HeaderExamples;const ey=class header_ExamplesVisitor_ExamplesVisitor extends pg{constructor(s){super(s),this.element=new Zg}};class ContentVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new Su.Sh,this.element.classes.push("content"),this.specPath=fc(["document","objects","MediaType"])}}const ty=ContentVisitor;class HeaderContent extends Su.Sh{static primaryClass="header-content";constructor(s,o,i){super(s,o,i),this.classes.push(HeaderContent.primaryClass),this.classes.push("content")}}const ry=HeaderContent;const ny=class ContentVisitor_ContentVisitor extends ty{constructor(s){super(s),this.element=new ry}};class schema_SchemaVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Ff,this.specPath=fc(["document","objects","Schema"]),this.canSupportSpecificationExtensions=!0}}const sy=schema_SchemaVisitor,oy=Tf.visitors.document.objects.JSONSchema.fixedFields.allOf;const iy=class AllOfVisitor_AllOfVisitor extends oy{ArrayElement(s){const o=oy.prototype.ArrayElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","schema")})),o}},ay=Tf.visitors.document.objects.JSONSchema.fixedFields.anyOf;const cy=class AnyOfVisitor_AnyOfVisitor extends ay{ArrayElement(s){const o=ay.prototype.ArrayElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","schema")})),o}},ly=Tf.visitors.document.objects.JSONSchema.fixedFields.oneOf;const uy=class OneOfVisitor_OneOfVisitor extends ly{ArrayElement(s){const o=ly.prototype.ArrayElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","schema")})),o}},py=Tf.visitors.document.objects.JSONSchema.fixedFields.items;const hy=class ItemsVisitor_ItemsVisitor extends py{ObjectElement(s){const o=py.prototype.ObjectElement.call(this,s);return Hm(this.element)&&this.element.setMetaProperty("referenced-element","schema"),o}ArrayElement(s){return this.enter(s)}},dy=Tf.visitors.document.objects.JSONSchema.fixedFields.properties;const fy=class PropertiesVisitor_PropertiesVisitor extends dy{ObjectElement(s){const o=dy.prototype.ObjectElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","schema")})),o}},my=Tf.visitors.document.objects.JSONSchema.fixedFields.type;const gy=class TypeVisitor_TypeVisitor extends my{ArrayElement(s){return this.enter(s)}},yy=Tf.visitors.JSONSchemaOrJSONReferenceVisitor;const vy=class SchemaOrReferenceVisitor_SchemaOrReferenceVisitor extends yy{ObjectElement(s){const o=yy.prototype.enter.call(this,s);return Hm(this.element)&&this.element.setMetaProperty("referenced-element","schema"),o}};class DiscriminatorVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new th,this.specPath=fc(["document","objects","Discriminator"]),this.canSupportSpecificationExtensions=!1}}const by=DiscriminatorVisitor;class DiscriminatorMapping extends Su.Sh{static primaryClass="discriminator-mapping";constructor(s,o,i){super(s,o,i),this.classes.push(DiscriminatorMapping.primaryClass)}}const _y=DiscriminatorMapping;class MappingVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new _y,this.specPath=fc(["value"])}}const Sy=MappingVisitor;class XmlVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Xf,this.specPath=fc(["document","objects","XML"]),this.canSupportSpecificationExtensions=!0}}const Ey=XmlVisitor;class ParameterExamples extends Su.Sh{static primaryClass="parameter-examples";constructor(s,o,i){super(s,o,i),this.classes.push(ParameterExamples.primaryClass),this.classes.push("examples")}}const wy=ParameterExamples;const xy=class parameter_ExamplesVisitor_ExamplesVisitor extends pg{constructor(s){super(s),this.element=new wy}};class ParameterContent extends Su.Sh{static primaryClass="parameter-content";constructor(s,o,i){super(s,o,i),this.classes.push(ParameterContent.primaryClass),this.classes.push("content")}}const ky=ParameterContent;const Oy=class parameter_ContentVisitor_ContentVisitor extends ty{constructor(s){super(s),this.element=new ky}};class ComponentsSchemas extends Su.Sh{static primaryClass="components-schemas";constructor(s,o,i){super(s,o,i),this.classes.push(ComponentsSchemas.primaryClass)}}const Ay=ComponentsSchemas;class SchemasVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new Ay,this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","Schema"]}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","schema")})),o}}const Cy=SchemasVisitor;class ComponentsResponses extends Su.Sh{static primaryClass="components-responses";constructor(s,o,i){super(s,o,i),this.classes.push(ComponentsResponses.primaryClass)}}const jy=ComponentsResponses;class ResponsesVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new jy,this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","Response"]}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","response")})),this.element.filter(Gm).forEach(((s,o)=>{s.setMetaProperty("http-status-code",serializers_value(o))})),o}}const Py=ResponsesVisitor;class ComponentsParameters extends Su.Sh{static primaryClass="components-parameters";constructor(s,o,i){super(s,o,i),this.classes.push(ComponentsParameters.primaryClass),this.classes.push("parameters")}}const Iy=ComponentsParameters;class ParametersVisitor_ParametersVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new Iy,this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","Parameter"]}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","parameter")})),o}}const Ty=ParametersVisitor_ParametersVisitor;class ComponentsExamples extends Su.Sh{static primaryClass="components-examples";constructor(s,o,i){super(s,o,i),this.classes.push(ComponentsExamples.primaryClass),this.classes.push("examples")}}const Ny=ComponentsExamples;class components_ExamplesVisitor_ExamplesVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new Ny,this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","Example"]}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","example")})),o}}const My=components_ExamplesVisitor_ExamplesVisitor;class ComponentsRequestBodies extends Su.Sh{static primaryClass="components-request-bodies";constructor(s,o,i){super(s,o,i),this.classes.push(ComponentsRequestBodies.primaryClass)}}const Ry=ComponentsRequestBodies;class RequestBodiesVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new Ry,this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","RequestBody"]}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","requestBody")})),o}}const Dy=RequestBodiesVisitor;class ComponentsHeaders extends Su.Sh{static primaryClass="components-headers";constructor(s,o,i){super(s,o,i),this.classes.push(ComponentsHeaders.primaryClass)}}const Ly=ComponentsHeaders;class HeadersVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new Ly,this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","Header"]}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","header")})),this.element.filter(Lm).forEach(((s,o)=>{s.setMetaProperty("header-name",serializers_value(o))})),o}}const Fy=HeadersVisitor;class ComponentsSecuritySchemes extends Su.Sh{static primaryClass="components-security-schemes";constructor(s,o,i){super(s,o,i),this.classes.push(ComponentsSecuritySchemes.primaryClass)}}const By=ComponentsSecuritySchemes;class SecuritySchemesVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new By,this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","SecurityScheme"]}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","securityScheme")})),o}}const $y=SecuritySchemesVisitor;class ComponentsLinks extends Su.Sh{static primaryClass="components-links";constructor(s,o,i){super(s,o,i),this.classes.push(ComponentsLinks.primaryClass)}}const qy=ComponentsLinks;class LinksVisitor_LinksVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new qy,this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","Link"]}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","link")})),o}}const Uy=LinksVisitor_LinksVisitor;class ComponentsCallbacks extends Su.Sh{static primaryClass="components-callbacks";constructor(s,o,i){super(s,o,i),this.classes.push(ComponentsCallbacks.primaryClass)}}const Vy=ComponentsCallbacks;class CallbacksVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new Vy,this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","Callback"]}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","callback")})),o}}const zy=CallbacksVisitor;class ExampleVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new uh,this.specPath=fc(["document","objects","Example"]),this.canSupportSpecificationExtensions=!0}ObjectElement(s){const o=cm.prototype.ObjectElement.call(this,s);return ju(this.element.externalValue)&&this.element.classes.push("reference-element"),o}}const Wy=ExampleVisitor;const Jy=class ExternalValueVisitor extends em{StringElement(s){const o=super.enter(s);return this.element.classes.push("reference-value"),o}};class ExternalDocumentationVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new dh,this.specPath=fc(["document","objects","ExternalDocumentation"]),this.canSupportSpecificationExtensions=!0}}const Hy=ExternalDocumentationVisitor;class encoding_EncodingVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new rh,this.specPath=fc(["document","objects","Encoding"]),this.canSupportSpecificationExtensions=!0}ObjectElement(s){const o=cm.prototype.ObjectElement.call(this,s);return Nu(this.element.headers)&&this.element.headers.filter(Lm).forEach(((s,o)=>{s.setMetaProperty("header-name",serializers_value(o))})),o}}const Ky=encoding_EncodingVisitor;class EncodingHeaders extends Su.Sh{static primaryClass="encoding-headers";constructor(s,o,i){super(s,o,i),this.classes.push(EncodingHeaders.primaryClass)}}const Gy=EncodingHeaders;class HeadersVisitor_HeadersVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new Gy,this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","Header"]}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","header")})),this.element.forEach(((s,o)=>{if(!Lm(s))return;const i=serializers_value(o);s.setMetaProperty("headerName",i)})),o}}const Yy=HeadersVisitor_HeadersVisitor;class PathsVisitor extends(Mixin(bm,em)){constructor(s){super(s),this.element=new Jh,this.specPath=fc(["document","objects","PathItem"]),this.canSupportSpecificationExtensions=!0,this.fieldPatternPredicate=es_T}ObjectElement(s){const o=bm.prototype.ObjectElement.call(this,s);return this.element.filter(Wm).forEach(((s,o)=>{o.classes.push("openapi-path-template"),o.classes.push("path-template"),s.setMetaProperty("path",cloneDeep(o))})),o}}const Xy=PathsVisitor;class RequestBodyVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Kh,this.specPath=fc(["document","objects","RequestBody"])}ObjectElement(s){const o=cm.prototype.ObjectElement.call(this,s);return Nu(this.element.contentProp)&&this.element.contentProp.filter(ng).forEach(((s,o)=>{s.setMetaProperty("media-type",serializers_value(o))})),o}}const Qy=RequestBodyVisitor;class RequestBodyContent extends Su.Sh{static primaryClass="request-body-content";constructor(s,o,i){super(s,o,i),this.classes.push(RequestBodyContent.primaryClass),this.classes.push("content")}}const Zy=RequestBodyContent;const ev=class request_body_ContentVisitor_ContentVisitor extends ty{constructor(s){super(s),this.element=new Zy}};class CallbackVisitor extends(Mixin(bm,em)){constructor(s){super(s),this.element=new Xp,this.specPath=fc(["document","objects","PathItem"]),this.canSupportSpecificationExtensions=!0,this.fieldPatternPredicate=s=>/{(?[^}]{1,2083})}/.test(String(s))}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(Wm).forEach(((s,o)=>{s.setMetaProperty("runtime-expression",serializers_value(o))})),o}}const tv=CallbackVisitor;class ResponseVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Gh,this.specPath=fc(["document","objects","Response"])}ObjectElement(s){const o=cm.prototype.ObjectElement.call(this,s);return Nu(this.element.contentProp)&&this.element.contentProp.filter(ng).forEach(((s,o)=>{s.setMetaProperty("media-type",serializers_value(o))})),Nu(this.element.headers)&&this.element.headers.filter(Lm).forEach(((s,o)=>{s.setMetaProperty("header-name",serializers_value(o))})),o}}const rv=ResponseVisitor;class ResponseHeaders extends Su.Sh{static primaryClass="response-headers";constructor(s,o,i){super(s,o,i),this.classes.push(ResponseHeaders.primaryClass)}}const nv=ResponseHeaders;class response_HeadersVisitor_HeadersVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new nv,this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","Header"]}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","header")})),this.element.forEach(((s,o)=>{if(!Lm(s))return;const i=serializers_value(o);s.setMetaProperty("header-name",i)})),o}}const sv=response_HeadersVisitor_HeadersVisitor;class ResponseContent extends Su.Sh{static primaryClass="response-content";constructor(s,o,i){super(s,o,i),this.classes.push(ResponseContent.primaryClass),this.classes.push("content")}}const ov=ResponseContent;const iv=class response_ContentVisitor_ContentVisitor extends ty{constructor(s){super(s),this.element=new ov}};class ResponseLinks extends Su.Sh{static primaryClass="response-links";constructor(s,o,i){super(s,o,i),this.classes.push(ResponseLinks.primaryClass)}}const av=ResponseLinks;class response_LinksVisitor_LinksVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new av,this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","Link"]}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","link")})),o}}const cv=response_LinksVisitor_LinksVisitor;function _isNumber(s){return"[object Number]"===Object.prototype.toString.call(s)}var lv=_curry2((function range(s,o){if(!_isNumber(s)||!_isNumber(o))throw new TypeError("Both arguments to range must be numbers");for(var i=Array(sisReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","Response"],this.fieldPatternPredicate=s=>new RegExp(`^(1XX|2XX|3XX|4XX|5XX|${uv(100,600).join("|")})$`).test(String(s))}ObjectElement(s){const o=fv.prototype.ObjectElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","response")})),this.element.filter(Gm).forEach(((s,o)=>{const i=cloneDeep(o);this.fieldPatternPredicate(serializers_value(i))&&s.setMetaProperty("http-status-code",i)})),o}}const mv=responses_ResponsesVisitor;class DefaultVisitor extends(Mixin(Im,em)){constructor(s){super(s),this.alternator=[{predicate:isReferenceLikeElement,specPath:["document","objects","Reference"]},{predicate:es_T,specPath:["document","objects","Response"]}]}ObjectElement(s){const o=Im.prototype.enter.call(this,s);return Hm(this.element)?this.element.setMetaProperty("referenced-element","response"):Gm(this.element)&&this.element.setMetaProperty("http-status-code","default"),o}}const gv=DefaultVisitor;class OperationVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Dh,this.specPath=fc(["document","objects","Operation"])}}const yv=OperationVisitor;class OperationTags extends Su.wE{static primaryClass="operation-tags";constructor(s,o,i){super(s,o,i),this.classes.push(OperationTags.primaryClass)}}const vv=OperationTags;const bv=class TagsVisitor extends em{constructor(s){super(s),this.element=new vv}ArrayElement(s){return this.element=this.element.concat(cloneDeep(s)),qu}};class OperationParameters extends Su.wE{static primaryClass="operation-parameters";constructor(s,o,i){super(s,o,i),this.classes.push(OperationParameters.primaryClass),this.classes.push("parameters")}}const _v=OperationParameters;class open_api_3_0_ParametersVisitor_ParametersVisitor extends(Mixin(tm,em)){constructor(s){super(s),this.element=new Su.wE,this.element.classes.push("parameters")}ArrayElement(s){return s.forEach((s=>{const o=isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","Parameter"],i=this.toRefractedElement(o,s);Hm(i)&&i.setMetaProperty("referenced-element","parameter"),this.element.push(i)})),this.copyMetaAndAttributes(s,this.element),qu}}const Sv=open_api_3_0_ParametersVisitor_ParametersVisitor;const Ev=class operation_ParametersVisitor_ParametersVisitor extends Sv{constructor(s){super(s),this.element=new _v}};const wv=class RequestBodyVisitor_RequestBodyVisitor extends Im{constructor(s){super(s),this.alternator=[{predicate:isReferenceLikeElement,specPath:["document","objects","Reference"]},{predicate:es_T,specPath:["document","objects","RequestBody"]}]}ObjectElement(s){const o=Im.prototype.enter.call(this,s);return Hm(this.element)&&this.element.setMetaProperty("referenced-element","requestBody"),o}};class OperationCallbacks extends Su.Sh{static primaryClass="operation-callbacks";constructor(s,o,i){super(s,o,i),this.classes.push(OperationCallbacks.primaryClass)}}const xv=OperationCallbacks;class CallbacksVisitor_CallbacksVisitor extends(Mixin(_m,em)){specPath;constructor(s){super(s),this.element=new xv,this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","Callback"]}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(Hm).forEach((s=>{s.setMetaProperty("referenced-element","callback")})),o}}const kv=CallbacksVisitor_CallbacksVisitor;class OperationSecurity extends Su.wE{static primaryClass="operation-security";constructor(s,o,i){super(s,o,i),this.classes.push(OperationSecurity.primaryClass),this.classes.push("security")}}const Ov=OperationSecurity;class SecurityVisitor_SecurityVisitor extends(Mixin(tm,em)){constructor(s){super(s),this.element=new Ov}ArrayElement(s){return s.forEach((s=>{const o=Nu(s)?["document","objects","SecurityRequirement"]:["value"],i=this.toRefractedElement(o,s);this.element.push(i)})),this.copyMetaAndAttributes(s,this.element),qu}}const Av=SecurityVisitor_SecurityVisitor;class OperationServers extends Su.wE{static primaryClass="operation-servers";constructor(s,o,i){super(s,o,i),this.classes.push(OperationServers.primaryClass),this.classes.push("servers")}}const Cv=OperationServers;const jv=class ServersVisitor_ServersVisitor extends Om{constructor(s){super(s),this.element=new Cv}};class PathItemVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Fh,this.specPath=fc(["document","objects","PathItem"])}ObjectElement(s){const o=cm.prototype.ObjectElement.call(this,s);return this.element.filter(Vm).forEach(((s,o)=>{const i=cloneDeep(o);i.content=serializers_value(i).toUpperCase(),s.setMetaProperty("http-method",i)})),ju(this.element.$ref)&&this.element.classes.push("reference-element"),o}}const Pv=PathItemVisitor;const Iv=class path_item_$RefVisitor_$RefVisitor extends em{StringElement(s){const o=super.enter(s);return this.element.classes.push("reference-value"),o}};class PathItemServers extends Su.wE{static primaryClass="path-item-servers";constructor(s,o,i){super(s,o,i),this.classes.push(PathItemServers.primaryClass),this.classes.push("servers")}}const Tv=PathItemServers;const Nv=class path_item_ServersVisitor_ServersVisitor extends Om{constructor(s){super(s),this.element=new Tv}};class PathItemParameters extends Su.wE{static primaryClass="path-item-parameters";constructor(s,o,i){super(s,o,i),this.classes.push(PathItemParameters.primaryClass),this.classes.push("parameters")}}const Mv=PathItemParameters;const Rv=class path_item_ParametersVisitor_ParametersVisitor extends Sv{constructor(s){super(s),this.element=new Mv}};class SecuritySchemeVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Wf,this.specPath=fc(["document","objects","SecurityScheme"]),this.canSupportSpecificationExtensions=!0}}const Dv=SecuritySchemeVisitor;class OAuthFlowsVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Ph,this.specPath=fc(["document","objects","OAuthFlows"]),this.canSupportSpecificationExtensions=!0}}const Lv=OAuthFlowsVisitor;class OAuthFlowVisitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new jh,this.specPath=fc(["document","objects","OAuthFlow"]),this.canSupportSpecificationExtensions=!0}}const Fv=OAuthFlowVisitor;class OAuthFlowScopes extends Su.Sh{static primaryClass="oauth-flow-scopes";constructor(s,o,i){super(s,o,i),this.classes.push(OAuthFlowScopes.primaryClass)}}const Bv=OAuthFlowScopes;class ScopesVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new Bv,this.specPath=fc(["value"])}}const $v=ScopesVisitor;class Tags extends Su.wE{static primaryClass="tags";constructor(s,o,i){super(s,o,i),this.classes.push(Tags.primaryClass)}}const qv=Tags;class TagsVisitor_TagsVisitor extends(Mixin(tm,em)){constructor(s){super(s),this.element=new qv}ArrayElement(s){return s.forEach((s=>{const o=am(s)?["document","objects","Tag"]:["value"],i=this.toRefractedElement(o,s);this.element.push(i)})),this.copyMetaAndAttributes(s,this.element),qu}}const Uv=TagsVisitor_TagsVisitor,{fixedFields:Vv}=Tf.visitors.document.objects.JSONSchema,zv={visitors:{value:em,document:{objects:{OpenApi:{$visitor:lm,fixedFields:{openapi:um,info:{$ref:"#/visitors/document/objects/Info"},servers:Om,paths:{$ref:"#/visitors/document/objects/Paths"},components:{$ref:"#/visitors/document/objects/Components"},security:kg,tags:Uv,externalDocs:{$ref:"#/visitors/document/objects/ExternalDocumentation"}}},Info:{$visitor:hm,fixedFields:{title:{$ref:"#/visitors/value"},description:{$ref:"#/visitors/value"},termsOfService:{$ref:"#/visitors/value"},contact:{$ref:"#/visitors/document/objects/Contact"},license:{$ref:"#/visitors/document/objects/License"},version:dm}},Contact:{$visitor:fm,fixedFields:{name:{$ref:"#/visitors/value"},url:{$ref:"#/visitors/value"},email:{$ref:"#/visitors/value"}}},License:{$visitor:mm,fixedFields:{name:{$ref:"#/visitors/value"},url:{$ref:"#/visitors/value"}}},Server:{$visitor:wm,fixedFields:{url:xm,description:{$ref:"#/visitors/value"},variables:jm}},ServerVariable:{$visitor:Am,fixedFields:{enum:{$ref:"#/visitors/value"},default:{$ref:"#/visitors/value"},description:{$ref:"#/visitors/value"}}},Components:{$visitor:qg,fixedFields:{schemas:Cy,responses:Py,parameters:Ty,examples:My,requestBodies:Dy,headers:Fy,securitySchemes:$y,links:Uy,callbacks:zy}},Paths:{$visitor:Xy},PathItem:{$visitor:Pv,fixedFields:{$ref:Iv,summary:{$ref:"#/visitors/value"},description:{$ref:"#/visitors/value"},get:{$ref:"#/visitors/document/objects/Operation"},put:{$ref:"#/visitors/document/objects/Operation"},post:{$ref:"#/visitors/document/objects/Operation"},delete:{$ref:"#/visitors/document/objects/Operation"},options:{$ref:"#/visitors/document/objects/Operation"},head:{$ref:"#/visitors/document/objects/Operation"},patch:{$ref:"#/visitors/document/objects/Operation"},trace:{$ref:"#/visitors/document/objects/Operation"},servers:Nv,parameters:Rv}},Operation:{$visitor:yv,fixedFields:{tags:bv,summary:{$ref:"#/visitors/value"},description:{$ref:"#/visitors/value"},externalDocs:{$ref:"#/visitors/document/objects/ExternalDocumentation"},operationId:{$ref:"#/visitors/value"},parameters:Ev,requestBody:wv,responses:{$ref:"#/visitors/document/objects/Responses"},callbacks:kv,deprecated:{$ref:"#/visitors/value"},security:Av,servers:jv}},ExternalDocumentation:{$visitor:Hy,fixedFields:{description:{$ref:"#/visitors/value"},url:{$ref:"#/visitors/value"}}},Parameter:{$visitor:Wg,fixedFields:{name:{$ref:"#/visitors/value"},in:{$ref:"#/visitors/value"},description:{$ref:"#/visitors/value"},required:{$ref:"#/visitors/value"},deprecated:{$ref:"#/visitors/value"},allowEmptyValue:{$ref:"#/visitors/value"},style:{$ref:"#/visitors/value"},explode:{$ref:"#/visitors/value"},allowReserved:{$ref:"#/visitors/value"},schema:Kg,example:{$ref:"#/visitors/value"},examples:xy,content:Oy}},RequestBody:{$visitor:Qy,fixedFields:{description:{$ref:"#/visitors/value"},content:ev,required:{$ref:"#/visitors/value"}}},MediaType:{$visitor:Pm,fixedFields:{schema:lg,example:{$ref:"#/visitors/value"},examples:mg,encoding:yg}},Encoding:{$visitor:Ky,fixedFields:{contentType:{$ref:"#/visitors/value"},headers:Yy,style:{$ref:"#/visitors/value"},explode:{$ref:"#/visitors/value"},allowReserved:{$ref:"#/visitors/value"}}},Responses:{$visitor:mv,fixedFields:{default:gv}},Response:{$visitor:rv,fixedFields:{description:{$ref:"#/visitors/value"},headers:sv,content:iv,links:cv}},Callback:{$visitor:tv},Example:{$visitor:Wy,fixedFields:{summary:{$ref:"#/visitors/value"},description:{$ref:"#/visitors/value"},value:{$ref:"#/visitors/value"},externalValue:Jy}},Link:{$visitor:gm,fixedFields:{operationRef:ym,operationId:vm,parameters:Em,requestBody:{$ref:"#/visitors/value"},description:{$ref:"#/visitors/value"},server:{$ref:"#/visitors/document/objects/Server"}}},Header:{$visitor:Yg,fixedFields:{description:{$ref:"#/visitors/value"},required:{$ref:"#/visitors/value"},deprecated:{$ref:"#/visitors/value"},allowEmptyValue:{$ref:"#/visitors/value"},style:{$ref:"#/visitors/value"},explode:{$ref:"#/visitors/value"},allowReserved:{$ref:"#/visitors/value"},schema:Xg,example:{$ref:"#/visitors/value"},examples:ey,content:ny}},Tag:{$visitor:Ug,fixedFields:{name:{$ref:"#/visitors/value"},description:{$ref:"#/visitors/value"},externalDocs:{$ref:"#/visitors/document/objects/ExternalDocumentation"}}},Reference:{$visitor:Vg,fixedFields:{$ref:zg}},JSONSchema:{$ref:"#/visitors/document/objects/Schema"},JSONReference:{$ref:"#/visitors/document/objects/Reference"},Schema:{$visitor:sy,fixedFields:{title:Vv.title,multipleOf:Vv.multipleOf,maximum:Vv.maximum,exclusiveMaximum:Vv.exclusiveMaximum,minimum:Vv.minimum,exclusiveMinimum:Vv.exclusiveMinimum,maxLength:Vv.maxLength,minLength:Vv.minLength,pattern:Vv.pattern,maxItems:Vv.maxItems,minItems:Vv.minItems,uniqueItems:Vv.uniqueItems,maxProperties:Vv.maxProperties,minProperties:Vv.minProperties,required:Vv.required,enum:Vv.enum,type:gy,allOf:iy,anyOf:cy,oneOf:uy,not:vy,items:hy,properties:fy,additionalProperties:vy,description:Vv.description,format:Vv.format,default:Vv.default,nullable:{$ref:"#/visitors/value"},discriminator:{$ref:"#/visitors/document/objects/Discriminator"},writeOnly:{$ref:"#/visitors/value"},xml:{$ref:"#/visitors/document/objects/XML"},externalDocs:{$ref:"#/visitors/document/objects/ExternalDocumentation"},example:{$ref:"#/visitors/value"},deprecated:{$ref:"#/visitors/value"}}},Discriminator:{$visitor:by,fixedFields:{propertyName:{$ref:"#/visitors/value"},mapping:Sy}},XML:{$visitor:Ey,fixedFields:{name:{$ref:"#/visitors/value"},namespace:{$ref:"#/visitors/value"},prefix:{$ref:"#/visitors/value"},attribute:{$ref:"#/visitors/value"},wrapped:{$ref:"#/visitors/value"}}},SecurityScheme:{$visitor:Dv,fixedFields:{type:{$ref:"#/visitors/value"},description:{$ref:"#/visitors/value"},name:{$ref:"#/visitors/value"},in:{$ref:"#/visitors/value"},scheme:{$ref:"#/visitors/value"},bearerFormat:{$ref:"#/visitors/value"},flows:{$ref:"#/visitors/document/objects/OAuthFlows"},openIdConnectUrl:{$ref:"#/visitors/value"}}},OAuthFlows:{$visitor:Lv,fixedFields:{implicit:{$ref:"#/visitors/document/objects/OAuthFlow"},password:{$ref:"#/visitors/document/objects/OAuthFlow"},clientCredentials:{$ref:"#/visitors/document/objects/OAuthFlow"},authorizationCode:{$ref:"#/visitors/document/objects/OAuthFlow"}}},OAuthFlow:{$visitor:Fv,fixedFields:{authorizationUrl:{$ref:"#/visitors/value"},tokenUrl:{$ref:"#/visitors/value"},refreshUrl:{$ref:"#/visitors/value"},scopes:$v}},SecurityRequirement:{$visitor:_g}},extension:{$visitor:pm}}}},src_traversal_visitor_getNodeType=s=>{if(Cu(s))return`${s.element.charAt(0).toUpperCase()+s.element.slice(1)}Element`},Wv={CallbackElement:["content"],ComponentsElement:["content"],ContactElement:["content"],DiscriminatorElement:["content"],Encoding:["content"],Example:["content"],ExternalDocumentationElement:["content"],HeaderElement:["content"],InfoElement:["content"],LicenseElement:["content"],MediaTypeElement:["content"],OAuthFlowElement:["content"],OAuthFlowsElement:["content"],OpenApi3_0Element:["content"],OperationElement:["content"],ParameterElement:["content"],PathItemElement:["content"],PathsElement:["content"],ReferenceElement:["content"],RequestBodyElement:["content"],ResponseElement:["content"],ResponsesElement:["content"],SchemaElement:["content"],SecurityRequirementElement:["content"],SecuritySchemeElement:["content"],ServerElement:["content"],ServerVariableElement:["content"],TagElement:["content"],...np},Jv={namespace:s=>{const{base:o}=s;return o.register("callback",Xp),o.register("components",Qp),o.register("contact",Zp),o.register("discriminator",th),o.register("encoding",rh),o.register("example",uh),o.register("externalDocumentation",dh),o.register("header",fh),o.register("info",vh),o.register("license",_h),o.register("link",wh),o.register("mediaType",Oh),o.register("oAuthFlow",jh),o.register("oAuthFlows",Ph),o.register("openapi",Ih),o.register("openApi3_0",Rh),o.register("operation",Dh),o.register("parameter",Lh),o.register("pathItem",Fh),o.register("paths",Jh),o.register("reference",Hh),o.register("requestBody",Kh),o.register("response",Gh),o.register("responses",Qh),o.register("schema",Ff),o.register("securityRequirement",Vf),o.register("securityScheme",Wf),o.register("server",Jf),o.register("serverVariable",Hf),o.register("tag",Gf),o.register("xml",Xf),o}},Hv=Jv,src_refractor_toolbox=()=>{const s=createNamespace(Hv);return{predicates:{...ce,isElement:Cu,isStringElement:ju,isArrayElement:Mu,isObjectElement:Nu,isMemberElement:Ru,includesClasses,hasElementSourceMap},namespace:s}},src_refractor_refract=(s,{specPath:o=["visitors","document","objects","OpenApi","$visitor"],plugins:i=[]}={})=>{const a=(0,Su.e)(s),u=dereference(zv),_=new(Qu(o,u))({specObj:u});return visitor_visit(a,_),dispatchPluginsSync(_.element,i,{toolboxCreator:src_refractor_toolbox,visitorOptions:{keyMap:Wv,nodeTypeGetter:src_traversal_visitor_getNodeType}})},src_refractor_createRefractor=s=>(o,i={})=>src_refractor_refract(o,{specPath:s,...i});Xp.refract=src_refractor_createRefractor(["visitors","document","objects","Callback","$visitor"]),Qp.refract=src_refractor_createRefractor(["visitors","document","objects","Components","$visitor"]),Zp.refract=src_refractor_createRefractor(["visitors","document","objects","Contact","$visitor"]),uh.refract=src_refractor_createRefractor(["visitors","document","objects","Example","$visitor"]),th.refract=src_refractor_createRefractor(["visitors","document","objects","Discriminator","$visitor"]),rh.refract=src_refractor_createRefractor(["visitors","document","objects","Encoding","$visitor"]),dh.refract=src_refractor_createRefractor(["visitors","document","objects","ExternalDocumentation","$visitor"]),fh.refract=src_refractor_createRefractor(["visitors","document","objects","Header","$visitor"]),vh.refract=src_refractor_createRefractor(["visitors","document","objects","Info","$visitor"]),_h.refract=src_refractor_createRefractor(["visitors","document","objects","License","$visitor"]),wh.refract=src_refractor_createRefractor(["visitors","document","objects","Link","$visitor"]),Oh.refract=src_refractor_createRefractor(["visitors","document","objects","MediaType","$visitor"]),jh.refract=src_refractor_createRefractor(["visitors","document","objects","OAuthFlow","$visitor"]),Ph.refract=src_refractor_createRefractor(["visitors","document","objects","OAuthFlows","$visitor"]),Ih.refract=src_refractor_createRefractor(["visitors","document","objects","OpenApi","fixedFields","openapi"]),Rh.refract=src_refractor_createRefractor(["visitors","document","objects","OpenApi","$visitor"]),Dh.refract=src_refractor_createRefractor(["visitors","document","objects","Operation","$visitor"]),Lh.refract=src_refractor_createRefractor(["visitors","document","objects","Parameter","$visitor"]),Fh.refract=src_refractor_createRefractor(["visitors","document","objects","PathItem","$visitor"]),Jh.refract=src_refractor_createRefractor(["visitors","document","objects","Paths","$visitor"]),Hh.refract=src_refractor_createRefractor(["visitors","document","objects","Reference","$visitor"]),Kh.refract=src_refractor_createRefractor(["visitors","document","objects","RequestBody","$visitor"]),Gh.refract=src_refractor_createRefractor(["visitors","document","objects","Response","$visitor"]),Qh.refract=src_refractor_createRefractor(["visitors","document","objects","Responses","$visitor"]),Ff.refract=src_refractor_createRefractor(["visitors","document","objects","Schema","$visitor"]),Vf.refract=src_refractor_createRefractor(["visitors","document","objects","SecurityRequirement","$visitor"]),Wf.refract=src_refractor_createRefractor(["visitors","document","objects","SecurityScheme","$visitor"]),Jf.refract=src_refractor_createRefractor(["visitors","document","objects","Server","$visitor"]),Hf.refract=src_refractor_createRefractor(["visitors","document","objects","ServerVariable","$visitor"]),Gf.refract=src_refractor_createRefractor(["visitors","document","objects","Tag","$visitor"]),Xf.refract=src_refractor_createRefractor(["visitors","document","objects","XML","$visitor"]);const Kv=class Callback_Callback extends Xp{};const Gv=class Components_Components extends Qp{get pathItems(){return this.get("pathItems")}set pathItems(s){this.set("pathItems",s)}};const Yv=class Contact_Contact extends Zp{};const Xv=class Discriminator_Discriminator extends th{};const Qv=class Encoding_Encoding extends rh{};const Zv=class Example_Example extends uh{};const eb=class ExternalDocumentation_ExternalDocumentation extends dh{};const tb=class Header_Header extends fh{get schema(){return this.get("schema")}set schema(s){this.set("schema",s)}};const nb=class Info_Info extends vh{get license(){return this.get("license")}set license(s){this.set("license",s)}get summary(){return this.get("summary")}set summary(s){this.set("summary",s)}};class JsonSchemaDialect extends Su.Om{static default=new JsonSchemaDialect("https://spec.openapis.org/oas/3.1/dialect/base");constructor(s,o,i){super(s,o,i),this.element="jsonSchemaDialect"}}const pb=JsonSchemaDialect;const mb=class License_License extends _h{get identifier(){return this.get("identifier")}set identifier(s){this.set("identifier",s)}};const yb=class Link_Link extends wh{};const _b=class MediaType_MediaType extends Oh{get schema(){return this.get("schema")}set schema(s){this.set("schema",s)}};const Sb=class OAuthFlow_OAuthFlow extends jh{};const wb=class OAuthFlows_OAuthFlows extends Ph{};const Ob=class Openapi_Openapi extends Ih{};class OpenApi3_1 extends Su.Sh{constructor(s,o,i){super(s,o,i),this.element="openApi3_1",this.classes.push("api")}get openapi(){return this.get("openapi")}set openapi(s){this.set("openapi",s)}get info(){return this.get("info")}set info(s){this.set("info",s)}get jsonSchemaDialect(){return this.get("jsonSchemaDialect")}set jsonSchemaDialect(s){this.set("jsonSchemaDialect",s)}get servers(){return this.get("servers")}set servers(s){this.set("servers",s)}get paths(){return this.get("paths")}set paths(s){this.set("paths",s)}get components(){return this.get("components")}set components(s){this.set("components",s)}get security(){return this.get("security")}set security(s){this.set("security",s)}get tags(){return this.get("tags")}set tags(s){this.set("tags",s)}get externalDocs(){return this.get("externalDocs")}set externalDocs(s){this.set("externalDocs",s)}get webhooks(){return this.get("webhooks")}set webhooks(s){this.set("webhooks",s)}}const Ab=OpenApi3_1;const Pb=class Operation_Operation extends Dh{get requestBody(){return this.get("requestBody")}set requestBody(s){this.set("requestBody",s)}};const Ib=class Parameter_Parameter extends Lh{get schema(){return this.get("schema")}set schema(s){this.set("schema",s)}};const Mb=class PathItem_PathItem extends Fh{get GET(){return this.get("get")}set GET(s){this.set("GET",s)}get PUT(){return this.get("put")}set PUT(s){this.set("PUT",s)}get POST(){return this.get("post")}set POST(s){this.set("POST",s)}get DELETE(){return this.get("delete")}set DELETE(s){this.set("DELETE",s)}get OPTIONS(){return this.get("options")}set OPTIONS(s){this.set("OPTIONS",s)}get HEAD(){return this.get("head")}set HEAD(s){this.set("HEAD",s)}get PATCH(){return this.get("patch")}set PATCH(s){this.set("PATCH",s)}get TRACE(){return this.get("trace")}set TRACE(s){this.set("TRACE",s)}};const Rb=class Paths_Paths extends Jh{};class Reference_Reference extends Hh{}Object.defineProperty(Reference_Reference.prototype,"description",{get(){return this.get("description")},set(s){this.set("description",s)},enumerable:!0}),Object.defineProperty(Reference_Reference.prototype,"summary",{get(){return this.get("summary")},set(s){this.set("summary",s)},enumerable:!0});const Lb=Reference_Reference;const qb=class RequestBody_RequestBody extends Kh{};const zb=class elements_Response_Response extends Gh{};const Qb=class Responses_Responses extends Qh{};const e_=class JSONSchema_JSONSchema extends sd{constructor(s,o,i){super(s,o,i),this.element="JSONSchemaDraft6"}get idProp(){throw new td("id keyword from Core vocabulary has been renamed to $id.")}set idProp(s){throw new td("id keyword from Core vocabulary has been renamed to $id.")}get $id(){return this.get("$id")}set $id(s){this.set("$id",s)}get exclusiveMaximum(){return this.get("exclusiveMaximum")}set exclusiveMaximum(s){this.set("exclusiveMaximum",s)}get exclusiveMinimum(){return this.get("exclusiveMinimum")}set exclusiveMinimum(s){this.set("exclusiveMinimum",s)}get containsProp(){return this.get("contains")}set containsProp(s){this.set("contains",s)}get items(){return this.get("items")}set items(s){this.set("items",s)}get propertyNames(){return this.get("propertyNames")}set propertyNames(s){this.set("propertyNames",s)}get const(){return this.get("const")}set const(s){this.set("const",s)}get not(){return this.get("not")}set not(s){this.set("not",s)}get examples(){return this.get("examples")}set examples(s){this.set("examples",s)}};const t_=class LinkDescription_LinkDescription extends ld{get hrefSchema(){return this.get("hrefSchema")}set hrefSchema(s){this.set("hrefSchema",s)}get targetSchema(){return this.get("targetSchema")}set targetSchema(s){this.set("targetSchema",s)}get schema(){throw new td("schema keyword from Hyper-Schema vocabulary has been renamed to submissionSchema.")}set schema(s){throw new td("schema keyword from Hyper-Schema vocabulary has been renamed to submissionSchema.")}get submissionSchema(){return this.get("submissionSchema")}set submissionSchema(s){this.set("submissionSchema",s)}get method(){throw new td("method keyword from Hyper-Schema vocabulary has been removed.")}set method(s){throw new td("method keyword from Hyper-Schema vocabulary has been removed.")}get encType(){throw new td("encType keyword from Hyper-Schema vocabulary has been renamed to submissionEncType.")}set encType(s){throw new td("encType keyword from Hyper-Schema vocabulary has been renamed to submissionEncType.")}get submissionEncType(){return this.get("submissionEncType")}set submissionEncType(s){this.set("submissionEncType",s)}};var r_=_curry3((function assocPath(s,o,i){if(0===s.length)return o;var a=s[0];if(s.length>1){var u=!Ju(i)&&_has(a,i)&&"object"==typeof i[a]?i[a]:Xo(s[1])?[]:{};o=assocPath(Array.prototype.slice.call(s,1),o,u)}return function _assoc(s,o,i){if(Xo(s)&&ca(i)){var a=[].concat(i);return a[s]=o,a}var u={};for(var _ in i)u[_]=i[_];return u[s]=o,u}(a,o,i)}));const n_=r_;var s_=_curry3((function remove(s,o,i){var a=Array.prototype.slice.call(i,0);return a.splice(s,o),a}));const o_=s_;var i_=_curry3((function assoc(s,o,i){return n_([s],o,i)}));const a_=i_;var c_=_curry2((function dissocPath(s,o){if(null==o)return o;switch(s.length){case 0:return o;case 1:return function _dissoc(s,o){if(null==o)return o;if(Xo(s)&&ca(o))return o_(s,1,o);var i={};for(var a in o)i[a]=o[a];return delete i[s],i}(s[0],o);default:var i=s[0],a=Array.prototype.slice.call(s,1);return null==o[i]?function _shallowCloneObject(s,o){if(Xo(s)&&ca(o))return[].concat(o);var i={};for(var a in o)i[a]=o[a];return i}(i,o):a_(i,dissocPath(a,o[i]),o)}}));const l_=c_;const u_=class json_schema_JSONSchemaVisitor extends $d{constructor(s){super(s),this.element=new e_}get defaultDialectIdentifier(){return"http://json-schema.org/draft-06/schema#"}BooleanElement(s){const o=this.enter(s);return this.element.classes.push("boolean-json-schema"),o}handleSchemaIdentifier(s,o="$id"){return super.handleSchemaIdentifier(s,o)}};const p_=class json_schema_ItemsVisitor_ItemsVisitor extends Ud{BooleanElement(s){return this.element=this.toRefractedElement(["document","objects","JSONSchema"],s),qu}};const h_=class json_schema_ExamplesVisitor_ExamplesVisitor extends yd{ArrayElement(s){const o=this.enter(s);return this.element.classes.push("json-schema-examples"),o}};const d_=class link_description_LinkDescriptionVisitor extends Pf{constructor(s){super(s),this.element=new t_}},f_=pipe(n_(["visitors","document","objects","JSONSchema","$visitor"],u_),l_(["visitors","document","objects","JSONSchema","fixedFields","id"]),n_(["visitors","document","objects","JSONSchema","fixedFields","$id"],Tf.visitors.value),n_(["visitors","document","objects","JSONSchema","fixedFields","contains"],Tf.visitors.JSONSchemaOrJSONReferenceVisitor),n_(["visitors","document","objects","JSONSchema","fixedFields","items"],p_),n_(["visitors","document","objects","JSONSchema","fixedFields","propertyNames"],Tf.visitors.JSONSchemaOrJSONReferenceVisitor),n_(["visitors","document","objects","JSONSchema","fixedFields","const"],Tf.visitors.value),n_(["visitors","document","objects","JSONSchema","fixedFields","examples"],h_),n_(["visitors","document","objects","LinkDescription","$visitor"],d_),n_(["visitors","document","objects","LinkDescription","fixedFields","hrefSchema"],Tf.visitors.JSONSchemaOrJSONReferenceVisitor),l_(["visitors","document","objects","LinkDescription","fixedFields","schema"]),n_(["visitors","document","objects","LinkDescription","fixedFields","submissionSchema"],Tf.visitors.JSONSchemaOrJSONReferenceVisitor),l_(["visitors","document","objects","LinkDescription","fixedFields","method"]),l_(["visitors","document","objects","LinkDescription","fixedFields","encType"]),n_(["visitors","document","objects","LinkDescription","fixedFields","submissionEncType"],Tf.visitors.value))(Tf),m_={JSONSchemaDraft6Element:["content"],JSONReferenceElement:["content"],MediaElement:["content"],LinkDescriptionElement:["content"],...np},g_=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof e_||s(a)&&o("JSONSchemaDraft6",a)&&i("object",a))),y_=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof t_||s(a)&&o("linkDescription",a)&&i("object",a))),v_={namespace:s=>{const{base:o}=s;return o.register("jSONSchemaDraft6",e_),o.register("jSONReference",id),o.register("media",cd),o.register("linkDescription",t_),o}},b_=v_,apidom_ns_json_schema_draft_6_src_refractor_toolbox=()=>{const s=createNamespace(b_);return{predicates:{...le,isStringElement:ju},namespace:s}},apidom_ns_json_schema_draft_6_src_refractor_refract=(s,{specPath:o=["visitors","document","objects","JSONSchema","$visitor"],plugins:i=[],specificationObj:a=f_}={})=>{const u=(0,Su.e)(s),_=dereference(a),w=new(Qu(o,_))({specObj:_});return visitor_visit(u,w),dispatchPluginsSync(w.element,i,{toolboxCreator:apidom_ns_json_schema_draft_6_src_refractor_toolbox,visitorOptions:{keyMap:m_,nodeTypeGetter:traversal_visitor_getNodeType}})},apidom_ns_json_schema_draft_6_src_refractor_createRefractor=s=>(o,i={})=>apidom_ns_json_schema_draft_6_src_refractor_refract(o,{specPath:s,...i});e_.refract=apidom_ns_json_schema_draft_6_src_refractor_createRefractor(["visitors","document","objects","JSONSchema","$visitor"]),t_.refract=apidom_ns_json_schema_draft_6_src_refractor_createRefractor(["visitors","document","objects","LinkDescription","$visitor"]);const S_=class elements_JSONSchema_JSONSchema extends e_{constructor(s,o,i){super(s,o,i),this.element="JSONSchemaDraft7"}get $comment(){return this.get("$comment")}set $comment(s){this.set("$comment",s)}get items(){return this.get("items")}set items(s){this.set("items",s)}get if(){return this.get("if")}set if(s){this.set("if",s)}get then(){return this.get("then")}set then(s){this.set("then",s)}get else(){return this.get("else")}set else(s){this.set("else",s)}get not(){return this.get("not")}set not(s){this.set("not",s)}get contentEncoding(){return this.get("contentEncoding")}set contentEncoding(s){this.set("contentEncoding",s)}get contentMediaType(){return this.get("contentMediaType")}set contentMediaType(s){this.set("contentMediaType",s)}get media(){throw new td('media keyword from Hyper-Schema vocabulary has been moved to validation vocabulary as "contentMediaType" / "contentEncoding"')}set media(s){throw new td('media keyword from Hyper-Schema vocabulary has been moved to validation vocabulary as "contentMediaType" / "contentEncoding"')}get writeOnly(){return this.get("writeOnly")}set writeOnly(s){this.set("writeOnly",s)}};const E_=class elements_LinkDescription_LinkDescription extends t_{get anchor(){return this.get("anchor")}set anchor(s){this.set("anchor",s)}get anchorPointer(){return this.get("anchorPointer")}set anchorPointer(s){this.set("anchorPointer",s)}get templatePointers(){return this.get("templatePointers")}set templatePointers(s){this.set("templatePointers",s)}get templateRequired(){return this.get("templateRequired")}set templateRequired(s){this.set("templateRequired",s)}get targetSchema(){return this.get("targetSchema")}set targetSchema(s){this.set("targetSchema",s)}get mediaType(){throw new td("mediaType keyword from Hyper-Schema vocabulary has been renamed to targetMediaType.")}set mediaType(s){throw new td("mediaType keyword from Hyper-Schema vocabulary has been renamed to targetMediaType.")}get targetMediaType(){return this.get("targetMediaType")}set targetMediaType(s){this.set("targetMediaType",s)}get targetHints(){return this.get("targetHints")}set targetHints(s){this.set("targetHints",s)}get description(){return this.get("description")}set description(s){this.set("description",s)}get $comment(){return this.get("$comment")}set $comment(s){this.set("$comment",s)}get hrefSchema(){return this.get("hrefSchema")}set hrefSchema(s){this.set("hrefSchema",s)}get headerSchema(){return this.get("headerSchema")}set headerSchema(s){this.set("headerSchema",s)}get submissionSchema(){return this.get("submissionSchema")}set submissionSchema(s){this.set("submissionSchema",s)}get submissionEncType(){throw new td("submissionEncType keyword from Hyper-Schema vocabulary has been renamed to submissionMediaType.")}set submissionEncType(s){throw new td("submissionEncType keyword from Hyper-Schema vocabulary has been renamed to submissionMediaType.")}get submissionMediaType(){return this.get("submissionMediaType")}set submissionMediaType(s){this.set("submissionMediaType",s)}};const w_=class visitors_json_schema_JSONSchemaVisitor extends u_{constructor(s){super(s),this.element=new S_}get defaultDialectIdentifier(){return"http://json-schema.org/draft-07/schema#"}};const x_=class json_schema_link_description_LinkDescriptionVisitor extends d_{constructor(s){super(s),this.element=new E_}},k_=pipe(n_(["visitors","document","objects","JSONSchema","$visitor"],w_),n_(["visitors","document","objects","JSONSchema","fixedFields","$comment"],f_.visitors.value),n_(["visitors","document","objects","JSONSchema","fixedFields","if"],f_.visitors.JSONSchemaOrJSONReferenceVisitor),n_(["visitors","document","objects","JSONSchema","fixedFields","then"],f_.visitors.JSONSchemaOrJSONReferenceVisitor),n_(["visitors","document","objects","JSONSchema","fixedFields","else"],f_.visitors.JSONSchemaOrJSONReferenceVisitor),l_(["visitors","document","objects","JSONSchema","fixedFields","media"]),n_(["visitors","document","objects","JSONSchema","fixedFields","contentEncoding"],f_.visitors.value),n_(["visitors","document","objects","JSONSchema","fixedFields","contentMediaType"],f_.visitors.value),n_(["visitors","document","objects","JSONSchema","fixedFields","writeOnly"],f_.visitors.value),n_(["visitors","document","objects","LinkDescription","$visitor"],x_),n_(["visitors","document","objects","LinkDescription","fixedFields","anchor"],f_.visitors.value),n_(["visitors","document","objects","LinkDescription","fixedFields","anchorPointer"],f_.visitors.value),l_(["visitors","document","objects","LinkDescription","fixedFields","mediaType"]),n_(["visitors","document","objects","LinkDescription","fixedFields","targetMediaType"],f_.visitors.value),n_(["visitors","document","objects","LinkDescription","fixedFields","targetHints"],f_.visitors.value),n_(["visitors","document","objects","LinkDescription","fixedFields","description"],f_.visitors.value),n_(["visitors","document","objects","LinkDescription","fixedFields","$comment"],f_.visitors.value),n_(["visitors","document","objects","LinkDescription","fixedFields","headerSchema"],f_.visitors.JSONSchemaOrJSONReferenceVisitor),l_(["visitors","document","objects","LinkDescription","fixedFields","submissionEncType"]),n_(["visitors","document","objects","LinkDescription","fixedFields","submissionMediaType"],f_.visitors.value))(f_),O_={JSONSchemaDraft7Element:["content"],JSONReferenceElement:["content"],LinkDescriptionElement:["content"],...np},A_=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof S_||s(a)&&o("JSONSchemaDraft7",a)&&i("object",a))),C_=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof E_||s(a)&&o("linkDescription",a)&&i("object",a))),j_={namespace:s=>{const{base:o}=s;return o.register("jSONSchemaDraft7",S_),o.register("jSONReference",id),o.register("linkDescription",E_),o}},P_=j_,apidom_ns_json_schema_draft_7_src_refractor_toolbox=()=>{const s=createNamespace(P_);return{predicates:{...pe,isStringElement:ju},namespace:s}},apidom_ns_json_schema_draft_7_src_refractor_refract=(s,{specPath:o=["visitors","document","objects","JSONSchema","$visitor"],plugins:i=[],specificationObj:a=k_}={})=>{const u=(0,Su.e)(s),_=dereference(a),w=new(Qu(o,_))({specObj:_});return visitor_visit(u,w),dispatchPluginsSync(w.element,i,{toolboxCreator:apidom_ns_json_schema_draft_7_src_refractor_toolbox,visitorOptions:{keyMap:O_,nodeTypeGetter:traversal_visitor_getNodeType}})},apidom_ns_json_schema_draft_7_src_refractor_createRefractor=s=>(o,i={})=>apidom_ns_json_schema_draft_7_src_refractor_refract(o,{specPath:s,...i});S_.refract=apidom_ns_json_schema_draft_7_src_refractor_createRefractor(["visitors","document","objects","JSONSchema","$visitor"]),E_.refract=apidom_ns_json_schema_draft_7_src_refractor_createRefractor(["visitors","document","objects","LinkDescription","$visitor"]);const I_=class src_elements_JSONSchema_JSONSchema extends S_{constructor(s,o,i){super(s,o,i),this.element="JSONSchema201909"}get $vocabulary(){return this.get("$vocabulary")}set $vocabulary(s){this.set("$vocabulary",s)}get $anchor(){return this.get("$anchor")}set $anchor(s){this.set("$anchor",s)}get $recursiveAnchor(){return this.get("$recursiveAnchor")}set $recursiveAnchor(s){this.set("$recursiveAnchor",s)}get $recursiveRef(){return this.get("$recursiveRef")}set $recursiveRef(s){this.set("$recursiveRef",s)}get $ref(){return this.get("$ref")}set $ref(s){this.set("$ref",s)}get $defs(){return this.get("$defs")}set $defs(s){this.set("$defs",s)}get definitions(){throw new td("definitions keyword from Validation vocabulary has been renamed to $defs.")}set definitions(s){throw new td("definitions keyword from Validation vocabulary has been renamed to $defs.")}get not(){return this.get("not")}set not(s){this.set("not",s)}get if(){return this.get("if")}set if(s){this.set("if",s)}get then(){return this.get("then")}set then(s){this.set("then",s)}get else(){return this.get("else")}set else(s){this.set("else",s)}get dependentSchemas(){return this.get("dependentSchemas")}set dependentSchemas(s){this.set("dependentSchemas",s)}get dependencies(){throw new td("dependencies keyword from Validation vocabulary has been renamed to dependentSchemas.")}set dependencies(s){throw new td("dependencies keyword from Validation vocabulary has been renamed to dependentSchemas.")}get items(){return this.get("items")}set items(s){this.set("items",s)}get containsProp(){return this.get("contains")}set containsProp(s){this.set("contains",s)}get additionalProperties(){return this.get("additionalProperties")}set additionalProperties(s){this.set("additionalProperties",s)}get additionalItems(){return this.get("additionalItems")}set additionalItems(s){this.set("additionalItems",s)}get propertyNames(){return this.get("propertyNames")}set propertyNames(s){this.set("propertyNames",s)}get unevaluatedItems(){return this.get("unevaluatedItems")}set unevaluatedItems(s){this.set("unevaluatedItems",s)}get unevaluatedProperties(){return this.get("unevaluatedProperties")}set unevaluatedProperties(s){this.set("unevaluatedProperties",s)}get maxContains(){return this.get("maxContains")}set maxContains(s){this.set("maxContains",s)}get minContains(){return this.get("minContains")}set minContains(s){this.set("minContains",s)}get dependentRequired(){return this.get("dependentRequired")}set dependentRequired(s){this.set("dependentRequired",s)}get deprecated(){return this.get("deprecated")}set deprecated(s){this.set("deprecated",s)}get contentSchema(){return this.get("contentSchema")}set contentSchema(s){this.set("contentSchema",s)}};const T_=class src_elements_LinkDescription_LinkDescription extends E_{get targetSchema(){return this.get("targetSchema")}set targetSchema(s){this.set("targetSchema",s)}get hrefSchema(){return this.get("hrefSchema")}set hrefSchema(s){this.set("hrefSchema",s)}get headerSchema(){return this.get("headerSchema")}set headerSchema(s){this.set("headerSchema",s)}get submissionSchema(){return this.get("submissionSchema")}set submissionSchema(s){this.set("submissionSchema",s)}};const N_=class refractor_visitors_json_schema_JSONSchemaVisitor extends w_{constructor(s){super(s),this.element=new I_}get defaultDialectIdentifier(){return"https://json-schema.org/draft/2019-09/schema"}ObjectElement(s){this.handleDialectIdentifier(s),this.handleSchemaIdentifier(s),this.parent=this.element;const o=Md.prototype.ObjectElement.call(this,s);return ju(this.element.$ref)&&(this.element.classes.push("reference-element"),this.element.setMetaProperty("referenced-element","schema")),o}};const M_=class $vocabularyVisitor extends yd{ObjectElement(s){const o=super.enter(s);return this.element.classes.push("json-schema-$vocabulary"),o}};const R_=class $refVisitor extends yd{StringElement(s){const o=super.enter(s);return this.element.classes.push("reference-value"),o}};class $defsVisitor extends(Mixin(Jd,Rd,yd)){constructor(s){super(s),this.element=new Su.Sh,this.element.classes.push("json-schema-$defs"),this.specPath=fc(["document","objects","JSONSchema"])}}const D_=$defsVisitor;class json_schema_AllOfVisitor_AllOfVisitor extends(Mixin(Nd,Rd,yd)){constructor(s){super(s),this.element=new Su.wE,this.element.classes.push("json-schema-allOf")}ArrayElement(s){return s.forEach((s=>{const o=this.toRefractedElement(["document","objects","JSONSchema"],s);this.element.push(o)})),this.copyMetaAndAttributes(s,this.element),qu}}const L_=json_schema_AllOfVisitor_AllOfVisitor;class json_schema_AnyOfVisitor_AnyOfVisitor extends(Mixin(Nd,Rd,yd)){constructor(s){super(s),this.element=new Su.wE,this.element.classes.push("json-schema-anyOf")}ArrayElement(s){return s.forEach((s=>{const o=this.toRefractedElement(["document","objects","JSONSchema"],s);this.element.push(o)})),this.copyMetaAndAttributes(s,this.element),qu}}const F_=json_schema_AnyOfVisitor_AnyOfVisitor;class json_schema_OneOfVisitor_OneOfVisitor extends(Mixin(Nd,Rd,yd)){constructor(s){super(s),this.element=new Su.wE,this.element.classes.push("json-schema-oneOf")}ArrayElement(s){return s.forEach((s=>{const o=this.toRefractedElement(["document","objects","JSONSchema"],s);this.element.push(o)})),this.copyMetaAndAttributes(s,this.element),qu}}const B_=json_schema_OneOfVisitor_OneOfVisitor;class DependentSchemasVisitor extends(Mixin(Jd,Rd,yd)){constructor(s){super(s),this.element=new Su.Sh,this.element.classes.push("json-schema-dependentSchemas"),this.specPath=fc(["document","objects","JSONSchema"])}}const $_=DependentSchemasVisitor;class visitors_json_schema_ItemsVisitor_ItemsVisitor extends(Mixin(Nd,Rd,yd)){ObjectElement(s){return this.element=this.toRefractedElement(["document","objects","JSONSchema"],s),qu}ArrayElement(s){return this.element=new Su.wE,this.element.classes.push("json-schema-items"),s.forEach((s=>{const o=this.toRefractedElement(["document","objects","JSONSchema"],s);this.element.push(o)})),this.copyMetaAndAttributes(s,this.element),qu}BooleanElement(s){return this.element=this.toRefractedElement(["document","objects","JSONSchema"],s),qu}}const q_=visitors_json_schema_ItemsVisitor_ItemsVisitor;class json_schema_PropertiesVisitor_PropertiesVisitor extends(Mixin(Jd,Rd,yd)){constructor(s){super(s),this.element=new Su.Sh,this.element.classes.push("json-schema-properties"),this.specPath=fc(["document","objects","JSONSchema"])}}const U_=json_schema_PropertiesVisitor_PropertiesVisitor;class PatternPropertiesVisitor_PatternPropertiesVisitor extends(Mixin(Jd,Rd,yd)){constructor(s){super(s),this.element=new Su.Sh,this.element.classes.push("json-schema-patternProperties"),this.specPath=fc(["document","objects","JSONSchema"])}}const V_=PatternPropertiesVisitor_PatternPropertiesVisitor;const z_=class DependentRequiredVisitor extends yd{ObjectElement(s){const o=super.enter(s);return this.element.classes.push("json-schema-dependentRequired"),o}};const W_=class visitors_json_schema_link_description_LinkDescriptionVisitor extends x_{constructor(s){super(s),this.element=new T_}},J_=pipe(n_(["visitors","document","objects","JSONSchema","$visitor"],N_),n_(["visitors","document","objects","JSONSchema","fixedFields","$vocabulary"],M_),n_(["visitors","document","objects","JSONSchema","fixedFields","$anchor"],k_.visitors.value),n_(["visitors","document","objects","JSONSchema","fixedFields","$recursiveAnchor"],k_.visitors.value),n_(["visitors","document","objects","JSONSchema","fixedFields","$recursiveRef"],k_.visitors.value),l_(["visitors","document","objects","JSONReference","$visitor"]),n_(["visitors","document","objects","JSONSchema","fixedFields","$ref"],R_),l_(["visitors","document","objects","JSONSchema","fixedFields","definitions"]),n_(["visitors","document","objects","JSONSchema","fixedFields","$defs"],D_),n_(["visitors","document","objects","JSONSchema","fixedFields","allOf"],L_),n_(["visitors","document","objects","JSONSchema","fixedFields","anyOf"],F_),n_(["visitors","document","objects","JSONSchema","fixedFields","oneOf"],B_),n_(["visitors","document","objects","JSONSchema","fixedFields","not"],N_),n_(["visitors","document","objects","JSONSchema","fixedFields","if"],N_),n_(["visitors","document","objects","JSONSchema","fixedFields","then"],N_),n_(["visitors","document","objects","JSONSchema","fixedFields","else"],N_),l_(["visitors","document","objects","JSONSchema","fixedFields","dependencies"]),n_(["visitors","document","objects","JSONSchema","fixedFields","dependentSchemas"],$_),n_(["visitors","document","objects","JSONSchema","fixedFields","items"],q_),n_(["visitors","document","objects","JSONSchema","fixedFields","contains"],N_),n_(["visitors","document","objects","JSONSchema","fixedFields","properties"],U_),n_(["visitors","document","objects","JSONSchema","fixedFields","patternProperties"],V_),n_(["visitors","document","objects","JSONSchema","fixedFields","additionalProperties"],N_),n_(["visitors","document","objects","JSONSchema","fixedFields","additionalItems"],N_),n_(["visitors","document","objects","JSONSchema","fixedFields","propertyNames"],N_),n_(["visitors","document","objects","JSONSchema","fixedFields","unevaluatedItems"],N_),n_(["visitors","document","objects","JSONSchema","fixedFields","unevaluatedProperties"],N_),n_(["visitors","document","objects","JSONSchema","fixedFields","maxContains"],k_.visitors.value),n_(["visitors","document","objects","JSONSchema","fixedFields","minContains"],k_.visitors.value),n_(["visitors","document","objects","JSONSchema","fixedFields","dependentRequired"],z_),n_(["visitors","document","objects","JSONSchema","fixedFields","deprecated"],k_.visitors.value),n_(["visitors","document","objects","JSONSchema","fixedFields","contentSchema"],N_),n_(["visitors","document","objects","LinkDescription","$visitor"],W_),n_(["visitors","document","objects","LinkDescription","fixedFields","targetSchema"],N_),n_(["visitors","document","objects","LinkDescription","fixedFields","hrefSchema"],N_),n_(["visitors","document","objects","LinkDescription","fixedFields","headerSchema"],N_),n_(["visitors","document","objects","LinkDescription","fixedFields","submissionSchema"],N_))(k_),H_={JSONSchema201909Element:["content"],LinkDescriptionElement:["content"],...np},K_=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof I_||s(a)&&o("JSONSchema201909",a)&&i("object",a))),G_=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof T_||s(a)&&o("linkDescription",a)&&i("object",a))),Y_={namespace:s=>{const{base:o}=s;return o.register("jSONSchema201909",I_),o.register("linkDescription",T_),o}},X_=Y_,apidom_ns_json_schema_2019_09_src_refractor_toolbox=()=>{const s=createNamespace(X_);return{predicates:{...de,isStringElement:ju},namespace:s}},apidom_ns_json_schema_2019_09_src_refractor_refract=(s,{specPath:o=["visitors","document","objects","JSONSchema","$visitor"],plugins:i=[],specificationObj:a=J_}={})=>{const u=(0,Su.e)(s),_=dereference(a),w=new(Qu(o,_))({specObj:_});return visitor_visit(u,w),dispatchPluginsSync(w.element,i,{toolboxCreator:apidom_ns_json_schema_2019_09_src_refractor_toolbox,visitorOptions:{keyMap:H_,nodeTypeGetter:traversal_visitor_getNodeType}})},apidom_ns_json_schema_2019_09_src_refractor_createRefractor=s=>(o,i={})=>apidom_ns_json_schema_2019_09_src_refractor_refract(o,{specPath:s,...i});I_.refract=apidom_ns_json_schema_2019_09_src_refractor_createRefractor(["visitors","document","objects","JSONSchema","$visitor"]),T_.refract=apidom_ns_json_schema_2019_09_src_refractor_createRefractor(["visitors","document","objects","LinkDescription","$visitor"]);const Q_=class apidom_ns_json_schema_2020_12_src_elements_JSONSchema_JSONSchema extends I_{constructor(s,o,i){super(s,o,i),this.element="JSONSchema202012"}get $dynamicAnchor(){return this.get("$dynamicAnchor")}set $dynamicAnchor(s){this.set("$dynamicAnchor",s)}get $recursiveAnchor(){throw new td("$recursiveAnchor keyword from Core vocabulary has been renamed to $dynamicAnchor.")}set $recursiveAnchor(s){throw new td("$recursiveAnchor keyword from Core vocabulary has been renamed to $dynamicAnchor.")}get $dynamicRef(){return this.get("$dynamicRef")}set $dynamicRef(s){this.set("$dynamicRef",s)}get $recursiveRef(){throw new td("$recursiveRef keyword from Core vocabulary has been renamed to $dynamicRef.")}set $recursiveRef(s){throw new td("$recursiveRef keyword from Core vocabulary has been renamed to $dynamicRef.")}get prefixItems(){return this.get("prefixItems")}set prefixItems(s){this.set("prefixItems",s)}};const Z_=class apidom_ns_json_schema_2020_12_src_elements_LinkDescription_LinkDescription extends T_{get targetSchema(){return this.get("targetSchema")}set targetSchema(s){this.set("targetSchema",s)}get hrefSchema(){return this.get("hrefSchema")}set hrefSchema(s){this.set("hrefSchema",s)}get headerSchema(){return this.get("headerSchema")}set headerSchema(s){this.set("headerSchema",s)}get submissionSchema(){return this.get("submissionSchema")}set submissionSchema(s){this.set("submissionSchema",s)}};const eS=class src_refractor_visitors_json_schema_JSONSchemaVisitor extends N_{constructor(s){super(s),this.element=new Q_}get defaultDialectIdentifier(){return"https://json-schema.org/draft/2020-12/schema"}};class PrefixItemsVisitor extends(Mixin(Nd,Rd,yd)){constructor(s){super(s),this.element=new Su.wE,this.element.classes.push("json-schema-prefixItems")}ArrayElement(s){return s.forEach((s=>{const o=this.toRefractedElement(["document","objects","JSONSchema"],s);this.element.push(o)})),this.copyMetaAndAttributes(s,this.element),qu}}const tS=PrefixItemsVisitor;const rS=class refractor_visitors_json_schema_link_description_LinkDescriptionVisitor extends W_{constructor(s){super(s),this.element=new Z_}},nS=pipe(n_(["visitors","document","objects","JSONSchema","$visitor"],eS),l_(["visitors","document","objects","JSONSchema","fixedFields","$recursiveAnchor"]),n_(["visitors","document","objects","JSONSchema","fixedFields","$dynamicAnchor"],J_.visitors.value),l_(["visitors","document","objects","JSONSchema","fixedFields","$recursiveRef"]),n_(["visitors","document","objects","JSONSchema","fixedFields","$dynamicRef"],J_.visitors.value),n_(["visitors","document","objects","JSONSchema","fixedFields","not"],eS),n_(["visitors","document","objects","JSONSchema","fixedFields","if"],eS),n_(["visitors","document","objects","JSONSchema","fixedFields","then"],eS),n_(["visitors","document","objects","JSONSchema","fixedFields","else"],eS),n_(["visitors","document","objects","JSONSchema","fixedFields","prefixItems"],tS),n_(["visitors","document","objects","JSONSchema","fixedFields","items"],eS),n_(["visitors","document","objects","JSONSchema","fixedFields","contains"],eS),n_(["visitors","document","objects","JSONSchema","fixedFields","additionalProperties"],eS),l_(["visitors","document","objects","JSONSchema","fixedFields","additionalItems"]),n_(["visitors","document","objects","JSONSchema","fixedFields","propertyNames"],eS),n_(["visitors","document","objects","JSONSchema","fixedFields","unevaluatedItems"],eS),n_(["visitors","document","objects","JSONSchema","fixedFields","unevaluatedProperties"],eS),n_(["visitors","document","objects","JSONSchema","fixedFields","contentSchema"],eS),n_(["visitors","document","objects","LinkDescription","$visitor"],rS),n_(["visitors","document","objects","LinkDescription","fixedFields","targetSchema"],eS),n_(["visitors","document","objects","LinkDescription","fixedFields","hrefSchema"],eS),n_(["visitors","document","objects","LinkDescription","fixedFields","headerSchema"],eS),n_(["visitors","document","objects","LinkDescription","fixedFields","submissionSchema"],eS))(J_),sS={JSONSchema202012Element:["content"],LinkDescriptionElement:["content"],...np},oS=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Q_||s(a)&&o("JSONSchema202012",a)&&i("object",a))),iS=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Z_||s(a)&&o("linkDescription",a)&&i("object",a))),aS={namespace:s=>{const{base:o}=s;return o.register("jSONSchema202012",Q_),o.register("linkDescription",Z_),o}},cS=aS,apidom_ns_json_schema_2020_12_src_refractor_toolbox=()=>{const s=createNamespace(cS);return{predicates:{...fe,isStringElement:ju},namespace:s}},apidom_ns_json_schema_2020_12_src_refractor_refract=(s,{specPath:o=["visitors","document","objects","JSONSchema","$visitor"],plugins:i=[],specificationObj:a=nS}={})=>{const u=(0,Su.e)(s),_=dereference(a),w=new(Qu(o,_))({specObj:_});return visitor_visit(u,w),dispatchPluginsSync(w.element,i,{toolboxCreator:apidom_ns_json_schema_2020_12_src_refractor_toolbox,visitorOptions:{keyMap:sS,nodeTypeGetter:traversal_visitor_getNodeType}})},apidom_ns_json_schema_2020_12_src_refractor_createRefractor=s=>(o,i={})=>apidom_ns_json_schema_2020_12_src_refractor_refract(o,{specPath:s,...i});Q_.refract=apidom_ns_json_schema_2020_12_src_refractor_createRefractor(["visitors","document","objects","JSONSchema","$visitor"]),Z_.refract=apidom_ns_json_schema_2020_12_src_refractor_createRefractor(["visitors","document","objects","LinkDescription","$visitor"]);const lS=class elements_Schema_Schema extends Q_{constructor(s,o,i){super(s,o,i),this.element="schema"}get discriminator(){return this.get("discriminator")}set discriminator(s){this.set("discriminator",s)}get xml(){return this.get("xml")}set xml(s){this.set("xml",s)}get externalDocs(){return this.get("externalDocs")}set externalDocs(s){this.set("externalDocs",s)}get example(){return this.get("example")}set example(s){this.set("example",s)}};const uS=class SecurityRequirement_SecurityRequirement extends Vf{};const pS=class SecurityScheme_SecurityScheme extends Wf{};const hS=class Server_Server extends Jf{};const dS=class ServerVariable_ServerVariable extends Hf{};const fS=class Tag_Tag extends Gf{};const mS=class Xml_Xml extends Xf{};class OpenApi3_1Visitor extends(Mixin(cm,em)){constructor(s){super(s),this.element=new Ab,this.specPath=fc(["document","objects","OpenApi"]),this.canSupportSpecificationExtensions=!0,this.openApiSemanticElement=this.element}ObjectElement(s){return this.openApiGenericElement=s,cm.prototype.ObjectElement.call(this,s)}}const gS=OpenApi3_1Visitor,yS=zv.visitors.document.objects.Info.$visitor;const vS=class info_InfoVisitor extends yS{constructor(s){super(s),this.element=new nb}},bS=zv.visitors.document.objects.Contact.$visitor;const _S=class contact_ContactVisitor extends bS{constructor(s){super(s),this.element=new Yv}},SS=zv.visitors.document.objects.License.$visitor;const ES=class license_LicenseVisitor extends SS{constructor(s){super(s),this.element=new mb}},wS=zv.visitors.document.objects.Link.$visitor;const xS=class link_LinkVisitor extends wS{constructor(s){super(s),this.element=new yb}};class JsonSchemaDialectVisitor extends(Mixin(tm,em)){StringElement(s){const o=new pb(serializers_value(s));return this.copyMetaAndAttributes(s,o),this.element=o,qu}}const kS=JsonSchemaDialectVisitor,OS=zv.visitors.document.objects.Server.$visitor;const AS=class server_ServerVisitor extends OS{constructor(s){super(s),this.element=new hS}},CS=zv.visitors.document.objects.ServerVariable.$visitor;const jS=class server_variable_ServerVariableVisitor extends CS{constructor(s){super(s),this.element=new dS}},PS=zv.visitors.document.objects.MediaType.$visitor;const IS=class media_type_MediaTypeVisitor extends PS{constructor(s){super(s),this.element=new _b}},TS=zv.visitors.document.objects.SecurityRequirement.$visitor;const NS=class security_requirement_SecurityRequirementVisitor extends TS{constructor(s){super(s),this.element=new uS}},MS=zv.visitors.document.objects.Components.$visitor;const RS=class components_ComponentsVisitor extends MS{constructor(s){super(s),this.element=new Gv}},DS=zv.visitors.document.objects.Tag.$visitor;const LS=class tag_TagVisitor extends DS{constructor(s){super(s),this.element=new fS}},FS=zv.visitors.document.objects.Reference.$visitor;const BS=class reference_ReferenceVisitor extends FS{constructor(s){super(s),this.element=new Lb}},$S=zv.visitors.document.objects.Parameter.$visitor;const qS=class parameter_ParameterVisitor extends $S{constructor(s){super(s),this.element=new Ib}},US=zv.visitors.document.objects.Header.$visitor;const VS=class header_HeaderVisitor extends US{constructor(s){super(s),this.element=new tb}},zS=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Kv||s(a)&&o("callback",a)&&i("object",a))),WS=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Gv||s(a)&&o("components",a)&&i("object",a))),JS=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Yv||s(a)&&o("contact",a)&&i("object",a))),HS=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Zv||s(a)&&o("example",a)&&i("object",a))),KS=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof eb||s(a)&&o("externalDocumentation",a)&&i("object",a))),GS=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof tb||s(a)&&o("header",a)&&i("object",a))),YS=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof nb||s(a)&&o("info",a)&&i("object",a))),XS=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof pb||s(a)&&o("jsonSchemaDialect",a)&&i("string",a))),QS=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof mb||s(a)&&o("license",a)&&i("object",a))),ZS=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof yb||s(a)&&o("link",a)&&i("object",a))),eE=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Ob||s(a)&&o("openapi",a)&&i("string",a))),tE=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i,hasClass:a})=>u=>u instanceof Ab||s(u)&&o("openApi3_1",u)&&i("object",u)&&a("api",u))),rE=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Pb||s(a)&&o("operation",a)&&i("object",a))),nE=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Ib||s(a)&&o("parameter",a)&&i("object",a))),sE=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Mb||s(a)&&o("pathItem",a)&&i("object",a))),isPathItemElementExternal=s=>{if(!sE(s))return!1;if(!ju(s.$ref))return!1;const o=serializers_value(s.$ref);return"string"==typeof o&&o.length>0&&!o.startsWith("#")},oE=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Rb||s(a)&&o("paths",a)&&i("object",a))),iE=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Lb||s(a)&&o("reference",a)&&i("object",a))),isReferenceElementExternal=s=>{if(!iE(s))return!1;if(!ju(s.$ref))return!1;const o=serializers_value(s.$ref);return"string"==typeof o&&o.length>0&&!o.startsWith("#")},aE=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof qb||s(a)&&o("requestBody",a)&&i("object",a))),cE=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof zb||s(a)&&o("response",a)&&i("object",a))),lE=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof Qb||s(a)&&o("responses",a)&&i("object",a))),uE=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof lS||s(a)&&o("schema",a)&&i("object",a))),predicates_isBooleanJsonSchemaElement=s=>Tu(s)&&s.classes.includes("boolean-json-schema"),pE=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof uS||s(a)&&o("securityRequirement",a)&&i("object",a))),hE=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof pS||s(a)&&o("securityScheme",a)&&i("object",a))),dE=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof hS||s(a)&&o("server",a)&&i("object",a))),fE=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof dS||s(a)&&o("serverVariable",a)&&i("object",a))),mE=helpers((({hasBasicElementProps:s,isElementType:o,primitiveEq:i})=>a=>a instanceof _b||s(a)&&o("mediaType",a)&&i("object",a)));class open_api_3_1_schema_SchemaVisitor extends(Mixin(cm,Rd,em)){constructor(s){super(s),this.element=new lS,this.specPath=fc(["document","objects","Schema"]),this.canSupportSpecificationExtensions=!0,this.jsonSchemaDefaultDialect=pb.default,this.passingOptionsNames.push("parent")}ObjectElement(s){this.handleDialectIdentifier(s),this.handleSchemaIdentifier(s),this.parent=this.element;const o=cm.prototype.ObjectElement.call(this,s);return ju(this.element.$ref)&&(this.element.classes.push("reference-element"),this.element.setMetaProperty("referenced-element","schema")),o}BooleanElement(s){return eS.prototype.BooleanElement.call(this,s)}get defaultDialectIdentifier(){let s;return s=void 0!==this.openApiSemanticElement&&XS(this.openApiSemanticElement.jsonSchemaDialect)?serializers_value(this.openApiSemanticElement.jsonSchemaDialect):void 0!==this.openApiGenericElement&&ju(this.openApiGenericElement.get("jsonSchemaDialect"))?serializers_value(this.openApiGenericElement.get("jsonSchemaDialect")):serializers_value(this.jsonSchemaDefaultDialect),s}handleDialectIdentifier(s){return eS.prototype.handleDialectIdentifier.call(this,s)}handleSchemaIdentifier(s){return eS.prototype.handleSchemaIdentifier.call(this,s)}}const gE=open_api_3_1_schema_SchemaVisitor;const yE=class $defsVisitor_$defsVisitor extends D_{constructor(s){super(s),this.passingOptionsNames.push("parent")}};const vE=class schema_AllOfVisitor_AllOfVisitor extends L_{constructor(s){super(s),this.passingOptionsNames.push("parent")}};const bE=class schema_AnyOfVisitor_AnyOfVisitor extends F_{constructor(s){super(s),this.passingOptionsNames.push("parent")}};const _E=class schema_OneOfVisitor_OneOfVisitor extends B_{constructor(s){super(s),this.passingOptionsNames.push("parent")}};const SE=class DependentSchemasVisitor_DependentSchemasVisitor extends $_{constructor(s){super(s),this.passingOptionsNames.push("parent")}};const EE=class PrefixItemsVisitor_PrefixItemsVisitor extends tS{constructor(s){super(s),this.passingOptionsNames.push("parent")}};const wE=class schema_PropertiesVisitor_PropertiesVisitor extends U_{constructor(s){super(s),this.passingOptionsNames.push("parent")}};const xE=class schema_PatternPropertiesVisitor_PatternPropertiesVisitor extends V_{constructor(s){super(s),this.passingOptionsNames.push("parent")}},kE=zv.visitors.document.objects.Discriminator.$visitor;const OE=class distriminator_DiscriminatorVisitor extends kE{constructor(s){super(s),this.element=new Xv,this.canSupportSpecificationExtensions=!0}},AE=zv.visitors.document.objects.XML.$visitor;const CE=class xml_XmlVisitor extends AE{constructor(s){super(s),this.element=new mS}};class SchemasVisitor_SchemasVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new Ay,this.specPath=fc(["document","objects","Schema"])}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(uE).forEach(((s,o)=>{s.setMetaProperty("schemaName",serializers_value(o))})),o}}const jE=SchemasVisitor_SchemasVisitor;class ComponentsPathItems extends Su.Sh{static primaryClass="components-path-items";constructor(s,o,i){super(s,o,i),this.classes.push(ComponentsPathItems.primaryClass)}}const PE=ComponentsPathItems;class PathItemsVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new PE,this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","PathItem"]}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(iE).forEach((s=>{s.setMetaProperty("referenced-element","pathItem")})),o}}const IE=PathItemsVisitor,TE=zv.visitors.document.objects.Example.$visitor;const NE=class example_ExampleVisitor extends TE{constructor(s){super(s),this.element=new Zv}},ME=zv.visitors.document.objects.ExternalDocumentation.$visitor;const RE=class external_documentation_ExternalDocumentationVisitor extends ME{constructor(s){super(s),this.element=new eb}},DE=zv.visitors.document.objects.Encoding.$visitor;const LE=class open_api_3_1_encoding_EncodingVisitor extends DE{constructor(s){super(s),this.element=new Qv}},FE=zv.visitors.document.objects.Paths.$visitor;const BE=class paths_PathsVisitor extends FE{constructor(s){super(s),this.element=new Rb}},$E=zv.visitors.document.objects.RequestBody.$visitor;const qE=class request_body_RequestBodyVisitor extends $E{constructor(s){super(s),this.element=new qb}},UE=zv.visitors.document.objects.Callback.$visitor;const VE=class callback_CallbackVisitor extends UE{constructor(s){super(s),this.element=new Kv,this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","PathItem"]}ObjectElement(s){const o=UE.prototype.ObjectElement.call(this,s);return this.element.filter(iE).forEach((s=>{s.setMetaProperty("referenced-element","pathItem")})),o}},zE=zv.visitors.document.objects.Response.$visitor;const WE=class response_ResponseVisitor extends zE{constructor(s){super(s),this.element=new zb}},JE=zv.visitors.document.objects.Responses.$visitor;const HE=class open_api_3_1_responses_ResponsesVisitor extends JE{constructor(s){super(s),this.element=new Qb}},KE=zv.visitors.document.objects.Operation.$visitor;const GE=class operation_OperationVisitor extends KE{constructor(s){super(s),this.element=new Pb}},YE=zv.visitors.document.objects.PathItem.$visitor;const XE=class path_item_PathItemVisitor extends YE{constructor(s){super(s),this.element=new Mb}},QE=zv.visitors.document.objects.SecurityScheme.$visitor;const ZE=class security_scheme_SecuritySchemeVisitor extends QE{constructor(s){super(s),this.element=new pS}},ew=zv.visitors.document.objects.OAuthFlows.$visitor;const tw=class oauth_flows_OAuthFlowsVisitor extends ew{constructor(s){super(s),this.element=new wb}},rw=zv.visitors.document.objects.OAuthFlow.$visitor;const nw=class oauth_flow_OAuthFlowVisitor extends rw{constructor(s){super(s),this.element=new Sb}};class Webhooks extends Su.Sh{static primaryClass="webhooks";constructor(s,o,i){super(s,o,i),this.classes.push(Webhooks.primaryClass)}}const sw=Webhooks;class WebhooksVisitor extends(Mixin(_m,em)){constructor(s){super(s),this.element=new sw,this.specPath=s=>isReferenceLikeElement(s)?["document","objects","Reference"]:["document","objects","PathItem"]}ObjectElement(s){const o=_m.prototype.ObjectElement.call(this,s);return this.element.filter(iE).forEach((s=>{s.setMetaProperty("referenced-element","pathItem")})),this.element.filter(sE).forEach(((s,o)=>{s.setMetaProperty("webhook-name",serializers_value(o))})),o}}const ow=WebhooksVisitor,{JSONSchema:iw,LinkDescription:aw}=nS.visitors.document.objects,cw={visitors:{value:zv.visitors.value,document:{objects:{OpenApi:{$visitor:gS,fixedFields:{openapi:zv.visitors.document.objects.OpenApi.fixedFields.openapi,info:{$ref:"#/visitors/document/objects/Info"},jsonSchemaDialect:kS,servers:zv.visitors.document.objects.OpenApi.fixedFields.servers,paths:{$ref:"#/visitors/document/objects/Paths"},webhooks:ow,components:{$ref:"#/visitors/document/objects/Components"},security:zv.visitors.document.objects.OpenApi.fixedFields.security,tags:zv.visitors.document.objects.OpenApi.fixedFields.tags,externalDocs:{$ref:"#/visitors/document/objects/ExternalDocumentation"}}},Info:{$visitor:vS,fixedFields:{title:zv.visitors.document.objects.Info.fixedFields.title,description:zv.visitors.document.objects.Info.fixedFields.description,summary:{$ref:"#/visitors/value"},termsOfService:zv.visitors.document.objects.Info.fixedFields.termsOfService,contact:{$ref:"#/visitors/document/objects/Contact"},license:{$ref:"#/visitors/document/objects/License"},version:zv.visitors.document.objects.Info.fixedFields.version}},Contact:{$visitor:_S,fixedFields:{name:zv.visitors.document.objects.Contact.fixedFields.name,url:zv.visitors.document.objects.Contact.fixedFields.url,email:zv.visitors.document.objects.Contact.fixedFields.email}},License:{$visitor:ES,fixedFields:{name:zv.visitors.document.objects.License.fixedFields.name,identifier:{$ref:"#/visitors/value"},url:zv.visitors.document.objects.License.fixedFields.url}},Server:{$visitor:AS,fixedFields:{url:zv.visitors.document.objects.Server.fixedFields.url,description:zv.visitors.document.objects.Server.fixedFields.description,variables:zv.visitors.document.objects.Server.fixedFields.variables}},ServerVariable:{$visitor:jS,fixedFields:{enum:zv.visitors.document.objects.ServerVariable.fixedFields.enum,default:zv.visitors.document.objects.ServerVariable.fixedFields.default,description:zv.visitors.document.objects.ServerVariable.fixedFields.description}},Components:{$visitor:RS,fixedFields:{schemas:jE,responses:zv.visitors.document.objects.Components.fixedFields.responses,parameters:zv.visitors.document.objects.Components.fixedFields.parameters,examples:zv.visitors.document.objects.Components.fixedFields.examples,requestBodies:zv.visitors.document.objects.Components.fixedFields.requestBodies,headers:zv.visitors.document.objects.Components.fixedFields.headers,securitySchemes:zv.visitors.document.objects.Components.fixedFields.securitySchemes,links:zv.visitors.document.objects.Components.fixedFields.links,callbacks:zv.visitors.document.objects.Components.fixedFields.callbacks,pathItems:IE}},Paths:{$visitor:BE},PathItem:{$visitor:XE,fixedFields:{$ref:zv.visitors.document.objects.PathItem.fixedFields.$ref,summary:zv.visitors.document.objects.PathItem.fixedFields.summary,description:zv.visitors.document.objects.PathItem.fixedFields.description,get:{$ref:"#/visitors/document/objects/Operation"},put:{$ref:"#/visitors/document/objects/Operation"},post:{$ref:"#/visitors/document/objects/Operation"},delete:{$ref:"#/visitors/document/objects/Operation"},options:{$ref:"#/visitors/document/objects/Operation"},head:{$ref:"#/visitors/document/objects/Operation"},patch:{$ref:"#/visitors/document/objects/Operation"},trace:{$ref:"#/visitors/document/objects/Operation"},servers:zv.visitors.document.objects.PathItem.fixedFields.servers,parameters:zv.visitors.document.objects.PathItem.fixedFields.parameters}},Operation:{$visitor:GE,fixedFields:{tags:zv.visitors.document.objects.Operation.fixedFields.tags,summary:zv.visitors.document.objects.Operation.fixedFields.summary,description:zv.visitors.document.objects.Operation.fixedFields.description,externalDocs:{$ref:"#/visitors/document/objects/ExternalDocumentation"},operationId:zv.visitors.document.objects.Operation.fixedFields.operationId,parameters:zv.visitors.document.objects.Operation.fixedFields.parameters,requestBody:zv.visitors.document.objects.Operation.fixedFields.requestBody,responses:{$ref:"#/visitors/document/objects/Responses"},callbacks:zv.visitors.document.objects.Operation.fixedFields.callbacks,deprecated:zv.visitors.document.objects.Operation.fixedFields.deprecated,security:zv.visitors.document.objects.Operation.fixedFields.security,servers:zv.visitors.document.objects.Operation.fixedFields.servers}},ExternalDocumentation:{$visitor:RE,fixedFields:{description:zv.visitors.document.objects.ExternalDocumentation.fixedFields.description,url:zv.visitors.document.objects.ExternalDocumentation.fixedFields.url}},Parameter:{$visitor:qS,fixedFields:{name:zv.visitors.document.objects.Parameter.fixedFields.name,in:zv.visitors.document.objects.Parameter.fixedFields.in,description:zv.visitors.document.objects.Parameter.fixedFields.description,required:zv.visitors.document.objects.Parameter.fixedFields.required,deprecated:zv.visitors.document.objects.Parameter.fixedFields.deprecated,allowEmptyValue:zv.visitors.document.objects.Parameter.fixedFields.allowEmptyValue,style:zv.visitors.document.objects.Parameter.fixedFields.style,explode:zv.visitors.document.objects.Parameter.fixedFields.explode,allowReserved:zv.visitors.document.objects.Parameter.fixedFields.allowReserved,schema:{$ref:"#/visitors/document/objects/Schema"},example:zv.visitors.document.objects.Parameter.fixedFields.example,examples:zv.visitors.document.objects.Parameter.fixedFields.examples,content:zv.visitors.document.objects.Parameter.fixedFields.content}},RequestBody:{$visitor:qE,fixedFields:{description:zv.visitors.document.objects.RequestBody.fixedFields.description,content:zv.visitors.document.objects.RequestBody.fixedFields.content,required:zv.visitors.document.objects.RequestBody.fixedFields.required}},MediaType:{$visitor:IS,fixedFields:{schema:{$ref:"#/visitors/document/objects/Schema"},example:zv.visitors.document.objects.MediaType.fixedFields.example,examples:zv.visitors.document.objects.MediaType.fixedFields.examples,encoding:zv.visitors.document.objects.MediaType.fixedFields.encoding}},Encoding:{$visitor:LE,fixedFields:{contentType:zv.visitors.document.objects.Encoding.fixedFields.contentType,headers:zv.visitors.document.objects.Encoding.fixedFields.headers,style:zv.visitors.document.objects.Encoding.fixedFields.style,explode:zv.visitors.document.objects.Encoding.fixedFields.explode,allowReserved:zv.visitors.document.objects.Encoding.fixedFields.allowReserved}},Responses:{$visitor:HE,fixedFields:{default:zv.visitors.document.objects.Responses.fixedFields.default}},Response:{$visitor:WE,fixedFields:{description:zv.visitors.document.objects.Response.fixedFields.description,headers:zv.visitors.document.objects.Response.fixedFields.headers,content:zv.visitors.document.objects.Response.fixedFields.content,links:zv.visitors.document.objects.Response.fixedFields.links}},Callback:{$visitor:VE},Example:{$visitor:NE,fixedFields:{summary:zv.visitors.document.objects.Example.fixedFields.summary,description:zv.visitors.document.objects.Example.fixedFields.description,value:zv.visitors.document.objects.Example.fixedFields.value,externalValue:zv.visitors.document.objects.Example.fixedFields.externalValue}},Link:{$visitor:xS,fixedFields:{operationRef:zv.visitors.document.objects.Link.fixedFields.operationRef,operationId:zv.visitors.document.objects.Link.fixedFields.operationId,parameters:zv.visitors.document.objects.Link.fixedFields.parameters,requestBody:zv.visitors.document.objects.Link.fixedFields.requestBody,description:zv.visitors.document.objects.Link.fixedFields.description,server:{$ref:"#/visitors/document/objects/Server"}}},Header:{$visitor:VS,fixedFields:{description:zv.visitors.document.objects.Header.fixedFields.description,required:zv.visitors.document.objects.Header.fixedFields.required,deprecated:zv.visitors.document.objects.Header.fixedFields.deprecated,allowEmptyValue:zv.visitors.document.objects.Header.fixedFields.allowEmptyValue,style:zv.visitors.document.objects.Header.fixedFields.style,explode:zv.visitors.document.objects.Header.fixedFields.explode,allowReserved:zv.visitors.document.objects.Header.fixedFields.allowReserved,schema:{$ref:"#/visitors/document/objects/Schema"},example:zv.visitors.document.objects.Header.fixedFields.example,examples:zv.visitors.document.objects.Header.fixedFields.examples,content:zv.visitors.document.objects.Header.fixedFields.content}},Tag:{$visitor:LS,fixedFields:{name:zv.visitors.document.objects.Tag.fixedFields.name,description:zv.visitors.document.objects.Tag.fixedFields.description,externalDocs:{$ref:"#/visitors/document/objects/ExternalDocumentation"}}},Reference:{$visitor:BS,fixedFields:{$ref:zv.visitors.document.objects.Reference.fixedFields.$ref,summary:{$ref:"#/visitors/value"},description:{$ref:"#/visitors/value"}}},JSONSchema:{$ref:"#/visitors/document/objects/Schema"},LinkDescription:{...aw},Schema:{$visitor:gE,fixedFields:{...iw.fixedFields,$defs:yE,allOf:vE,anyOf:bE,oneOf:_E,not:{$ref:"#/visitors/document/objects/Schema"},if:{$ref:"#/visitors/document/objects/Schema"},then:{$ref:"#/visitors/document/objects/Schema"},else:{$ref:"#/visitors/document/objects/Schema"},dependentSchemas:SE,prefixItems:EE,items:{$ref:"#/visitors/document/objects/Schema"},contains:{$ref:"#/visitors/document/objects/Schema"},properties:wE,patternProperties:xE,additionalProperties:{$ref:"#/visitors/document/objects/Schema"},propertyNames:{$ref:"#/visitors/document/objects/Schema"},unevaluatedItems:{$ref:"#/visitors/document/objects/Schema"},unevaluatedProperties:{$ref:"#/visitors/document/objects/Schema"},contentSchema:{$ref:"#/visitors/document/objects/Schema"},discriminator:{$ref:"#/visitors/document/objects/Discriminator"},xml:{$ref:"#/visitors/document/objects/XML"},externalDocs:{$ref:"#/visitors/document/objects/ExternalDocumentation"},example:{$ref:"#/visitors/value"}}},Discriminator:{$visitor:OE,fixedFields:{propertyName:zv.visitors.document.objects.Discriminator.fixedFields.propertyName,mapping:zv.visitors.document.objects.Discriminator.fixedFields.mapping}},XML:{$visitor:CE,fixedFields:{name:zv.visitors.document.objects.XML.fixedFields.name,namespace:zv.visitors.document.objects.XML.fixedFields.namespace,prefix:zv.visitors.document.objects.XML.fixedFields.prefix,attribute:zv.visitors.document.objects.XML.fixedFields.attribute,wrapped:zv.visitors.document.objects.XML.fixedFields.wrapped}},SecurityScheme:{$visitor:ZE,fixedFields:{type:zv.visitors.document.objects.SecurityScheme.fixedFields.type,description:zv.visitors.document.objects.SecurityScheme.fixedFields.description,name:zv.visitors.document.objects.SecurityScheme.fixedFields.name,in:zv.visitors.document.objects.SecurityScheme.fixedFields.in,scheme:zv.visitors.document.objects.SecurityScheme.fixedFields.scheme,bearerFormat:zv.visitors.document.objects.SecurityScheme.fixedFields.bearerFormat,flows:{$ref:"#/visitors/document/objects/OAuthFlows"},openIdConnectUrl:zv.visitors.document.objects.SecurityScheme.fixedFields.openIdConnectUrl}},OAuthFlows:{$visitor:tw,fixedFields:{implicit:{$ref:"#/visitors/document/objects/OAuthFlow"},password:{$ref:"#/visitors/document/objects/OAuthFlow"},clientCredentials:{$ref:"#/visitors/document/objects/OAuthFlow"},authorizationCode:{$ref:"#/visitors/document/objects/OAuthFlow"}}},OAuthFlow:{$visitor:nw,fixedFields:{authorizationUrl:zv.visitors.document.objects.OAuthFlow.fixedFields.authorizationUrl,tokenUrl:zv.visitors.document.objects.OAuthFlow.fixedFields.tokenUrl,refreshUrl:zv.visitors.document.objects.OAuthFlow.fixedFields.refreshUrl,scopes:zv.visitors.document.objects.OAuthFlow.fixedFields.scopes}},SecurityRequirement:{$visitor:NS}},extension:{$visitor:zv.visitors.document.extension.$visitor}}}},apidom_ns_openapi_3_1_src_traversal_visitor_getNodeType=s=>{if(Cu(s))return`${s.element.charAt(0).toUpperCase()+s.element.slice(1)}Element`},lw={CallbackElement:["content"],ComponentsElement:["content"],ContactElement:["content"],DiscriminatorElement:["content"],Encoding:["content"],Example:["content"],ExternalDocumentationElement:["content"],HeaderElement:["content"],InfoElement:["content"],LicenseElement:["content"],MediaTypeElement:["content"],OAuthFlowElement:["content"],OAuthFlowsElement:["content"],OpenApi3_1Element:["content"],OperationElement:["content"],ParameterElement:["content"],PathItemElement:["content"],PathsElement:["content"],ReferenceElement:["content"],RequestBodyElement:["content"],ResponseElement:["content"],ResponsesElement:["content"],SchemaElement:["content"],SecurityRequirementElement:["content"],SecuritySchemeElement:["content"],ServerElement:["content"],ServerVariableElement:["content"],TagElement:["content"],...np},uw={namespace:s=>{const{base:o}=s;return o.register("callback",Kv),o.register("components",Gv),o.register("contact",Yv),o.register("discriminator",Xv),o.register("encoding",Qv),o.register("example",Zv),o.register("externalDocumentation",eb),o.register("header",tb),o.register("info",nb),o.register("jsonSchemaDialect",pb),o.register("license",mb),o.register("link",yb),o.register("mediaType",_b),o.register("oAuthFlow",Sb),o.register("oAuthFlows",wb),o.register("openapi",Ob),o.register("openApi3_1",Ab),o.register("operation",Pb),o.register("parameter",Ib),o.register("pathItem",Mb),o.register("paths",Rb),o.register("reference",Lb),o.register("requestBody",qb),o.register("response",zb),o.register("responses",Qb),o.register("schema",lS),o.register("securityRequirement",uS),o.register("securityScheme",pS),o.register("server",hS),o.register("serverVariable",dS),o.register("tag",fS),o.register("xml",mS),o}},pw=uw,ancestorLineageToJSONPointer=s=>{const o=s.reduce(((o,i,a)=>{if(Ru(i)){const s=String(serializers_value(i.key));o.push(s)}else if(Mu(s[a-2])){const u=String(s[a-2].content.indexOf(i));o.push(u)}return o}),[]);return es_compile(o)},apidom_ns_openapi_3_1_src_refractor_toolbox=()=>{const s=createNamespace(pw);return{predicates:{...ye,isElement:Cu,isStringElement:ju,isArrayElement:Mu,isObjectElement:Nu,isMemberElement:Ru,isServersElement:sg,includesClasses,hasElementSourceMap},ancestorLineageToJSONPointer,namespace:s}},apidom_ns_openapi_3_1_src_refractor_refract=(s,{specPath:o=["visitors","document","objects","OpenApi","$visitor"],plugins:i=[]}={})=>{const a=(0,Su.e)(s),u=dereference(cw),_=new(Qu(o,u))({specObj:u});return visitor_visit(a,_),dispatchPluginsSync(_.element,i,{toolboxCreator:apidom_ns_openapi_3_1_src_refractor_toolbox,visitorOptions:{keyMap:lw,nodeTypeGetter:apidom_ns_openapi_3_1_src_traversal_visitor_getNodeType}})},apidom_ns_openapi_3_1_src_refractor_createRefractor=s=>(o,i={})=>apidom_ns_openapi_3_1_src_refractor_refract(o,{specPath:s,...i});Kv.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Callback","$visitor"]),Gv.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Components","$visitor"]),Yv.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Contact","$visitor"]),Zv.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Example","$visitor"]),Xv.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Discriminator","$visitor"]),Qv.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Encoding","$visitor"]),eb.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","ExternalDocumentation","$visitor"]),tb.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Header","$visitor"]),nb.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Info","$visitor"]),pb.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","OpenApi","fixedFields","jsonSchemaDialect"]),mb.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","License","$visitor"]),yb.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Link","$visitor"]),_b.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","MediaType","$visitor"]),Sb.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","OAuthFlow","$visitor"]),wb.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","OAuthFlows","$visitor"]),Ob.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","OpenApi","fixedFields","openapi"]),Ab.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","OpenApi","$visitor"]),Pb.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Operation","$visitor"]),Ib.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Parameter","$visitor"]),Mb.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","PathItem","$visitor"]),Rb.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Paths","$visitor"]),Lb.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Reference","$visitor"]),qb.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","RequestBody","$visitor"]),zb.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Response","$visitor"]),Qb.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Responses","$visitor"]),lS.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Schema","$visitor"]),uS.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","SecurityRequirement","$visitor"]),pS.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","SecurityScheme","$visitor"]),hS.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Server","$visitor"]),dS.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","ServerVariable","$visitor"]),fS.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","Tag","$visitor"]),mS.refract=apidom_ns_openapi_3_1_src_refractor_createRefractor(["visitors","document","objects","XML","$visitor"]);const hw=class NotImplementedError extends td{};const dw=class MediaTypes extends Array{unknownMediaType="application/octet-stream";filterByFormat(){throw new hw("filterByFormat method in MediaTypes class is not yet implemented.")}findBy(){throw new hw("findBy method in MediaTypes class is not yet implemented.")}latest(){throw new hw("latest method in MediaTypes class is not yet implemented.")}};class OpenAPIMediaTypes extends dw{filterByFormat(s="generic"){const o="generic"===s?"openapi;version":s;return this.filter((s=>s.includes(o)))}findBy(s="3.1.0",o="generic"){const i="generic"===o?`vnd.oai.openapi;version=${s}`:`vnd.oai.openapi+${o};version=${s}`;return this.find((s=>s.includes(i)))||this.unknownMediaType}latest(s="generic"){return Ba(this.filterByFormat(s))}}const fw=new OpenAPIMediaTypes("application/vnd.oai.openapi;version=3.1.0","application/vnd.oai.openapi+json;version=3.1.0","application/vnd.oai.openapi+yaml;version=3.1.0");const mw=class src_Reference_Reference{uri;depth;value;refSet;errors;constructor({uri:s,depth:o=0,refSet:i,value:a}){this.uri=s,this.value=a,this.depth=o,this.refSet=i,this.errors=[]}};const gw=class ReferenceSet{rootRef;refs;circular;constructor({refs:s=[],circular:o=!1}={}){this.refs=[],this.circular=o,s.forEach(this.add.bind(this))}get size(){return this.refs.length}add(s){return this.has(s)||(this.refs.push(s),this.rootRef=void 0===this.rootRef?s:this.rootRef,s.refSet=this),this}merge(s){for(const o of s.values())this.add(o);return this}has(s){const o=Jc(s)?s:s.uri;return _c(this.find((s=>s.uri===o)))}find(s){return this.refs.find(s)}*values(){yield*this.refs}clean(){this.refs.forEach((s=>{s.refSet=void 0})),this.rootRef=void 0,this.refs.length=0}};function _identity(s){return s}const yw=_curry1(_identity),vw={parse:{mediaType:"text/plain",parsers:[],parserOpts:{}},resolve:{baseURI:"",resolvers:[],resolverOpts:{},strategies:[],strategyOpts:{},internal:!0,external:!0,maxDepth:1/0},dereference:{strategies:[],strategyOpts:{},refSet:null,maxDepth:1/0,circular:"ignore",circularReplacer:yw,immutable:!0},bundle:{strategies:[],refSet:null,maxDepth:1/0}};const bw=_curry2((function lens(s,o){return function(i){return function(a){return cc((function(s){return o(s,a)}),i(s(a)))}}}));var Identity=function(s){return{value:s,map:function(o){return Identity(o(s))}}},_w=_curry3((function over(s,o,i){return s((function(s){return Identity(o(s))}))(i).value}));const Sw=_w;const Ew=na(""),ww=bw(Qu(["resolve","baseURI"]),n_(["resolve","baseURI"])),baseURIDefault=s=>Ew(s)?url_cwd():s,util_merge=(s,o)=>{const i=up(s,o);return Sw(ww,baseURIDefault,i)};const xw=class File_File{uri;mediaType;data;parseResult;constructor({uri:s,mediaType:o="text/plain",data:i,parseResult:a}){this.uri=s,this.mediaType=o,this.data=i,this.parseResult=a}get extension(){return Jc(this.uri)?(s=>{const o=s.lastIndexOf(".");return o>=0?s.substring(o).toLowerCase():""})(this.uri):""}toString(){if("string"==typeof this.data)return this.data;if(this.data instanceof ArrayBuffer||["ArrayBuffer"].includes(ra(this.data))||ArrayBuffer.isView(this.data)){return new TextDecoder("utf-8").decode(this.data)}return String(this.data)}};const kw=class PluginError extends Ko{plugin;constructor(s,o){super(s,{cause:o.cause}),this.plugin=o.plugin}},plugins_filter=async(s,o,i)=>{const a=await Promise.all(i.map(_p([s],o)));return i.filter(((s,o)=>a[o]))},run=async(s,o,i)=>{let a;for(const u of i)try{const i=await u[s].call(u,...o);return{plugin:u,result:i}}catch(s){a=new kw("Error while running plugin",{cause:s,plugin:u})}return Promise.reject(a)};const Ow=class DereferenceError extends Ko{};const Aw=class UnmatchedDereferenceStrategyError extends Ow{},dereferenceApiDOM=async(s,o)=>{let i=s,a=!1;if(!$u(s)){const o=cloneShallow(s);o.classes.push("result"),i=new Au([o]),a=!0}const u=new xw({uri:o.resolve.baseURI,parseResult:i,mediaType:o.parse.mediaType}),_=await plugins_filter("canDereference",[u,o],o.dereference.strategies);if(gp(_))throw new Aw(u.uri);try{const{result:s}=await run("dereference",[u,o],_);return a?s.get(0):s}catch(s){throw new Ow(`Error while dereferencing file "${u.uri}"`,{cause:s})}};const Cw=class ParseError extends Ko{};const jw=class ParserError extends Cw{};const Pw=class Parser_Parser{name;allowEmpty;sourceMap;fileExtensions;mediaTypes;constructor({name:s,allowEmpty:o=!0,sourceMap:i=!1,fileExtensions:a=[],mediaTypes:u=[]}){this.name=s,this.allowEmpty=o,this.sourceMap=i,this.fileExtensions=a,this.mediaTypes=u}};const Iw=class BinaryParser extends Pw{constructor(s){super({...null!=s?s:{},name:"binary"})}canParse(s){return 0===this.fileExtensions.length||this.fileExtensions.includes(s.extension)}parse(s){try{const o=unescape(encodeURIComponent(s.toString())),i=btoa(o),a=new Au;if(0!==i.length){const s=new Su.Om(i);s.classes.push("result"),a.push(s)}return a}catch(o){throw new jw(`Error parsing "${s.uri}"`,{cause:o})}}};const Tw=class ResolveStrategy{name;constructor({name:s}){this.name=s}};const Nw=class OpenAPI3_1ResolveStrategy extends Tw{constructor(s){super({...null!=s?s:{},name:"openapi-3-1"})}canResolve(s,o){const i=o.dereference.strategies.find((s=>"openapi-3-1"===s.name));return void 0!==i&&i.canDereference(s,o)}async resolve(s,o){const i=o.dereference.strategies.find((s=>"openapi-3-1"===s.name));if(void 0===i)throw new Aw('"openapi-3-1" dereference strategy is not available.');const a=new gw,u=util_merge(o,{resolve:{internal:!1},dereference:{refSet:a}});return await i.dereference(s,u),a}};const Mw=class Resolver{name;constructor({name:s}){this.name=s}};const Rw=class HTTPResolver extends Mw{timeout;redirects;withCredentials;constructor(s){const{name:o="http-resolver",timeout:i=5e3,redirects:a=5,withCredentials:u=!1}=null!=s?s:{};super({name:o}),this.timeout=i,this.redirects=a,this.withCredentials=u}canRead(s){return isHttpUrl(s.uri)}};const Dw=class ResolveError extends Ko{};const Lw=class ResolverError extends Dw{},{AbortController:Fw,AbortSignal:Bw}=globalThis;void 0===globalThis.AbortController&&(globalThis.AbortController=Fw),void 0===globalThis.AbortSignal&&(globalThis.AbortSignal=Bw);const $w=class HTTPResolverSwaggerClient extends Rw{swaggerHTTPClient=http_http;swaggerHTTPClientConfig;constructor({swaggerHTTPClient:s=http_http,swaggerHTTPClientConfig:o={},...i}={}){super({...i,name:"http-swagger-client"}),this.swaggerHTTPClient=s,this.swaggerHTTPClientConfig=o}getHttpClient(){return this.swaggerHTTPClient}async read(s){const o=this.getHttpClient(),i=new AbortController,{signal:a}=i,u=setTimeout((()=>{i.abort()}),this.timeout),_=this.getHttpClient().withCredentials||this.withCredentials?"include":"same-origin",w=0===this.redirects?"error":"follow",x=this.redirects>0?this.redirects:void 0;try{return(await o({url:s.uri,signal:a,userFetch:async(s,o)=>{let i=await fetch(s,o);try{i.headers.delete("Content-Type")}catch{i=new Response(i.body,{...i,headers:new Headers(i.headers)}),i.headers.delete("Content-Type")}return i},credentials:_,redirect:w,follow:x,...this.swaggerHTTPClientConfig})).text.arrayBuffer()}catch(o){throw new Lw(`Error downloading "${s.uri}"`,{cause:o})}finally{clearTimeout(u)}}},transformers_from=(s,o=Ep)=>{if(Jc(s))try{return o.fromRefract(JSON.parse(s))}catch{}return fu(s)&&Yu("element",s)?o.fromRefract(s):o.toElement(s)};const qw=class JSONParser extends Pw{constructor(s={}){super({name:"json-swagger-client",mediaTypes:["application/json"],...s})}async canParse(s){const o=0===this.fileExtensions.length||this.fileExtensions.includes(s.extension),i=this.mediaTypes.includes(s.mediaType);if(!o)return!1;if(i)return!0;if(!i)try{return JSON.parse(s.toString()),!0}catch(s){return!1}return!1}async parse(s){if(this.sourceMap)throw new jw("json-swagger-client parser plugin doesn't support sourceMaps option");const o=new Au,i=s.toString();if(this.allowEmpty&&""===i.trim())return o;try{const s=transformers_from(JSON.parse(i));return s.classes.push("result"),o.push(s),o}catch(o){throw new jw(`Error parsing "${s.uri}"`,{cause:o})}}};const Uw=class YAMLParser extends Pw{constructor(s={}){super({name:"yaml-1-2-swagger-client",mediaTypes:["text/yaml","application/yaml"],...s})}async canParse(s){const o=0===this.fileExtensions.length||this.fileExtensions.includes(s.extension),i=this.mediaTypes.includes(s.mediaType);if(!o)return!1;if(i)return!0;if(!i)try{return fn.load(s.toString(),{schema:rn}),!0}catch(s){return!1}return!1}async parse(s){if(this.sourceMap)throw new jw("yaml-1-2-swagger-client parser plugin doesn't support sourceMaps option");const o=new Au,i=s.toString();try{const s=fn.load(i,{schema:rn});if(this.allowEmpty&&void 0===s)return o;const a=transformers_from(s);return a.classes.push("result"),o.push(a),o}catch(o){throw new jw(`Error parsing "${s.uri}"`,{cause:o})}}};const Vw=class OpenAPIJSON3_1Parser extends Pw{detectionRegExp=/"openapi"\s*:\s*"(?3\.1\.(?:[1-9]\d*|0))"/;constructor(s={}){super({name:"openapi-json-3-1-swagger-client",mediaTypes:new OpenAPIMediaTypes(...fw.filterByFormat("generic"),...fw.filterByFormat("json")),...s})}async canParse(s){const o=0===this.fileExtensions.length||this.fileExtensions.includes(s.extension),i=this.mediaTypes.includes(s.mediaType);if(!o)return!1;if(i)return!0;if(!i)try{const o=s.toString();return JSON.parse(o),this.detectionRegExp.test(o)}catch(s){return!1}return!1}async parse(s){if(this.sourceMap)throw new jw("openapi-json-3-1-swagger-client parser plugin doesn't support sourceMaps option");const o=new Au,i=s.toString();if(this.allowEmpty&&""===i.trim())return o;try{const s=JSON.parse(i),a=Ab.refract(s,this.refractorOpts);return a.classes.push("result"),o.push(a),o}catch(o){throw new jw(`Error parsing "${s.uri}"`,{cause:o})}}};const zw=class OpenAPIYAML31Parser extends Pw{detectionRegExp=/(?^(["']?)openapi\2\s*:\s*(["']?)(?3\.1\.(?:[1-9]\d*|0))\3(?:\s+|$))|(?"openapi"\s*:\s*"(?3\.1\.(?:[1-9]\d*|0))")/m;constructor(s={}){super({name:"openapi-yaml-3-1-swagger-client",mediaTypes:new OpenAPIMediaTypes(...fw.filterByFormat("generic"),...fw.filterByFormat("yaml")),...s})}async canParse(s){const o=0===this.fileExtensions.length||this.fileExtensions.includes(s.extension),i=this.mediaTypes.includes(s.mediaType);if(!o)return!1;if(i)return!0;if(!i)try{const o=s.toString();return fn.load(o),this.detectionRegExp.test(o)}catch(s){return!1}return!1}async parse(s){if(this.sourceMap)throw new jw("openapi-yaml-3-1-swagger-client parser plugin doesn't support sourceMaps option");const o=new Au,i=s.toString();try{const s=fn.load(i,{schema:rn});if(this.allowEmpty&&void 0===s)return o;const a=Ab.refract(s,this.refractorOpts);return a.classes.push("result"),o.push(a),o}catch(o){throw new jw(`Error parsing "${s.uri}"`,{cause:o})}}};const Ww=_curry3((function propEq(s,o,i){return na(s,Da(o,i))}));const Jw=class DereferenceStrategy{name;constructor({name:s}){this.name=s}};const Hw=_curry2((function none(s,o){return xu(_complement(s),o)}));var Kw=__webpack_require__(8068);const Gw=class ElementIdentityError extends Go{value;constructor(s,o){super(s,o),void 0!==o&&(this.value=o.value)}};class IdentityManager{uuid;identityMap;constructor({length:s=6}={}){this.uuid=new Kw({length:s}),this.identityMap=new WeakMap}identify(s){if(!Cu(s))throw new Gw("Cannot not identify the element. `element` is neither structurally compatible nor a subclass of an Element class.",{value:s});if(s.meta.hasKey("id")&&ju(s.meta.get("id"))&&!s.meta.get("id").equals(""))return s.id;if(this.identityMap.has(s))return this.identityMap.get(s);const o=new Su.Om(this.generateId());return this.identityMap.set(s,o),o}forget(s){return!!this.identityMap.has(s)&&(this.identityMap.delete(s),!0)}generateId(){return this.uuid.randomUUID()}}new IdentityManager;const Yw=_curry3((function pathOr(s,o,i){return Na(s,_path(o,i))})),traversal_find=(s,o)=>{const i=new PredicateVisitor({predicate:s,returnOnTrue:qu});return visitor_visit(o,i),Yw(void 0,[0],i.result)};const Xw=class JsonSchema$anchorError extends Ko{};const Qw=class EvaluationJsonSchema$anchorError extends Xw{};const Zw=class InvalidJsonSchema$anchorError extends Xw{constructor(s){super(`Invalid JSON Schema $anchor "${s}".`)}},isAnchor=s=>/^[A-Za-z_][A-Za-z_0-9.-]*$/.test(s),uriToAnchor=s=>{const o=getHash(s);return tp("#",o)},$anchor_evaluate=(s,o)=>{const i=(s=>{if(!isAnchor(s))throw new Zw(s);return s})(s),a=traversal_find((s=>uE(s)&&serializers_value(s.$anchor)===i),o);if(bc(a))throw new Qw(`Evaluation failed on token: "${i}"`);return a},traversal_filter=(s,o)=>{const i=new PredicateVisitor({predicate:s});return visitor_visit(o,i),new Su.G6(i.result)};const ex=class JsonSchemaUriError extends Ko{};const tx=class EvaluationJsonSchemaUriError extends ex{},resolveSchema$refField=(s,o)=>{if(void 0===o.$ref)return;const i=getHash(serializers_value(o.$ref)),a=serializers_value(o.meta.get("ancestorsSchemaIdentifiers")),u=Aa(((s,o)=>resolve(s,sanitize(stripHash(o)))),s,[...a,serializers_value(o.$ref)]);return`${u}${"#"===i?"":i}`},refractToSchemaElement=s=>{if(refractToSchemaElement.cache.has(s))return refractToSchemaElement.cache.get(s);const o=lS.refract(s);return refractToSchemaElement.cache.set(s,o),o};refractToSchemaElement.cache=new WeakMap;const maybeRefractToSchemaElement=s=>isPrimitiveElement(s)?refractToSchemaElement(s):s,uri_evaluate=(s,o)=>{const{cache:i}=uri_evaluate,a=stripHash(s),isSchemaElementWith$id=s=>uE(s)&&void 0!==s.$id;if(!i.has(o)){const s=traversal_filter(isSchemaElementWith$id,o);i.set(o,Array.from(s))}const u=i.get(o).find((s=>{const o=((s,o)=>{if(void 0===o.$id)return;const i=serializers_value(o.meta.get("ancestorsSchemaIdentifiers"));return Aa(((s,o)=>resolve(s,sanitize(stripHash(o)))),s,i)})(a,s);return o===a}));if(bc(u))throw new tx(`Evaluation failed on URI: "${s}"`);return isAnchor(uriToAnchor(s))?$anchor_evaluate(uriToAnchor(s),u):apidom_evaluate(u,fromURIReference(s))};uri_evaluate.cache=new WeakMap;const rx=class MaximumDereferenceDepthError extends Ow{};const nx=class MaximumResolveDepthError extends Dw{};const sx=class UnmatchedResolverError extends Lw{},apidom_reference_src_parse=async(s,o)=>{const i=new xw({uri:sanitize(stripHash(s)),mediaType:o.parse.mediaType}),a=await(async(s,o)=>{const i=o.resolve.resolvers.map((s=>{const i=Object.create(s);return Object.assign(i,o.resolve.resolverOpts)})),a=await plugins_filter("canRead",[s,o],i);if(gp(a))throw new sx(s.uri);try{const{result:o}=await run("read",[s],a);return o}catch(o){throw new Dw(`Error while reading file "${s.uri}"`,{cause:o})}})(i,o);return(async(s,o)=>{const i=o.parse.parsers.map((s=>{const i=Object.create(s);return Object.assign(i,o.parse.parserOpts)})),a=await plugins_filter("canParse",[s,o],i);if(gp(a))throw new sx(s.uri);try{const{plugin:i,result:u}=await run("parse",[s,o],a);return!i.allowEmpty&&u.isEmpty?Promise.reject(new Cw(`Error while parsing file "${s.uri}". File is empty.`)):u}catch(o){throw new Cw(`Error while parsing file "${s.uri}"`,{cause:o})}})(new xw({...i,data:a}),o)};class AncestorLineage extends Array{includesCycle(s){return this.filter((o=>o.has(s))).length>1}includes(s,o){return s instanceof Set?super.includes(s,o):this.some((o=>o.has(s)))}findItem(s){for(const o of this)for(const i of o)if(Cu(i)&&s(i))return i}}const ox=visitor_visit[Symbol.for("nodejs.util.promisify.custom")],ix=new IdentityManager,mutationReplacer=(s,o,i,a)=>{Ru(a)?a.value=s:Array.isArray(a)&&(a[i]=s)};class OpenAPI3_1DereferenceVisitor{indirections;namespace;reference;options;ancestors;refractCache;allOfDiscriminatorMapping;constructor({reference:s,namespace:o,options:i,indirections:a=[],ancestors:u=new AncestorLineage,refractCache:_=new Map,allOfDiscriminatorMapping:w=new Map}){this.indirections=a,this.namespace=o,this.reference=s,this.options=i,this.ancestors=new AncestorLineage(...u),this.refractCache=_,this.allOfDiscriminatorMapping=w}toBaseURI(s){return resolve(this.reference.uri,sanitize(stripHash(s)))}async toReference(s){if(this.reference.depth>=this.options.resolve.maxDepth)throw new nx(`Maximum resolution depth of ${this.options.resolve.maxDepth} has been exceeded by file "${this.reference.uri}"`);const o=this.toBaseURI(s),{refSet:i}=this.reference;if(i.has(o))return i.find(Ww(o,"uri"));const a=await apidom_reference_src_parse(unsanitize(o),{...this.options,parse:{...this.options.parse,mediaType:"text/plain"}}),u=new mw({uri:o,value:cloneDeep(a),depth:this.reference.depth+1});if(i.add(u),this.options.dereference.immutable){const s=new mw({uri:`immutable://${o}`,value:a,depth:this.reference.depth+1});i.add(s)}return u}toAncestorLineage(s){const o=new Set(s.filter(Cu));return[new AncestorLineage(...this.ancestors,o),o]}OpenApi3_1Element={leave:(s,o,i,a,u,_)=>{var w;if(null===(w=this.options.dereference.strategyOpts["openapi-3-1"])||void 0===w||!w.dereferenceDiscriminatorMapping)return;const x=cloneShallow(s);return x.setMetaProperty("allOfDiscriminatorMapping",Object.fromEntries(this.allOfDiscriminatorMapping)),_.replaceWith(x,mutationReplacer),i?void 0:x}};async ReferenceElement(s,o,i,a,u,_){if(this.indirections.includes(s))return!1;const[w,x]=this.toAncestorLineage([...u,i]),C=this.toBaseURI(serializers_value(s.$ref)),j=stripHash(this.reference.uri)===C,L=!j;if(!this.options.resolve.internal&&j)return!1;if(!this.options.resolve.external&&L)return!1;const B=await this.toReference(serializers_value(s.$ref)),$=resolve(C,serializers_value(s.$ref));this.indirections.push(s);const U=fromURIReference($);let V=apidom_evaluate(B.value.result,U);if(V.id=ix.identify(V),isPrimitiveElement(V)){const o=serializers_value(s.meta.get("referenced-element")),i=`${o}-${serializers_value(ix.identify(V))}`;if(this.refractCache.has(i))V=this.refractCache.get(i);else if(isReferenceLikeElement(V))V=Lb.refract(V),V.setMetaProperty("referenced-element",o),this.refractCache.set(i,V);else{V=this.namespace.getElementClass(o).refract(V),this.refractCache.set(i,V)}}if(s===V)throw new Ko("Recursive Reference Object detected");if(this.indirections.length>this.options.dereference.maxDepth)throw new rx(`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`);if(w.includes(V)){if(B.refSet.circular=!0,"error"===this.options.dereference.circular)throw new Ko("Circular reference detected");if("replace"===this.options.dereference.circular){var z,Y;const o=new Su.sI(V.id,{type:"reference",uri:B.uri,$ref:serializers_value(s.$ref)}),a=(null!==(z=null===(Y=this.options.dereference.strategyOpts["openapi-3-1"])||void 0===Y?void 0:Y.circularReplacer)&&void 0!==z?z:this.options.dereference.circularReplacer)(o);return _.replaceWith(a,mutationReplacer),!i&&a}}const Z=stripHash(B.refSet.rootRef.uri)!==B.uri,ee=["error","replace"].includes(this.options.dereference.circular);if((L||Z||iE(V)||ee)&&!w.includesCycle(V)){x.add(s);const o=new OpenAPI3_1DereferenceVisitor({reference:B,namespace:this.namespace,indirections:[...this.indirections],options:this.options,refractCache:this.refractCache,ancestors:w,allOfDiscriminatorMapping:this.allOfDiscriminatorMapping});V=await ox(V,o,{keyMap:lw,nodeTypeGetter:apidom_ns_openapi_3_1_src_traversal_visitor_getNodeType}),x.delete(s)}this.indirections.pop();const ie=cloneShallow(V);return ie.setMetaProperty("id",ix.generateId()),ie.setMetaProperty("ref-fields",{$ref:serializers_value(s.$ref),description:serializers_value(s.description),summary:serializers_value(s.summary)}),ie.setMetaProperty("ref-origin",B.uri),ie.setMetaProperty("ref-referencing-element-id",cloneDeep(ix.identify(s))),Nu(V)&&Nu(ie)&&(s.hasKey("description")&&"description"in V&&(ie.remove("description"),ie.set("description",s.get("description"))),s.hasKey("summary")&&"summary"in V&&(ie.remove("summary"),ie.set("summary",s.get("summary")))),_.replaceWith(ie,mutationReplacer),!i&&ie}async PathItemElement(s,o,i,a,u,_){if(!ju(s.$ref))return;if(this.indirections.includes(s))return!1;const[w,x]=this.toAncestorLineage([...u,i]),C=this.toBaseURI(serializers_value(s.$ref)),j=stripHash(this.reference.uri)===C,L=!j;if(!this.options.resolve.internal&&j)return;if(!this.options.resolve.external&&L)return;const B=await this.toReference(serializers_value(s.$ref)),$=resolve(C,serializers_value(s.$ref));this.indirections.push(s);const U=fromURIReference($);let V=apidom_evaluate(B.value.result,U);if(V.id=ix.identify(V),isPrimitiveElement(V)){const s=`path-item-${serializers_value(ix.identify(V))}`;this.refractCache.has(s)?V=this.refractCache.get(s):(V=Mb.refract(V),this.refractCache.set(s,V))}if(s===V)throw new Ko("Recursive Path Item Object reference detected");if(this.indirections.length>this.options.dereference.maxDepth)throw new rx(`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`);if(w.includes(V)){if(B.refSet.circular=!0,"error"===this.options.dereference.circular)throw new Ko("Circular reference detected");if("replace"===this.options.dereference.circular){var z,Y;const o=new Su.sI(V.id,{type:"path-item",uri:B.uri,$ref:serializers_value(s.$ref)}),a=(null!==(z=null===(Y=this.options.dereference.strategyOpts["openapi-3-1"])||void 0===Y?void 0:Y.circularReplacer)&&void 0!==z?z:this.options.dereference.circularReplacer)(o);return _.replaceWith(a,mutationReplacer),!i&&a}}const Z=stripHash(B.refSet.rootRef.uri)!==B.uri,ee=["error","replace"].includes(this.options.dereference.circular);if((L||Z||sE(V)&&ju(V.$ref)||ee)&&!w.includesCycle(V)){x.add(s);const o=new OpenAPI3_1DereferenceVisitor({reference:B,namespace:this.namespace,indirections:[...this.indirections],options:this.options,refractCache:this.refractCache,ancestors:w,allOfDiscriminatorMapping:this.allOfDiscriminatorMapping});V=await ox(V,o,{keyMap:lw,nodeTypeGetter:apidom_ns_openapi_3_1_src_traversal_visitor_getNodeType}),x.delete(s)}if(this.indirections.pop(),sE(V)){const o=new Mb([...V.content],cloneDeep(V.meta),cloneDeep(V.attributes));o.setMetaProperty("id",ix.generateId()),s.forEach(((s,i,a)=>{o.remove(serializers_value(i)),o.content.push(a)})),o.remove("$ref"),o.setMetaProperty("ref-fields",{$ref:serializers_value(s.$ref)}),o.setMetaProperty("ref-origin",B.uri),o.setMetaProperty("ref-referencing-element-id",cloneDeep(ix.identify(s))),V=o}return _.replaceWith(V,mutationReplacer),i?void 0:V}async LinkElement(s,o,i,a,u,_){if(!ju(s.operationRef)&&!ju(s.operationId))return;if(ju(s.operationRef)&&ju(s.operationId))throw new Ko("LinkElement operationRef and operationId fields are mutually exclusive.");let w;if(ju(s.operationRef)){var x;const o=fromURIReference(serializers_value(s.operationRef)),a=this.toBaseURI(serializers_value(s.operationRef)),u=stripHash(this.reference.uri)===a,C=!u;if(!this.options.resolve.internal&&u)return;if(!this.options.resolve.external&&C)return;const j=await this.toReference(serializers_value(s.operationRef));if(w=apidom_evaluate(j.value.result,o),isPrimitiveElement(w)){const s=`operation-${serializers_value(ix.identify(w))}`;this.refractCache.has(s)?w=this.refractCache.get(s):(w=Pb.refract(w),this.refractCache.set(s,w))}w=cloneShallow(w),w.setMetaProperty("ref-origin",j.uri);const L=cloneShallow(s);return null===(x=L.operationRef)||void 0===x||x.meta.set("operation",w),_.replaceWith(L,mutationReplacer),i?void 0:L}if(ju(s.operationId)){var C;const o=serializers_value(s.operationId),a=await this.toReference(unsanitize(this.reference.uri));if(w=traversal_find((s=>rE(s)&&Cu(s.operationId)&&s.operationId.equals(o)),a.value.result),bc(w))throw new Ko(`OperationElement(operationId=${o}) not found.`);const u=cloneShallow(s);return null===(C=u.operationId)||void 0===C||C.meta.set("operation",w),_.replaceWith(u,mutationReplacer),i?void 0:u}}async ExampleElement(s,o,i,a,u,_){if(!ju(s.externalValue))return;if(s.hasKey("value")&&ju(s.externalValue))throw new Ko("ExampleElement value and externalValue fields are mutually exclusive.");const w=this.toBaseURI(serializers_value(s.externalValue)),x=stripHash(this.reference.uri)===w,C=!x;if(!this.options.resolve.internal&&x)return;if(!this.options.resolve.external&&C)return;const j=await this.toReference(serializers_value(s.externalValue)),L=cloneShallow(j.value.result);L.setMetaProperty("ref-origin",j.uri);const B=cloneShallow(s);return B.value=L,_.replaceWith(B,mutationReplacer),i?void 0:B}async MemberElement(s,o,i,a,u,_){var w;const x=u[u.length-1];if(!Nu(x)||!x.classes.contains("discriminator-mapping"))return;if(null===(w=this.options.dereference.strategyOpts["openapi-3-1"])||void 0===w||!w.dereferenceDiscriminatorMapping)return!1;if(!ju(s.key)||!ju(s.value))return!1;if(this.indirections.includes(s))return!1;this.indirections.push(s);const[C,j]=this.toAncestorLineage([...u,i]),L=[...j].findLast(uE),B=cloneDeep(L.getMetaProperty("ancestorsSchemaIdentifiers")),$=serializers_value(s.value),U=/^[a-zA-Z0-9\\.\\-_]+$/.test($)?`#/components/schemas/${$}`:$,V=new lS({$ref:U});V.setMetaProperty("ancestorsSchemaIdentifiers",B),j.add(V);const z=new OpenAPI3_1DereferenceVisitor({reference:this.reference,namespace:this.namespace,indirections:[...this.indirections],options:this.options,refractCache:this.refractCache,ancestors:C,allOfDiscriminatorMapping:this.allOfDiscriminatorMapping}),Y=await ox(V,z,{keyMap:lw,nodeTypeGetter:apidom_ns_openapi_3_1_src_traversal_visitor_getNodeType});j.delete(V),this.indirections.pop();const Z=cloneShallow(s);return Z.value.setMetaProperty("ref-schema",Y),_.replaceWith(Z,mutationReplacer),i?void 0:Z}async SchemaElement(s,o,i,a,u,_){if(!ju(s.$ref))return;if(this.indirections.includes(s))return!1;const[w,x]=this.toAncestorLineage([...u,i]);let C=await this.toReference(unsanitize(this.reference.uri)),{uri:j}=C;const L=resolveSchema$refField(j,s),B=stripHash(L),$=new xw({uri:B}),U=Hw((s=>s.canRead($)),this.options.resolve.resolvers),V=!U;let z,Y=stripHash(this.reference.uri)===L,Z=!Y;this.indirections.push(s);try{if(U||V){j=this.toBaseURI(L);const s=L,o=maybeRefractToSchemaElement(C.value.result);if(z=uri_evaluate(s,o),z=maybeRefractToSchemaElement(z),z.id=ix.identify(z),!this.options.resolve.internal&&Y)return;if(!this.options.resolve.external&&Z)return}else{if(j=this.toBaseURI(L),Y=stripHash(this.reference.uri)===j,Z=!Y,!this.options.resolve.internal&&Y)return;if(!this.options.resolve.external&&Z)return;C=await this.toReference(unsanitize(L));const s=fromURIReference(L),o=maybeRefractToSchemaElement(C.value.result);z=apidom_evaluate(o,s),z=maybeRefractToSchemaElement(z),z.id=ix.identify(z)}}catch(s){if(!(V&&s instanceof tx))throw s;if(isAnchor(uriToAnchor(L))){if(Y=stripHash(this.reference.uri)===j,Z=!Y,!this.options.resolve.internal&&Y)return;if(!this.options.resolve.external&&Z)return;C=await this.toReference(unsanitize(L));const s=uriToAnchor(L),o=maybeRefractToSchemaElement(C.value.result);z=$anchor_evaluate(s,o),z=maybeRefractToSchemaElement(z),z.id=ix.identify(z)}else{if(j=this.toBaseURI(L),Y=stripHash(this.reference.uri)===j,Z=!Y,!this.options.resolve.internal&&Y)return;if(!this.options.resolve.external&&Z)return;C=await this.toReference(unsanitize(L));const s=fromURIReference(L),o=maybeRefractToSchemaElement(C.value.result);z=apidom_evaluate(o,s),z=maybeRefractToSchemaElement(z),z.id=ix.identify(z)}}if(s===z)throw new Ko("Recursive Schema Object reference detected");if(this.indirections.length>this.options.dereference.maxDepth)throw new rx(`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`);if(w.includes(z)){if(C.refSet.circular=!0,"error"===this.options.dereference.circular)throw new Ko("Circular reference detected");if("replace"===this.options.dereference.circular){var ee,ie;const o=new Su.sI(z.id,{type:"json-schema",uri:C.uri,$ref:serializers_value(s.$ref)}),a=(null!==(ee=null===(ie=this.options.dereference.strategyOpts["openapi-3-1"])||void 0===ie?void 0:ie.circularReplacer)&&void 0!==ee?ee:this.options.dereference.circularReplacer)(o);return _.replaceWith(a,mutationReplacer),!i&&a}}const ae=stripHash(C.refSet.rootRef.uri)!==C.uri,ce=["error","replace"].includes(this.options.dereference.circular);if((Z||ae||uE(z)&&ju(z.$ref)||ce)&&!w.includesCycle(z)){x.add(s);const o=new OpenAPI3_1DereferenceVisitor({reference:C,namespace:this.namespace,indirections:[...this.indirections],options:this.options,refractCache:this.refractCache,ancestors:w,allOfDiscriminatorMapping:this.allOfDiscriminatorMapping});z=await ox(z,o,{keyMap:lw,nodeTypeGetter:apidom_ns_openapi_3_1_src_traversal_visitor_getNodeType}),x.delete(s)}if(this.indirections.pop(),predicates_isBooleanJsonSchemaElement(z)){const o=cloneDeep(z);return o.setMetaProperty("id",ix.generateId()),o.setMetaProperty("ref-fields",{$ref:serializers_value(s.$ref),$refBaseURI:L}),o.setMetaProperty("ref-origin",C.uri),o.setMetaProperty("ref-referencing-element-id",cloneDeep(ix.identify(s))),_.replaceWith(o,mutationReplacer),!i&&o}if(uE(z)){var le;const o=new lS([...z.content],cloneDeep(z.meta),cloneDeep(z.attributes));if(o.setMetaProperty("id",ix.generateId()),s.forEach(((s,i,a)=>{o.remove(serializers_value(i)),o.content.push(a)})),o.remove("$ref"),o.setMetaProperty("ref-fields",{$ref:serializers_value(s.$ref),$refBaseURI:L}),o.setMetaProperty("ref-origin",C.uri),o.setMetaProperty("ref-referencing-element-id",cloneDeep(ix.identify(s))),null!==(le=this.options.dereference.strategyOpts["openapi-3-1"])&&void 0!==le&&le.dereferenceDiscriminatorMapping){var pe;const s=u[u.length-1],i=[...x].findLast(uE),a=null==i?void 0:i.getMetaProperty("schemaName"),_=serializers_value(o.getMetaProperty("schemaName"));if(_&&a&&null!=s&&null!==(pe=s.classes)&&void 0!==pe&&pe.contains("json-schema-allOf")){var de;const s=null!==(de=this.allOfDiscriminatorMapping.get(_))&&void 0!==de?de:[];s.push(i),this.allOfDiscriminatorMapping.set(_,s)}}z=o}return _.replaceWith(z,mutationReplacer),i?void 0:z}}const ax=OpenAPI3_1DereferenceVisitor,cx=visitor_visit[Symbol.for("nodejs.util.promisify.custom")];const lx=class OpenAPI3_1DereferenceStrategy extends Jw{constructor(s){super({...null!=s?s:{},name:"openapi-3-1"})}canDereference(s){var o;return"text/plain"!==s.mediaType?fw.includes(s.mediaType):tE(null===(o=s.parseResult)||void 0===o?void 0:o.result)}async dereference(s,o){var i;const a=createNamespace(pw),u=null!==(i=o.dereference.refSet)&&void 0!==i?i:new gw,_=new gw;let w,x=u;u.has(s.uri)?w=u.find(Ww(s.uri,"uri")):(w=new mw({uri:s.uri,value:s.parseResult}),u.add(w)),o.dereference.immutable&&(u.refs.map((s=>new mw({...s,value:cloneDeep(s.value)}))).forEach((s=>_.add(s))),w=_.find((o=>o.uri===s.uri)),x=_);const C=new ax({reference:w,namespace:a,options:o}),j=await cx(x.rootRef.value,C,{keyMap:lw,nodeTypeGetter:apidom_ns_openapi_3_1_src_traversal_visitor_getNodeType});return o.dereference.immutable&&_.refs.filter((s=>s.uri.startsWith("immutable://"))).map((s=>new mw({...s,uri:s.uri.replace(/^immutable:\/\//,"")}))).forEach((s=>u.add(s))),null===o.dereference.refSet&&u.clean(),_.clean(),j}},to_path=s=>{const o=(s=>s.slice(2))(s);return o.reduce(((s,i,a)=>{if(Ru(i)){const o=String(serializers_value(i.key));s.push(o)}else if(Mu(o[a-2])){const u=o[a-2].content.indexOf(i);s.push(u)}return s}),[])};const ux=class ModelPropertyMacroVisitor{modelPropertyMacro;options;SchemaElement={leave:(s,o,i,a,u)=>{void 0!==s.properties&&Nu(s.properties)&&s.properties.forEach((o=>{if(Nu(o))try{const s=this.modelPropertyMacro(serializers_value(o));o.set("default",s)}catch(o){var a,_;const w=new Error(o,{cause:o});w.fullPath=[...to_path([...u,i,s]),"properties"],null===(a=this.options.dereference.dereferenceOpts)||void 0===a||null===(a=a.errors)||void 0===a||null===(_=a.push)||void 0===_||_.call(a,w)}}))}};constructor({modelPropertyMacro:s,options:o}){this.modelPropertyMacro=s,this.options=o}};var px=function(){function XUniqWith(s,o){this.xf=o,this.pred=s,this.items=[]}return XUniqWith.prototype["@@transducer/init"]=_xfBase_init,XUniqWith.prototype["@@transducer/result"]=_xfBase_result,XUniqWith.prototype["@@transducer/step"]=function(s,o){return _includesWith(this.pred,o,this.items)?s:(this.items.push(o),this.xf["@@transducer/step"](s,o))},XUniqWith}();function _xuniqWith(s){return function(o){return new px(s,o)}}var hx=_curry2(_dispatchable([],_xuniqWith,(function(s,o){for(var i,a=0,u=o.length,_=[];a"enum"===serializers_value(s)?(s,o)=>{if(includesClasses(["json-schema-enum"],s)&&includesClasses(["json-schema-enum"],o)){const areElementsEqual=(s,o)=>!(Mu(s)||Mu(o)||Nu(s)||Nu(o))&&s.equals(serializers_value(o)),i=cloneShallow(s);return i.content=dx(areElementsEqual)([...s.content,...o.content]),i}return dd(s,o)}:dd});if(s.hasKey("$$ref")||i.remove("$$ref"),s.hasKey("example")){const o=i.getMember("example");o&&(o.value=s.get("example"))}if(s.hasKey("examples")){const o=i.getMember("examples");o&&(o.value=s.get("examples"))}s.content=i.content}}};constructor({options:s}){this.options=s}};const mx=class ParameterMacroVisitor{parameterMacro;options;#n;OperationElement={enter:s=>{this.#n=s},leave:()=>{this.#n=void 0}};ParameterElement={leave:(s,o,i,a,u)=>{const _=this.#n?serializers_value(this.#n):null,w=serializers_value(s);try{const o=this.parameterMacro(_,w);s.set("default",o)}catch(s){var x,C;const o=new Error(s,{cause:s});o.fullPath=to_path([...u,i]),null===(x=this.options.dereference.dereferenceOpts)||void 0===x||null===(x=x.errors)||void 0===x||null===(C=x.push)||void 0===C||C.call(x,o)}}};constructor({parameterMacro:s,options:o}){this.parameterMacro=s,this.options=o}},get_root_cause=s=>{if(null==s.cause)return s;let{cause:o}=s;for(;null!=o.cause;)o=o.cause;return o};const gx=class SchemaRefError extends Go{},{wrapError:yx}=Xl,vx=visitor_visit[Symbol.for("nodejs.util.promisify.custom")],bx=new IdentityManager,dereference_mutationReplacer=(s,o,i,a)=>{Ru(a)?a.value=s:Array.isArray(a)&&(a[i]=s)};class OpenAPI3_1SwaggerClientDereferenceVisitor extends ax{useCircularStructures;allowMetaPatches;basePath;constructor({allowMetaPatches:s=!0,useCircularStructures:o=!1,basePath:i=null,...a}){super(a),this.allowMetaPatches=s,this.useCircularStructures=o,this.basePath=i}async ReferenceElement(s,o,i,a,u,_){try{if(this.indirections.includes(s))return!1;const[o,a]=this.toAncestorLineage([...u,i]),j=this.toBaseURI(serializers_value(s.$ref)),L=stripHash(this.reference.uri)===j,B=!L;if(!this.options.resolve.internal&&L)return!1;if(!this.options.resolve.external&&B)return!1;const $=await this.toReference(serializers_value(s.$ref)),U=resolve(j,serializers_value(s.$ref));this.indirections.push(s);const V=fromURIReference(U);let z=apidom_evaluate($.value.result,V);if(z.id=bx.identify(z),isPrimitiveElement(z)){const o=serializers_value(s.meta.get("referenced-element")),i=`${o}-${serializers_value(bx.identify(z))}`;if(this.refractCache.has(i))z=this.refractCache.get(i);else if(isReferenceLikeElement(z))z=Lb.refract(z),z.setMetaProperty("referenced-element",o),this.refractCache.set(i,z);else{z=this.namespace.getElementClass(o).refract(z),this.refractCache.set(i,z)}}if(s===z)throw new Ko("Recursive Reference Object detected");if(this.indirections.length>this.options.dereference.maxDepth)throw new rx(`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`);if(o.includes(z)){if($.refSet.circular=!0,"error"===this.options.dereference.circular)throw new Ko("Circular reference detected");if("replace"===this.options.dereference.circular){var w,x;const o=new Su.sI(z.id,{type:"reference",uri:$.uri,$ref:serializers_value(s.$ref),baseURI:U,referencingElement:s}),a=(null!==(w=null===(x=this.options.dereference.strategyOpts["openapi-3-1"])||void 0===x?void 0:x.circularReplacer)&&void 0!==w?w:this.options.dereference.circularReplacer)(o);return _.replaceWith(o,dereference_mutationReplacer),!i&&a}}const Y=stripHash($.refSet.rootRef.uri)!==$.uri,Z=["error","replace"].includes(this.options.dereference.circular);if((B||Y||iE(z)||Z)&&!o.includesCycle(z)){var C;a.add(s);const _=new OpenAPI3_1SwaggerClientDereferenceVisitor({reference:$,namespace:this.namespace,indirections:[...this.indirections],options:this.options,refractCache:this.refractCache,ancestors:o,allowMetaPatches:this.allowMetaPatches,useCircularStructures:this.useCircularStructures,basePath:null!==(C=this.basePath)&&void 0!==C?C:[...to_path([...u,i,s]),"$ref"]});z=await vx(z,_,{keyMap:lw,nodeTypeGetter:apidom_ns_openapi_3_1_src_traversal_visitor_getNodeType}),a.delete(s)}this.indirections.pop();const ee=cloneShallow(z);if(ee.setMetaProperty("ref-fields",{$ref:serializers_value(s.$ref),description:serializers_value(s.description),summary:serializers_value(s.summary)}),ee.setMetaProperty("ref-origin",$.uri),ee.setMetaProperty("ref-referencing-element-id",cloneDeep(bx.identify(s))),Nu(z)&&(s.hasKey("description")&&"description"in z&&(ee.remove("description"),ee.set("description",s.get("description"))),s.hasKey("summary")&&"summary"in z&&(ee.remove("summary"),ee.set("summary",s.get("summary")))),this.allowMetaPatches&&Nu(ee)&&!ee.hasKey("$$ref")){const s=resolve(j,U);ee.set("$$ref",s)}return _.replaceWith(ee,dereference_mutationReplacer),!i&&ee}catch(o){var j,L,B;const a=get_root_cause(o),_=yx(a,{baseDoc:this.reference.uri,$ref:serializers_value(s.$ref),pointer:fromURIReference(serializers_value(s.$ref)),fullPath:null!==(j=this.basePath)&&void 0!==j?j:[...to_path([...u,i,s]),"$ref"]});return void(null===(L=this.options.dereference.dereferenceOpts)||void 0===L||null===(L=L.errors)||void 0===L||null===(B=L.push)||void 0===B||B.call(L,_))}}async PathItemElement(s,o,i,a,u,_){try{if(!ju(s.$ref))return;if(this.indirections.includes(s))return!1;if(includesClasses(["cycle"],s.$ref))return!1;const[o,a]=this.toAncestorLineage([...u,i]),j=this.toBaseURI(serializers_value(s.$ref)),L=stripHash(this.reference.uri)===j,B=!L;if(!this.options.resolve.internal&&L)return;if(!this.options.resolve.external&&B)return;const $=await this.toReference(serializers_value(s.$ref)),U=resolve(j,serializers_value(s.$ref));this.indirections.push(s);const V=fromURIReference(U);let z=apidom_evaluate($.value.result,V);if(z.id=bx.identify(z),isPrimitiveElement(z)){const s=`path-item-${serializers_value(bx.identify(z))}`;this.refractCache.has(s)?z=this.refractCache.get(s):(z=Mb.refract(z),this.refractCache.set(s,z))}if(s===z)throw new Ko("Recursive Path Item Object reference detected");if(this.indirections.length>this.options.dereference.maxDepth)throw new rx(`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`);if(o.includes(z)){if($.refSet.circular=!0,"error"===this.options.dereference.circular)throw new Ko("Circular reference detected");if("replace"===this.options.dereference.circular){var w,x;const o=new Su.sI(z.id,{type:"path-item",uri:$.uri,$ref:serializers_value(s.$ref),baseURI:U,referencingElement:s}),a=(null!==(w=null===(x=this.options.dereference.strategyOpts["openapi-3-1"])||void 0===x?void 0:x.circularReplacer)&&void 0!==w?w:this.options.dereference.circularReplacer)(o);return _.replaceWith(o,dereference_mutationReplacer),!i&&a}}const Y=stripHash($.refSet.rootRef.uri)!==$.uri,Z=["error","replace"].includes(this.options.dereference.circular);if((B||Y||sE(z)&&ju(z.$ref)||Z)&&!o.includesCycle(z)){var C;a.add(s);const _=new OpenAPI3_1SwaggerClientDereferenceVisitor({reference:$,namespace:this.namespace,indirections:[...this.indirections],options:this.options,ancestors:o,allowMetaPatches:this.allowMetaPatches,useCircularStructures:this.useCircularStructures,basePath:null!==(C=this.basePath)&&void 0!==C?C:[...to_path([...u,i,s]),"$ref"]});z=await vx(z,_,{keyMap:lw,nodeTypeGetter:apidom_ns_openapi_3_1_src_traversal_visitor_getNodeType}),a.delete(s)}if(this.indirections.pop(),sE(z)){const o=new Mb([...z.content],cloneDeep(z.meta),cloneDeep(z.attributes));if(s.forEach(((s,i,a)=>{o.remove(serializers_value(i)),o.content.push(a)})),o.remove("$ref"),o.setMetaProperty("ref-fields",{$ref:serializers_value(s.$ref)}),o.setMetaProperty("ref-origin",$.uri),o.setMetaProperty("ref-referencing-element-id",cloneDeep(bx.identify(s))),this.allowMetaPatches&&void 0===o.get("$$ref")){const s=resolve(j,U);o.set("$$ref",s)}z=o}return _.replaceWith(z,dereference_mutationReplacer),i?void 0:z}catch(o){var j,L,B;const a=get_root_cause(o),_=yx(a,{baseDoc:this.reference.uri,$ref:serializers_value(s.$ref),pointer:fromURIReference(serializers_value(s.$ref)),fullPath:null!==(j=this.basePath)&&void 0!==j?j:[...to_path([...u,i,s]),"$ref"]});return void(null===(L=this.options.dereference.dereferenceOpts)||void 0===L||null===(L=L.errors)||void 0===L||null===(B=L.push)||void 0===B||B.call(L,_))}}async SchemaElement(s,o,i,a,u,_){try{if(!ju(s.$ref))return;if(this.indirections.includes(s))return!1;const[o,a]=this.toAncestorLineage([...u,i]);let j=await this.toReference(unsanitize(this.reference.uri)),{uri:L}=j;const B=resolveSchema$refField(L,s),$=stripHash(B),U=new xw({uri:$}),V=!this.options.resolve.resolvers.some((s=>s.canRead(U))),z=!V;let Y,Z=stripHash(this.reference.uri)===B,ee=!Z;this.indirections.push(s);try{if(V||z){L=this.toBaseURI(B);const s=B,o=maybeRefractToSchemaElement(j.value.result);if(Y=uri_evaluate(s,o),Y=maybeRefractToSchemaElement(Y),Y.id=bx.identify(Y),!this.options.resolve.internal&&Z)return;if(!this.options.resolve.external&&ee)return}else{if(L=this.toBaseURI(B),Z=stripHash(this.reference.uri)===L,ee=!Z,!this.options.resolve.internal&&Z)return;if(!this.options.resolve.external&&ee)return;j=await this.toReference(unsanitize(B));const s=fromURIReference(B),o=maybeRefractToSchemaElement(j.value.result);Y=apidom_evaluate(o,s),Y=maybeRefractToSchemaElement(Y),Y.id=bx.identify(Y)}}catch(s){if(!(z&&s instanceof tx))throw s;if(isAnchor(uriToAnchor(B))){if(Z=stripHash(this.reference.uri)===L,ee=!Z,!this.options.resolve.internal&&Z)return;if(!this.options.resolve.external&&ee)return;j=await this.toReference(unsanitize(B));const s=uriToAnchor(B),o=maybeRefractToSchemaElement(j.value.result);Y=$anchor_evaluate(s,o),Y=maybeRefractToSchemaElement(Y),Y.id=bx.identify(Y)}else{if(L=this.toBaseURI(serializers_value(B)),Z=stripHash(this.reference.uri)===L,ee=!Z,!this.options.resolve.internal&&Z)return;if(!this.options.resolve.external&&ee)return;j=await this.toReference(unsanitize(B));const s=fromURIReference(B),o=maybeRefractToSchemaElement(j.value.result);Y=apidom_evaluate(o,s),Y=maybeRefractToSchemaElement(Y),Y.id=bx.identify(Y)}}if(s===Y)throw new Ko("Recursive Schema Object reference detected");if(this.indirections.length>this.options.dereference.maxDepth)throw new rx(`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`);if(o.includes(Y)){if(j.refSet.circular=!0,"error"===this.options.dereference.circular)throw new Ko("Circular reference detected");if("replace"===this.options.dereference.circular){var w,x;const o=new Su.sI(Y.id,{type:"json-schema",uri:j.uri,$ref:serializers_value(s.$ref),baseURI:resolve(L,B),referencingElement:s}),a=(null!==(w=null===(x=this.options.dereference.strategyOpts["openapi-3-1"])||void 0===x?void 0:x.circularReplacer)&&void 0!==w?w:this.options.dereference.circularReplacer)(o);return _.replaceWith(a,dereference_mutationReplacer),!i&&a}}const ie=stripHash(j.refSet.rootRef.uri)!==j.uri,ae=["error","replace"].includes(this.options.dereference.circular);if((ee||ie||uE(Y)&&ju(Y.$ref)||ae)&&!o.includesCycle(Y)){var C;a.add(s);const _=new OpenAPI3_1SwaggerClientDereferenceVisitor({reference:j,namespace:this.namespace,indirections:[...this.indirections],options:this.options,useCircularStructures:this.useCircularStructures,allowMetaPatches:this.allowMetaPatches,ancestors:o,basePath:null!==(C=this.basePath)&&void 0!==C?C:[...to_path([...u,i,s]),"$ref"]});Y=await vx(Y,_,{keyMap:lw,nodeTypeGetter:apidom_ns_openapi_3_1_src_traversal_visitor_getNodeType}),a.delete(s)}if(this.indirections.pop(),predicates_isBooleanJsonSchemaElement(Y)){const o=cloneDeep(Y);return o.setMetaProperty("ref-fields",{$ref:serializers_value(s.$ref)}),o.setMetaProperty("ref-origin",j.uri),o.setMetaProperty("ref-referencing-element-id",cloneDeep(bx.identify(s))),_.replaceWith(o,dereference_mutationReplacer),!i&&o}if(uE(Y)){const o=new lS([...Y.content],cloneDeep(Y.meta),cloneDeep(Y.attributes));if(s.forEach(((s,i,a)=>{o.remove(serializers_value(i)),o.content.push(a)})),o.remove("$ref"),o.setMetaProperty("ref-fields",{$ref:serializers_value(s.$ref)}),o.setMetaProperty("ref-origin",j.uri),o.setMetaProperty("ref-referencing-element-id",cloneDeep(bx.identify(s))),this.allowMetaPatches&&void 0===o.get("$$ref")){const s=resolve(L,B);o.set("$$ref",s)}Y=o}return _.replaceWith(Y,dereference_mutationReplacer),i?void 0:Y}catch(o){var j,L,B;const a=get_root_cause(o),_=new gx(`Could not resolve reference: ${a.message}`,{baseDoc:this.reference.uri,$ref:serializers_value(s.$ref),fullPath:null!==(j=this.basePath)&&void 0!==j?j:[...to_path([...u,i,s]),"$ref"],cause:a});return void(null===(L=this.options.dereference.dereferenceOpts)||void 0===L||null===(L=L.errors)||void 0===L||null===(B=L.push)||void 0===B||B.call(L,_))}}async LinkElement(){}async ExampleElement(s,o,i,a,u,_){try{return await super.ExampleElement(s,o,i,a,u,_)}catch(o){var w,x,C;const a=get_root_cause(o),_=yx(a,{baseDoc:this.reference.uri,externalValue:serializers_value(s.externalValue),fullPath:null!==(w=this.basePath)&&void 0!==w?w:[...to_path([...u,i,s]),"externalValue"]});return void(null===(x=this.options.dereference.dereferenceOpts)||void 0===x||null===(x=x.errors)||void 0===x||null===(C=x.push)||void 0===C||C.call(x,_))}}}const _x=OpenAPI3_1SwaggerClientDereferenceVisitor,Sx=mergeAll[Symbol.for("nodejs.util.promisify.custom")];const Ex=class RootVisitor{constructor({parameterMacro:s,modelPropertyMacro:o,mode:i,options:a,...u}){const _=[];_.push(new _x({...u,options:a})),"function"==typeof o&&_.push(new ux({modelPropertyMacro:o,options:a})),"strict"!==i&&_.push(new fx({options:a})),"function"==typeof s&&_.push(new mx({parameterMacro:s,options:a}));const w=Sx(_,{nodeTypeGetter:apidom_ns_openapi_3_1_src_traversal_visitor_getNodeType});Object.assign(this,w)}},wx=visitor_visit[Symbol.for("nodejs.util.promisify.custom")];const xx=class OpenAPI3_1SwaggerClientDereferenceStrategy extends lx{allowMetaPatches;parameterMacro;modelPropertyMacro;mode;ancestors;constructor({allowMetaPatches:s=!1,parameterMacro:o=null,modelPropertyMacro:i=null,mode:a="non-strict",ancestors:u=[],..._}={}){super({..._}),this.name="openapi-3-1-swagger-client",this.allowMetaPatches=s,this.parameterMacro=o,this.modelPropertyMacro=i,this.mode=a,this.ancestors=[...u]}async dereference(s,o){var i;const a=createNamespace(pw),u=null!==(i=o.dereference.refSet)&&void 0!==i?i:new gw,_=new gw;let w,x=u;u.has(s.uri)?w=u.find((o=>o.uri===s.uri)):(w=new mw({uri:s.uri,value:s.parseResult}),u.add(w)),o.dereference.immutable&&(u.refs.map((s=>new mw({...s,value:cloneDeep(s.value)}))).forEach((s=>_.add(s))),w=_.find((o=>o.uri===s.uri)),x=_);const C=new Ex({reference:w,namespace:a,options:o,allowMetaPatches:this.allowMetaPatches,ancestors:this.ancestors,modelPropertyMacro:this.modelPropertyMacro,mode:this.mode,parameterMacro:this.parameterMacro}),j=await wx(x.rootRef.value,C,{keyMap:lw,nodeTypeGetter:apidom_ns_openapi_3_1_src_traversal_visitor_getNodeType});return o.dereference.immutable&&_.refs.filter((s=>s.uri.startsWith("immutable://"))).map((s=>new mw({...s,uri:s.uri.replace(/^immutable:\/\//,"")}))).forEach((s=>u.add(s))),null===o.dereference.refSet&&u.clean(),_.clean(),j}},circularReplacer=s=>{const o=serializers_value(s.meta.get("baseURI")),i=s.meta.get("referencingElement");return new Su.Sh({$ref:o},cloneDeep(i.meta),cloneDeep(i.attributes))},resolveOpenAPI31Strategy=async s=>{const{spec:o,timeout:i,redirects:a,requestInterceptor:u,responseInterceptor:_,pathDiscriminator:w=[],allowMetaPatches:x=!1,useCircularStructures:C=!1,skipNormalization:j=!1,parameterMacro:L=null,modelPropertyMacro:B=null,mode:$="non-strict",strategies:U}=s;try{const{cache:V}=resolveOpenAPI31Strategy,z=U.find((s=>s.match(o))),Y=isHttpUrl(url_cwd())?url_cwd():Ll,Z=options_retrievalURI(s),ee=resolve(Y,Z);let ie;V.has(o)?ie=V.get(o):(ie=Ab.refract(o),ie.classes.push("result"),V.set(o,ie));const ae=new Au([ie]),ce=es_compile(w),le=""===ce?"":`#${ce}`,pe=apidom_evaluate(ie,ce),de=new mw({uri:ee,value:ae}),fe=new gw({refs:[de]});""!==ce&&(fe.rootRef=void 0);const ye=[new Set([pe])],be=[],_e=await(async(s,o={})=>{const i=util_merge(vw,o);return dereferenceApiDOM(s,i)})(pe,{resolve:{baseURI:`${ee}${le}`,resolvers:[new $w({timeout:i||1e4,redirects:a||10})],resolverOpts:{swaggerHTTPClientConfig:{requestInterceptor:u,responseInterceptor:_}},strategies:[new Nw]},parse:{mediaType:fw.latest(),parsers:[new Vw({allowEmpty:!1,sourceMap:!1}),new zw({allowEmpty:!1,sourceMap:!1}),new qw({allowEmpty:!1,sourceMap:!1}),new Uw({allowEmpty:!1,sourceMap:!1}),new Iw({allowEmpty:!1,sourceMap:!1})]},dereference:{maxDepth:100,strategies:[new xx({allowMetaPatches:x,useCircularStructures:C,parameterMacro:L,modelPropertyMacro:B,mode:$,ancestors:ye})],refSet:fe,dereferenceOpts:{errors:be},immutable:!1,circular:C?"ignore":"replace",circularReplacer:C?vw.dereference.circularReplacer:circularReplacer}}),Se=((s,o,i)=>new xp({element:i}).transclude(s,o))(pe,_e,ie),we=j?Se:z.normalize(Se);return{spec:serializers_value(we),errors:be}}catch(s){if(s instanceof Wp)return{spec:o,errors:[]};throw s}};resolveOpenAPI31Strategy.cache=new WeakMap;const kx=resolveOpenAPI31Strategy;function _clone(s,o,i){if(i||(i=new Ox),function _isPrimitive(s){var o=typeof s;return null==s||"object"!=o&&"function"!=o}(s))return s;var a=function copy(a){var u=i.get(s);if(u)return u;for(var _ in i.set(s,a),s)Object.prototype.hasOwnProperty.call(s,_)&&(a[_]=o?_clone(s[_],!0,i):s[_]);return a};switch(ra(s)){case"Object":return a(Object.create(Object.getPrototypeOf(s)));case"Array":return a(Array(s.length));case"Date":return new Date(s.valueOf());case"RegExp":return _cloneRegExp(s);case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":return s.slice();default:return s}}var Ox=function(){function _ObjectMap(){this.map={},this.length=0}return _ObjectMap.prototype.set=function(s,o){var i=this.hash(s),a=this.map[i];a||(this.map[i]=a=[]),a.push([s,o]),this.length+=1},_ObjectMap.prototype.hash=function(s){var o=[];for(var i in s)o.push(Object.prototype.toString.call(s[i]));return o.join()},_ObjectMap.prototype.get=function(s){if(this.length<=180)for(var o in this.map)for(var i=this.map[o],a=0;as.replace(/\s/g,""),normalize_operation_ids_replaceSpecialCharsWithUnderscore=s=>s.replace(/\W/gi,"_"),normalizeOperationId=(s,o,i)=>{const a=removeSpaces(s);return a.length>0?normalize_operation_ids_replaceSpecialCharsWithUnderscore(a):((s,o)=>`${normalize_operation_ids_replaceSpecialCharsWithUnderscore(removeSpaces(o.toLowerCase()))}${normalize_operation_ids_replaceSpecialCharsWithUnderscore(removeSpaces(s))}`)(o,i)},normalize_operation_ids=({storageField:s="x-normalized",operationIdNormalizer:o=normalizeOperationId}={})=>i=>{const{predicates:a,ancestorLineageToJSONPointer:u,namespace:_}=i,w=[],x=[],C=[];let j;return{visitor:{OpenApi3_1Element:{enter(o){j=new Px(o,s,"operation-ids")},leave(){const s=jx((s=>serializers_value(s.operationId)),x);Object.entries(s).forEach((([s,o])=>{Array.isArray(o)&&(o.length<=1||o.forEach(((o,i)=>{const a=`${s}${i+1}`;o.operationId=new _.elements.String(a)})))})),C.forEach((s=>{if(void 0===s.operationId)return;const o=String(serializers_value(s.operationId)),i=x.find((s=>serializers_value(s.meta.get("originalOperationId"))===o));void 0!==i&&(s.operationId=cloneDeep.safe(i.operationId),s.meta.set("originalOperationId",o),s.set("__originalOperationId",o))})),x.length=0,C.length=0,j=void 0}},PathItemElement:{enter(s){const o=Na("path",serializers_value(s.meta.get("path")));w.push(o)},leave(){w.pop()}},OperationElement:{enter(s,i,a,C,L){if(void 0===s.operationId)return;const B=u([...L,a,s]);if(j.includes(B))return;const $=String(serializers_value(s.operationId)),U=Ba(w),V=Na("method",serializers_value(s.meta.get("http-method"))),z=o($,U,V);$!==z&&(s.operationId=new _.elements.String(z),s.set("__originalOperationId",$),s.meta.set("originalOperationId",$),x.push(s),j.append(B))}},LinkElement:{leave(s){a.isLinkElement(s)&&void 0!==s.operationId&&C.push(s)}}}}},normalize_parameters=({storageField:s="x-normalized"}={})=>o=>{const{predicates:i,ancestorLineageToJSONPointer:a}=o,parameterEquals=(s,o)=>!!i.isParameterElement(s)&&(!!i.isParameterElement(o)&&(!!i.isStringElement(s.name)&&(!!i.isStringElement(s.in)&&(!!i.isStringElement(o.name)&&(!!i.isStringElement(o.in)&&(serializers_value(s.name)===serializers_value(o.name)&&serializers_value(s.in)===serializers_value(o.in))))))),u=[];let _;return{visitor:{OpenApi3_1Element:{enter(o){_=new Px(o,s,"parameters")},leave(){_=void 0}},PathItemElement:{enter(s,o,a,_,w){if(w.some(i.isComponentsElement))return;const{parameters:x}=s;i.isArrayElement(x)?u.push([...x.content]):u.push([])},leave(){u.pop()}},OperationElement:{leave(s,o,i,w,x){const C=Ba(u);if(!Array.isArray(C)||0===C.length)return;const j=a([...x,i,s]);if(_.includes(j))return;const L=Yw([],["parameters","content"],s),B=dx(parameterEquals,[...L,...C]);s.parameters=new _v(B),_.append(j)}}}}},normalize_security_requirements=({storageField:s="x-normalized"}={})=>o=>{const{predicates:i,ancestorLineageToJSONPointer:a}=o;let u,_;return{visitor:{OpenApi3_1Element:{enter(o){_=new Px(o,s,"security-requirements"),i.isArrayElement(o.security)&&(u=o.security)},leave(){_=void 0,u=void 0}},OperationElement:{leave(s,o,w,x,C){if(C.some(i.isComponentsElement))return;const j=a([...C,w,s]);if(_.includes(j))return;var L;void 0===s.security&&void 0!==u&&(s.security=new Ov(null===(L=u)||void 0===L?void 0:L.content),_.append(j))}}}}},normalize_parameter_examples=({storageField:s="x-normalized"}={})=>o=>{const{predicates:i,ancestorLineageToJSONPointer:a}=o;let u;return{visitor:{OpenApi3_1Element:{enter(o){u=new Px(o,s,"parameter-examples")},leave(){u=void 0}},ParameterElement:{leave(s,o,_,w,x){var C,j;if(x.some(i.isComponentsElement))return;if(void 0===s.schema||!i.isSchemaElement(s.schema))return;if(void 0===(null===(C=s.schema)||void 0===C?void 0:C.example)&&void 0===(null===(j=s.schema)||void 0===j?void 0:j.examples))return;const L=a([...x,_,s]);if(!u.includes(L)){if(void 0!==s.examples&&i.isObjectElement(s.examples)){const o=s.examples.map((s=>cloneDeep.safe(s.value)));return void 0!==s.schema.examples&&(s.schema.set("examples",o),u.append(L)),void(void 0!==s.schema.example&&(s.schema.set("example",o[0]),u.append(L)))}void 0!==s.example&&(void 0!==s.schema.examples&&(s.schema.set("examples",[cloneDeep(s.example)]),u.append(L)),void 0!==s.schema.example&&(s.schema.set("example",cloneDeep(s.example)),u.append(L)))}}}}}},normalize_header_examples=({storageField:s="x-normalized"}={})=>o=>{const{predicates:i,ancestorLineageToJSONPointer:a}=o;let u;return{visitor:{OpenApi3_1Element:{enter(o){u=new Px(o,s,"header-examples")},leave(){u=void 0}},HeaderElement:{leave(s,o,_,w,x){var C,j;if(x.some(i.isComponentsElement))return;if(void 0===s.schema||!i.isSchemaElement(s.schema))return;if(void 0===(null===(C=s.schema)||void 0===C?void 0:C.example)&&void 0===(null===(j=s.schema)||void 0===j?void 0:j.examples))return;const L=a([...x,_,s]);if(!u.includes(L)){if(void 0!==s.examples&&i.isObjectElement(s.examples)){const o=s.examples.map((s=>cloneDeep.safe(s.value)));return void 0!==s.schema.examples&&(s.schema.set("examples",o),u.append(L)),void(void 0!==s.schema.example&&(s.schema.set("example",o[0]),u.append(L)))}void 0!==s.example&&(void 0!==s.schema.examples&&(s.schema.set("examples",[cloneDeep(s.example)]),u.append(L)),void 0!==s.schema.example&&(s.schema.set("example",cloneDeep(s.example)),u.append(L)))}}}}}},openapi_3_1_apidom_normalize=s=>{if(!Nu(s))return s;const o=[normalize_operation_ids({operationIdNormalizer:(s,o,i)=>opId({operationId:s},o,i,{v2OperationIdCompatibilityMode:!1})}),normalize_parameters(),normalize_security_requirements(),normalize_parameter_examples(),normalize_header_examples()];return dispatchPluginsSync(s,o,{toolboxCreator:apidom_ns_openapi_3_1_src_refractor_toolbox,visitorOptions:{keyMap:lw,nodeTypeGetter:apidom_ns_openapi_3_1_src_traversal_visitor_getNodeType}})},Ix={name:"openapi-3-1-apidom",match:s=>isOpenAPI31(s),normalize(s){if(!Cu(s)&&fu(s)&&!s.$$normalized){const i=(o=openapi_3_1_apidom_normalize,s=>{const i=Ab.refract(s);i.classes.push("result");const a=o(i),u=serializers_value(a);return kx.cache.set(u,a),serializers_value(a)})(s);return i.$$normalized=!0,i}var o;return Cu(s)?openapi_3_1_apidom_normalize(s):s},resolve:async s=>kx(s)},Tx=Ix,makeResolve=s=>async o=>(async s=>{const{spec:o,requestInterceptor:i,responseInterceptor:a}=s,u=options_retrievalURI(s),_=options_httpClient(s),w=o||await makeFetchJSON(_,{requestInterceptor:i,responseInterceptor:a})(u),x={...s,spec:w};return s.strategies.find((s=>s.match(w))).resolve(x)})({...s,...o}),Nx=makeResolve({strategies:[_u,vu,gu]});const server_url_template=(s,o,i,a,u)=>{if(s===Pp.SEM_PRE){if(!1===Array.isArray(u))throw new Error("parser's user data must be an array");u.push(["server-url-template",jp.charsToString(o,i,a)])}return Pp.SEM_OK},callbacks_server_variable=(s,o,i,a,u)=>{if(s===Pp.SEM_PRE){if(!1===Array.isArray(u))throw new Error("parser's user data must be an array");u.push(["server-variable",jp.charsToString(o,i,a)])}return Pp.SEM_OK},server_variable_name=(s,o,i,a,u)=>{if(s===Pp.SEM_PRE){if(!1===Array.isArray(u))throw new Error("parser's user data must be an array");u.push(["server-variable-name",jp.charsToString(o,i,a)])}return Pp.SEM_OK},callbacks_literals=(s,o,i,a,u)=>{if(s===Pp.SEM_PRE){if(!1===Array.isArray(u))throw new Error("parser's user data must be an array");u.push(["literals",jp.charsToString(o,i,a)])}return Pp.SEM_OK},Mx=new function server_url_templating_grammar(){this.grammarObject="grammarObject",this.rules=[],this.rules[0]={name:"server-url-template",lower:"server-url-template",index:0,isBkr:!1},this.rules[1]={name:"server-variable",lower:"server-variable",index:1,isBkr:!1},this.rules[2]={name:"server-variable-name",lower:"server-variable-name",index:2,isBkr:!1},this.rules[3]={name:"literals",lower:"literals",index:3,isBkr:!1},this.rules[4]={name:"DIGIT",lower:"digit",index:4,isBkr:!1},this.rules[5]={name:"HEXDIG",lower:"hexdig",index:5,isBkr:!1},this.rules[6]={name:"pct-encoded",lower:"pct-encoded",index:6,isBkr:!1},this.rules[7]={name:"ucschar",lower:"ucschar",index:7,isBkr:!1},this.rules[8]={name:"iprivate",lower:"iprivate",index:8,isBkr:!1},this.udts=[],this.rules[0].opcodes=[],this.rules[0].opcodes[0]={type:3,min:1,max:1/0},this.rules[0].opcodes[1]={type:1,children:[2,3]},this.rules[0].opcodes[2]={type:4,index:3},this.rules[0].opcodes[3]={type:4,index:1},this.rules[1].opcodes=[],this.rules[1].opcodes[0]={type:2,children:[1,2,3]},this.rules[1].opcodes[1]={type:7,string:[123]},this.rules[1].opcodes[2]={type:4,index:2},this.rules[1].opcodes[3]={type:7,string:[125]},this.rules[2].opcodes=[],this.rules[2].opcodes[0]={type:3,min:1,max:1/0},this.rules[2].opcodes[1]={type:1,children:[2,3,4]},this.rules[2].opcodes[2]={type:5,min:0,max:122},this.rules[2].opcodes[3]={type:6,string:[124]},this.rules[2].opcodes[4]={type:5,min:126,max:1114111},this.rules[3].opcodes=[],this.rules[3].opcodes[0]={type:3,min:1,max:1/0},this.rules[3].opcodes[1]={type:1,children:[2,3,4,5,6,7,8,9,10,11,12,13]},this.rules[3].opcodes[2]={type:6,string:[33]},this.rules[3].opcodes[3]={type:5,min:35,max:36},this.rules[3].opcodes[4]={type:5,min:38,max:59},this.rules[3].opcodes[5]={type:6,string:[61]},this.rules[3].opcodes[6]={type:5,min:63,max:91},this.rules[3].opcodes[7]={type:6,string:[93]},this.rules[3].opcodes[8]={type:6,string:[95]},this.rules[3].opcodes[9]={type:5,min:97,max:122},this.rules[3].opcodes[10]={type:6,string:[126]},this.rules[3].opcodes[11]={type:4,index:7},this.rules[3].opcodes[12]={type:4,index:8},this.rules[3].opcodes[13]={type:4,index:6},this.rules[4].opcodes=[],this.rules[4].opcodes[0]={type:5,min:48,max:57},this.rules[5].opcodes=[],this.rules[5].opcodes[0]={type:1,children:[1,2,3,4,5,6,7]},this.rules[5].opcodes[1]={type:4,index:4},this.rules[5].opcodes[2]={type:7,string:[97]},this.rules[5].opcodes[3]={type:7,string:[98]},this.rules[5].opcodes[4]={type:7,string:[99]},this.rules[5].opcodes[5]={type:7,string:[100]},this.rules[5].opcodes[6]={type:7,string:[101]},this.rules[5].opcodes[7]={type:7,string:[102]},this.rules[6].opcodes=[],this.rules[6].opcodes[0]={type:2,children:[1,2,3]},this.rules[6].opcodes[1]={type:7,string:[37]},this.rules[6].opcodes[2]={type:4,index:5},this.rules[6].opcodes[3]={type:4,index:5},this.rules[7].opcodes=[],this.rules[7].opcodes[0]={type:1,children:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]},this.rules[7].opcodes[1]={type:5,min:160,max:55295},this.rules[7].opcodes[2]={type:5,min:63744,max:64975},this.rules[7].opcodes[3]={type:5,min:65008,max:65519},this.rules[7].opcodes[4]={type:5,min:65536,max:131069},this.rules[7].opcodes[5]={type:5,min:131072,max:196605},this.rules[7].opcodes[6]={type:5,min:196608,max:262141},this.rules[7].opcodes[7]={type:5,min:262144,max:327677},this.rules[7].opcodes[8]={type:5,min:327680,max:393213},this.rules[7].opcodes[9]={type:5,min:393216,max:458749},this.rules[7].opcodes[10]={type:5,min:458752,max:524285},this.rules[7].opcodes[11]={type:5,min:524288,max:589821},this.rules[7].opcodes[12]={type:5,min:589824,max:655357},this.rules[7].opcodes[13]={type:5,min:655360,max:720893},this.rules[7].opcodes[14]={type:5,min:720896,max:786429},this.rules[7].opcodes[15]={type:5,min:786432,max:851965},this.rules[7].opcodes[16]={type:5,min:851968,max:917501},this.rules[7].opcodes[17]={type:5,min:921600,max:983037},this.rules[8].opcodes=[],this.rules[8].opcodes[0]={type:1,children:[1,2,3]},this.rules[8].opcodes[1]={type:5,min:57344,max:63743},this.rules[8].opcodes[2]={type:5,min:983040,max:1048573},this.rules[8].opcodes[3]={type:5,min:1048576,max:1114109},this.toString=function toString(){let s="";return s+="; OpenAPI Server URL templating ABNF syntax\n",s+="server-url-template = 1*( literals / server-variable ) ; variant of https://www.rfc-editor.org/rfc/rfc6570#section-2\n",s+='server-variable = "{" server-variable-name "}"\n',s+="server-variable-name = 1*( %x00-7A / %x7C / %x7E-10FFFF ) ; every UTF8 character except { and } (from OpenAPI)\n",s+="\n",s+="; https://www.rfc-editor.org/rfc/rfc6570#section-2.1\n",s+="; https://www.rfc-editor.org/errata/eid6937\n",s+="literals = 1*( %x21 / %x23-24 / %x26-3B / %x3D / %x3F-5B\n",s+=" / %x5D / %x5F / %x61-7A / %x7E / ucschar / iprivate\n",s+=" / pct-encoded)\n",s+=" ; any Unicode character except: CTL, SP,\n",s+=' ; DQUOTE, "%" (aside from pct-encoded),\n',s+=' ; "<", ">", "\\", "^", "`", "{", "|", "}"\n',s+="\n",s+="; https://www.rfc-editor.org/rfc/rfc6570#section-1.5\n",s+="DIGIT = %x30-39 ; 0-9\n",s+='HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F" ; case-insensitive\n',s+="\n",s+='pct-encoded = "%" HEXDIG HEXDIG\n',s+="\n",s+="ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF\n",s+=" / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD\n",s+=" / %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD\n",s+=" / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD\n",s+=" / %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD\n",s+=" / %xD0000-DFFFD / %xE1000-EFFFD\n",s+="\n",s+="iprivate = %xE000-F8FF / %xF0000-FFFFD / %x100000-10FFFD\n",'; OpenAPI Server URL templating ABNF syntax\nserver-url-template = 1*( literals / server-variable ) ; variant of https://www.rfc-editor.org/rfc/rfc6570#section-2\nserver-variable = "{" server-variable-name "}"\nserver-variable-name = 1*( %x00-7A / %x7C / %x7E-10FFFF ) ; every UTF8 character except { and } (from OpenAPI)\n\n; https://www.rfc-editor.org/rfc/rfc6570#section-2.1\n; https://www.rfc-editor.org/errata/eid6937\nliterals = 1*( %x21 / %x23-24 / %x26-3B / %x3D / %x3F-5B\n / %x5D / %x5F / %x61-7A / %x7E / ucschar / iprivate\n / pct-encoded)\n ; any Unicode character except: CTL, SP,\n ; DQUOTE, "%" (aside from pct-encoded),\n ; "<", ">", "\\", "^", "`", "{", "|", "}"\n\n; https://www.rfc-editor.org/rfc/rfc6570#section-1.5\nDIGIT = %x30-39 ; 0-9\nHEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F" ; case-insensitive\n\npct-encoded = "%" HEXDIG HEXDIG\n\nucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF\n / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD\n / %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD\n / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD\n / %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD\n / %xD0000-DFFFD / %xE1000-EFFFD\n\niprivate = %xE000-F8FF / %xF0000-FFFFD / %x100000-10FFFD\n'}},openapi_server_url_templating_es_parse=s=>{const o=new kp;o.ast=new Op,o.ast.callbacks["server-url-template"]=server_url_template,o.ast.callbacks["server-variable"]=callbacks_server_variable,o.ast.callbacks["server-variable-name"]=server_variable_name,o.ast.callbacks.literals=callbacks_literals;return{result:o.parse(Mx,"server-url-template",s),ast:o.ast}},openapi_server_url_templating_es_test=(s,{strict:o=!1}={})=>{try{const i=openapi_server_url_templating_es_parse(s);if(!i.result.success)return!1;const a=[];i.ast.translate(a);const u=a.some((([s])=>"server-variable"===s));if(!o&&!u)try{return new URL(s,"https://vladimirgorej.com"),!0}catch{return!1}return!o||u}catch{return!1}},encodeServerVariable=s=>(s=>{try{return"string"==typeof s&&decodeURIComponent(s)!==s}catch{return!1}})(s)?s:encodeURIComponent(s).replace(/%5B/g,"[").replace(/%5D/g,"]"),Rx=["literals","server-variable-name"],es_substitute=(s,o,i={})=>{const a={...{encoder:encodeServerVariable},...i},u=openapi_server_url_templating_es_parse(s);if(!u.result.success)return s;const _=[];u.ast.translate(_);const w=_.filter((([s])=>Rx.includes(s))).map((([s,i])=>"server-variable-name"===s?Object.hasOwn(o,i)?a.encoder(o[i],i):`{${i}}`:i));return w.join("")};function path_templating_grammar(){this.grammarObject="grammarObject",this.rules=[],this.rules[0]={name:"path-template",lower:"path-template",index:0,isBkr:!1},this.rules[1]={name:"path-segment",lower:"path-segment",index:1,isBkr:!1},this.rules[2]={name:"slash",lower:"slash",index:2,isBkr:!1},this.rules[3]={name:"path-literal",lower:"path-literal",index:3,isBkr:!1},this.rules[4]={name:"template-expression",lower:"template-expression",index:4,isBkr:!1},this.rules[5]={name:"template-expression-param-name",lower:"template-expression-param-name",index:5,isBkr:!1},this.rules[6]={name:"pchar",lower:"pchar",index:6,isBkr:!1},this.rules[7]={name:"unreserved",lower:"unreserved",index:7,isBkr:!1},this.rules[8]={name:"pct-encoded",lower:"pct-encoded",index:8,isBkr:!1},this.rules[9]={name:"sub-delims",lower:"sub-delims",index:9,isBkr:!1},this.rules[10]={name:"ALPHA",lower:"alpha",index:10,isBkr:!1},this.rules[11]={name:"DIGIT",lower:"digit",index:11,isBkr:!1},this.rules[12]={name:"HEXDIG",lower:"hexdig",index:12,isBkr:!1},this.udts=[],this.rules[0].opcodes=[],this.rules[0].opcodes[0]={type:2,children:[1,2,6]},this.rules[0].opcodes[1]={type:4,index:2},this.rules[0].opcodes[2]={type:3,min:0,max:1/0},this.rules[0].opcodes[3]={type:2,children:[4,5]},this.rules[0].opcodes[4]={type:4,index:1},this.rules[0].opcodes[5]={type:4,index:2},this.rules[0].opcodes[6]={type:3,min:0,max:1},this.rules[0].opcodes[7]={type:4,index:1},this.rules[1].opcodes=[],this.rules[1].opcodes[0]={type:3,min:1,max:1/0},this.rules[1].opcodes[1]={type:1,children:[2,3]},this.rules[1].opcodes[2]={type:4,index:3},this.rules[1].opcodes[3]={type:4,index:4},this.rules[2].opcodes=[],this.rules[2].opcodes[0]={type:7,string:[47]},this.rules[3].opcodes=[],this.rules[3].opcodes[0]={type:3,min:1,max:1/0},this.rules[3].opcodes[1]={type:4,index:6},this.rules[4].opcodes=[],this.rules[4].opcodes[0]={type:2,children:[1,2,3]},this.rules[4].opcodes[1]={type:7,string:[123]},this.rules[4].opcodes[2]={type:4,index:5},this.rules[4].opcodes[3]={type:7,string:[125]},this.rules[5].opcodes=[],this.rules[5].opcodes[0]={type:3,min:1,max:1/0},this.rules[5].opcodes[1]={type:1,children:[2,3,4]},this.rules[5].opcodes[2]={type:5,min:0,max:122},this.rules[5].opcodes[3]={type:6,string:[124]},this.rules[5].opcodes[4]={type:5,min:126,max:1114111},this.rules[6].opcodes=[],this.rules[6].opcodes[0]={type:1,children:[1,2,3,4,5]},this.rules[6].opcodes[1]={type:4,index:7},this.rules[6].opcodes[2]={type:4,index:8},this.rules[6].opcodes[3]={type:4,index:9},this.rules[6].opcodes[4]={type:7,string:[58]},this.rules[6].opcodes[5]={type:7,string:[64]},this.rules[7].opcodes=[],this.rules[7].opcodes[0]={type:1,children:[1,2,3,4,5,6]},this.rules[7].opcodes[1]={type:4,index:10},this.rules[7].opcodes[2]={type:4,index:11},this.rules[7].opcodes[3]={type:7,string:[45]},this.rules[7].opcodes[4]={type:7,string:[46]},this.rules[7].opcodes[5]={type:7,string:[95]},this.rules[7].opcodes[6]={type:7,string:[126]},this.rules[8].opcodes=[],this.rules[8].opcodes[0]={type:2,children:[1,2,3]},this.rules[8].opcodes[1]={type:7,string:[37]},this.rules[8].opcodes[2]={type:4,index:12},this.rules[8].opcodes[3]={type:4,index:12},this.rules[9].opcodes=[],this.rules[9].opcodes[0]={type:1,children:[1,2,3,4,5,6,7,8,9,10,11]},this.rules[9].opcodes[1]={type:7,string:[33]},this.rules[9].opcodes[2]={type:7,string:[36]},this.rules[9].opcodes[3]={type:7,string:[38]},this.rules[9].opcodes[4]={type:7,string:[39]},this.rules[9].opcodes[5]={type:7,string:[40]},this.rules[9].opcodes[6]={type:7,string:[41]},this.rules[9].opcodes[7]={type:7,string:[42]},this.rules[9].opcodes[8]={type:7,string:[43]},this.rules[9].opcodes[9]={type:7,string:[44]},this.rules[9].opcodes[10]={type:7,string:[59]},this.rules[9].opcodes[11]={type:7,string:[61]},this.rules[10].opcodes=[],this.rules[10].opcodes[0]={type:1,children:[1,2]},this.rules[10].opcodes[1]={type:5,min:65,max:90},this.rules[10].opcodes[2]={type:5,min:97,max:122},this.rules[11].opcodes=[],this.rules[11].opcodes[0]={type:5,min:48,max:57},this.rules[12].opcodes=[],this.rules[12].opcodes[0]={type:1,children:[1,2,3,4,5,6,7]},this.rules[12].opcodes[1]={type:4,index:11},this.rules[12].opcodes[2]={type:7,string:[97]},this.rules[12].opcodes[3]={type:7,string:[98]},this.rules[12].opcodes[4]={type:7,string:[99]},this.rules[12].opcodes[5]={type:7,string:[100]},this.rules[12].opcodes[6]={type:7,string:[101]},this.rules[12].opcodes[7]={type:7,string:[102]},this.toString=function toString(){let s="";return s+="; OpenAPI Path Templating ABNF syntax\n",s+="; variant of https://datatracker.ietf.org/doc/html/rfc3986#section-3.3\n",s+="path-template = slash *( path-segment slash ) [ path-segment ]\n",s+="path-segment = 1*( path-literal / template-expression )\n",s+='slash = "/"\n',s+="path-literal = 1*pchar\n",s+='template-expression = "{" template-expression-param-name "}"\n',s+="template-expression-param-name = 1*( %x00-7A / %x7C / %x7E-10FFFF ) ; every UTF8 character except { and } (from OpenAPI)\n",s+="\n",s+="; https://datatracker.ietf.org/doc/html/rfc3986#section-3.3\n",s+='pchar = unreserved / pct-encoded / sub-delims / ":" / "@"\n',s+='unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"\n',s+=" ; https://datatracker.ietf.org/doc/html/rfc3986#section-2.3\n",s+='pct-encoded = "%" HEXDIG HEXDIG\n',s+=" ; https://datatracker.ietf.org/doc/html/rfc3986#section-2.1\n",s+='sub-delims = "!" / "$" / "&" / "\'" / "(" / ")"\n',s+=' / "*" / "+" / "," / ";" / "="\n',s+=" ; https://datatracker.ietf.org/doc/html/rfc3986#section-2.2\n",s+="\n",s+="; https://datatracker.ietf.org/doc/html/rfc5234#appendix-B.1\n",s+="ALPHA = %x41-5A / %x61-7A ; A-Z / a-z\n",s+="DIGIT = %x30-39 ; 0-9\n",s+='HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"\n','; OpenAPI Path Templating ABNF syntax\n; variant of https://datatracker.ietf.org/doc/html/rfc3986#section-3.3\npath-template = slash *( path-segment slash ) [ path-segment ]\npath-segment = 1*( path-literal / template-expression )\nslash = "/"\npath-literal = 1*pchar\ntemplate-expression = "{" template-expression-param-name "}"\ntemplate-expression-param-name = 1*( %x00-7A / %x7C / %x7E-10FFFF ) ; every UTF8 character except { and } (from OpenAPI)\n\n; https://datatracker.ietf.org/doc/html/rfc3986#section-3.3\npchar = unreserved / pct-encoded / sub-delims / ":" / "@"\nunreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"\n ; https://datatracker.ietf.org/doc/html/rfc3986#section-2.3\npct-encoded = "%" HEXDIG HEXDIG\n ; https://datatracker.ietf.org/doc/html/rfc3986#section-2.1\nsub-delims = "!" / "$" / "&" / "\'" / "(" / ")"\n / "*" / "+" / "," / ";" / "="\n ; https://datatracker.ietf.org/doc/html/rfc3986#section-2.2\n\n; https://datatracker.ietf.org/doc/html/rfc5234#appendix-B.1\nALPHA = %x41-5A / %x61-7A ; A-Z / a-z\nDIGIT = %x30-39 ; 0-9\nHEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"\n'}}const callbacks_slash=(s,o,i,a,u)=>(s===Pp.SEM_PRE?u.push(["slash",jp.charsToString(o,i,a)]):Pp.SEM_POST,Pp.SEM_OK),path_template=(s,o,i,a,u)=>{if(s===Pp.SEM_PRE){if(!1===Array.isArray(u))throw new Error("parser's user data must be an array");u.push(["path-template",jp.charsToString(o,i,a)])}return Pp.SEM_OK},path_literal=(s,o,i,a,u)=>(s===Pp.SEM_PRE?u.push(["path-literal",jp.charsToString(o,i,a)]):Pp.SEM_POST,Pp.SEM_OK),template_expression=(s,o,i,a,u)=>(s===Pp.SEM_PRE?u.push(["template-expression",jp.charsToString(o,i,a)]):Pp.SEM_POST,Pp.SEM_OK),template_expression_param_name=(s,o,i,a,u)=>(s===Pp.SEM_PRE?u.push(["template-expression-param-name",jp.charsToString(o,i,a)]):Pp.SEM_POST,Pp.SEM_OK),Dx=new path_templating_grammar,openapi_path_templating_es_parse=s=>{const o=new kp;o.ast=new Op,o.ast.callbacks["path-template"]=path_template,o.ast.callbacks.slash=callbacks_slash,o.ast.callbacks["path-literal"]=path_literal,o.ast.callbacks["template-expression"]=template_expression,o.ast.callbacks["template-expression-param-name"]=template_expression_param_name;return{result:o.parse(Dx,"path-template",s),ast:o.ast}},encodePathComponent=s=>(s=>{try{return"string"==typeof s&&decodeURIComponent(s)!==s}catch{return!1}})(s)?s:encodeURIComponent(s).replace(/%5B/g,"[").replace(/%5D/g,"]"),Lx=["slash","path-literal","template-expression-param-name"],es_resolve=(s,o,i={})=>{const a={...{encoder:encodePathComponent},...i},u=openapi_path_templating_es_parse(s);if(!u.result.success)return s;const _=[];u.ast.translate(_);const w=_.filter((([s])=>Lx.includes(s))).map((([s,i])=>"template-expression-param-name"===s?Object.prototype.hasOwnProperty.call(o,i)?a.encoder(o[i],i):`{${i}}`:i));return w.join("")},Fx=(new path_templating_grammar,new kp,{body:function bodyBuilder({req:s,value:o}){void 0!==o&&(s.body=o)},header:function headerBuilder({req:s,parameter:o,value:i}){s.headers=s.headers||{},void 0!==i&&(s.headers[o.name]=i)},query:function queryBuilder({req:s,value:o,parameter:i}){s.query=s.query||{},!1===o&&"boolean"===i.type&&(o="false");0===o&&["number","integer"].indexOf(i.type)>-1&&(o="0");if(o)s.query[i.name]={collectionFormat:i.collectionFormat,value:o};else if(i.allowEmptyValue&&void 0!==o){const o=i.name;s.query[o]=s.query[o]||{},s.query[o].allowEmptyValue=!0}},path:function pathBuilder({req:s,value:o,parameter:i,baseURL:a}){if(void 0!==o){const u=s.url.replace(a,""),_=es_resolve(u,{[i.name]:o});s.url=a+_}},formData:function formDataBuilder({req:s,value:o,parameter:i}){!1===o&&"boolean"===i.type&&(o="false");0===o&&["number","integer"].indexOf(i.type)>-1&&(o="0");if(o)s.form=s.form||{},s.form[i.name]={collectionFormat:i.collectionFormat,value:o};else if(i.allowEmptyValue&&void 0!==o){s.form=s.form||{};const o=i.name;s.form[o]=s.form[o]||{},s.form[o].allowEmptyValue=!0}}});function serialize(s,o){return o.includes("application/json")?"string"==typeof s?s:(Array.isArray(s)&&(s=s.map((s=>{try{return JSON.parse(s)}catch(o){return s}}))),JSON.stringify(s)):String(s)}function grammar_grammar(){this.grammarObject="grammarObject",this.rules=[],this.rules[0]={name:"lenient-cookie-string",lower:"lenient-cookie-string",index:0,isBkr:!1},this.rules[1]={name:"lenient-cookie-entry",lower:"lenient-cookie-entry",index:1,isBkr:!1},this.rules[2]={name:"lenient-cookie-pair",lower:"lenient-cookie-pair",index:2,isBkr:!1},this.rules[3]={name:"lenient-cookie-pair-invalid",lower:"lenient-cookie-pair-invalid",index:3,isBkr:!1},this.rules[4]={name:"lenient-cookie-name",lower:"lenient-cookie-name",index:4,isBkr:!1},this.rules[5]={name:"lenient-cookie-value",lower:"lenient-cookie-value",index:5,isBkr:!1},this.rules[6]={name:"lenient-quoted-value",lower:"lenient-quoted-value",index:6,isBkr:!1},this.rules[7]={name:"lenient-quoted-char",lower:"lenient-quoted-char",index:7,isBkr:!1},this.rules[8]={name:"lenient-cookie-octet",lower:"lenient-cookie-octet",index:8,isBkr:!1},this.rules[9]={name:"cookie-string",lower:"cookie-string",index:9,isBkr:!1},this.rules[10]={name:"cookie-pair",lower:"cookie-pair",index:10,isBkr:!1},this.rules[11]={name:"cookie-name",lower:"cookie-name",index:11,isBkr:!1},this.rules[12]={name:"cookie-value",lower:"cookie-value",index:12,isBkr:!1},this.rules[13]={name:"cookie-octet",lower:"cookie-octet",index:13,isBkr:!1},this.rules[14]={name:"OWS",lower:"ows",index:14,isBkr:!1},this.rules[15]={name:"token",lower:"token",index:15,isBkr:!1},this.rules[16]={name:"tchar",lower:"tchar",index:16,isBkr:!1},this.rules[17]={name:"CHAR",lower:"char",index:17,isBkr:!1},this.rules[18]={name:"CTL",lower:"ctl",index:18,isBkr:!1},this.rules[19]={name:"separators",lower:"separators",index:19,isBkr:!1},this.rules[20]={name:"SP",lower:"sp",index:20,isBkr:!1},this.rules[21]={name:"HT",lower:"ht",index:21,isBkr:!1},this.rules[22]={name:"ALPHA",lower:"alpha",index:22,isBkr:!1},this.rules[23]={name:"DIGIT",lower:"digit",index:23,isBkr:!1},this.rules[24]={name:"DQUOTE",lower:"dquote",index:24,isBkr:!1},this.rules[25]={name:"WSP",lower:"wsp",index:25,isBkr:!1},this.rules[26]={name:"HTAB",lower:"htab",index:26,isBkr:!1},this.rules[27]={name:"CRLF",lower:"crlf",index:27,isBkr:!1},this.rules[28]={name:"CR",lower:"cr",index:28,isBkr:!1},this.rules[29]={name:"LF",lower:"lf",index:29,isBkr:!1},this.udts=[],this.rules[0].opcodes=[],this.rules[0].opcodes[0]={type:2,children:[1,2]},this.rules[0].opcodes[1]={type:4,index:1},this.rules[0].opcodes[2]={type:3,min:0,max:1/0},this.rules[0].opcodes[3]={type:2,children:[4,5,6]},this.rules[0].opcodes[4]={type:7,string:[59]},this.rules[0].opcodes[5]={type:4,index:14},this.rules[0].opcodes[6]={type:4,index:1},this.rules[1].opcodes=[],this.rules[1].opcodes[0]={type:1,children:[1,2]},this.rules[1].opcodes[1]={type:4,index:2},this.rules[1].opcodes[2]={type:4,index:3},this.rules[2].opcodes=[],this.rules[2].opcodes[0]={type:2,children:[1,2,3,4,5,6,7]},this.rules[2].opcodes[1]={type:4,index:14},this.rules[2].opcodes[2]={type:4,index:4},this.rules[2].opcodes[3]={type:4,index:14},this.rules[2].opcodes[4]={type:7,string:[61]},this.rules[2].opcodes[5]={type:4,index:14},this.rules[2].opcodes[6]={type:4,index:5},this.rules[2].opcodes[7]={type:4,index:14},this.rules[3].opcodes=[],this.rules[3].opcodes[0]={type:2,children:[1,2,4]},this.rules[3].opcodes[1]={type:4,index:14},this.rules[3].opcodes[2]={type:3,min:1,max:1/0},this.rules[3].opcodes[3]={type:4,index:16},this.rules[3].opcodes[4]={type:4,index:14},this.rules[4].opcodes=[],this.rules[4].opcodes[0]={type:3,min:1,max:1/0},this.rules[4].opcodes[1]={type:1,children:[2,3,4]},this.rules[4].opcodes[2]={type:5,min:33,max:58},this.rules[4].opcodes[3]={type:6,string:[60]},this.rules[4].opcodes[4]={type:5,min:62,max:126},this.rules[5].opcodes=[],this.rules[5].opcodes[0]={type:1,children:[1,6]},this.rules[5].opcodes[1]={type:2,children:[2,3]},this.rules[5].opcodes[2]={type:4,index:6},this.rules[5].opcodes[3]={type:3,min:0,max:1},this.rules[5].opcodes[4]={type:3,min:0,max:1/0},this.rules[5].opcodes[5]={type:4,index:8},this.rules[5].opcodes[6]={type:3,min:0,max:1/0},this.rules[5].opcodes[7]={type:4,index:8},this.rules[6].opcodes=[],this.rules[6].opcodes[0]={type:2,children:[1,2,4]},this.rules[6].opcodes[1]={type:4,index:24},this.rules[6].opcodes[2]={type:3,min:0,max:1/0},this.rules[6].opcodes[3]={type:4,index:7},this.rules[6].opcodes[4]={type:4,index:24},this.rules[7].opcodes=[],this.rules[7].opcodes[0]={type:1,children:[1,2]},this.rules[7].opcodes[1]={type:5,min:32,max:33},this.rules[7].opcodes[2]={type:5,min:35,max:126},this.rules[8].opcodes=[],this.rules[8].opcodes[0]={type:1,children:[1,2,3]},this.rules[8].opcodes[1]={type:5,min:33,max:43},this.rules[8].opcodes[2]={type:5,min:45,max:58},this.rules[8].opcodes[3]={type:5,min:60,max:126},this.rules[9].opcodes=[],this.rules[9].opcodes[0]={type:2,children:[1,2]},this.rules[9].opcodes[1]={type:4,index:10},this.rules[9].opcodes[2]={type:3,min:0,max:1/0},this.rules[9].opcodes[3]={type:2,children:[4,5,6]},this.rules[9].opcodes[4]={type:7,string:[59]},this.rules[9].opcodes[5]={type:4,index:20},this.rules[9].opcodes[6]={type:4,index:10},this.rules[10].opcodes=[],this.rules[10].opcodes[0]={type:2,children:[1,2,3]},this.rules[10].opcodes[1]={type:4,index:11},this.rules[10].opcodes[2]={type:7,string:[61]},this.rules[10].opcodes[3]={type:4,index:12},this.rules[11].opcodes=[],this.rules[11].opcodes[0]={type:4,index:15},this.rules[12].opcodes=[],this.rules[12].opcodes[0]={type:1,children:[1,6]},this.rules[12].opcodes[1]={type:2,children:[2,3,5]},this.rules[12].opcodes[2]={type:4,index:24},this.rules[12].opcodes[3]={type:3,min:0,max:1/0},this.rules[12].opcodes[4]={type:4,index:13},this.rules[12].opcodes[5]={type:4,index:24},this.rules[12].opcodes[6]={type:3,min:0,max:1/0},this.rules[12].opcodes[7]={type:4,index:13},this.rules[13].opcodes=[],this.rules[13].opcodes[0]={type:1,children:[1,2,3,4,5]},this.rules[13].opcodes[1]={type:6,string:[33]},this.rules[13].opcodes[2]={type:5,min:35,max:43},this.rules[13].opcodes[3]={type:5,min:45,max:58},this.rules[13].opcodes[4]={type:5,min:60,max:91},this.rules[13].opcodes[5]={type:5,min:93,max:126},this.rules[14].opcodes=[],this.rules[14].opcodes[0]={type:3,min:0,max:1/0},this.rules[14].opcodes[1]={type:2,children:[2,4]},this.rules[14].opcodes[2]={type:3,min:0,max:1},this.rules[14].opcodes[3]={type:4,index:27},this.rules[14].opcodes[4]={type:4,index:25},this.rules[15].opcodes=[],this.rules[15].opcodes[0]={type:3,min:1,max:1/0},this.rules[15].opcodes[1]={type:4,index:16},this.rules[16].opcodes=[],this.rules[16].opcodes[0]={type:1,children:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]},this.rules[16].opcodes[1]={type:7,string:[33]},this.rules[16].opcodes[2]={type:7,string:[35]},this.rules[16].opcodes[3]={type:7,string:[36]},this.rules[16].opcodes[4]={type:7,string:[37]},this.rules[16].opcodes[5]={type:7,string:[38]},this.rules[16].opcodes[6]={type:7,string:[39]},this.rules[16].opcodes[7]={type:7,string:[42]},this.rules[16].opcodes[8]={type:7,string:[43]},this.rules[16].opcodes[9]={type:7,string:[45]},this.rules[16].opcodes[10]={type:7,string:[46]},this.rules[16].opcodes[11]={type:7,string:[94]},this.rules[16].opcodes[12]={type:7,string:[95]},this.rules[16].opcodes[13]={type:7,string:[96]},this.rules[16].opcodes[14]={type:7,string:[124]},this.rules[16].opcodes[15]={type:7,string:[126]},this.rules[16].opcodes[16]={type:4,index:23},this.rules[16].opcodes[17]={type:4,index:22},this.rules[17].opcodes=[],this.rules[17].opcodes[0]={type:5,min:1,max:127},this.rules[18].opcodes=[],this.rules[18].opcodes[0]={type:1,children:[1,2]},this.rules[18].opcodes[1]={type:5,min:0,max:31},this.rules[18].opcodes[2]={type:6,string:[127]},this.rules[19].opcodes=[],this.rules[19].opcodes[0]={type:1,children:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]},this.rules[19].opcodes[1]={type:7,string:[40]},this.rules[19].opcodes[2]={type:7,string:[41]},this.rules[19].opcodes[3]={type:7,string:[60]},this.rules[19].opcodes[4]={type:7,string:[62]},this.rules[19].opcodes[5]={type:7,string:[64]},this.rules[19].opcodes[6]={type:7,string:[44]},this.rules[19].opcodes[7]={type:7,string:[59]},this.rules[19].opcodes[8]={type:7,string:[58]},this.rules[19].opcodes[9]={type:7,string:[92]},this.rules[19].opcodes[10]={type:6,string:[34]},this.rules[19].opcodes[11]={type:7,string:[47]},this.rules[19].opcodes[12]={type:7,string:[91]},this.rules[19].opcodes[13]={type:7,string:[93]},this.rules[19].opcodes[14]={type:7,string:[63]},this.rules[19].opcodes[15]={type:7,string:[61]},this.rules[19].opcodes[16]={type:7,string:[123]},this.rules[19].opcodes[17]={type:7,string:[125]},this.rules[19].opcodes[18]={type:4,index:20},this.rules[19].opcodes[19]={type:4,index:21},this.rules[20].opcodes=[],this.rules[20].opcodes[0]={type:6,string:[32]},this.rules[21].opcodes=[],this.rules[21].opcodes[0]={type:6,string:[9]},this.rules[22].opcodes=[],this.rules[22].opcodes[0]={type:1,children:[1,2]},this.rules[22].opcodes[1]={type:5,min:65,max:90},this.rules[22].opcodes[2]={type:5,min:97,max:122},this.rules[23].opcodes=[],this.rules[23].opcodes[0]={type:5,min:48,max:57},this.rules[24].opcodes=[],this.rules[24].opcodes[0]={type:6,string:[34]},this.rules[25].opcodes=[],this.rules[25].opcodes[0]={type:1,children:[1,2]},this.rules[25].opcodes[1]={type:4,index:20},this.rules[25].opcodes[2]={type:4,index:26},this.rules[26].opcodes=[],this.rules[26].opcodes[0]={type:6,string:[9]},this.rules[27].opcodes=[],this.rules[27].opcodes[0]={type:2,children:[1,2]},this.rules[27].opcodes[1]={type:4,index:28},this.rules[27].opcodes[2]={type:4,index:29},this.rules[28].opcodes=[],this.rules[28].opcodes[0]={type:6,string:[13]},this.rules[29].opcodes=[],this.rules[29].opcodes[0]={type:6,string:[10]},this.toString=function toString(){let s="";return s+="; Lenient version of https://datatracker.ietf.org/doc/html/rfc6265#section-4.2.1\n",s+='lenient-cookie-string = lenient-cookie-entry *( ";" OWS lenient-cookie-entry )\n',s+="lenient-cookie-entry = lenient-cookie-pair / lenient-cookie-pair-invalid\n",s+='lenient-cookie-pair = OWS lenient-cookie-name OWS "=" OWS lenient-cookie-value OWS\n',s+='lenient-cookie-pair-invalid = OWS 1*tchar OWS ; Allow for standalone entries like "fizz" to be ignored\n',s+='lenient-cookie-name = 1*( %x21-3A / %x3C / %x3E-7E ) ; Allow all printable US-ASCII except "="\n',s+="lenient-cookie-value = lenient-quoted-value [ *lenient-cookie-octet ] / *lenient-cookie-octet\n",s+="lenient-quoted-value = DQUOTE *( lenient-quoted-char ) DQUOTE\n",s+="lenient-quoted-char = %x20-21 / %x23-7E ; Allow all printable US-ASCII except DQUOTE\n",s+="lenient-cookie-octet = %x21-2B / %x2D-3A / %x3C-7E\n",s+=" ; Allow all printable characters except CTLs, semicolon and SP\n",s+="\n",s+="; https://datatracker.ietf.org/doc/html/rfc6265#section-4.2.1\n",s+='cookie-string = cookie-pair *( ";" SP cookie-pair )\n',s+="\n",s+="; https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.1\n",s+="; https://www.rfc-editor.org/errata/eid5518\n",s+='cookie-pair = cookie-name "=" cookie-value\n',s+="cookie-name = token\n",s+="cookie-value = ( DQUOTE *cookie-octet DQUOTE ) / *cookie-octet\n",s+=" ; https://www.rfc-editor.org/errata/eid8242\n",s+="cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n",s+=" ; US-ASCII characters excluding CTLs,\n",s+=" ; whitespace, DQUOTE, comma, semicolon,\n",s+=" ; and backslash\n",s+="\n",s+="; https://datatracker.ietf.org/doc/html/rfc6265#section-2.2\n",s+='OWS = *( [ CRLF ] WSP ) ; "optional" whitespace\n',s+="\n",s+="; https://datatracker.ietf.org/doc/html/rfc9110#section-5.6.2\n",s+="token = 1*(tchar)\n",s+='tchar = "!" / "#" / "$" / "%" / "&" / "\'" / "*"\n',s+=' / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"\n',s+=" / DIGIT / ALPHA\n",s+=" ; any VCHAR, except delimiters\n",s+="\n",s+="; https://datatracker.ietf.org/doc/html/rfc2616#section-2.2\n",s+="CHAR = %x01-7F ; any US-ASCII character (octets 0 - 127)\n",s+="CTL = %x00-1F / %x7F ; any US-ASCII control character\n",s+='separators = "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / "\\" / %x22 / "/" / "[" / "]" / "?" / "=" / "{" / "}" / SP / HT\n',s+="SP = %x20 ; US-ASCII SP, space (32)\n",s+="HT = %x09 ; US-ASCII HT, horizontal-tab (9)\n",s+="\n",s+="; https://datatracker.ietf.org/doc/html/rfc5234#appendix-B.1\n",s+="ALPHA = %x41-5A / %x61-7A ; A-Z / a-z\n",s+="DIGIT = %x30-39 ; 0-9\n",s+='DQUOTE = %x22 ; " (Double Quote)\n',s+="WSP = SP / HTAB ; white space\n",s+="HTAB = %x09 ; horizontal tab\n",s+="CRLF = CR LF ; Internet standard newline\n",s+="CR = %x0D ; carriage return\n",s+="LF = %x0A ; linefeed\n",'; Lenient version of https://datatracker.ietf.org/doc/html/rfc6265#section-4.2.1\nlenient-cookie-string = lenient-cookie-entry *( ";" OWS lenient-cookie-entry )\nlenient-cookie-entry = lenient-cookie-pair / lenient-cookie-pair-invalid\nlenient-cookie-pair = OWS lenient-cookie-name OWS "=" OWS lenient-cookie-value OWS\nlenient-cookie-pair-invalid = OWS 1*tchar OWS ; Allow for standalone entries like "fizz" to be ignored\nlenient-cookie-name = 1*( %x21-3A / %x3C / %x3E-7E ) ; Allow all printable US-ASCII except "="\nlenient-cookie-value = lenient-quoted-value [ *lenient-cookie-octet ] / *lenient-cookie-octet\nlenient-quoted-value = DQUOTE *( lenient-quoted-char ) DQUOTE\nlenient-quoted-char = %x20-21 / %x23-7E ; Allow all printable US-ASCII except DQUOTE\nlenient-cookie-octet = %x21-2B / %x2D-3A / %x3C-7E\n ; Allow all printable characters except CTLs, semicolon and SP\n\n; https://datatracker.ietf.org/doc/html/rfc6265#section-4.2.1\ncookie-string = cookie-pair *( ";" SP cookie-pair )\n\n; https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.1\n; https://www.rfc-editor.org/errata/eid5518\ncookie-pair = cookie-name "=" cookie-value\ncookie-name = token\ncookie-value = ( DQUOTE *cookie-octet DQUOTE ) / *cookie-octet\n ; https://www.rfc-editor.org/errata/eid8242\ncookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n ; US-ASCII characters excluding CTLs,\n ; whitespace, DQUOTE, comma, semicolon,\n ; and backslash\n\n; https://datatracker.ietf.org/doc/html/rfc6265#section-2.2\nOWS = *( [ CRLF ] WSP ) ; "optional" whitespace\n\n; https://datatracker.ietf.org/doc/html/rfc9110#section-5.6.2\ntoken = 1*(tchar)\ntchar = "!" / "#" / "$" / "%" / "&" / "\'" / "*"\n / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"\n / DIGIT / ALPHA\n ; any VCHAR, except delimiters\n\n; https://datatracker.ietf.org/doc/html/rfc2616#section-2.2\nCHAR = %x01-7F ; any US-ASCII character (octets 0 - 127)\nCTL = %x00-1F / %x7F ; any US-ASCII control character\nseparators = "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / "\\" / %x22 / "/" / "[" / "]" / "?" / "=" / "{" / "}" / SP / HT\nSP = %x20 ; US-ASCII SP, space (32)\nHT = %x09 ; US-ASCII HT, horizontal-tab (9)\n\n; https://datatracker.ietf.org/doc/html/rfc5234#appendix-B.1\nALPHA = %x41-5A / %x61-7A ; A-Z / a-z\nDIGIT = %x30-39 ; 0-9\nDQUOTE = %x22 ; " (Double Quote)\nWSP = SP / HTAB ; white space\nHTAB = %x09 ; horizontal tab\nCRLF = CR LF ; Internet standard newline\nCR = %x0D ; carriage return\nLF = %x0A ; linefeed\n'}}new grammar_grammar;const utils_percentEncodeChar=s=>{if("string"!=typeof s||1!==[...s].length)throw new TypeError("Input must be a single character string.");const o=s.codePointAt(0);return o<=127?`%${o.toString(16).toUpperCase().padStart(2,"0")}`:encodeURIComponent(s)},utils_isQuoted=s=>s.length>=2&&s.startsWith('"')&&s.endsWith('"'),utils_unquote=s=>utils_isQuoted(s)?s.slice(1,-1):s,utils_quote=s=>`"${s}"`,utils_identity=s=>s,Bx=new kp,$x=new grammar_grammar,test_cookie_value=(s,{strict:o=!0,quoted:i=null}={})=>{try{const a=o?"cookie-value":"lenient-cookie-value",u=Bx.parse($x,a,s);return"boolean"==typeof i?u.success&&i===utils_isQuoted(s):u.success}catch{return!1}},base64_browser=s=>{const o=(new TextEncoder).encode(s).reduce(((s,o)=>s+String.fromCharCode(o)),"");return btoa(o)},cookie_value_strict_base64=(s,o=base64_browser)=>{const i=String(s);if(test_cookie_value(i))return i;const a=utils_isQuoted(i),u=o(a?utils_unquote(i):i);return a?utils_quote(u):u},base64url_browser=s=>(s=>s.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,""))(base64_browser(s)),cookie_value_strict_base64url=s=>cookie_value_strict_base64(s,base64url_browser),qx=new kp,Ux=new grammar_grammar,test_cookie_name=(s,{strict:o=!0}={})=>{try{const i=o?"cookie-name":"lenient-cookie-name";return qx.parse(Ux,i,s).success}catch{return!1}},cookie_name_strict=s=>{if(!test_cookie_name(s))throw new TypeError(`Invalid cookie name: ${s}`)},cookie_value_strict=s=>{if(!test_cookie_value(s))throw new TypeError(`Invalid cookie value: ${s}`)},Vx={encoders:{name:utils_identity,value:cookie_value_strict_base64url},validators:{name:cookie_name_strict,value:cookie_value_strict}},set_cookie_serialize=(s,o,i={})=>{const a={...Vx,...i,encoders:{...Vx.encoders,...i.encoders},validators:{...Vx.validators,...i.validators}},u=a.encoders.name(s),_=a.encoders.value(o);return a.validators.name(u),a.validators.value(_),`${u}=${_}`},cookie_serialize=(s,o={})=>(Array.isArray(s)?s:"object"==typeof s&&null!==s?Object.entries(s):[]).map((([s,i])=>set_cookie_serialize(s,i,o))).join("; "),zx=new kp,Wx=new grammar_grammar,cookie_value_strict_percent=s=>{const o=String(s);if(test_cookie_value(o))return o;const i=utils_isQuoted(o),a=i?utils_unquote(o):o;let u="";for(const s of a)u+=zx.parse(Wx,"cookie-octet",s).success?s:utils_percentEncodeChar(s);return i?utils_quote(u):u},Jx=(new kp,new grammar_grammar,s=>{if(!test_cookie_name(s,{strict:!1}))throw new TypeError(`Invalid cookie name: ${s}`)}),valuePercentEncoder=s=>cookie_value_strict_percent(s).replace(/[=&]/gu,(s=>"="===s?"%3D":"%26")),helpers_cookie_serialize=(s,o={})=>cookie_serialize(s,up({encoders:{name:utils_identity,value:valuePercentEncoder},validators:{name:Jx,value:cookie_value_strict}},o));function parameter_builders_path({req:s,value:o,parameter:i,baseURL:a}){const{name:u,style:_,explode:w,content:x}=i;if(void 0===o)return;const C=s.url.replace(a,"");let j;if(x){const s=Object.keys(x)[0];j=es_resolve(C,{[u]:o},{encoder:o=>encodeCharacters(serialize(o,s))})}else j=es_resolve(C,{[u]:o},{encoder:s=>stylize({key:i.name,value:s,style:_||"simple",explode:null!=w&&w,escape:"reserved"})});s.url=a+j}function query({req:s,value:o,parameter:i}){if(s.query=s.query||{},void 0!==o&&i.content){const a=serialize(o,Object.keys(i.content)[0]);if(a)s.query[i.name]=a;else if(i.allowEmptyValue){const o=i.name;s.query[o]=s.query[o]||{},s.query[o].allowEmptyValue=!0}}else if(!1===o&&(o="false"),0===o&&(o="0"),o){const{style:a,explode:u,allowReserved:_}=i;s.query[i.name]={value:o,serializationOption:{style:a,explode:u,allowReserved:_}}}else if(i.allowEmptyValue&&void 0!==o){const o=i.name;s.query[o]=s.query[o]||{},s.query[o].allowEmptyValue=!0}}const Hx=["accept","authorization","content-type"];function parameter_builders_header({req:s,parameter:o,value:i}){if(s.headers=s.headers||{},!(Hx.indexOf(o.name.toLowerCase())>-1))if(void 0!==i&&o.content){const a=Object.keys(o.content)[0];s.headers[o.name]=serialize(i,a)}else void 0===i||Array.isArray(i)&&0===i.length||(s.headers[o.name]=stylize({key:o.name,value:i,style:o.style||"simple",explode:void 0!==o.explode&&o.explode,escape:!1}))}function cookie({req:s,parameter:o,value:i}){const{name:a}=o;if(s.headers=s.headers||{},void 0!==i&&o.content){const u=serialize(i,Object.keys(o.content)[0]);s.headers.Cookie=helpers_cookie_serialize({[a]:u})}else if(void 0!==i&&(!Array.isArray(i)||0!==i.length)){var u;const _=stylize({key:o.name,value:i,escape:!1,style:o.style||"form",explode:null!==(u=o.explode)&&void 0!==u&&u}),w=Array.isArray(i)&&o.explode?`${a}=${_}`:_;s.headers.Cookie=helpers_cookie_serialize({[a]:w})}}const Kx="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:window,{btoa:Gx}=Kx,Yx=Gx;function buildRequest(s,o){const{operation:i,requestBody:a,securities:u,spec:_,attachContentTypeForEmptyPayload:w}=s;let{requestContentType:x}=s;o=function applySecurities({request:s,securities:o={},operation:i={},spec:a}){var u;const _={...s},{authorized:w={}}=o,x=i.security||a.security||[],C=w&&!!Object.keys(w).length,j=(null==a||null===(u=a.components)||void 0===u?void 0:u.securitySchemes)||{};if(_.headers=_.headers||{},_.query=_.query||{},!Object.keys(o).length||!C||!x||Array.isArray(i.security)&&!i.security.length)return s;return x.forEach((s=>{Object.keys(s).forEach((s=>{const o=w[s],i=j[s];if(!o)return;const a=o.value||o,{type:u}=i;if(o)if("apiKey"===u)"query"===i.in&&(_.query[i.name]=a),"header"===i.in&&(_.headers[i.name]=a),"cookie"===i.in&&(_.cookies[i.name]=a);else if("http"===u){if(/^basic$/i.test(i.scheme)){const s=a.username||"",o=a.password||"",i=Yx(`${s}:${o}`);_.headers.Authorization=`Basic ${i}`}/^bearer$/i.test(i.scheme)&&(_.headers.Authorization=`Bearer ${a}`)}else if("oauth2"===u||"openIdConnect"===u){const s=o.token||{},a=s[i["x-tokenName"]||"access_token"];let u=s.token_type;u&&"bearer"!==u.toLowerCase()||(u="Bearer"),_.headers.Authorization=`${u} ${a}`}}))})),_}({request:o,securities:u,operation:i,spec:_});const C=i.requestBody||{},j=Object.keys(C.content||{}),L=x&&j.indexOf(x)>-1;if(a||w){if(x&&L)o.headers["Content-Type"]=x;else if(!x){const s=j[0];s&&(o.headers["Content-Type"]=s,x=s)}}else x&&L&&(o.headers["Content-Type"]=x);if(!s.responseContentType&&i.responses){const s=Object.entries(i.responses).filter((([s,o])=>{const i=parseInt(s,10);return i>=200&&i<300&&fu(o.content)})).reduce(((s,[,o])=>s.concat(Object.keys(o.content))),[]);s.length>0&&(o.headers.accept=s.join(", "))}if(a)if(x){if(j.indexOf(x)>-1)if("application/x-www-form-urlencoded"===x||"multipart/form-data"===x)if("object"==typeof a){var B,$;const s=null!==(B=null===($=C.content[x])||void 0===$?void 0:$.encoding)&&void 0!==B?B:{};o.form={},Object.keys(a).forEach((i=>{let u;try{u=JSON.parse(a[i])}catch{u=a[i]}o.form[i]={value:u,encoding:s[i]||{}}}))}else if("string"==typeof a){var U,V;const s=null!==(U=null===(V=C.content[x])||void 0===V?void 0:V.encoding)&&void 0!==U?U:{};try{o.form={};const i=JSON.parse(a);Object.entries(i).forEach((([i,a])=>{o.form[i]={value:a,encoding:s[i]||{}}}))}catch{o.form=a}}else o.form=a;else o.body=a}else o.body=a;return o}function build_request_buildRequest(s,o){const{spec:i,operation:a,securities:u,requestContentType:_,responseContentType:w,attachContentTypeForEmptyPayload:x}=s;if(o=function build_request_applySecurities({request:s,securities:o={},operation:i={},spec:a}){const u={...s},{authorized:_={},specSecurity:w=[]}=o,x=i.security||w,C=_&&!!Object.keys(_).length,j=a.securityDefinitions;if(u.headers=u.headers||{},u.query=u.query||{},!Object.keys(o).length||!C||!x||Array.isArray(i.security)&&!i.security.length)return s;return x.forEach((s=>{Object.keys(s).forEach((s=>{const o=_[s];if(!o)return;const{token:i}=o,a=o.value||o,w=j[s],{type:x}=w,C=w["x-tokenName"]||"access_token",L=i&&i[C];let B=i&&i.token_type;if(o)if("apiKey"===x){const s="query"===w.in?"query":"headers";u[s]=u[s]||{},u[s][w.name]=a}else if("basic"===x)if(a.header)u.headers.authorization=a.header;else{const s=a.username||"",o=a.password||"";a.base64=Yx(`${s}:${o}`),u.headers.authorization=`Basic ${a.base64}`}else"oauth2"===x&&L&&(B=B&&"bearer"!==B.toLowerCase()?B:"Bearer",u.headers.authorization=`${B} ${L}`)}))})),u}({request:o,securities:u,operation:a,spec:i}),o.body||o.form||x)_?o.headers["Content-Type"]=_:Array.isArray(a.consumes)?[o.headers["Content-Type"]]=a.consumes:Array.isArray(i.consumes)?[o.headers["Content-Type"]]=i.consumes:a.parameters&&a.parameters.filter((s=>"file"===s.type)).length?o.headers["Content-Type"]="multipart/form-data":a.parameters&&a.parameters.filter((s=>"formData"===s.in)).length&&(o.headers["Content-Type"]="application/x-www-form-urlencoded");else if(_){const s=a.parameters&&a.parameters.filter((s=>"body"===s.in)).length>0,i=a.parameters&&a.parameters.filter((s=>"formData"===s.in)).length>0;(s||i)&&(o.headers["Content-Type"]=_)}return!w&&Array.isArray(a.produces)&&a.produces.length>0&&(o.headers.accept=a.produces.join(", ")),o}function idFromPathMethodLegacy(s,o){return`${o.toLowerCase()}-${s}`}const arrayOrEmpty=s=>Array.isArray(s)?s:[],findObjectOrArraySchema=(s,{recurse:o=!0,depth:i=1}={})=>{if(fu(s)){if("object"===s.type||"array"===s.type||Array.isArray(s.type)&&(s.type.includes("object")||s.type.includes("array")))return s;if(!(i>Bl)&&o){const a=Array.isArray(s.oneOf)?s.oneOf.find((s=>findObjectOrArraySchema(s,{recurse:o,depth:i+1}))):void 0;if(a)return a;const u=Array.isArray(s.anyOf)?s.anyOf.find((s=>findObjectOrArraySchema(s,{recurse:o,depth:i+1}))):void 0;if(u)return u}}},parseJsonObjectOrArray=({value:s,silentFail:o=!1})=>{try{const i=JSON.parse(s);if(fu(i)||Array.isArray(i))return i;if(!o)throw new Error("Expected JSON serialized object or array")}catch{if(!o)throw new Error("Could not parse parameter value string as JSON Object or JSON Array")}return s},parseURIReference=s=>{try{return new URL(s)}catch{const o=new URL(s,Ll),i=String(s).startsWith("/")?o.pathname:o.pathname.substring(1);return{hash:o.hash,host:"",hostname:"",href:"",origin:"",password:"",pathname:i,port:"",protocol:"",search:o.search,searchParams:o.searchParams}}};class OperationNotFoundError extends Go{}const Xx={buildRequest:execute_buildRequest};function execute_execute({http:s,fetch:o,spec:i,operationId:a,pathName:u,method:_,parameters:w,securities:x,...C}){const j=s||o||http_http;u&&_&&!a&&(a=idFromPathMethodLegacy(u,_));const L=Xx.buildRequest({spec:i,operationId:a,parameters:w,securities:x,http:j,...C});return L.body&&(fu(L.body)||Array.isArray(L.body))&&(L.body=JSON.stringify(L.body)),j(L)}function execute_buildRequest(s){const{spec:o,operationId:i,responseContentType:a,scheme:u,requestInterceptor:_,responseInterceptor:w,contextUrl:x,userFetch:C,server:j,serverVariables:L,http:B,signal:$,serverVariableEncoder:U}=s;let{parameters:V,parameterBuilders:z,baseURL:Y}=s;const Z=isOpenAPI3(o);z||(z=Z?be:Fx);let ee={url:"",credentials:B&&B.withCredentials?"include":"same-origin",headers:{},cookies:{}};$&&(ee.signal=$),_&&(ee.requestInterceptor=_),w&&(ee.responseInterceptor=w),C&&(ee.userFetch=C);const ie=function getOperationRaw(s,o){return s&&s.paths?function findOperation(s,o){return function eachOperation(s,o,i){if(!s||"object"!=typeof s||!s.paths||"object"!=typeof s.paths)return null;const{paths:a}=s;for(const u in a)for(const _ in a[u]){if("PARAMETERS"===_.toUpperCase())continue;const w=a[u][_];if(!w||"object"!=typeof w)continue;const x={spec:s,pathName:u,method:_.toUpperCase(),operation:w},C=o(x);if(i&&C)return x}}(s,o,!0)||null}(s,(({pathName:s,method:i,operation:a})=>{if(!a||"object"!=typeof a)return!1;const u=a.operationId;return[opId(a,s,i),idFromPathMethodLegacy(s,i),u].some((s=>s&&s===o))})):null}(o,i);if(!ie)throw new OperationNotFoundError(`Operation ${i} not found`);const{operation:ae={},method:ce,pathName:le}=ie;if(Y=null!=Y?Y:function baseUrl(s){const o=isOpenAPI3(s.spec);return o?function oas3BaseUrl({spec:s,pathName:o,method:i,server:a,contextUrl:u,serverVariables:_={},serverVariableEncoder:w}){var x,C;let j,L=[],B="";const $=null==s||null===(x=s.paths)||void 0===x||null===(x=x[o])||void 0===x||null===(x=x[(i||"").toLowerCase()])||void 0===x?void 0:x.servers,U=null==s||null===(C=s.paths)||void 0===C||null===(C=C[o])||void 0===C?void 0:C.servers,V=null==s?void 0:s.servers;L=isNonEmptyServerList($)?$:isNonEmptyServerList(U)?U:isNonEmptyServerList(V)?V:[Fl],a&&(j=L.find((s=>s.url===a)),j&&(B=a));B||([j]=L,B=j.url);if(openapi_server_url_templating_es_test(B,{strict:!0})){const s=Object.entries({...j.variables}).reduce(((s,[o,i])=>(s[o]=i.default,s)),{});B=es_substitute(B,{...s,..._},{encoder:"function"==typeof w?w:yw})}return function buildOas3UrlWithContext(s="",o=""){const i=parseURIReference(s&&o?resolve(o,s):s),a=parseURIReference(o),u=stripNonAlpha(i.protocol)||stripNonAlpha(a.protocol),_=i.host||a.host,w=i.pathname;let x;x=u&&_?`${u}://${_+w}`:w;return"/"===x[x.length-1]?x.slice(0,-1):x}(B,u)}(s):function swagger2BaseUrl({spec:s,scheme:o,contextUrl:i=""}){const a=parseURIReference(i),u=Array.isArray(s.schemes)?s.schemes[0]:null,_=o||u||stripNonAlpha(a.protocol)||"http",w=s.host||a.host||"",x=s.basePath||"";let C;C=_&&w?`${_}://${w+x}`:x;return"/"===C[C.length-1]?C.slice(0,-1):C}(s)}({spec:o,scheme:u,contextUrl:x,server:j,serverVariables:L,pathName:le,method:ce,serverVariableEncoder:U}),ee.url+=Y,!i)return delete ee.cookies,ee;ee.url+=le,ee.method=`${ce}`.toUpperCase(),V=V||{};const pe=o.paths[le]||{};a&&(ee.headers.accept=a);const de=(s=>{const o={};s.forEach((s=>{o[s.in]||(o[s.in]={}),o[s.in][s.name]=s}));const i=[];return Object.keys(o).forEach((s=>{Object.keys(o[s]).forEach((a=>{i.push(o[s][a])}))})),i})([].concat(arrayOrEmpty(ae.parameters)).concat(arrayOrEmpty(pe.parameters)));de.forEach((s=>{const i=z[s.in];let a;if("body"===s.in&&s.schema&&s.schema.properties&&(a=V),a=s&&s.name&&V[s.name],void 0===a?a=s&&s.name&&V[`${s.in}.${s.name}`]:((s,o)=>o.filter((o=>o.name===s)))(s.name,de).length>1&&console.warn(`Parameter '${s.name}' is ambiguous because the defined spec has more than one parameter with the name: '${s.name}' and the passed-in parameter values did not define an 'in' value.`),null!==a){if(void 0!==s.default&&void 0===a&&(a=s.default),void 0===a&&s.required&&!s.allowEmptyValue)throw new Error(`Required parameter ${s.name} is not provided`);Z&&"string"==typeof a&&(Yu("type",s.schema)&&"string"==typeof s.schema.type&&findObjectOrArraySchema(s.schema,{recurse:!1})?a=parseJsonObjectOrArray({value:a,silentFail:!1}):(Yu("type",s.schema)&&Array.isArray(s.schema.type)&&findObjectOrArraySchema(s.schema,{recurse:!1})||!Yu("type",s.schema)&&findObjectOrArraySchema(s.schema,{recurse:!0}))&&(a=parseJsonObjectOrArray({value:a,silentFail:!0}))),i&&i({req:ee,parameter:s,value:a,operation:ae,spec:o,baseURL:Y})}}));const fe={...s,operation:ae};if(ee=Z?buildRequest(fe,ee):build_request_buildRequest(fe,ee),ee.cookies&&Object.keys(ee.cookies).length>0){const s=helpers_cookie_serialize(ee.cookies);Id(ee.headers.Cookie)?ee.headers.Cookie+=`; ${s}`:ee.headers.Cookie=s}return ee.cookies&&delete ee.cookies,serializeRequest(ee)}const stripNonAlpha=s=>s?s.replace(/\W/g,""):null;const isNonEmptyServerList=s=>Array.isArray(s)&&s.length>0;const makeResolveSubtree=s=>async(o,i,a={})=>(async(s,o,i={})=>{const{returnEntireTree:a,baseDoc:u,requestInterceptor:_,responseInterceptor:w,parameterMacro:x,modelPropertyMacro:C,useCircularStructures:j,strategies:L}=i,B={spec:s,pathDiscriminator:o,baseDoc:u,requestInterceptor:_,responseInterceptor:w,parameterMacro:x,modelPropertyMacro:C,useCircularStructures:j,strategies:L},$=L.find((o=>o.match(s))).normalize(s),U=await Nx({spec:$,...B,allowMetaPatches:!0,skipNormalization:!isOpenAPI31(s)});return!a&&Array.isArray(o)&&o.length&&(U.spec=o.reduce(((s,o)=>null==s?void 0:s[o]),U.spec)||null),U})(o,i,{...s,...a}),Qx=(makeResolveSubtree({strategies:[_u,vu,gu]}),(s,o)=>(...i)=>{s(...i);const a=o.getConfigs().withCredentials;o.fn.fetch.withCredentials=a});function swagger_client({configs:s,getConfigs:o}){return{fn:{fetch:(i=http_http,a=s.preFetch,u=s.postFetch,u=u||(s=>s),a=a||(s=>s),s=>("string"==typeof s&&(s={url:s}),s=serializeRequest(s),s=a(s),u(i(s)))),buildRequest:execute_buildRequest,execute:execute_execute,resolve:makeResolve({strategies:[Tx,_u,vu,gu]}),resolveSubtree:async(s,i,a={})=>{const u=o(),_={modelPropertyMacro:u.modelPropertyMacro,parameterMacro:u.parameterMacro,requestInterceptor:u.requestInterceptor,responseInterceptor:u.responseInterceptor,strategies:[Tx,_u,vu,gu]};return makeResolveSubtree(_)(s,i,a)},serializeRes:serializeResponse,opId},statePlugins:{configs:{wrapActions:{loaded:Qx}}}};var i,a,u}function util(){return{fn:{shallowEqualKeys,sanitizeUrl}}}var Zx=__webpack_require__(40961),tk=(__webpack_require__(78418),Re.version.startsWith("19")),rk=Symbol.for(tk?"react.transitional.element":"react.element"),nk=Symbol.for("react.portal"),sk=Symbol.for("react.fragment"),ok=Symbol.for("react.strict_mode"),lk=Symbol.for("react.profiler"),uk=Symbol.for("react.consumer"),pk=Symbol.for("react.context"),fk=Symbol.for("react.forward_ref"),mk=Symbol.for("react.suspense"),yk=Symbol.for("react.suspense_list"),vk=Symbol.for("react.memo"),_k=Symbol.for("react.lazy"),wk=fk,xk=vk;function typeOf(s){if("object"==typeof s&&null!==s){const{$$typeof:o}=s;switch(o){case rk:switch(s=s.type){case sk:case lk:case ok:case mk:case yk:return s;default:switch(s=s&&s.$$typeof){case pk:case fk:case _k:case vk:case uk:return s;default:return o}}case nk:return o}}}function pureFinalPropsSelectorFactory(s,o,i,a,{areStatesEqual:u,areOwnPropsEqual:_,areStatePropsEqual:w}){let x,C,j,L,B,$=!1;function handleSubsequentCalls($,U){const V=!_(U,C),z=!u($,x,U,C);return x=$,C=U,V&&z?function handleNewPropsAndNewState(){return j=s(x,C),o.dependsOnOwnProps&&(L=o(a,C)),B=i(j,L,C),B}():V?function handleNewProps(){return s.dependsOnOwnProps&&(j=s(x,C)),o.dependsOnOwnProps&&(L=o(a,C)),B=i(j,L,C),B}():z?function handleNewState(){const o=s(x,C),a=!w(o,j);return j=o,a&&(B=i(j,L,C)),B}():B}return function pureFinalPropsSelector(u,_){return $?handleSubsequentCalls(u,_):function handleFirstCall(u,_){return x=u,C=_,j=s(x,C),L=o(a,C),B=i(j,L,C),$=!0,B}(u,_)}}function wrapMapToPropsConstant(s){return function initConstantSelector(o){const i=s(o);function constantSelector(){return i}return constantSelector.dependsOnOwnProps=!1,constantSelector}}function getDependsOnOwnProps(s){return s.dependsOnOwnProps?Boolean(s.dependsOnOwnProps):1!==s.length}function wrapMapToPropsFunc(s,o){return function initProxySelector(o,{displayName:i}){const a=function mapToPropsProxy(s,o){return a.dependsOnOwnProps?a.mapToProps(s,o):a.mapToProps(s,void 0)};return a.dependsOnOwnProps=!0,a.mapToProps=function detectFactoryAndVerify(o,i){a.mapToProps=s,a.dependsOnOwnProps=getDependsOnOwnProps(s);let u=a(o,i);return"function"==typeof u&&(a.mapToProps=u,a.dependsOnOwnProps=getDependsOnOwnProps(u),u=a(o,i)),u},a}}function createInvalidArgFactory(s,o){return(i,a)=>{throw new Error(`Invalid value of type ${typeof s} for ${o} argument when connecting component ${a.wrappedComponentName}.`)}}function defaultMergeProps(s,o,i){return{...i,...s,...o}}function defaultNoopBatch(s){s()}var Ak={notify(){},get:()=>[]};function createSubscription(s,o){let i,a=Ak,u=0,_=!1;function handleChangeWrapper(){w.onStateChange&&w.onStateChange()}function trySubscribe(){u++,i||(i=o?o.addNestedSub(handleChangeWrapper):s.subscribe(handleChangeWrapper),a=function createListenerCollection(){let s=null,o=null;return{clear(){s=null,o=null},notify(){defaultNoopBatch((()=>{let o=s;for(;o;)o.callback(),o=o.next}))},get(){const o=[];let i=s;for(;i;)o.push(i),i=i.next;return o},subscribe(i){let a=!0;const u=o={callback:i,next:null,prev:o};return u.prev?u.prev.next=u:s=u,function unsubscribe(){a&&null!==s&&(a=!1,u.next?u.next.prev=u.prev:o=u.prev,u.prev?u.prev.next=u.next:s=u.next)}}}}())}function tryUnsubscribe(){u--,i&&0===u&&(i(),i=void 0,a.clear(),a=Ak)}const w={addNestedSub:function addNestedSub(s){trySubscribe();const o=a.subscribe(s);let i=!1;return()=>{i||(i=!0,o(),tryUnsubscribe())}},notifyNestedSubs:function notifyNestedSubs(){a.notify()},handleChangeWrapper,isSubscribed:function isSubscribed(){return _},trySubscribe:function trySubscribeSelf(){_||(_=!0,trySubscribe())},tryUnsubscribe:function tryUnsubscribeSelf(){_&&(_=!1,tryUnsubscribe())},getListeners:()=>a};return w}var Bk=(()=>!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement))(),qk=(()=>"undefined"!=typeof navigator&&"ReactNative"===navigator.product)(),Vk=(()=>Bk||qk?Re.useLayoutEffect:Re.useEffect)();function is(s,o){return s===o?0!==s||0!==o||1/s==1/o:s!=s&&o!=o}function shallowEqual(s,o){if(is(s,o))return!0;if("object"!=typeof s||null===s||"object"!=typeof o||null===o)return!1;const i=Object.keys(s),a=Object.keys(o);if(i.length!==a.length)return!1;for(let a=0;a({})))}(s),$=function mapDispatchToPropsFactory(s){return s&&"object"==typeof s?wrapMapToPropsConstant((o=>function react_redux_bindActionCreators(s,o){const i={};for(const a in s){const u=s[a];"function"==typeof u&&(i[a]=(...s)=>o(u(...s)))}return i}(s,o))):s?"function"==typeof s?wrapMapToPropsFunc(s):createInvalidArgFactory(s,"mapDispatchToProps"):wrapMapToPropsConstant((s=>({dispatch:s})))}(o),U=function mergePropsFactory(s){return s?"function"==typeof s?function wrapMergePropsFunc(s){return function initMergePropsProxy(o,{displayName:i,areMergedPropsEqual:a}){let u,_=!1;return function mergePropsProxy(o,i,w){const x=s(o,i,w);return _?a(x,u)||(u=x):(_=!0,u=x),u}}}(s):createInvalidArgFactory(s,"mergeProps"):()=>defaultMergeProps}(i),V=Boolean(s);return s=>{const o=s.displayName||s.name||"Component",i=`Connect(${o})`,a={shouldHandleStateChanges:V,displayName:i,wrappedComponentName:o,WrappedComponent:s,initMapStateToProps:B,initMapDispatchToProps:$,initMergeProps:U,areStatesEqual:u,areStatePropsEqual:w,areOwnPropsEqual:_,areMergedPropsEqual:x};function ConnectFunction(o){const[i,u,_]=Re.useMemo((()=>{const{reactReduxForwardedRef:s,...i}=o;return[o.context,s,i]}),[o]),w=Re.useMemo((()=>L),[i,L]),x=Re.useContext(w),C=Boolean(o.store)&&Boolean(o.store.getState)&&Boolean(o.store.dispatch),j=Boolean(x)&&Boolean(x.store);const B=C?o.store:x.store,$=j?x.getServerState:B.getState,U=Re.useMemo((()=>function finalPropsSelectorFactory(s,{initMapStateToProps:o,initMapDispatchToProps:i,initMergeProps:a,...u}){return pureFinalPropsSelectorFactory(o(s,u),i(s,u),a(s,u),s,u)}(B.dispatch,a)),[B]),[z,Y]=Re.useMemo((()=>{if(!V)return hO;const s=createSubscription(B,C?void 0:x.subscription),o=s.notifyNestedSubs.bind(s);return[s,o]}),[B,C,x]),Z=Re.useMemo((()=>C?x:{...x,subscription:z}),[C,x,z]),ee=Re.useRef(void 0),ie=Re.useRef(_),ae=Re.useRef(void 0),ce=Re.useRef(!1),le=Re.useRef(!1),pe=Re.useRef(void 0);Vk((()=>(le.current=!0,()=>{le.current=!1})),[]);const de=Re.useMemo((()=>()=>ae.current&&_===ie.current?ae.current:U(B.getState(),_)),[B,_]),fe=Re.useMemo((()=>s=>z?function subscribeUpdates(s,o,i,a,u,_,w,x,C,j,L){if(!s)return()=>{};let B=!1,$=null;const checkForUpdates=()=>{if(B||!x.current)return;const s=o.getState();let i,U;try{i=a(s,u.current)}catch(s){U=s,$=s}U||($=null),i===_.current?w.current||j():(_.current=i,C.current=i,w.current=!0,L())};return i.onStateChange=checkForUpdates,i.trySubscribe(),checkForUpdates(),()=>{if(B=!0,i.tryUnsubscribe(),i.onStateChange=null,$)throw $}}(V,B,z,U,ie,ee,ce,le,ae,Y,s):()=>{}),[z]);let ye;!function useIsomorphicLayoutEffectWithArgs(s,o,i){Vk((()=>s(...o)),i)}(captureWrapperProps,[ie,ee,ce,_,ae,Y]);try{ye=Re.useSyncExternalStore(fe,de,$?()=>U($(),_):de)}catch(s){throw pe.current&&(s.message+=`\nThe error may be correlated with this previous error:\n${pe.current.stack}\n\n`),s}Vk((()=>{pe.current=void 0,ae.current=void 0,ee.current=ye}));const be=Re.useMemo((()=>Re.createElement(s,{...ye,ref:u})),[u,s,ye]);return Re.useMemo((()=>V?Re.createElement(w.Provider,{value:Z},be):be),[w,be,Z])}const j=Re.memo(ConnectFunction);if(j.WrappedComponent=s,j.displayName=ConnectFunction.displayName=i,C){const o=Re.forwardRef((function forwardConnectRef(s,o){return Re.createElement(j,{...s,reactReduxForwardedRef:o})}));return o.displayName=i,o.WrappedComponent=s,hoistNonReactStatics(o,s)}return hoistNonReactStatics(j,s)}};var fO=function Provider(s){const{children:o,context:i,serverState:a,store:u}=s,_=Re.useMemo((()=>{const s=createSubscription(u);return{store:u,subscription:s,getServerState:a?()=>a:void 0}}),[u,a]),w=Re.useMemo((()=>u.getState()),[u]);Vk((()=>{const{subscription:s}=_;return s.onStateChange=s.notifyNestedSubs,s.trySubscribe(),w!==u.getState()&&s.notifyNestedSubs(),()=>{s.tryUnsubscribe(),s.onStateChange=void 0}}),[_,w]);const x=i||pO;return Re.createElement(x.Provider,{value:_},o)};var mO=__webpack_require__(83488),gO=__webpack_require__.n(mO);const withSystem=s=>o=>{const{fn:i}=s();class WithSystem extends Re.Component{render(){return Re.createElement(o,Mn()({},s(),this.props,this.context))}}return WithSystem.displayName=`WithSystem(${i.getDisplayName(o)})`,WithSystem},withRoot=(s,o)=>i=>{const{fn:a}=s();class WithRoot extends Re.Component{render(){return Re.createElement(fO,{store:o},Re.createElement(i,Mn()({},this.props,this.context)))}}return WithRoot.displayName=`WithRoot(${a.getDisplayName(i)})`,WithRoot},withConnect=(s,o,i)=>compose(i?withRoot(s,i):gO(),dO(((i,a)=>{const u={...a,...s()},_=o.prototype?.mapStateToProps||(s=>({state:s}));return _(i,u)})),withSystem(s))(o),handleProps=(s,o,i,a)=>{for(const u in o){const _=o[u];"function"==typeof _&&_(i[u],a[u],s())}},withMappedContainer=(s,o,i)=>(o,a)=>{const{fn:u}=s(),_=i(o,"root");class WithMappedContainer extends Re.Component{constructor(o,i){super(o,i),handleProps(s,a,o,{})}UNSAFE_componentWillReceiveProps(o){handleProps(s,a,o,this.props)}render(){const s=Gt()(this.props,a?Object.keys(a):[]);return Re.createElement(_,s)}}return WithMappedContainer.displayName=`WithMappedContainer(${u.getDisplayName(_)})`,WithMappedContainer},render=(s,o,i,a)=>u=>{const _=i(s,o,a)("App","root"),{createRoot:w}=Zx;w(u).render(Re.createElement(_,null))},getComponent=(s,o,i)=>(a,u,_={})=>{if("string"!=typeof a)throw new TypeError("Need a string, to fetch a component. Was given a "+typeof a);const w=i(a);return w?u?"root"===u?withConnect(s,w,o()):withConnect(s,w):w:(_.failSilently||s().log.warn("Could not find component:",a),null)},getDisplayName=s=>s.displayName||s.name||"Component",view=({getComponents:s,getStore:o,getSystem:i})=>{const a=(u=getComponent(i,o,s),Pt(u,((...s)=>JSON.stringify(s))));var u;const _=(s=>utils_memoizeN(s,((...s)=>s)))(withMappedContainer(i,0,a));return{rootInjects:{getComponent:a,makeMappedContainer:_,render:render(i,o,getComponent,s)},fn:{getDisplayName}}},view_legacy=({React:s,getSystem:o,getStore:i,getComponents:a})=>{const u={},_=parseInt(s?.version,10);return _>=16&&_<18&&(u.render=((s,o,i,a)=>u=>{const _=i(s,o,a)("App","root");Zx.render(Re.createElement(_,null),u)})(o,i,getComponent,a)),{rootInjects:u}};function downloadUrlPlugin(s){let{fn:o}=s;const i={download:s=>({errActions:i,specSelectors:a,specActions:u,getConfigs:_})=>{let{fetch:w}=o;const x=_();function next(o){if(o instanceof Error||o.status>=400)return u.updateLoadingStatus("failed"),i.newThrownErr(Object.assign(new Error((o.message||o.statusText)+" "+s),{source:"fetch"})),void(!o.status&&o instanceof Error&&function checkPossibleFailReasons(){try{let o;if("URL"in lt?o=new URL(s):(o=document.createElement("a"),o.href=s),"https:"!==o.protocol&&"https:"===lt.location.protocol){const s=Object.assign(new Error(`Possible mixed-content issue? The page was loaded over https:// but a ${o.protocol}// URL was specified. Check that you are not attempting to load mixed content.`),{source:"fetch"});return void i.newThrownErr(s)}if(o.origin!==lt.location.origin){const s=Object.assign(new Error(`Possible cross-origin (CORS) issue? The URL origin (${o.origin}) does not match the page (${lt.location.origin}). Check the server returns the correct 'Access-Control-Allow-*' headers.`),{source:"fetch"});i.newThrownErr(s)}}catch(s){return}}());u.updateLoadingStatus("success"),u.updateSpec(o.text),a.url()!==s&&u.updateUrl(s)}s=s||a.url(),u.updateLoadingStatus("loading"),i.clear({source:"fetch"}),w({url:s,loadSpec:!0,requestInterceptor:x.requestInterceptor||(s=>s),responseInterceptor:x.responseInterceptor||(s=>s),credentials:"same-origin",headers:{Accept:"application/json,*/*"}}).then(next,next)},updateLoadingStatus:s=>{let o=[null,"loading","failed","success","failedConfig"];return-1===o.indexOf(s)&&console.error(`Error: ${s} is not one of ${JSON.stringify(o)}`),{type:"spec_update_loading_status",payload:s}}};let a={loadingStatus:Ut((s=>s||(0,ze.Map)()),(s=>s.get("loadingStatus")||null))};return{statePlugins:{spec:{actions:i,reducers:{spec_update_loading_status:(s,o)=>"string"==typeof o.payload?s.set("loadingStatus",o.payload):s},selectors:a}}}}function arrayLikeToArray_arrayLikeToArray(s,o){(null==o||o>s.length)&&(o=s.length);for(var i=0,a=Array(o);i1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2?arguments[2]:void 0;return function getClassNameCombinations(s){if(0===s.length||1===s.length)return s;var o=s.join(".");return yO[o]||(yO[o]=function powerSetPermutations(s){var o=s.length;return 0===o||1===o?s:2===o?[s[0],s[1],"".concat(s[0],".").concat(s[1]),"".concat(s[1],".").concat(s[0])]:3===o?[s[0],s[1],s[2],"".concat(s[0],".").concat(s[1]),"".concat(s[0],".").concat(s[2]),"".concat(s[1],".").concat(s[0]),"".concat(s[1],".").concat(s[2]),"".concat(s[2],".").concat(s[0]),"".concat(s[2],".").concat(s[1]),"".concat(s[0],".").concat(s[1],".").concat(s[2]),"".concat(s[0],".").concat(s[2],".").concat(s[1]),"".concat(s[1],".").concat(s[0],".").concat(s[2]),"".concat(s[1],".").concat(s[2],".").concat(s[0]),"".concat(s[2],".").concat(s[0],".").concat(s[1]),"".concat(s[2],".").concat(s[1],".").concat(s[0])]:o>=4?[s[0],s[1],s[2],s[3],"".concat(s[0],".").concat(s[1]),"".concat(s[0],".").concat(s[2]),"".concat(s[0],".").concat(s[3]),"".concat(s[1],".").concat(s[0]),"".concat(s[1],".").concat(s[2]),"".concat(s[1],".").concat(s[3]),"".concat(s[2],".").concat(s[0]),"".concat(s[2],".").concat(s[1]),"".concat(s[2],".").concat(s[3]),"".concat(s[3],".").concat(s[0]),"".concat(s[3],".").concat(s[1]),"".concat(s[3],".").concat(s[2]),"".concat(s[0],".").concat(s[1],".").concat(s[2]),"".concat(s[0],".").concat(s[1],".").concat(s[3]),"".concat(s[0],".").concat(s[2],".").concat(s[1]),"".concat(s[0],".").concat(s[2],".").concat(s[3]),"".concat(s[0],".").concat(s[3],".").concat(s[1]),"".concat(s[0],".").concat(s[3],".").concat(s[2]),"".concat(s[1],".").concat(s[0],".").concat(s[2]),"".concat(s[1],".").concat(s[0],".").concat(s[3]),"".concat(s[1],".").concat(s[2],".").concat(s[0]),"".concat(s[1],".").concat(s[2],".").concat(s[3]),"".concat(s[1],".").concat(s[3],".").concat(s[0]),"".concat(s[1],".").concat(s[3],".").concat(s[2]),"".concat(s[2],".").concat(s[0],".").concat(s[1]),"".concat(s[2],".").concat(s[0],".").concat(s[3]),"".concat(s[2],".").concat(s[1],".").concat(s[0]),"".concat(s[2],".").concat(s[1],".").concat(s[3]),"".concat(s[2],".").concat(s[3],".").concat(s[0]),"".concat(s[2],".").concat(s[3],".").concat(s[1]),"".concat(s[3],".").concat(s[0],".").concat(s[1]),"".concat(s[3],".").concat(s[0],".").concat(s[2]),"".concat(s[3],".").concat(s[1],".").concat(s[0]),"".concat(s[3],".").concat(s[1],".").concat(s[2]),"".concat(s[3],".").concat(s[2],".").concat(s[0]),"".concat(s[3],".").concat(s[2],".").concat(s[1]),"".concat(s[0],".").concat(s[1],".").concat(s[2],".").concat(s[3]),"".concat(s[0],".").concat(s[1],".").concat(s[3],".").concat(s[2]),"".concat(s[0],".").concat(s[2],".").concat(s[1],".").concat(s[3]),"".concat(s[0],".").concat(s[2],".").concat(s[3],".").concat(s[1]),"".concat(s[0],".").concat(s[3],".").concat(s[1],".").concat(s[2]),"".concat(s[0],".").concat(s[3],".").concat(s[2],".").concat(s[1]),"".concat(s[1],".").concat(s[0],".").concat(s[2],".").concat(s[3]),"".concat(s[1],".").concat(s[0],".").concat(s[3],".").concat(s[2]),"".concat(s[1],".").concat(s[2],".").concat(s[0],".").concat(s[3]),"".concat(s[1],".").concat(s[2],".").concat(s[3],".").concat(s[0]),"".concat(s[1],".").concat(s[3],".").concat(s[0],".").concat(s[2]),"".concat(s[1],".").concat(s[3],".").concat(s[2],".").concat(s[0]),"".concat(s[2],".").concat(s[0],".").concat(s[1],".").concat(s[3]),"".concat(s[2],".").concat(s[0],".").concat(s[3],".").concat(s[1]),"".concat(s[2],".").concat(s[1],".").concat(s[0],".").concat(s[3]),"".concat(s[2],".").concat(s[1],".").concat(s[3],".").concat(s[0]),"".concat(s[2],".").concat(s[3],".").concat(s[0],".").concat(s[1]),"".concat(s[2],".").concat(s[3],".").concat(s[1],".").concat(s[0]),"".concat(s[3],".").concat(s[0],".").concat(s[1],".").concat(s[2]),"".concat(s[3],".").concat(s[0],".").concat(s[2],".").concat(s[1]),"".concat(s[3],".").concat(s[1],".").concat(s[0],".").concat(s[2]),"".concat(s[3],".").concat(s[1],".").concat(s[2],".").concat(s[0]),"".concat(s[3],".").concat(s[2],".").concat(s[0],".").concat(s[1]),"".concat(s[3],".").concat(s[2],".").concat(s[1],".").concat(s[0])]:void 0}(s)),yO[o]}(s.filter((function(s){return"token"!==s}))).reduce((function(s,o){return _objectSpread(_objectSpread({},s),i[o])}),o)}function createClassNameString(s){return s.join(" ")}function createElement(s){var o=s.node,i=s.stylesheet,a=s.style,u=void 0===a?{}:a,_=s.useInlineStyles,w=s.key,x=o.properties,C=o.type,j=o.tagName,L=o.value;if("text"===C)return L;if(j){var B,$=function createChildren(s,o){var i=0;return function(a){return i+=1,a.map((function(a,u){return createElement({node:a,stylesheet:s,useInlineStyles:o,key:"code-segment-".concat(i,"-").concat(u)})}))}}(i,_);if(_){var U=Object.keys(i).reduce((function(s,o){return o.split(".").forEach((function(o){s.includes(o)||s.push(o)})),s}),[]),V=x.className&&x.className.includes("token")?["token"]:[],z=x.className&&V.concat(x.className.filter((function(s){return!U.includes(s)})));B=_objectSpread(_objectSpread({},x),{},{className:createClassNameString(z)||void 0,style:createStyleObject(x.className,Object.assign({},x.style,u),i)})}else B=_objectSpread(_objectSpread({},x),{},{className:createClassNameString(x.className)});var Y=$(o.children);return Re.createElement(j,extends_extends({key:w},B),Y)}}var vO=["language","children","style","customStyle","codeTagProps","useInlineStyles","showLineNumbers","showInlineLineNumbers","startingLineNumber","lineNumberContainerStyle","lineNumberStyle","wrapLines","wrapLongLines","lineProps","renderer","PreTag","CodeTag","code","astGenerator"];function highlight_ownKeys(s,o){var i=Object.keys(s);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(s);o&&(a=a.filter((function(o){return Object.getOwnPropertyDescriptor(s,o).enumerable}))),i.push.apply(i,a)}return i}function highlight_objectSpread(s){for(var o=1;o1&&void 0!==arguments[1]?arguments[1]:[],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];void 0===s.length&&(s=[s]);for(var a=0;a2&&void 0!==arguments[2]?arguments[2]:[];return o||j.length>0?function createWrappedLine(s,_){return createLineElement({children:s,lineNumber:_,lineNumberStyle:x,largestLineNumber:w,showInlineLineNumbers:u,lineProps:i,className:arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],showLineNumbers:a,wrapLongLines:C,wrapLines:o})}(s,_,j):function createUnwrappedLine(s,o){if(a&&o&&u){var i=assembleLineNumberStyles(x,o,w);s.unshift(getInlineLineNumber(o,i))}return s}(s,_)}for(var V=function _loop(){var s=L[U],o=s.children[0].value,i=function getNewLines(s){return s.match(bO)}(o);if(i){var u=o.split("\n");u.forEach((function(o,i){var w=a&&B.length+_,x={type:"text",value:"".concat(o,"\n")};if(0===i){var C=createLine(L.slice($+1,U).concat(createLineElement({children:[x],className:s.properties.className})),w);B.push(C)}else if(i===u.length-1){var j=L[U+1]&&L[U+1].children&&L[U+1].children[0],V={type:"text",value:"".concat(o)};if(j){var z=createLineElement({children:[V],className:s.properties.className});L.splice(U+1,0,z)}else{var Y=createLine([V],w,s.properties.className);B.push(Y)}}else{var Z=createLine([x],w,s.properties.className);B.push(Z)}})),$=U}U++};U{EO.registerLanguage("json",OO),EO.registerLanguage("js",xO),EO.registerLanguage("xml",CO),EO.registerLanguage("yaml",TO),EO.registerLanguage("http",MO),EO.registerLanguage("bash",PO),EO.registerLanguage("powershell",DO),EO.registerLanguage("javascript",xO)},LO={hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#333",color:"white"},"hljs-name":{fontWeight:"bold"},"hljs-strong":{fontWeight:"bold"},"hljs-code":{fontStyle:"italic",color:"#888"},"hljs-emphasis":{fontStyle:"italic"},"hljs-tag":{color:"#62c8f3"},"hljs-variable":{color:"#ade5fc"},"hljs-template-variable":{color:"#ade5fc"},"hljs-selector-id":{color:"#ade5fc"},"hljs-selector-class":{color:"#ade5fc"},"hljs-string":{color:"#a2fca2"},"hljs-bullet":{color:"#d36363"},"hljs-type":{color:"#ffa"},"hljs-title":{color:"#ffa"},"hljs-section":{color:"#ffa"},"hljs-attribute":{color:"#ffa"},"hljs-quote":{color:"#ffa"},"hljs-built_in":{color:"#ffa"},"hljs-builtin-name":{color:"#ffa"},"hljs-number":{color:"#d36363"},"hljs-symbol":{color:"#d36363"},"hljs-keyword":{color:"#fcc28c"},"hljs-selector-tag":{color:"#fcc28c"},"hljs-literal":{color:"#fcc28c"},"hljs-comment":{color:"#888"},"hljs-deletion":{color:"#333",backgroundColor:"#fc9b9b"},"hljs-regexp":{color:"#c6b4f0"},"hljs-link":{color:"#c6b4f0"},"hljs-meta":{color:"#fc9b9b"},"hljs-addition":{backgroundColor:"#a2fca2",color:"#333"}},FO={agate:LO,arta:{hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#222",color:"#aaa"},"hljs-subst":{color:"#aaa"},"hljs-section":{color:"#fff",fontWeight:"bold"},"hljs-comment":{color:"#444"},"hljs-quote":{color:"#444"},"hljs-meta":{color:"#444"},"hljs-string":{color:"#ffcc33"},"hljs-symbol":{color:"#ffcc33"},"hljs-bullet":{color:"#ffcc33"},"hljs-regexp":{color:"#ffcc33"},"hljs-number":{color:"#00cc66"},"hljs-addition":{color:"#00cc66"},"hljs-built_in":{color:"#32aaee"},"hljs-builtin-name":{color:"#32aaee"},"hljs-literal":{color:"#32aaee"},"hljs-type":{color:"#32aaee"},"hljs-template-variable":{color:"#32aaee"},"hljs-attribute":{color:"#32aaee"},"hljs-link":{color:"#32aaee"},"hljs-keyword":{color:"#6644aa"},"hljs-selector-tag":{color:"#6644aa"},"hljs-name":{color:"#6644aa"},"hljs-selector-id":{color:"#6644aa"},"hljs-selector-class":{color:"#6644aa"},"hljs-title":{color:"#bb1166"},"hljs-variable":{color:"#bb1166"},"hljs-deletion":{color:"#bb1166"},"hljs-template-tag":{color:"#bb1166"},"hljs-doctag":{fontWeight:"bold"},"hljs-strong":{fontWeight:"bold"},"hljs-emphasis":{fontStyle:"italic"}},monokai:{hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#272822",color:"#ddd"},"hljs-tag":{color:"#f92672"},"hljs-keyword":{color:"#f92672",fontWeight:"bold"},"hljs-selector-tag":{color:"#f92672",fontWeight:"bold"},"hljs-literal":{color:"#f92672",fontWeight:"bold"},"hljs-strong":{color:"#f92672"},"hljs-name":{color:"#f92672"},"hljs-code":{color:"#66d9ef"},"hljs-class .hljs-title":{color:"white"},"hljs-attribute":{color:"#bf79db"},"hljs-symbol":{color:"#bf79db"},"hljs-regexp":{color:"#bf79db"},"hljs-link":{color:"#bf79db"},"hljs-string":{color:"#a6e22e"},"hljs-bullet":{color:"#a6e22e"},"hljs-subst":{color:"#a6e22e"},"hljs-title":{color:"#a6e22e",fontWeight:"bold"},"hljs-section":{color:"#a6e22e",fontWeight:"bold"},"hljs-emphasis":{color:"#a6e22e"},"hljs-type":{color:"#a6e22e",fontWeight:"bold"},"hljs-built_in":{color:"#a6e22e"},"hljs-builtin-name":{color:"#a6e22e"},"hljs-selector-attr":{color:"#a6e22e"},"hljs-selector-pseudo":{color:"#a6e22e"},"hljs-addition":{color:"#a6e22e"},"hljs-variable":{color:"#a6e22e"},"hljs-template-tag":{color:"#a6e22e"},"hljs-template-variable":{color:"#a6e22e"},"hljs-comment":{color:"#75715e"},"hljs-quote":{color:"#75715e"},"hljs-deletion":{color:"#75715e"},"hljs-meta":{color:"#75715e"},"hljs-doctag":{fontWeight:"bold"},"hljs-selector-id":{fontWeight:"bold"}},nord:{hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#2E3440",color:"#D8DEE9"},"hljs-subst":{color:"#D8DEE9"},"hljs-selector-tag":{color:"#81A1C1"},"hljs-selector-id":{color:"#8FBCBB",fontWeight:"bold"},"hljs-selector-class":{color:"#8FBCBB"},"hljs-selector-attr":{color:"#8FBCBB"},"hljs-selector-pseudo":{color:"#88C0D0"},"hljs-addition":{backgroundColor:"rgba(163, 190, 140, 0.5)"},"hljs-deletion":{backgroundColor:"rgba(191, 97, 106, 0.5)"},"hljs-built_in":{color:"#8FBCBB"},"hljs-type":{color:"#8FBCBB"},"hljs-class":{color:"#8FBCBB"},"hljs-function":{color:"#88C0D0"},"hljs-function > .hljs-title":{color:"#88C0D0"},"hljs-keyword":{color:"#81A1C1"},"hljs-literal":{color:"#81A1C1"},"hljs-symbol":{color:"#81A1C1"},"hljs-number":{color:"#B48EAD"},"hljs-regexp":{color:"#EBCB8B"},"hljs-string":{color:"#A3BE8C"},"hljs-title":{color:"#8FBCBB"},"hljs-params":{color:"#D8DEE9"},"hljs-bullet":{color:"#81A1C1"},"hljs-code":{color:"#8FBCBB"},"hljs-emphasis":{fontStyle:"italic"},"hljs-formula":{color:"#8FBCBB"},"hljs-strong":{fontWeight:"bold"},"hljs-link:hover":{textDecoration:"underline"},"hljs-quote":{color:"#4C566A"},"hljs-comment":{color:"#4C566A"},"hljs-doctag":{color:"#8FBCBB"},"hljs-meta":{color:"#5E81AC"},"hljs-meta-keyword":{color:"#5E81AC"},"hljs-meta-string":{color:"#A3BE8C"},"hljs-attr":{color:"#8FBCBB"},"hljs-attribute":{color:"#D8DEE9"},"hljs-builtin-name":{color:"#81A1C1"},"hljs-name":{color:"#81A1C1"},"hljs-section":{color:"#88C0D0"},"hljs-tag":{color:"#81A1C1"},"hljs-variable":{color:"#D8DEE9"},"hljs-template-variable":{color:"#D8DEE9"},"hljs-template-tag":{color:"#5E81AC"},"abnf .hljs-attribute":{color:"#88C0D0"},"abnf .hljs-symbol":{color:"#EBCB8B"},"apache .hljs-attribute":{color:"#88C0D0"},"apache .hljs-section":{color:"#81A1C1"},"arduino .hljs-built_in":{color:"#88C0D0"},"aspectj .hljs-meta":{color:"#D08770"},"aspectj > .hljs-title":{color:"#88C0D0"},"bnf .hljs-attribute":{color:"#8FBCBB"},"clojure .hljs-name":{color:"#88C0D0"},"clojure .hljs-symbol":{color:"#EBCB8B"},"coq .hljs-built_in":{color:"#88C0D0"},"cpp .hljs-meta-string":{color:"#8FBCBB"},"css .hljs-built_in":{color:"#88C0D0"},"css .hljs-keyword":{color:"#D08770"},"diff .hljs-meta":{color:"#8FBCBB"},"ebnf .hljs-attribute":{color:"#8FBCBB"},"glsl .hljs-built_in":{color:"#88C0D0"},"groovy .hljs-meta:not(:first-child)":{color:"#D08770"},"haxe .hljs-meta":{color:"#D08770"},"java .hljs-meta":{color:"#D08770"},"ldif .hljs-attribute":{color:"#8FBCBB"},"lisp .hljs-name":{color:"#88C0D0"},"lua .hljs-built_in":{color:"#88C0D0"},"moonscript .hljs-built_in":{color:"#88C0D0"},"nginx .hljs-attribute":{color:"#88C0D0"},"nginx .hljs-section":{color:"#5E81AC"},"pf .hljs-built_in":{color:"#88C0D0"},"processing .hljs-built_in":{color:"#88C0D0"},"scss .hljs-keyword":{color:"#81A1C1"},"stylus .hljs-keyword":{color:"#81A1C1"},"swift .hljs-meta":{color:"#D08770"},"vim .hljs-built_in":{color:"#88C0D0",fontStyle:"italic"},"yaml .hljs-meta":{color:"#D08770"}},obsidian:{hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#282b2e",color:"#e0e2e4"},"hljs-keyword":{color:"#93c763",fontWeight:"bold"},"hljs-selector-tag":{color:"#93c763",fontWeight:"bold"},"hljs-literal":{color:"#93c763",fontWeight:"bold"},"hljs-selector-id":{color:"#93c763"},"hljs-number":{color:"#ffcd22"},"hljs-attribute":{color:"#668bb0"},"hljs-code":{color:"white"},"hljs-class .hljs-title":{color:"white"},"hljs-section":{color:"white",fontWeight:"bold"},"hljs-regexp":{color:"#d39745"},"hljs-link":{color:"#d39745"},"hljs-meta":{color:"#557182"},"hljs-tag":{color:"#8cbbad"},"hljs-name":{color:"#8cbbad",fontWeight:"bold"},"hljs-bullet":{color:"#8cbbad"},"hljs-subst":{color:"#8cbbad"},"hljs-emphasis":{color:"#8cbbad"},"hljs-type":{color:"#8cbbad",fontWeight:"bold"},"hljs-built_in":{color:"#8cbbad"},"hljs-selector-attr":{color:"#8cbbad"},"hljs-selector-pseudo":{color:"#8cbbad"},"hljs-addition":{color:"#8cbbad"},"hljs-variable":{color:"#8cbbad"},"hljs-template-tag":{color:"#8cbbad"},"hljs-template-variable":{color:"#8cbbad"},"hljs-string":{color:"#ec7600"},"hljs-symbol":{color:"#ec7600"},"hljs-comment":{color:"#818e96"},"hljs-quote":{color:"#818e96"},"hljs-deletion":{color:"#818e96"},"hljs-selector-class":{color:"#A082BD"},"hljs-doctag":{fontWeight:"bold"},"hljs-title":{fontWeight:"bold"},"hljs-strong":{fontWeight:"bold"}},"tomorrow-night":{"hljs-comment":{color:"#969896"},"hljs-quote":{color:"#969896"},"hljs-variable":{color:"#cc6666"},"hljs-template-variable":{color:"#cc6666"},"hljs-tag":{color:"#cc6666"},"hljs-name":{color:"#cc6666"},"hljs-selector-id":{color:"#cc6666"},"hljs-selector-class":{color:"#cc6666"},"hljs-regexp":{color:"#cc6666"},"hljs-deletion":{color:"#cc6666"},"hljs-number":{color:"#de935f"},"hljs-built_in":{color:"#de935f"},"hljs-builtin-name":{color:"#de935f"},"hljs-literal":{color:"#de935f"},"hljs-type":{color:"#de935f"},"hljs-params":{color:"#de935f"},"hljs-meta":{color:"#de935f"},"hljs-link":{color:"#de935f"},"hljs-attribute":{color:"#f0c674"},"hljs-string":{color:"#b5bd68"},"hljs-symbol":{color:"#b5bd68"},"hljs-bullet":{color:"#b5bd68"},"hljs-addition":{color:"#b5bd68"},"hljs-title":{color:"#81a2be"},"hljs-section":{color:"#81a2be"},"hljs-keyword":{color:"#b294bb"},"hljs-selector-tag":{color:"#b294bb"},hljs:{display:"block",overflowX:"auto",background:"#1d1f21",color:"#c5c8c6",padding:"0.5em"},"hljs-emphasis":{fontStyle:"italic"},"hljs-strong":{fontWeight:"bold"}},idea:{hljs:{display:"block",overflowX:"auto",padding:"0.5em",color:"#000",background:"#fff"},"hljs-subst":{fontWeight:"normal",color:"#000"},"hljs-title":{fontWeight:"normal",color:"#000"},"hljs-comment":{color:"#808080",fontStyle:"italic"},"hljs-quote":{color:"#808080",fontStyle:"italic"},"hljs-meta":{color:"#808000"},"hljs-tag":{background:"#efefef"},"hljs-section":{fontWeight:"bold",color:"#000080"},"hljs-name":{fontWeight:"bold",color:"#000080"},"hljs-literal":{fontWeight:"bold",color:"#000080"},"hljs-keyword":{fontWeight:"bold",color:"#000080"},"hljs-selector-tag":{fontWeight:"bold",color:"#000080"},"hljs-type":{fontWeight:"bold",color:"#000080"},"hljs-selector-id":{fontWeight:"bold",color:"#000080"},"hljs-selector-class":{fontWeight:"bold",color:"#000080"},"hljs-attribute":{fontWeight:"bold",color:"#0000ff"},"hljs-number":{fontWeight:"normal",color:"#0000ff"},"hljs-regexp":{fontWeight:"normal",color:"#0000ff"},"hljs-link":{fontWeight:"normal",color:"#0000ff"},"hljs-string":{color:"#008000",fontWeight:"bold"},"hljs-symbol":{color:"#000",background:"#d0eded",fontStyle:"italic"},"hljs-bullet":{color:"#000",background:"#d0eded",fontStyle:"italic"},"hljs-formula":{color:"#000",background:"#d0eded",fontStyle:"italic"},"hljs-doctag":{textDecoration:"underline"},"hljs-variable":{color:"#660e7a"},"hljs-template-variable":{color:"#660e7a"},"hljs-addition":{background:"#baeeba"},"hljs-deletion":{background:"#ffc8bd"},"hljs-emphasis":{fontStyle:"italic"},"hljs-strong":{fontWeight:"bold"}}},BO=LO,components_SyntaxHighlighter=({language:s,className:o="",getConfigs:i,syntaxHighlighting:a={},children:u=""})=>{const _=i().syntaxHighlight.theme,{styles:w,defaultStyle:x}=a,C=w?.[_]??x;return Re.createElement(EO,{language:s,className:o,style:C},u)};var $O=__webpack_require__(5419),qO=__webpack_require__.n($O);const components_HighlightCode=({fileName:s="response.txt",className:o,downloadable:i,getComponent:a,canCopy:u,language:_,children:w})=>{const x=(0,Re.useRef)(null),C=a("SyntaxHighlighter",!0),handlePreventYScrollingBeyondElement=s=>{const{target:o,deltaY:i}=s,{scrollHeight:a,offsetHeight:u,scrollTop:_}=o;a>u&&(0===_&&i<0||u+_>=a&&i>0)&&s.preventDefault()};return(0,Re.useEffect)((()=>{const s=Array.from(x.current.childNodes).filter((s=>!!s.nodeType&&s.classList.contains("microlight")));return s.forEach((s=>s.addEventListener("mousewheel",handlePreventYScrollingBeyondElement,{passive:!1}))),()=>{s.forEach((s=>s.removeEventListener("mousewheel",handlePreventYScrollingBeyondElement)))}}),[w,o,_]),Re.createElement("div",{className:"highlight-code",ref:x},u&&Re.createElement("div",{className:"copy-to-clipboard"},Re.createElement(Hn.CopyToClipboard,{text:w},Re.createElement("button",null))),i?Re.createElement("button",{className:"download-contents",onClick:()=>{qO()(w,s)}},"Download"):null,Re.createElement(C,{language:_,className:Jn()(o,"microlight"),renderPlainText:({children:s,PlainTextViewer:i})=>Re.createElement(i,{className:o},s)},w))},components_PlainTextViewer=({className:s="",children:o})=>Re.createElement("pre",{className:Jn()("microlight",s)},o),wrap_components_SyntaxHighlighter=(s,o)=>({renderPlainText:i,children:a,...u})=>{const _=o.getConfigs().syntaxHighlight.activated,w=o.getComponent("PlainTextViewer");return _||"function"!=typeof i?_?Re.createElement(s,u,a):Re.createElement(w,null,a):i({children:a,PlainTextViewer:w})},SyntaxHighlightingPlugin1=()=>({afterLoad:after_load,rootInjects:{syntaxHighlighting:{styles:FO,defaultStyle:BO}},components:{SyntaxHighlighter:components_SyntaxHighlighter,HighlightCode:components_HighlightCode,PlainTextViewer:components_PlainTextViewer}}),SyntaxHighlightingPlugin2=()=>({wrapComponents:{SyntaxHighlighter:wrap_components_SyntaxHighlighter}}),syntax_highlighting=()=>[SyntaxHighlightingPlugin1,SyntaxHighlightingPlugin2],versions_after_load=()=>{const{GIT_DIRTY:s,GIT_COMMIT:o,PACKAGE_VERSION:i,BUILD_TIME:a}={PACKAGE_VERSION:"5.31.0",GIT_COMMIT:"gcf11271c",GIT_DIRTY:!0,BUILD_TIME:"Thu, 11 Dec 2025 15:56:57 GMT"};lt.versions=lt.versions||{},lt.versions.swaggerUI={version:i,gitRevision:o,gitDirty:s,buildTimestamp:a}},versions=()=>({afterLoad:versions_after_load});var UO=__webpack_require__(47248),VO=__webpack_require__.n(UO);const zO=console.error,withErrorBoundary=s=>o=>{const{getComponent:i,fn:a}=s(),u=i("ErrorBoundary"),_=a.getDisplayName(o);class WithErrorBoundary extends Re.Component{render(){return Re.createElement(u,{targetName:_,getComponent:i,fn:a},Re.createElement(o,Mn()({},this.props,this.context)))}}var w;return WithErrorBoundary.displayName=`WithErrorBoundary(${_})`,(w=o).prototype&&w.prototype.isReactComponent&&(WithErrorBoundary.prototype.mapStateToProps=o.prototype.mapStateToProps),WithErrorBoundary},fallback=({name:s})=>Re.createElement("div",{className:"fallback"},"😱 ",Re.createElement("i",null,"Could not render ","t"===s?"this component":s,", see the console."));class ErrorBoundary extends Re.Component{static defaultProps={targetName:"this component",getComponent:()=>fallback,fn:{componentDidCatch:zO},children:null};static getDerivedStateFromError(s){return{hasError:!0,error:s}}constructor(...s){super(...s),this.state={hasError:!1,error:null}}componentDidCatch(s,o){this.props.fn.componentDidCatch(s,o)}render(){const{getComponent:s,targetName:o,children:i}=this.props;if(this.state.hasError){const i=s("Fallback");return Re.createElement(i,{name:o})}return i}}const WO=ErrorBoundary,safe_render=({componentList:s=[],fullOverride:o=!1}={})=>({getSystem:i})=>{const a=o?s:["App","BaseLayout","VersionPragmaFilter","InfoContainer","ServersContainer","SchemesContainer","AuthorizeBtnContainer","FilterContainer","Operations","OperationContainer","parameters","responses","OperationServers","Models","ModelWrapper",...s],u=VO()(a,Array(a.length).fill(((s,{fn:o})=>o.withErrorBoundary(s))));return{fn:{componentDidCatch:zO,withErrorBoundary:withErrorBoundary(i)},components:{ErrorBoundary:WO,Fallback:fallback},wrapComponents:u}};class App extends Re.Component{getLayout(){const{getComponent:s,layoutSelectors:o}=this.props,i=o.current(),a=s(i,!0);return a||(()=>Re.createElement("h1",null,' No layout defined for "',i,'" '))}render(){const s=this.getLayout();return Re.createElement(s,null)}}const JO=App;class AuthorizationPopup extends Re.Component{close=()=>{let{authActions:s}=this.props;s.showDefinitions(!1)};render(){let{authSelectors:s,authActions:o,getComponent:i,errSelectors:a,specSelectors:u,fn:{AST:_={}}}=this.props,w=s.shownDefinitions();const x=i("auths"),C=i("CloseIcon");return Re.createElement("div",{className:"dialog-ux"},Re.createElement("div",{className:"backdrop-ux"}),Re.createElement("div",{className:"modal-ux"},Re.createElement("div",{className:"modal-dialog-ux"},Re.createElement("div",{className:"modal-ux-inner"},Re.createElement("div",{className:"modal-ux-header"},Re.createElement("h3",null,"Available authorizations"),Re.createElement("button",{type:"button",className:"close-modal",onClick:this.close},Re.createElement(C,null))),Re.createElement("div",{className:"modal-ux-content"},w.valueSeq().map(((w,C)=>Re.createElement(x,{key:C,AST:_,definitions:w,getComponent:i,errSelectors:a,authSelectors:s,authActions:o,specSelectors:u}))))))))}}class AuthorizeBtn extends Re.Component{render(){let{isAuthorized:s,showPopup:o,onClick:i,getComponent:a}=this.props;const u=a("authorizationPopup",!0),_=a("LockAuthIcon",!0),w=a("UnlockAuthIcon",!0);return Re.createElement("div",{className:"auth-wrapper"},Re.createElement("button",{className:s?"btn authorize locked":"btn authorize unlocked",onClick:i},Re.createElement("span",null,"Authorize"),s?Re.createElement(_,null):Re.createElement(w,null)),o&&Re.createElement(u,null))}}class AuthorizeBtnContainer extends Re.Component{render(){const{authActions:s,authSelectors:o,specSelectors:i,getComponent:a}=this.props,u=i.securityDefinitions(),_=o.definitionsToAuthorize(),w=a("authorizeBtn");return u?Re.createElement(w,{onClick:()=>s.showDefinitions(_),isAuthorized:!!o.authorized().size,showPopup:!!o.shownDefinitions(),getComponent:a}):null}}class AuthorizeOperationBtn extends Re.Component{onClick=s=>{s.stopPropagation();let{onClick:o}=this.props;o&&o()};render(){let{isAuthorized:s,getComponent:o}=this.props;const i=o("LockAuthOperationIcon",!0),a=o("UnlockAuthOperationIcon",!0);return Re.createElement("button",{className:"authorization__btn","aria-label":s?"authorization button locked":"authorization button unlocked",onClick:this.onClick},s?Re.createElement(i,{className:"locked"}):Re.createElement(a,{className:"unlocked"}))}}class Auths extends Re.Component{constructor(s,o){super(s,o),this.state={}}onAuthChange=s=>{let{name:o}=s;this.setState({[o]:s})};submitAuth=s=>{s.preventDefault();let{authActions:o}=this.props;o.authorizeWithPersistOption(this.state)};logoutClick=s=>{s.preventDefault();let{authActions:o,definitions:i}=this.props,a=i.map(((s,o)=>o)).toArray();this.setState(a.reduce(((s,o)=>(s[o]="",s)),{})),o.logoutWithPersistOption(a)};close=s=>{s.preventDefault();let{authActions:o}=this.props;o.showDefinitions(!1)};render(){let{definitions:s,getComponent:o,authSelectors:i,errSelectors:a}=this.props;const u=o("AuthItem"),_=o("oauth2",!0),w=o("Button");let x=i.authorized(),C=s.filter(((s,o)=>!!x.get(o))),j=s.filter((s=>"oauth2"!==s.get("type"))),L=s.filter((s=>"oauth2"===s.get("type")));return Re.createElement("div",{className:"auth-container"},!!j.size&&Re.createElement("form",{onSubmit:this.submitAuth},j.map(((s,_)=>Re.createElement(u,{key:_,schema:s,name:_,getComponent:o,onAuthChange:this.onAuthChange,authorized:x,errSelectors:a,authSelectors:i}))).toArray(),Re.createElement("div",{className:"auth-btn-wrapper"},j.size===C.size?Re.createElement(w,{className:"btn modal-btn auth",onClick:this.logoutClick,"aria-label":"Remove authorization"},"Logout"):Re.createElement(w,{type:"submit",className:"btn modal-btn auth authorize","aria-label":"Apply credentials"},"Authorize"),Re.createElement(w,{className:"btn modal-btn auth btn-done",onClick:this.close},"Close"))),L&&L.size?Re.createElement("div",null,Re.createElement("div",{className:"scope-def"},Re.createElement("p",null,"Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes."),Re.createElement("p",null,"API requires the following scopes. Select which ones you want to grant to Swagger UI.")),s.filter((s=>"oauth2"===s.get("type"))).map(((s,o)=>Re.createElement("div",{key:o},Re.createElement(_,{authorized:x,schema:s,name:o})))).toArray()):null)}}class auth_item_Auths extends Re.Component{render(){let{schema:s,name:o,getComponent:i,onAuthChange:a,authorized:u,errSelectors:_,authSelectors:w}=this.props;const x=i("apiKeyAuth"),C=i("basicAuth");let j;const L=s.get("type");switch(L){case"apiKey":j=Re.createElement(x,{key:o,schema:s,name:o,errSelectors:_,authorized:u,getComponent:i,onChange:a,authSelectors:w});break;case"basic":j=Re.createElement(C,{key:o,schema:s,name:o,errSelectors:_,authorized:u,getComponent:i,onChange:a,authSelectors:w});break;default:j=Re.createElement("div",{key:o},"Unknown security definition type ",L)}return Re.createElement("div",{key:`${o}-jump`},j)}}class AuthError extends Re.Component{render(){let{error:s}=this.props,o=s.get("level"),i=s.get("message"),a=s.get("source");return Re.createElement("div",{className:"errors"},Re.createElement("b",null,a," ",o),Re.createElement("span",null,i))}}class ApiKeyAuth extends Re.Component{constructor(s,o){super(s,o);let{name:i,schema:a}=this.props,u=this.getValue();this.state={name:i,schema:a,value:u}}getValue(){let{name:s,authorized:o}=this.props;return o&&o.getIn([s,"value"])}onChange=s=>{let{onChange:o}=this.props,i=s.target.value,a=Object.assign({},this.state,{value:i});this.setState(a),o(a)};render(){let{schema:s,getComponent:o,errSelectors:i,name:a,authSelectors:u}=this.props;const _=o("Input"),w=o("Row"),x=o("Col"),C=o("authError"),j=o("Markdown",!0),L=o("JumpToPath",!0),B=u.selectAuthPath(a);let $=this.getValue(),U=i.allErrors().filter((s=>s.get("authId")===a));return Re.createElement("div",null,Re.createElement("h4",null,Re.createElement("code",null,a||s.get("name"))," (apiKey)",Re.createElement(L,{path:B})),$&&Re.createElement("h6",null,"Authorized"),Re.createElement(w,null,Re.createElement(j,{source:s.get("description")})),Re.createElement(w,null,Re.createElement("p",null,"Name: ",Re.createElement("code",null,s.get("name")))),Re.createElement(w,null,Re.createElement("p",null,"In: ",Re.createElement("code",null,s.get("in")))),Re.createElement(w,null,Re.createElement("label",{htmlFor:"api_key_value"},"Value:"),$?Re.createElement("code",null," ****** "):Re.createElement(x,null,Re.createElement(_,{id:"api_key_value",type:"text",onChange:this.onChange,autoFocus:!0}))),U.valueSeq().map(((s,o)=>Re.createElement(C,{error:s,key:o}))))}}class BasicAuth extends Re.Component{constructor(s,o){super(s,o);let{schema:i,name:a}=this.props,u=this.getValue().username;this.state={name:a,schema:i,value:u?{username:u}:{}}}getValue(){let{authorized:s,name:o}=this.props;return s&&s.getIn([o,"value"])||{}}onChange=s=>{let{onChange:o}=this.props,{value:i,name:a}=s.target,u=this.state.value;u[a]=i,this.setState({value:u}),o(this.state)};render(){let{schema:s,getComponent:o,name:i,errSelectors:a,authSelectors:u}=this.props;const _=o("Input"),w=o("Row"),x=o("Col"),C=o("authError"),j=o("JumpToPath",!0),L=o("Markdown",!0),B=u.selectAuthPath(i);let $=this.getValue().username,U=a.allErrors().filter((s=>s.get("authId")===i));return Re.createElement("div",null,Re.createElement("h4",null,"Basic authorization",Re.createElement(j,{path:B})),$&&Re.createElement("h6",null,"Authorized"),Re.createElement(w,null,Re.createElement(L,{source:s.get("description")})),Re.createElement(w,null,Re.createElement("label",{htmlFor:"auth_username"},"Username:"),$?Re.createElement("code",null," ",$," "):Re.createElement(x,null,Re.createElement(_,{id:"auth_username",type:"text",required:"required",name:"username",onChange:this.onChange,autoFocus:!0}))),Re.createElement(w,null,Re.createElement("label",{htmlFor:"auth_password"},"Password:"),$?Re.createElement("code",null," ****** "):Re.createElement(x,null,Re.createElement(_,{id:"auth_password",autoComplete:"new-password",name:"password",type:"password",onChange:this.onChange}))),U.valueSeq().map(((s,o)=>Re.createElement(C,{error:s,key:o}))))}}function example_Example(s){const{example:o,showValue:i,getComponent:a}=s,u=a("Markdown",!0),_=a("HighlightCode",!0);return o&&ze.Map.isMap(o)?Re.createElement("div",{className:"example"},o.get("description")?Re.createElement("section",{className:"example__section"},Re.createElement("div",{className:"example__section-header"},"Example Description"),Re.createElement("p",null,Re.createElement(u,{source:o.get("description")}))):null,i&&o.has("value")?Re.createElement("section",{className:"example__section"},Re.createElement("div",{className:"example__section-header"},"Example Value"),Re.createElement(_,null,stringify(o.get("value")))):null):null}class ExamplesSelect extends Re.PureComponent{static defaultProps={examples:(0,ze.Map)({}),onSelect:(...s)=>console.log("DEBUG: ExamplesSelect was not given an onSelect callback",...s),currentExampleKey:null,showLabels:!0};_onSelect=(s,{isSyntheticChange:o=!1}={})=>{"function"==typeof this.props.onSelect&&this.props.onSelect(s,{isSyntheticChange:o})};_onDomSelect=s=>{if("function"==typeof this.props.onSelect){const o=s.target.selectedOptions[0].getAttribute("value");this._onSelect(o,{isSyntheticChange:!1})}};getCurrentExample=()=>{const{examples:s,currentExampleKey:o}=this.props,i=s.get(o),a=s.keySeq().first(),u=s.get(a);return i||u||(0,ze.Map)({})};componentDidMount(){const{onSelect:s,examples:o}=this.props;if("function"==typeof s){const s=o.first(),i=o.keyOf(s);this._onSelect(i,{isSyntheticChange:!0})}}UNSAFE_componentWillReceiveProps(s){const{currentExampleKey:o,examples:i}=s;if(i!==this.props.examples&&!i.has(o)){const s=i.first(),o=i.keyOf(s);this._onSelect(o,{isSyntheticChange:!0})}}render(){const{examples:s,currentExampleKey:o,isValueModified:i,isModifiedValueAvailable:a,showLabels:u}=this.props;return Re.createElement("div",{className:"examples-select"},u?Re.createElement("span",{className:"examples-select__section-label"},"Examples: "):null,Re.createElement("select",{className:"examples-select-element",onChange:this._onDomSelect,value:a&&i?"__MODIFIED__VALUE__":o||""},a?Re.createElement("option",{value:"__MODIFIED__VALUE__"},"[Modified value]"):null,s.map(((s,o)=>Re.createElement("option",{key:o,value:o},ze.Map.isMap(s)&&s.get("summary")||o))).valueSeq()))}}const stringifyUnlessList=s=>ze.List.isList(s)?s:stringify(s);class ExamplesSelectValueRetainer extends Re.PureComponent{static defaultProps={userHasEditedBody:!1,examples:(0,ze.Map)({}),currentNamespace:"__DEFAULT__NAMESPACE__",setRetainRequestBodyValueFlag:()=>{},onSelect:(...s)=>console.log("ExamplesSelectValueRetainer: no `onSelect` function was provided",...s),updateValue:(...s)=>console.log("ExamplesSelectValueRetainer: no `updateValue` function was provided",...s)};constructor(s){super(s);const o=this._getCurrentExampleValue();this.state={[s.currentNamespace]:(0,ze.Map)({lastUserEditedValue:this.props.currentUserInputValue,lastDownstreamValue:o,isModifiedValueSelected:this.props.userHasEditedBody||this.props.currentUserInputValue!==o})}}componentWillUnmount(){this.props.setRetainRequestBodyValueFlag(!1)}_getStateForCurrentNamespace=()=>{const{currentNamespace:s}=this.props;return(this.state[s]||(0,ze.Map)()).toObject()};_setStateForCurrentNamespace=s=>{const{currentNamespace:o}=this.props;return this._setStateForNamespace(o,s)};_setStateForNamespace=(s,o)=>{const i=(this.state[s]||(0,ze.Map)()).mergeDeep(o);return this.setState({[s]:i})};_isCurrentUserInputSameAsExampleValue=()=>{const{currentUserInputValue:s}=this.props;return this._getCurrentExampleValue()===s};_getValueForExample=(s,o)=>{const{examples:i}=o||this.props;return stringifyUnlessList((i||(0,ze.Map)({})).getIn([s,"value"]))};_getCurrentExampleValue=s=>{const{currentKey:o}=s||this.props;return this._getValueForExample(o,s||this.props)};_onExamplesSelect=(s,{isSyntheticChange:o}={},...i)=>{const{onSelect:a,updateValue:u,currentUserInputValue:_,userHasEditedBody:w}=this.props,{lastUserEditedValue:x}=this._getStateForCurrentNamespace(),C=this._getValueForExample(s);if("__MODIFIED__VALUE__"===s)return u(stringifyUnlessList(x)),this._setStateForCurrentNamespace({isModifiedValueSelected:!0});"function"==typeof a&&a(s,{isSyntheticChange:o},...i),this._setStateForCurrentNamespace({lastDownstreamValue:C,isModifiedValueSelected:o&&w||!!_&&_!==C}),o||"function"==typeof u&&u(stringifyUnlessList(C))};UNSAFE_componentWillReceiveProps(s){const{currentUserInputValue:o,examples:i,onSelect:a,userHasEditedBody:u}=s,{lastUserEditedValue:_,lastDownstreamValue:w}=this._getStateForCurrentNamespace(),x=this._getValueForExample(s.currentKey,s),C=i.filter((s=>ze.Map.isMap(s)&&(s.get("value")===o||stringify(s.get("value"))===o)));if(C.size){let o;o=C.has(s.currentKey)?s.currentKey:C.keySeq().first(),a(o,{isSyntheticChange:!0})}else o!==this.props.currentUserInputValue&&o!==_&&o!==w&&(this.props.setRetainRequestBodyValueFlag(!0),this._setStateForNamespace(s.currentNamespace,{lastUserEditedValue:s.currentUserInputValue,isModifiedValueSelected:u||o!==x}))}render(){const{currentUserInputValue:s,examples:o,currentKey:i,getComponent:a,userHasEditedBody:u}=this.props,{lastDownstreamValue:_,lastUserEditedValue:w,isModifiedValueSelected:x}=this._getStateForCurrentNamespace(),C=a("ExamplesSelect");return Re.createElement(C,{examples:o,currentExampleKey:i,onSelect:this._onExamplesSelect,isModifiedValueAvailable:!!w&&w!==_,isValueModified:void 0!==s&&x&&s!==this._getCurrentExampleValue()||u})}}function oauth2_authorize_authorize({auth:s,authActions:o,errActions:i,configs:a,authConfigs:u={},currentServer:_}){let{schema:w,scopes:x,name:C,clientId:j}=s,L=w.get("flow"),B=[];switch(L){case"password":return void o.authorizePassword(s);case"application":case"clientCredentials":case"client_credentials":return void o.authorizeApplication(s);case"accessCode":case"authorizationCode":case"authorization_code":B.push("response_type=code");break;case"implicit":B.push("response_type=token")}"string"==typeof j&&B.push("client_id="+encodeURIComponent(j));let $=a.oauth2RedirectUrl;if(void 0===$)return void i.newAuthErr({authId:C,source:"validation",level:"error",message:"oauth2RedirectUrl configuration is not passed. Oauth2 authorization cannot be performed."});B.push("redirect_uri="+encodeURIComponent($));let U=[];if(Array.isArray(x)?U=x:We().List.isList(x)&&(U=x.toArray()),U.length>0){let s=u.scopeSeparator||" ";B.push("scope="+encodeURIComponent(U.join(s)))}let V=utils_btoa(new Date);if(B.push("state="+encodeURIComponent(V)),void 0!==u.realm&&B.push("realm="+encodeURIComponent(u.realm)),("authorizationCode"===L||"authorization_code"===L||"accessCode"===L)&&u.usePkceWithAuthorizationCodeGrant){const o=function generateCodeVerifier(){return b64toB64UrlEncoded(xt()(32).toString("base64"))}(),i=function createCodeChallenge(s){return b64toB64UrlEncoded(Ot()("sha256").update(s).digest("base64"))}(o);B.push("code_challenge="+i),B.push("code_challenge_method=S256"),s.codeVerifier=o}let{additionalQueryStringParams:z}=u;for(let s in z)void 0!==z[s]&&B.push([s,z[s]].map(encodeURIComponent).join("="));const Y=w.get("authorizationUrl");let Z;Z=_?Nt()(sanitizeUrl(Y),_,!0).toString():sanitizeUrl(Y);let ee,ie=[Z,B.join("&")].join("string"!=typeof Y||Y.includes("?")?"&":"?");ee="implicit"===L?o.preAuthorizeImplicit:u.useBasicAuthenticationWithAccessCodeGrant?o.authorizeAccessCodeWithBasicAuthentication:o.authorizeAccessCodeWithFormParams,o.authPopup(ie,{auth:s,state:V,redirectUrl:$,callback:ee,errCb:i.newAuthErr})}class Oauth2 extends Re.Component{constructor(s,o){super(s,o);let{name:i,schema:a,authorized:u,authSelectors:_}=this.props,w=u&&u.get(i),x=_.getConfigs()||{},C=w&&w.get("username")||"",j=w&&w.get("clientId")||x.clientId||"",L=w&&w.get("clientSecret")||x.clientSecret||"",B=w&&w.get("passwordType")||"basic",$=w&&w.get("scopes")||x.scopes||[];"string"==typeof $&&($=$.split(x.scopeSeparator||" ")),this.state={appName:x.appName,name:i,schema:a,scopes:$,clientId:j,clientSecret:L,username:C,password:"",passwordType:B}}close=s=>{s.preventDefault();let{authActions:o}=this.props;o.showDefinitions(!1)};authorize=()=>{let{authActions:s,errActions:o,getConfigs:i,authSelectors:a,oas3Selectors:u}=this.props,_=i(),w=a.getConfigs();o.clear({authId:name,type:"auth",source:"auth"}),oauth2_authorize_authorize({auth:this.state,currentServer:u.serverEffectiveValue(u.selectedServer()),authActions:s,errActions:o,configs:_,authConfigs:w})};onScopeChange=s=>{let{target:o}=s,{checked:i}=o,a=o.dataset.value;if(i&&-1===this.state.scopes.indexOf(a)){let s=this.state.scopes.concat([a]);this.setState({scopes:s})}else!i&&this.state.scopes.indexOf(a)>-1&&this.setState({scopes:this.state.scopes.filter((s=>s!==a))})};onInputChange=s=>{let{target:{dataset:{name:o},value:i}}=s,a={[o]:i};this.setState(a)};selectScopes=s=>{s.target.dataset.all?this.setState({scopes:Array.from((this.props.schema.get("allowedScopes")||this.props.schema.get("scopes")).keys())}):this.setState({scopes:[]})};logout=s=>{s.preventDefault();let{authActions:o,errActions:i,name:a}=this.props;i.clear({authId:a,type:"auth",source:"auth"}),o.logoutWithPersistOption([a])};render(){let{schema:s,getComponent:o,authSelectors:i,errSelectors:a,name:u,specSelectors:_}=this.props;const w=o("Input"),x=o("Row"),C=o("Col"),j=o("Button"),L=o("authError"),B=o("JumpToPath",!0),$=o("Markdown",!0),U=o("InitializedInput"),{isOAS3:V}=_;let z=V()?s.get("openIdConnectUrl"):null;const Y="implicit",Z="password",ee=V()?z?"authorization_code":"authorizationCode":"accessCode",ie=V()?z?"client_credentials":"clientCredentials":"application",ae=i.selectAuthPath(u);let ce=!!(i.getConfigs()||{}).usePkceWithAuthorizationCodeGrant,le=s.get("flow"),pe=le===ee&&ce?le+" with PKCE":le,de=s.get("allowedScopes")||s.get("scopes"),fe=!!i.authorized().get(u),ye=a.allErrors().filter((s=>s.get("authId")===u)),be=!ye.filter((s=>"validation"===s.get("source"))).size,_e=s.get("description");return Re.createElement("div",null,Re.createElement("h4",null,u," (OAuth2, ",pe,") ",Re.createElement(B,{path:ae})),this.state.appName?Re.createElement("h5",null,"Application: ",this.state.appName," "):null,_e&&Re.createElement($,{source:s.get("description")}),fe&&Re.createElement("h6",null,"Authorized"),z&&Re.createElement("p",null,"OpenID Connect URL: ",Re.createElement("code",null,z)),(le===Y||le===ee)&&Re.createElement("p",null,"Authorization URL: ",Re.createElement("code",null,s.get("authorizationUrl"))),(le===Z||le===ee||le===ie)&&Re.createElement("p",null,"Token URL:",Re.createElement("code",null," ",s.get("tokenUrl"))),Re.createElement("p",{className:"flow"},"Flow: ",Re.createElement("code",null,pe)),le!==Z?null:Re.createElement(x,null,Re.createElement(x,null,Re.createElement("label",{htmlFor:"oauth_username"},"username:"),fe?Re.createElement("code",null," ",this.state.username," "):Re.createElement(C,{tablet:10,desktop:10},Re.createElement("input",{id:"oauth_username",type:"text","data-name":"username",onChange:this.onInputChange,autoFocus:!0}))),Re.createElement(x,null,Re.createElement("label",{htmlFor:"oauth_password"},"password:"),fe?Re.createElement("code",null," ****** "):Re.createElement(C,{tablet:10,desktop:10},Re.createElement("input",{id:"oauth_password",type:"password","data-name":"password",onChange:this.onInputChange}))),Re.createElement(x,null,Re.createElement("label",{htmlFor:"password_type"},"Client credentials location:"),fe?Re.createElement("code",null," ",this.state.passwordType," "):Re.createElement(C,{tablet:10,desktop:10},Re.createElement("select",{id:"password_type","data-name":"passwordType",onChange:this.onInputChange},Re.createElement("option",{value:"basic"},"Authorization header"),Re.createElement("option",{value:"request-body"},"Request body"))))),(le===ie||le===Y||le===ee||le===Z)&&(!fe||fe&&this.state.clientId)&&Re.createElement(x,null,Re.createElement("label",{htmlFor:`client_id_${le}`},"client_id:"),fe?Re.createElement("code",null," ****** "):Re.createElement(C,{tablet:10,desktop:10},Re.createElement(U,{id:`client_id_${le}`,type:"text",required:le===Z,initialValue:this.state.clientId,"data-name":"clientId",onChange:this.onInputChange}))),(le===ie||le===ee||le===Z)&&Re.createElement(x,null,Re.createElement("label",{htmlFor:`client_secret_${le}`},"client_secret:"),fe?Re.createElement("code",null," ****** "):Re.createElement(C,{tablet:10,desktop:10},Re.createElement(U,{id:`client_secret_${le}`,initialValue:this.state.clientSecret,type:"password","data-name":"clientSecret",onChange:this.onInputChange}))),!fe&&de&&de.size?Re.createElement("div",{className:"scopes"},Re.createElement("h2",null,"Scopes:",Re.createElement("a",{onClick:this.selectScopes,"data-all":!0},"select all"),Re.createElement("a",{onClick:this.selectScopes},"select none")),de.map(((s,o)=>Re.createElement(x,{key:o},Re.createElement("div",{className:"checkbox"},Re.createElement(w,{"data-value":o,id:`${o}-${le}-checkbox-${this.state.name}`,disabled:fe,checked:this.state.scopes.includes(o),type:"checkbox",onChange:this.onScopeChange}),Re.createElement("label",{htmlFor:`${o}-${le}-checkbox-${this.state.name}`},Re.createElement("span",{className:"item"}),Re.createElement("div",{className:"text"},Re.createElement("p",{className:"name"},o),Re.createElement("p",{className:"description"},s))))))).toArray()):null,ye.valueSeq().map(((s,o)=>Re.createElement(L,{error:s,key:o}))),Re.createElement("div",{className:"auth-btn-wrapper"},be&&(fe?Re.createElement(j,{className:"btn modal-btn auth authorize",onClick:this.logout,"aria-label":"Remove authorization"},"Logout"):Re.createElement(j,{className:"btn modal-btn auth authorize",onClick:this.authorize,"aria-label":"Apply given OAuth2 credentials"},"Authorize")),Re.createElement(j,{className:"btn modal-btn auth btn-done",onClick:this.close},"Close")))}}class Clear extends Re.Component{onClick=()=>{let{specActions:s,path:o,method:i}=this.props;s.clearResponse(o,i),s.clearRequest(o,i)};render(){return Re.createElement("button",{className:"btn btn-clear opblock-control__btn",onClick:this.onClick},"Clear")}}const live_response_Headers=({headers:s})=>Re.createElement("div",null,Re.createElement("h5",null,"Response headers"),Re.createElement("pre",{className:"microlight"},s)),Duration=({duration:s})=>Re.createElement("div",null,Re.createElement("h5",null,"Request duration"),Re.createElement("pre",{className:"microlight"},s," ms"));class LiveResponse extends Re.Component{shouldComponentUpdate(s){return this.props.response!==s.response||this.props.path!==s.path||this.props.method!==s.method||this.props.displayRequestDuration!==s.displayRequestDuration}render(){const{response:s,getComponent:o,getConfigs:i,displayRequestDuration:a,specSelectors:u,path:_,method:w}=this.props,{showMutatedRequest:x,requestSnippetsEnabled:C}=i(),j=x?u.mutatedRequestFor(_,w):u.requestFor(_,w),L=s.get("status"),B=j.get("url"),$=s.get("headers").toJS(),U=s.get("notDocumented"),V=s.get("error"),z=s.get("text"),Y=s.get("duration"),Z=Object.keys($),ee=$["content-type"]||$["Content-Type"],ie=o("responseBody"),ae=Z.map((s=>{var o=Array.isArray($[s])?$[s].join():$[s];return Re.createElement("span",{className:"headerline",key:s}," ",s,": ",o," ")})),ce=0!==ae.length,le=o("Markdown",!0),pe=o("RequestSnippets",!0),de=o("curl",!0);return Re.createElement("div",null,j&&C?Re.createElement(pe,{request:j}):Re.createElement(de,{request:j}),B&&Re.createElement("div",null,Re.createElement("div",{className:"request-url"},Re.createElement("h4",null,"Request URL"),Re.createElement("pre",{className:"microlight"},B))),Re.createElement("h4",null,"Server response"),Re.createElement("table",{className:"responses-table live-responses-table"},Re.createElement("thead",null,Re.createElement("tr",{className:"responses-header"},Re.createElement("td",{className:"col_header response-col_status"},"Code"),Re.createElement("td",{className:"col_header response-col_description"},"Details"))),Re.createElement("tbody",null,Re.createElement("tr",{className:"response"},Re.createElement("td",{className:"response-col_status"},L,U?Re.createElement("div",{className:"response-undocumented"},Re.createElement("i",null," Undocumented ")):null),Re.createElement("td",{className:"response-col_description"},V?Re.createElement(le,{source:`${""!==s.get("name")?`${s.get("name")}: `:""}${s.get("message")}`}):null,z?Re.createElement(ie,{content:z,contentType:ee,url:B,headers:$,getConfigs:i,getComponent:o}):null,ce?Re.createElement(live_response_Headers,{headers:ae}):null,a&&Y?Re.createElement(Duration,{duration:Y}):null)))))}}class OnlineValidatorBadge extends Re.Component{constructor(s,o){super(s,o);let{getConfigs:i}=s,{validatorUrl:a}=i();this.state={url:this.getDefinitionUrl(),validatorUrl:void 0===a?"https://validator.swagger.io/validator":a}}getDefinitionUrl=()=>{let{specSelectors:s}=this.props;return new(Nt())(s.url(),lt.location).toString()};UNSAFE_componentWillReceiveProps(s){let{getConfigs:o}=s,{validatorUrl:i}=o();this.setState({url:this.getDefinitionUrl(),validatorUrl:void 0===i?"https://validator.swagger.io/validator":i})}render(){let{getConfigs:s}=this.props,{spec:o}=s(),i=sanitizeUrl(this.state.validatorUrl);return"object"==typeof o&&Object.keys(o).length?null:this.state.url&&requiresValidationURL(this.state.validatorUrl)&&requiresValidationURL(this.state.url)?Re.createElement("span",{className:"float-right"},Re.createElement("a",{target:"_blank",rel:"noopener noreferrer",href:`${i}/debug?url=${encodeURIComponent(this.state.url)}`},Re.createElement(ValidatorImage,{src:`${i}?url=${encodeURIComponent(this.state.url)}`,alt:"Online validator badge"}))):null}}class ValidatorImage extends Re.Component{constructor(s){super(s),this.state={loaded:!1,error:!1}}componentDidMount(){const s=new Image;s.onload=()=>{this.setState({loaded:!0})},s.onerror=()=>{this.setState({error:!0})},s.src=this.props.src}UNSAFE_componentWillReceiveProps(s){if(s.src!==this.props.src){const o=new Image;o.onload=()=>{this.setState({loaded:!0})},o.onerror=()=>{this.setState({error:!0})},o.src=s.src}}render(){return this.state.error?Re.createElement("img",{alt:"Error"}):this.state.loaded?Re.createElement("img",{src:this.props.src,alt:this.props.alt}):null}}class Operations extends Re.Component{render(){let{specSelectors:s}=this.props;const o=s.taggedOperations();return 0===o.size?Re.createElement("h3",null," No operations defined in spec!"):Re.createElement("div",null,o.map(this.renderOperationTag).toArray(),o.size<1?Re.createElement("h3",null," No operations defined in spec! "):null)}renderOperationTag=(s,o)=>{const{specSelectors:i,getComponent:a,oas3Selectors:u,layoutSelectors:_,layoutActions:w,getConfigs:x}=this.props,C=i.validOperationMethods(),j=a("OperationContainer",!0),L=a("OperationTag"),B=s.get("operations");return Re.createElement(L,{key:"operation-"+o,tagObj:s,tag:o,oas3Selectors:u,layoutSelectors:_,layoutActions:w,getConfigs:x,getComponent:a,specUrl:i.url()},Re.createElement("div",{className:"operation-tag-content"},B.map((s=>{const i=s.get("path"),a=s.get("method"),u=We().List(["paths",i,a]);return-1===C.indexOf(a)?null:Re.createElement(j,{key:`${i}-${a}`,specPath:u,op:s,path:i,method:a,tag:o})})).toArray()))}}class OperationTag extends Re.Component{static defaultProps={tagObj:We().fromJS({}),tag:""};render(){const{tagObj:s,tag:o,children:i,oas3Selectors:a,layoutSelectors:u,layoutActions:_,getConfigs:w,getComponent:x,specUrl:C}=this.props;let{docExpansion:j,deepLinking:L}=w();const B=x("Collapse"),$=x("Markdown",!0),U=x("DeepLink"),V=x("Link"),z=x("ArrowUpIcon"),Y=x("ArrowDownIcon");let Z,ee=s.getIn(["tagDetails","description"],null),ie=s.getIn(["tagDetails","externalDocs","description"]),ae=s.getIn(["tagDetails","externalDocs","url"]);Z=isFunc(a)&&isFunc(a.selectedServer)?safeBuildUrl(ae,C,{selectedServer:a.selectedServer()}):ae;let ce=["operations-tag",o],le=u.isShown(ce,"full"===j||"list"===j);return Re.createElement("div",{className:le?"opblock-tag-section is-open":"opblock-tag-section"},Re.createElement("h3",{onClick:()=>_.show(ce,!le),className:ee?"opblock-tag":"opblock-tag no-desc",id:ce.map((s=>escapeDeepLinkPath(s))).join("-"),"data-tag":o,"data-is-open":le},Re.createElement(U,{enabled:L,isShown:le,path:createDeepLinkPath(o),text:o}),ee?Re.createElement("small",null,Re.createElement($,{source:ee})):Re.createElement("small",null),Z?Re.createElement("div",{className:"info__externaldocs"},Re.createElement("small",null,Re.createElement(V,{href:sanitizeUrl(Z),onClick:s=>s.stopPropagation(),target:"_blank"},ie||Z))):null,Re.createElement("button",{"aria-expanded":le,className:"expand-operation",title:le?"Collapse operation":"Expand operation",onClick:()=>_.show(ce,!le)},le?Re.createElement(z,{className:"arrow"}):Re.createElement(Y,{className:"arrow"}))),Re.createElement(B,{isOpened:le},i))}}class operation_Operation extends Re.PureComponent{static defaultProps={operation:null,response:null,request:null,specPath:(0,ze.List)(),summary:""};render(){let{specPath:s,response:o,request:i,toggleShown:a,onTryoutClick:u,onResetClick:_,onCancelClick:w,onExecute:x,fn:C,getComponent:j,getConfigs:L,specActions:B,specSelectors:$,authActions:U,authSelectors:V,oas3Actions:z,oas3Selectors:Y}=this.props,Z=this.props.operation,{deprecated:ee,isShown:ie,path:ae,method:ce,op:le,tag:pe,operationId:de,allowTryItOut:fe,displayRequestDuration:ye,tryItOutEnabled:be,executeInProgress:_e}=Z.toJS(),{description:Se,externalDocs:we,schemes:xe}=le;const Pe=we?safeBuildUrl(we.url,$.url(),{selectedServer:Y.selectedServer()}):"";let Te=Z.getIn(["op"]),$e=Te.get("responses"),qe=function getList(s,o){if(!We().Iterable.isIterable(s))return We().List();let i=s.getIn(Array.isArray(o)?o:[o]);return We().List.isList(i)?i:We().List()}(Te,["parameters"]),ze=$.operationScheme(ae,ce),He=["operations",pe,de],Ye=getExtensions(Te);const Xe=j("responses"),Qe=j("parameters"),et=j("execute"),tt=j("clear"),rt=j("Collapse"),nt=j("Markdown",!0),st=j("schemes"),ot=j("OperationServers"),it=j("OperationExt"),at=j("OperationSummary"),ct=j("Link"),{showExtensions:lt}=L();if($e&&o&&o.size>0){let s=!$e.get(String(o.get("status")))&&!$e.get("default");o=o.set("notDocumented",s)}let ut=[ae,ce];const pt=$.validationErrors([ae,ce]);return Re.createElement("div",{className:ee?"opblock opblock-deprecated":ie?`opblock opblock-${ce} is-open`:`opblock opblock-${ce}`,id:escapeDeepLinkPath(He.join("-"))},Re.createElement(at,{operationProps:Z,isShown:ie,toggleShown:a,getComponent:j,authActions:U,authSelectors:V,specPath:s}),Re.createElement(rt,{isOpened:ie},Re.createElement("div",{className:"opblock-body"},Te&&Te.size||null===Te?null:Re.createElement(rolling_load,{height:"32px",width:"32px",className:"opblock-loading-animation"}),ee&&Re.createElement("h4",{className:"opblock-title_normal"}," Warning: Deprecated"),Se&&Re.createElement("div",{className:"opblock-description-wrapper"},Re.createElement("div",{className:"opblock-description"},Re.createElement(nt,{source:Se}))),Pe?Re.createElement("div",{className:"opblock-external-docs-wrapper"},Re.createElement("h4",{className:"opblock-title_normal"},"Find more details"),Re.createElement("div",{className:"opblock-external-docs"},we.description&&Re.createElement("span",{className:"opblock-external-docs__description"},Re.createElement(nt,{source:we.description})),Re.createElement(ct,{target:"_blank",className:"opblock-external-docs__link",href:sanitizeUrl(Pe)},Pe))):null,Te&&Te.size?Re.createElement(Qe,{parameters:qe,specPath:s.push("parameters"),operation:Te,onChangeKey:ut,onTryoutClick:u,onResetClick:_,onCancelClick:w,tryItOutEnabled:be,allowTryItOut:fe,fn:C,getComponent:j,specActions:B,specSelectors:$,pathMethod:[ae,ce],getConfigs:L,oas3Actions:z,oas3Selectors:Y}):null,be?Re.createElement(ot,{getComponent:j,path:ae,method:ce,operationServers:Te.get("servers"),pathServers:$.paths().getIn([ae,"servers"]),getSelectedServer:Y.selectedServer,setSelectedServer:z.setSelectedServer,setServerVariableValue:z.setServerVariableValue,getServerVariable:Y.serverVariableValue,getEffectiveServerValue:Y.serverEffectiveValue}):null,be&&fe&&xe&&xe.size?Re.createElement("div",{className:"opblock-schemes"},Re.createElement(st,{schemes:xe,path:ae,method:ce,specActions:B,currentScheme:ze})):null,!be||!fe||pt.length<=0?null:Re.createElement("div",{className:"validation-errors errors-wrapper"},"Please correct the following validation errors and try again.",Re.createElement("ul",null,pt.map(((s,o)=>Re.createElement("li",{key:o}," ",s," "))))),Re.createElement("div",{className:be&&o&&fe?"btn-group":"execute-wrapper"},be&&fe?Re.createElement(et,{operation:Te,specActions:B,specSelectors:$,oas3Selectors:Y,oas3Actions:z,path:ae,method:ce,onExecute:x,disabled:_e}):null,be&&o&&fe?Re.createElement(tt,{specActions:B,path:ae,method:ce}):null),_e?Re.createElement("div",{className:"loading-container"},Re.createElement("div",{className:"loading"})):null,$e?Re.createElement(Xe,{responses:$e,request:i,tryItOutResponse:o,getComponent:j,getConfigs:L,specSelectors:$,oas3Actions:z,oas3Selectors:Y,specActions:B,produces:$.producesOptionsFor([ae,ce]),producesValue:$.currentProducesFor([ae,ce]),specPath:s.push("responses"),path:ae,method:ce,displayRequestDuration:ye,fn:C}):null,lt&&Ye.size?Re.createElement(it,{extensions:Ye,getComponent:j}):null)))}}class OperationContainer extends Re.PureComponent{constructor(s,o){super(s,o);const{tryItOutEnabled:i}=s.getConfigs();this.state={tryItOutEnabled:i,executeInProgress:!1}}static defaultProps={showSummary:!0,response:null,allowTryItOut:!0,displayOperationId:!1,displayRequestDuration:!1};mapStateToProps(s,o){const{op:i,layoutSelectors:a,getConfigs:u}=o,{docExpansion:_,deepLinking:w,displayOperationId:x,displayRequestDuration:C,supportedSubmitMethods:j}=u(),L=a.showSummary(),B=i.getIn(["operation","__originalOperationId"])||i.getIn(["operation","operationId"])||opId(i.get("operation"),o.path,o.method)||i.get("id"),$=["operations",o.tag,B],U=j.indexOf(o.method)>=0&&(void 0===o.allowTryItOut?o.specSelectors.allowTryItOutFor(o.path,o.method):o.allowTryItOut),V=i.getIn(["operation","security"])||o.specSelectors.security();return{operationId:B,isDeepLinkingEnabled:w,showSummary:L,displayOperationId:x,displayRequestDuration:C,allowTryItOut:U,security:V,isAuthorized:o.authSelectors.isAuthorized(V),isShown:a.isShown($,"full"===_),jumpToKey:`paths.${o.path}.${o.method}`,response:o.specSelectors.responseFor(o.path,o.method),request:o.specSelectors.requestFor(o.path,o.method)}}componentDidMount(){const{isShown:s}=this.props,o=this.getResolvedSubtree();s&&void 0===o&&this.requestResolvedSubtree()}componentDidUpdate(s){const{response:o,isShown:i}=this.props,a=this.getResolvedSubtree();o!==s.response&&this.setState({executeInProgress:!1}),i&&void 0===a&&!s.isShown&&this.requestResolvedSubtree()}toggleShown=()=>{let{layoutActions:s,tag:o,operationId:i,isShown:a}=this.props;const u=this.getResolvedSubtree();a||void 0!==u||this.requestResolvedSubtree(),s.show(["operations",o,i],!a)};onCancelClick=()=>{this.setState({tryItOutEnabled:!this.state.tryItOutEnabled})};onTryoutClick=()=>{this.setState({tryItOutEnabled:!this.state.tryItOutEnabled})};onResetClick=s=>{const o=this.props.oas3Selectors.selectDefaultRequestBodyValue(...s),i=this.props.oas3Selectors.requestContentType(...s);if("application/x-www-form-urlencoded"===i||"multipart/form-data"===i){const i=JSON.parse(o);Object.entries(i).forEach((([s,o])=>{Array.isArray(o)?i[s]=i[s].map((s=>"object"==typeof s?JSON.stringify(s,null,2):s)):"object"==typeof o&&(i[s]=JSON.stringify(i[s],null,2))})),this.props.oas3Actions.setRequestBodyValue({value:(0,ze.fromJS)(i),pathMethod:s})}else this.props.oas3Actions.setRequestBodyValue({value:o,pathMethod:s})};onExecute=()=>{this.setState({executeInProgress:!0})};getResolvedSubtree=()=>{const{specSelectors:s,path:o,method:i,specPath:a}=this.props;return a?s.specResolvedSubtree(a.toJS()):s.specResolvedSubtree(["paths",o,i])};requestResolvedSubtree=()=>{const{specActions:s,path:o,method:i,specPath:a}=this.props;return a?s.requestResolvedSubtree(a.toJS()):s.requestResolvedSubtree(["paths",o,i])};render(){let{op:s,tag:o,path:i,method:a,security:u,isAuthorized:_,operationId:w,showSummary:x,isShown:C,jumpToKey:j,allowTryItOut:L,response:B,request:$,displayOperationId:U,displayRequestDuration:V,isDeepLinkingEnabled:z,specPath:Y,specSelectors:Z,specActions:ee,getComponent:ie,getConfigs:ae,layoutSelectors:ce,layoutActions:le,authActions:pe,authSelectors:de,oas3Actions:fe,oas3Selectors:ye,fn:be}=this.props;const _e=ie("operation"),Se=this.getResolvedSubtree()||(0,ze.Map)(),we=(0,ze.fromJS)({op:Se,tag:o,path:i,summary:s.getIn(["operation","summary"])||"",deprecated:Se.get("deprecated")||s.getIn(["operation","deprecated"])||!1,method:a,security:u,isAuthorized:_,operationId:w,originalOperationId:Se.getIn(["operation","__originalOperationId"]),showSummary:x,isShown:C,jumpToKey:j,allowTryItOut:L,request:$,displayOperationId:U,displayRequestDuration:V,isDeepLinkingEnabled:z,executeInProgress:this.state.executeInProgress,tryItOutEnabled:this.state.tryItOutEnabled});return Re.createElement(_e,{operation:we,response:B,request:$,isShown:C,toggleShown:this.toggleShown,onTryoutClick:this.onTryoutClick,onResetClick:this.onResetClick,onCancelClick:this.onCancelClick,onExecute:this.onExecute,specPath:Y,specActions:ee,specSelectors:Z,oas3Actions:fe,oas3Selectors:ye,layoutActions:le,layoutSelectors:ce,authActions:pe,authSelectors:de,getComponent:ie,getConfigs:ae,fn:be})}}var HO=__webpack_require__(13222),KO=__webpack_require__.n(HO);class OperationSummary extends Re.PureComponent{static defaultProps={operationProps:null,specPath:(0,ze.List)(),summary:""};render(){let{isShown:s,toggleShown:o,getComponent:i,authActions:a,authSelectors:u,operationProps:_,specPath:w}=this.props,{summary:x,isAuthorized:C,method:j,op:L,showSummary:B,path:$,operationId:U,originalOperationId:V,displayOperationId:z}=_.toJS(),{summary:Y}=L,Z=_.get("security");const ee=i("authorizeOperationBtn",!0),ie=i("OperationSummaryMethod"),ae=i("OperationSummaryPath"),ce=i("JumpToPath",!0),le=i("CopyToClipboardBtn",!0),pe=i("ArrowUpIcon"),de=i("ArrowDownIcon"),fe=Z&&!!Z.count(),ye=fe&&1===Z.size&&Z.first().isEmpty(),be=!fe||ye;return Re.createElement("div",{className:`opblock-summary opblock-summary-${j}`},Re.createElement("button",{"aria-expanded":s,className:"opblock-summary-control",onClick:o},Re.createElement(ie,{method:j}),Re.createElement("div",{className:"opblock-summary-path-description-wrapper"},Re.createElement(ae,{getComponent:i,operationProps:_,specPath:w}),B?Re.createElement("div",{className:"opblock-summary-description"},KO()(Y||x)):null),z&&(V||U)?Re.createElement("span",{className:"opblock-summary-operation-id"},V||U):null),Re.createElement(le,{textToCopy:`${w.get(1)}`}),be?null:Re.createElement(ee,{isAuthorized:C,onClick:()=>{const s=u.definitionsForRequirements(Z);a.showDefinitions(s)}}),Re.createElement(ce,{path:w}),Re.createElement("button",{"aria-label":`${j} ${$.replace(/\//g,"​/")}`,className:"opblock-control-arrow","aria-expanded":s,tabIndex:"-1",onClick:o},s?Re.createElement(pe,{className:"arrow"}):Re.createElement(de,{className:"arrow"})))}}class OperationSummaryMethod extends Re.PureComponent{static defaultProps={operationProps:null};render(){let{method:s}=this.props;return Re.createElement("span",{className:"opblock-summary-method"},s.toUpperCase())}}class OperationSummaryPath extends Re.PureComponent{render(){let{getComponent:s,operationProps:o}=this.props,{deprecated:i,isShown:a,path:u,tag:_,operationId:w,isDeepLinkingEnabled:x}=o.toJS();const C=u.split(/(?=\/)/g);for(let s=1;s{let i=o("OperationExtRow");return Re.createElement("div",{className:"opblock-section"},Re.createElement("div",{className:"opblock-section-header"},Re.createElement("h4",null,"Extensions")),Re.createElement("div",{className:"table-container"},Re.createElement("table",null,Re.createElement("thead",null,Re.createElement("tr",null,Re.createElement("td",{className:"col_header"},"Field"),Re.createElement("td",{className:"col_header"},"Value"))),Re.createElement("tbody",null,s.entrySeq().map((([s,o])=>Re.createElement(i,{key:`${s}-${o}`,xKey:s,xVal:o})))))))},operation_extension_row=({xKey:s,xVal:o})=>{const i=o?o.toJS?o.toJS():o:null;return Re.createElement("tr",null,Re.createElement("td",null,s),Re.createElement("td",null,JSON.stringify(i)))};function createHtmlReadyId(s,o="_"){return s.replace(/[^\w-]/g,o)}class responses_Responses extends Re.Component{static defaultProps={tryItOutResponse:null,produces:(0,ze.fromJS)(["application/json"]),displayRequestDuration:!1};onChangeProducesWrapper=s=>this.props.specActions.changeProducesValue([this.props.path,this.props.method],s);onResponseContentTypeChange=({controlsAcceptHeader:s,value:o})=>{const{oas3Actions:i,path:a,method:u}=this.props;s&&i.setResponseContentType({value:o,path:a,method:u})};render(){let{responses:s,tryItOutResponse:o,getComponent:i,getConfigs:a,specSelectors:u,fn:_,producesValue:w,displayRequestDuration:x,specPath:C,path:j,method:L,oas3Selectors:B,oas3Actions:$}=this.props,U=function defaultStatusCode(s){let o=s.keySeq();return o.contains(jt)?jt:o.filter((s=>"2"===(s+"")[0])).sort().first()}(s);const V=i("contentType"),z=i("liveResponse"),Y=i("response");let Z=this.props.produces&&this.props.produces.size?this.props.produces:responses_Responses.defaultProps.produces;const ee=u.isOAS3()?function getAcceptControllingResponse(s){if(!We().OrderedMap.isOrderedMap(s))return null;if(!s.size)return null;const o=s.find(((s,o)=>o.startsWith("2")&&Object.keys(s.get("content")||{}).length>0)),i=s.get("default")||We().OrderedMap(),a=(i.get("content")||We().OrderedMap()).keySeq().toJS().length?i:null;return o||a}(s):null,ie=s.filter(((s,o)=>!isExtension(o))),ae=createHtmlReadyId(`${L}${j}_responses`),ce=`${ae}_select`;return ie&&ie.size?Re.createElement("div",{className:"responses-wrapper"},Re.createElement("div",{className:"opblock-section-header"},Re.createElement("h4",null,"Responses"),u.isOAS3()?null:Re.createElement("label",{htmlFor:ce},Re.createElement("span",null,"Response content type"),Re.createElement(V,{value:w,ariaControls:ae,ariaLabel:"Response content type",className:"execute-content-type",contentTypes:Z,controlId:ce,onChange:this.onChangeProducesWrapper}))),Re.createElement("div",{className:"responses-inner"},o?Re.createElement("div",null,Re.createElement(z,{response:o,getComponent:i,getConfigs:a,specSelectors:u,path:this.props.path,method:this.props.method,displayRequestDuration:x}),Re.createElement("h4",null,"Responses")):null,Re.createElement("table",{"aria-live":"polite",className:"responses-table",id:ae,role:"region"},Re.createElement("thead",null,Re.createElement("tr",{className:"responses-header"},Re.createElement("td",{className:"col_header response-col_status"},"Code"),Re.createElement("td",{className:"col_header response-col_description"},"Description"),u.isOAS3()?Re.createElement("td",{className:"col col_header response-col_links"},"Links"):null)),Re.createElement("tbody",null,ie.entrySeq().map((([s,x])=>{let V=o&&o.get("status")==s?"response_current":"";return Re.createElement(Y,{key:s,path:j,method:L,specPath:C.push(s),isDefault:U===s,fn:_,className:V,code:s,response:x,specSelectors:u,controlsAcceptHeader:x===ee,onContentTypeChange:this.onResponseContentTypeChange,contentType:w,getConfigs:a,activeExamplesKey:B.activeExamplesMember(j,L,"responses",s),oas3Actions:$,getComponent:i})})).toArray())))):null}}function getKnownSyntaxHighlighterLanguage(s){const o=function canJsonParse(s){try{return!!JSON.parse(s)}catch(s){return null}}(s);return o?"json":null}class response_Response extends Re.Component{constructor(s,o){super(s,o),this.state={responseContentType:""}}static defaultProps={response:(0,ze.fromJS)({}),onContentTypeChange:()=>{}};_onContentTypeChange=s=>{const{onContentTypeChange:o,controlsAcceptHeader:i}=this.props;this.setState({responseContentType:s}),o({value:s,controlsAcceptHeader:i})};getTargetExamplesKey=()=>{const{response:s,contentType:o,activeExamplesKey:i}=this.props,a=this.state.responseContentType||o,u=s.getIn(["content",a],(0,ze.Map)({})).get("examples",null).keySeq().first();return i||u};render(){let{path:s,method:o,code:i,response:a,className:u,specPath:_,fn:w,getComponent:x,getConfigs:C,specSelectors:j,contentType:L,controlsAcceptHeader:B,oas3Actions:$}=this.props,{inferSchema:U,getSampleSchema:V}=w,z=j.isOAS3();const{showExtensions:Y}=C();let Z=Y?getExtensions(a):null,ee=a.get("headers"),ie=a.get("links");const ae=x("ResponseExtension"),ce=x("headers"),le=x("HighlightCode",!0),pe=x("modelExample"),de=x("Markdown",!0),fe=x("operationLink"),ye=x("contentType"),be=x("ExamplesSelect"),_e=x("Example");var Se,we;const xe=this.state.responseContentType||L,Pe=a.getIn(["content",xe],(0,ze.Map)({})),Te=Pe.get("examples",null);if(z){const s=Pe.get("schema");Se=s?U(s.toJS()):null,we=s?_.push("content",this.state.responseContentType,"schema"):_}else Se=a.get("schema"),we=a.has("schema")?_.push("schema"):_;let $e,qe,We=!1,He={includeReadOnly:!0};if(z)if(qe=Pe.get("schema")?.toJS(),ze.Map.isMap(Te)&&!Te.isEmpty()){const s=this.getTargetExamplesKey(),getMediaTypeExample=s=>ze.Map.isMap(s)?s.get("value"):void 0;$e=getMediaTypeExample(Te.get(s,(0,ze.Map)({}))),void 0===$e&&($e=getMediaTypeExample(Te.values().next().value)),We=!0}else void 0!==Pe.get("example")&&($e=Pe.get("example"),We=!0);else{qe=Se,He={...He,includeWriteOnly:!0};const s=a.getIn(["examples",xe]);s&&($e=s,We=!0)}const Ye=((s,o)=>{if(null==s)return null;const i=getKnownSyntaxHighlighterLanguage(s)?"json":null;return Re.createElement("div",null,Re.createElement(o,{className:"example",language:i},stringify(s)))})(V(qe,xe,He,We?$e:void 0),le);return Re.createElement("tr",{className:"response "+(u||""),"data-code":i},Re.createElement("td",{className:"response-col_status"},i),Re.createElement("td",{className:"response-col_description"},Re.createElement("div",{className:"response-col_description__inner"},Re.createElement(de,{source:a.get("description")})),Y&&Z.size?Z.entrySeq().map((([s,o])=>Re.createElement(ae,{key:`${s}-${o}`,xKey:s,xVal:o}))):null,z&&a.get("content")?Re.createElement("section",{className:"response-controls"},Re.createElement("div",{className:Jn()("response-control-media-type",{"response-control-media-type--accept-controller":B})},Re.createElement("small",{className:"response-control-media-type__title"},"Media type"),Re.createElement(ye,{value:this.state.responseContentType,contentTypes:a.get("content")?a.get("content").keySeq():(0,ze.Seq)(),onChange:this._onContentTypeChange,ariaLabel:"Media Type"}),B?Re.createElement("small",{className:"response-control-media-type__accept-message"},"Controls ",Re.createElement("code",null,"Accept")," header."):null),ze.Map.isMap(Te)&&!Te.isEmpty()?Re.createElement("div",{className:"response-control-examples"},Re.createElement("small",{className:"response-control-examples__title"},"Examples"),Re.createElement(be,{examples:Te,currentExampleKey:this.getTargetExamplesKey(),onSelect:a=>$.setActiveExamplesMember({name:a,pathMethod:[s,o],contextType:"responses",contextName:i}),showLabels:!1})):null):null,Ye||Se?Re.createElement(pe,{specPath:we,getComponent:x,getConfigs:C,specSelectors:j,schema:fromJSOrdered(Se),example:Ye,includeReadOnly:!0}):null,z&&Te?Re.createElement(_e,{example:Te.get(this.getTargetExamplesKey(),(0,ze.Map)({})),getComponent:x,getConfigs:C,omitValue:!0}):null,ee?Re.createElement(ce,{headers:ee,getComponent:x}):null),z?Re.createElement("td",{className:"response-col_links"},ie?ie.toSeq().entrySeq().map((([s,o])=>Re.createElement(fe,{key:s,name:s,link:o,getComponent:x}))):Re.createElement("i",null,"No links")):null)}}const response_extension=({xKey:s,xVal:o})=>Re.createElement("div",{className:"response__extension"},s,": ",String(o));var GO=__webpack_require__(26657),YO=__webpack_require__.n(GO),XO=__webpack_require__(80218),QO=__webpack_require__.n(XO);class ResponseBody extends Re.PureComponent{state={parsedContent:null};updateParsedContent=s=>{const{content:o}=this.props;if(s!==o)if(o&&o instanceof Blob){var i=new FileReader;i.onload=()=>{this.setState({parsedContent:i.result})},i.readAsText(o)}else this.setState({parsedContent:o.toString()})};componentDidMount(){this.updateParsedContent(null)}componentDidUpdate(s){this.updateParsedContent(s.content)}render(){let{content:s,contentType:o,url:i,headers:a={},getComponent:u}=this.props;const{parsedContent:_}=this.state,w=u("HighlightCode",!0),x="response_"+(new Date).getTime();let C,j;if(i=i||"",(/^application\/octet-stream/i.test(o)||a["Content-Disposition"]&&/attachment/i.test(a["Content-Disposition"])||a["content-disposition"]&&/attachment/i.test(a["content-disposition"])||a["Content-Description"]&&/File Transfer/i.test(a["Content-Description"])||a["content-description"]&&/File Transfer/i.test(a["content-description"]))&&(s.size>0||s.length>0))if("Blob"in window){let u=o||"text/html",_=s instanceof Blob?s:new Blob([s],{type:u}),w=window.URL.createObjectURL(_),x=[u,i.substr(i.lastIndexOf("/")+1),w].join(":"),C=a["content-disposition"]||a["Content-Disposition"];if(void 0!==C){let s=function extractFileNameFromContentDispositionHeader(s){let o;if([/filename\*=[^']+'\w*'"([^"]+)";?/i,/filename\*=[^']+'\w*'([^;]+);?/i,/filename="([^;]*);?"/i,/filename=([^;]*);?/i].some((i=>(o=i.exec(s),null!==o))),null!==o&&o.length>1)try{return decodeURIComponent(o[1])}catch(s){console.error(s)}return null}(C);null!==s&&(x=s)}j=lt.navigator&<.navigator.msSaveOrOpenBlob?Re.createElement("div",null,Re.createElement("a",{href:w,onClick:()=>lt.navigator.msSaveOrOpenBlob(_,x)},"Download file")):Re.createElement("div",null,Re.createElement("a",{href:w,download:x},"Download file"))}else j=Re.createElement("pre",{className:"microlight"},"Download headers detected but your browser does not support downloading binary via XHR (Blob).");else if(/json/i.test(o)){let o=null;getKnownSyntaxHighlighterLanguage(s)&&(o="json");try{C=JSON.stringify(JSON.parse(s),null," ")}catch(o){C="can't parse JSON. Raw result:\n\n"+s}j=Re.createElement(w,{language:o,downloadable:!0,fileName:`${x}.json`,canCopy:!0},C)}else/xml/i.test(o)?(C=YO()(s,{textNodesOnSameLine:!0,indentor:" "}),j=Re.createElement(w,{downloadable:!0,fileName:`${x}.xml`,canCopy:!0},C)):j="text/html"===QO()(o)||/text\/plain/.test(o)?Re.createElement(w,{downloadable:!0,fileName:`${x}.html`,canCopy:!0},s):"text/csv"===QO()(o)||/text\/csv/.test(o)?Re.createElement(w,{downloadable:!0,fileName:`${x}.csv`,canCopy:!0},s):/^image\//i.test(o)?o.includes("svg")?Re.createElement("div",null," ",s," "):Re.createElement("img",{src:window.URL.createObjectURL(s)}):/^audio\//i.test(o)?Re.createElement("pre",{className:"microlight"},Re.createElement("audio",{controls:!0,key:i},Re.createElement("source",{src:i,type:o}))):"string"==typeof s?Re.createElement(w,{downloadable:!0,fileName:`${x}.txt`,canCopy:!0},s):s.size>0?_?Re.createElement("div",null,Re.createElement("p",{className:"i"},"Unrecognized response type; displaying content as text."),Re.createElement(w,{downloadable:!0,fileName:`${x}.txt`,canCopy:!0},_)):Re.createElement("p",{className:"i"},"Unrecognized response type; unable to display."):null;return j?Re.createElement("div",null,Re.createElement("h5",null,"Response body"),j):null}}class Parameters extends Re.Component{constructor(s){super(s),this.state={callbackVisible:!1,parametersVisible:!0}}static defaultProps={onTryoutClick:Function.prototype,onCancelClick:Function.prototype,tryItOutEnabled:!1,allowTryItOut:!0,onChangeKey:[],specPath:[]};onChange=(s,o,i)=>{let{specActions:{changeParamByIdentity:a},onChangeKey:u}=this.props;a(u,s,o,i)};onChangeConsumesWrapper=s=>{let{specActions:{changeConsumesValue:o},onChangeKey:i}=this.props;o(i,s)};toggleTab=s=>"parameters"===s?this.setState({parametersVisible:!0,callbackVisible:!1}):"callbacks"===s?this.setState({callbackVisible:!0,parametersVisible:!1}):void 0;onChangeMediaType=({value:s,pathMethod:o})=>{let{specActions:i,oas3Selectors:a,oas3Actions:u}=this.props;const _=a.hasUserEditedBody(...o),w=a.shouldRetainRequestBodyValue(...o);u.setRequestContentType({value:s,pathMethod:o}),u.initRequestBodyValidateError({pathMethod:o}),_||(w||u.setRequestBodyValue({value:void 0,pathMethod:o}),i.clearResponse(...o),i.clearRequest(...o),i.clearValidateParams(o))};render(){let{onTryoutClick:s,onResetClick:o,parameters:i,allowTryItOut:a,tryItOutEnabled:u,specPath:_,fn:w,getComponent:x,getConfigs:C,specSelectors:j,specActions:L,pathMethod:B,oas3Actions:$,oas3Selectors:U,operation:V}=this.props;const z=x("parameterRow"),Y=x("TryItOutButton"),Z=x("contentType"),ee=x("Callbacks",!0),ie=x("RequestBody",!0),ae=u&&a,ce=j.isOAS3(),le=`${createHtmlReadyId(`${B[1]}${B[0]}_requests`)}_select`,pe=V.get("requestBody"),de=Object.values(i.reduce(((s,o)=>{if(ze.Map.isMap(o)){const i=o.get("in");s[i]??=[],s[i].push(o)}return s}),{})).reduce(((s,o)=>s.concat(o)),[]);return Re.createElement("div",{className:"opblock-section"},Re.createElement("div",{className:"opblock-section-header"},ce?Re.createElement("div",{className:"tab-header"},Re.createElement("div",{onClick:()=>this.toggleTab("parameters"),className:`tab-item ${this.state.parametersVisible&&"active"}`},Re.createElement("h4",{className:"opblock-title"},Re.createElement("span",null,"Parameters"))),V.get("callbacks")?Re.createElement("div",{onClick:()=>this.toggleTab("callbacks"),className:`tab-item ${this.state.callbackVisible&&"active"}`},Re.createElement("h4",{className:"opblock-title"},Re.createElement("span",null,"Callbacks"))):null):Re.createElement("div",{className:"tab-header"},Re.createElement("h4",{className:"opblock-title"},"Parameters")),a?Re.createElement(Y,{isOAS3:j.isOAS3(),hasUserEditedBody:U.hasUserEditedBody(...B),enabled:u,onCancelClick:this.props.onCancelClick,onTryoutClick:s,onResetClick:()=>o(B)}):null),this.state.parametersVisible?Re.createElement("div",{className:"parameters-container"},de.length?Re.createElement("div",{className:"table-container"},Re.createElement("table",{className:"parameters"},Re.createElement("thead",null,Re.createElement("tr",null,Re.createElement("th",{className:"col_header parameters-col_name"},"Name"),Re.createElement("th",{className:"col_header parameters-col_description"},"Description"))),Re.createElement("tbody",null,de.map(((s,o)=>Re.createElement(z,{fn:w,specPath:_.push(o.toString()),getComponent:x,getConfigs:C,rawParam:s,param:j.parameterWithMetaByIdentity(B,s),key:`${s.get("in")}.${s.get("name")}`,onChange:this.onChange,onChangeConsumes:this.onChangeConsumesWrapper,specSelectors:j,specActions:L,oas3Actions:$,oas3Selectors:U,pathMethod:B,isExecute:ae})))))):Re.createElement("div",{className:"opblock-description-wrapper"},Re.createElement("p",null,"No parameters"))):null,this.state.callbackVisible?Re.createElement("div",{className:"callbacks-container opblock-description-wrapper"},Re.createElement(ee,{callbacks:(0,ze.Map)(V.get("callbacks")),specPath:_.slice(0,-1).push("callbacks")})):null,ce&&pe&&this.state.parametersVisible&&Re.createElement("div",{className:"opblock-section opblock-section-request-body"},Re.createElement("div",{className:"opblock-section-header"},Re.createElement("h4",{className:`opblock-title parameter__name ${pe.get("required")&&"required"}`},"Request body"),Re.createElement("label",{id:le},Re.createElement(Z,{value:U.requestContentType(...B),contentTypes:pe.get("content",(0,ze.List)()).keySeq(),onChange:s=>{this.onChangeMediaType({value:s,pathMethod:B})},className:"body-param-content-type",ariaLabel:"Request content type",controlId:le}))),Re.createElement("div",{className:"opblock-description-wrapper"},Re.createElement(ie,{setRetainRequestBodyValueFlag:s=>$.setRetainRequestBodyValueFlag({value:s,pathMethod:B}),userHasEditedBody:U.hasUserEditedBody(...B),specPath:_.slice(0,-1).push("requestBody"),requestBody:pe,requestBodyValue:U.requestBodyValue(...B),requestBodyInclusionSetting:U.requestBodyInclusionSetting(...B),requestBodyErrors:U.requestBodyErrors(...B),isExecute:ae,getConfigs:C,activeExamplesKey:U.activeExamplesMember(...B,"requestBody","requestBody"),updateActiveExamplesKey:s=>{this.props.oas3Actions.setActiveExamplesMember({name:s,pathMethod:this.props.pathMethod,contextType:"requestBody",contextName:"requestBody"})},onChange:(s,o)=>{if(o){const i=U.requestBodyValue(...B),a=ze.Map.isMap(i)?i:(0,ze.Map)();return $.setRequestBodyValue({pathMethod:B,value:a.setIn(o,s)})}$.setRequestBodyValue({value:s,pathMethod:B})},onChangeIncludeEmpty:(s,o)=>{$.setRequestBodyInclusion({pathMethod:B,value:o,name:s})},contentType:U.requestContentType(...B)}))))}}const parameter_extension=({xKey:s,xVal:o})=>Re.createElement("div",{className:"parameter__extension"},s,": ",String(o)),ZO={onChange:()=>{},isIncludedOptions:{}};class ParameterIncludeEmpty extends Re.Component{static defaultProps=ZO;componentDidMount(){const{isIncludedOptions:s,onChange:o}=this.props,{shouldDispatchInit:i,defaultValue:a}=s;i&&o(a)}onCheckboxChange=s=>{const{onChange:o}=this.props;o(s.target.checked)};render(){let{isIncluded:s,isDisabled:o}=this.props;return Re.createElement("div",null,Re.createElement("label",{htmlFor:"include_empty_value",className:Jn()("parameter__empty_value_toggle",{disabled:o})},Re.createElement("input",{id:"include_empty_value",type:"checkbox",disabled:o,checked:!o&&s,onChange:this.onCheckboxChange}),"Send empty value"))}}class ParameterRow extends Re.Component{constructor(s,o){super(s,o),this.setDefaultValue()}UNSAFE_componentWillReceiveProps(s){let o,{specSelectors:i,pathMethod:a,rawParam:u}=s,_=i.isOAS3(),w=i.parameterWithMetaByIdentity(a,u)||new ze.Map;if(w=w.isEmpty()?u:w,_){let{schema:s}=getParameterSchema(w,{isOAS3:_});o=s?s.get("enum"):void 0}else o=w?w.get("enum"):void 0;let x,C=w?w.get("value"):void 0;void 0!==C?x=C:u.get("required")&&o&&o.size&&(x=o.first()),void 0!==x&&x!==C&&this.onChangeWrapper(function numberToString(s){return"number"==typeof s?s.toString():s}(x)),this.setDefaultValue()}onChangeWrapper=(s,o=!1)=>{let i,{onChange:a,rawParam:u}=this.props;return i=""===s||s&&0===s.size?null:s,a(u,i,o)};_onExampleSelect=s=>{this.props.oas3Actions.setActiveExamplesMember({name:s,pathMethod:this.props.pathMethod,contextType:"parameters",contextName:this.getParamKey()})};onChangeIncludeEmpty=s=>{let{specActions:o,param:i,pathMethod:a}=this.props;const u=i.get("name"),_=i.get("in");return o.updateEmptyParamInclusion(a,u,_,s)};setDefaultValue=()=>{let{specSelectors:s,pathMethod:o,rawParam:i,oas3Selectors:a,fn:u}=this.props;const _=s.parameterWithMetaByIdentity(o,i)||(0,ze.Map)();let{schema:w}=getParameterSchema(_,{isOAS3:s.isOAS3()});const x=_.get("content",(0,ze.Map)()).keySeq().first(),C=w?u.getSampleSchema(w.toJS(),x,{includeWriteOnly:!0}):null;if(_&&void 0===_.get("value")&&"body"!==_.get("in")){let i;if(s.isSwagger2())i=void 0!==_.get("x-example")?_.get("x-example"):void 0!==_.getIn(["schema","example"])?_.getIn(["schema","example"]):w&&w.getIn(["default"]);else if(s.isOAS3()){w=this.composeJsonSchema(w);const s=a.activeExamplesMember(...o,"parameters",this.getParamKey());i=void 0!==_.getIn(["examples",s,"value"])?_.getIn(["examples",s,"value"]):void 0!==_.getIn(["content",x,"example"])?_.getIn(["content",x,"example"]):void 0!==_.get("example")?_.get("example"):void 0!==(w&&w.get("example"))?w&&w.get("example"):void 0!==(w&&w.get("default"))?w&&w.get("default"):_.get("default")}void 0===i||ze.List.isList(i)||(i=stringify(i));const j=u.getSchemaObjectType(w),L=u.getSchemaObjectType(w?.get("items"));void 0!==i?this.onChangeWrapper(i):"object"===j&&C&&!_.get("examples")?this.onChangeWrapper(ze.List.isList(C)?C:stringify(C)):"array"===j&&"object"===L&&C&&!_.get("examples")&&this.onChangeWrapper(ze.List.isList(C)?C:(0,ze.List)(JSON.parse(C)))}};getParamKey(){const{param:s}=this.props;return s?`${s.get("name")}-${s.get("in")}`:null}composeJsonSchema(s){const{fn:o}=this.props,i=s.get("oneOf")?.get(0)?.toJS(),a=s.get("anyOf")?.get(0)?.toJS();return(0,ze.fromJS)(o.mergeJsonSchema(s.toJS(),i??a??{}))}render(){let{param:s,rawParam:o,getComponent:i,getConfigs:a,isExecute:u,fn:_,onChangeConsumes:w,specSelectors:x,pathMethod:C,specPath:j,oas3Selectors:L}=this.props,B=x.isOAS3();const{showExtensions:$,showCommonExtensions:U}=a();if(s||(s=o),!o)return null;const V=i("JsonSchemaForm"),z=i("ParamBody");let Y=s.get("in"),Z="body"!==Y?null:Re.createElement(z,{getComponent:i,getConfigs:a,fn:_,param:s,consumes:x.consumesOptionsFor(C),consumesValue:x.contentTypeValues(C).get("requestContentType"),onChange:this.onChangeWrapper,onChangeConsumes:w,isExecute:u,specSelectors:x,pathMethod:C});const ee=i("modelExample"),ie=i("Markdown",!0),ae=i("ParameterExt"),ce=i("ParameterIncludeEmpty"),le=i("ExamplesSelectValueRetainer"),pe=i("Example");let{schema:de}=getParameterSchema(s,{isOAS3:B}),fe=x.parameterWithMetaByIdentity(C,o)||(0,ze.Map)();const ye=fe.get("content",(0,ze.Map)()).keySeq().first();B&&(de=this.composeJsonSchema(de));let be=de?de.get("format"):null,_e="formData"===Y,Se="FormData"in lt,we=s.get("required");const xe=_.getSchemaObjectType(de),Pe=_.getSchemaObjectType(de?.get("items")),Te=_.getSchemaObjectTypeLabel(de),$e=!Z&&"object"===xe,qe=!Z&&"object"===Pe;let We,He,Ye,Xe,Qe=fe?fe.get("value"):"",et=U?getCommonExtensions(de):null,tt=$?getExtensions(s):null,rt=!1;void 0!==s&&de&&(We=de.get("items")),void 0!==We?(He=We.get("enum"),Ye=We.get("default")):de&&(He=de.get("enum")),He&&He.size&&He.size>0&&(rt=!0),void 0!==s&&(de&&(Ye=de.get("default")),void 0===Ye&&(Ye=s.get("default")),Xe=s.get("example"),void 0===Xe&&(Xe=s.get("x-example")));const nt=Z?null:Re.createElement(V,{fn:_,getComponent:i,value:Qe,required:we,disabled:!u,description:s.get("name"),onChange:this.onChangeWrapper,errors:fe.get("errors"),schema:de});return Re.createElement("tr",{"data-param-name":s.get("name"),"data-param-in":s.get("in")},Re.createElement("td",{className:"parameters-col_name"},Re.createElement("div",{className:we?"parameter__name required":"parameter__name"},s.get("name"),we?Re.createElement("span",null," *"):null),Re.createElement("div",{className:"parameter__type"},Te,be&&Re.createElement("span",{className:"prop-format"},"($",be,")")),Re.createElement("div",{className:"parameter__deprecated"},B&&s.get("deprecated")?"deprecated":null),Re.createElement("div",{className:"parameter__in"},"(",s.get("in"),")")),Re.createElement("td",{className:"parameters-col_description"},s.get("description")?Re.createElement(ie,{source:s.get("description")}):null,!Z&&u||!rt?null:Re.createElement(ie,{className:"parameter__enum",source:"Available values : "+He.map((function(s){return s})).toArray().map(String).join(", ")}),!Z&&u||void 0===Ye?null:Re.createElement(ie,{className:"parameter__default",source:"Default value : "+Ye}),!Z&&u||void 0===Xe?null:Re.createElement(ie,{source:"Example : "+Xe}),_e&&!Se&&Re.createElement("div",null,"Error: your browser does not support FormData"),B&&s.get("examples")?Re.createElement("section",{className:"parameter-controls"},Re.createElement(le,{examples:s.get("examples"),onSelect:this._onExampleSelect,updateValue:this.onChangeWrapper,getComponent:i,defaultToFirstExample:!0,currentKey:L.activeExamplesMember(...C,"parameters",this.getParamKey()),currentUserInputValue:Qe})):null,$e||qe?Re.createElement(ee,{getComponent:i,specPath:ye?j.push("content",ye,"schema"):j.push("schema"),getConfigs:a,isExecute:u,specSelectors:x,schema:de,example:nt}):nt,Z&&de?Re.createElement(ee,{getComponent:i,specPath:j.push("schema"),getConfigs:a,isExecute:u,specSelectors:x,schema:de,example:Z,includeWriteOnly:!0}):null,!Z&&u&&s.get("allowEmptyValue")?Re.createElement(ce,{onChange:this.onChangeIncludeEmpty,isIncluded:x.parameterInclusionSettingFor(C,s.get("name"),s.get("in")),isDisabled:!isEmptyValue(Qe)}):null,B&&s.get("examples")?Re.createElement(pe,{example:s.getIn(["examples",L.activeExamplesMember(...C,"parameters",this.getParamKey())]),getComponent:i,getConfigs:a}):null,U&&et.size?et.entrySeq().map((([s,o])=>Re.createElement(ae,{key:`${s}-${o}`,xKey:s,xVal:o}))):null,$&&tt.size?tt.entrySeq().map((([s,o])=>Re.createElement(ae,{key:`${s}-${o}`,xKey:s,xVal:o}))):null))}}class Execute extends Re.Component{handleValidateParameters=()=>{let{specSelectors:s,specActions:o,path:i,method:a}=this.props;return o.validateParams([i,a]),s.validateBeforeExecute([i,a])};handleValidateRequestBody=()=>{let{path:s,method:o,specSelectors:i,oas3Selectors:a,oas3Actions:u}=this.props,_={missingBodyValue:!1,missingRequiredKeys:[]};u.clearRequestBodyValidateError({path:s,method:o});let w=i.getOAS3RequiredRequestBodyContentType([s,o]),x=a.requestBodyValue(s,o),C=a.validateBeforeExecute([s,o]),j=a.requestContentType(s,o);if(!C)return _.missingBodyValue=!0,u.setRequestBodyValidateError({path:s,method:o,validationErrors:_}),!1;if(!w)return!0;let L=a.validateShallowRequired({oas3RequiredRequestBodyContentType:w,oas3RequestContentType:j,oas3RequestBodyValue:x});return!L||L.length<1||(L.forEach((s=>{_.missingRequiredKeys.push(s)})),u.setRequestBodyValidateError({path:s,method:o,validationErrors:_}),!1)};handleValidationResultPass=()=>{let{specActions:s,operation:o,path:i,method:a}=this.props;this.props.onExecute&&this.props.onExecute(),s.execute({operation:o,path:i,method:a})};handleValidationResultFail=()=>{let{specActions:s,path:o,method:i}=this.props;s.clearValidateParams([o,i]),setTimeout((()=>{s.validateParams([o,i])}),40)};handleValidationResult=s=>{s?this.handleValidationResultPass():this.handleValidationResultFail()};onClick=()=>{let s=this.handleValidateParameters(),o=this.handleValidateRequestBody(),i=s&&o;this.handleValidationResult(i)};onChangeProducesWrapper=s=>this.props.specActions.changeProducesValue([this.props.path,this.props.method],s);render(){const{disabled:s}=this.props;return Re.createElement("button",{className:"btn execute opblock-control__btn",onClick:this.onClick,disabled:s},"Execute")}}class headers_Headers extends Re.Component{render(){let{headers:s,getComponent:o}=this.props;const i=o("Property"),a=o("Markdown",!0);return s&&s.size?Re.createElement("div",{className:"headers-wrapper"},Re.createElement("h4",{className:"headers__title"},"Headers:"),Re.createElement("table",{className:"headers"},Re.createElement("thead",null,Re.createElement("tr",{className:"header-row"},Re.createElement("th",{className:"header-col"},"Name"),Re.createElement("th",{className:"header-col"},"Description"),Re.createElement("th",{className:"header-col"},"Type"))),Re.createElement("tbody",null,s.entrySeq().map((([s,o])=>{if(!We().Map.isMap(o))return null;const u=o.get("description"),_=o.getIn(["schema"])?o.getIn(["schema","type"]):o.getIn(["type"]),w=o.getIn(["schema","example"]);return Re.createElement("tr",{key:s},Re.createElement("td",{className:"header-col"},s),Re.createElement("td",{className:"header-col"},u?Re.createElement(a,{source:u}):null),Re.createElement("td",{className:"header-col"},_," ",w?Re.createElement(i,{propKey:"Example",propVal:w,propClass:"header-example"}):null))})).toArray()))):null}}class Errors extends Re.Component{render(){let{editorActions:s,errSelectors:o,layoutSelectors:i,layoutActions:a,getComponent:u}=this.props;const _=u("Collapse");if(s&&s.jumpToLine)var w=s.jumpToLine;let x=o.allErrors().filter((s=>"thrown"===s.get("type")||"error"===s.get("level")));if(!x||x.count()<1)return null;let C=i.isShown(["errorPane"],!0),j=x.sortBy((s=>s.get("line")));return Re.createElement("pre",{className:"errors-wrapper"},Re.createElement("hgroup",{className:"error"},Re.createElement("h4",{className:"errors__title"},"Errors"),Re.createElement("button",{className:"btn errors__clear-btn",onClick:()=>a.show(["errorPane"],!C)},C?"Hide":"Show")),Re.createElement(_,{isOpened:C,animated:!0},Re.createElement("div",{className:"errors"},j.map(((s,o)=>{let i=s.get("type");return"thrown"===i||"auth"===i?Re.createElement(ThrownErrorItem,{key:o,error:s.get("error")||s,jumpToLine:w}):"spec"===i?Re.createElement(SpecErrorItem,{key:o,error:s,jumpToLine:w}):void 0})))))}}const ThrownErrorItem=({error:s,jumpToLine:o})=>{if(!s)return null;let i=s.get("line");return Re.createElement("div",{className:"error-wrapper"},s?Re.createElement("div",null,Re.createElement("h4",null,s.get("source")&&s.get("level")?toTitleCase(s.get("source"))+" "+s.get("level"):"",s.get("path")?Re.createElement("small",null," at ",s.get("path")):null),Re.createElement("span",{className:"message thrown"},s.get("message")),Re.createElement("div",{className:"error-line"},i&&o?Re.createElement("a",{onClick:o.bind(null,i)},"Jump to line ",i):null)):null)},SpecErrorItem=({error:s,jumpToLine:o=null})=>{let i=null;return s.get("path")?i=ze.List.isList(s.get("path"))?Re.createElement("small",null,"at ",s.get("path").join(".")):Re.createElement("small",null,"at ",s.get("path")):s.get("line")&&!o&&(i=Re.createElement("small",null,"on line ",s.get("line"))),Re.createElement("div",{className:"error-wrapper"},s?Re.createElement("div",null,Re.createElement("h4",null,toTitleCase(s.get("source"))+" "+s.get("level")," ",i),Re.createElement("span",{className:"message"},s.get("message")),Re.createElement("div",{className:"error-line"},o?Re.createElement("a",{onClick:o.bind(null,s.get("line"))},"Jump to line ",s.get("line")):null)):null)};function toTitleCase(s){return(s||"").split(" ").map((s=>s[0].toUpperCase()+s.slice(1))).join(" ")}const content_type_noop=()=>{};class ContentType extends Re.Component{static defaultProps={onChange:content_type_noop,value:null,contentTypes:(0,ze.fromJS)(["application/json"])};componentDidMount(){const{contentTypes:s,onChange:o}=this.props;s&&s.size&&o(s.first())}componentDidUpdate(){const{contentTypes:s,value:o,onChange:i}=this.props;s&&s.size&&(s.includes(o)||i(s.first()))}onChangeWrapper=s=>this.props.onChange(s.target.value);render(){let{ariaControls:s,ariaLabel:o,className:i,contentTypes:a,controlId:u,value:_}=this.props;return a&&a.size?Re.createElement("div",{className:"content-type-wrapper "+(i||"")},Re.createElement("select",{"aria-controls":s,"aria-label":o,className:"content-type",id:u,onChange:this.onChangeWrapper,value:_||""},a.map((s=>Re.createElement("option",{key:s,value:s},s))).toArray())):null}}function xclass(...s){return s.filter((s=>!!s)).join(" ").trim()}class Container extends Re.Component{render(){let{fullscreen:s,full:o,...i}=this.props;if(s)return Re.createElement("section",i);let a="swagger-container"+(o?"-full":"");return Re.createElement("section",Mn()({},i,{className:xclass(i.className,a)}))}}const eA={mobile:"",tablet:"-tablet",desktop:"-desktop",large:"-hd"};class Col extends Re.Component{render(){const{hide:s,keepContents:o,mobile:i,tablet:a,desktop:u,large:_,...w}=this.props;if(s&&!o)return Re.createElement("span",null);let x=[];for(let s in eA){if(!Object.prototype.hasOwnProperty.call(eA,s))continue;let o=eA[s];if(s in this.props){let i=this.props[s];if(i<1){x.push("none"+o);continue}x.push("block"+o),x.push("col-"+i+o)}}s&&x.push("hidden");let C=xclass(w.className,...x);return Re.createElement("section",Mn()({},w,{className:C}))}}class Row extends Re.Component{render(){return Re.createElement("div",Mn()({},this.props,{className:xclass(this.props.className,"wrapper")}))}}class Button extends Re.Component{static defaultProps={className:""};render(){return Re.createElement("button",Mn()({},this.props,{className:xclass(this.props.className,"button")}))}}const TextArea=s=>Re.createElement("textarea",s),Input=s=>Re.createElement("input",s);class Select extends Re.Component{static defaultProps={multiple:!1,allowEmptyValue:!0};constructor(s,o){let i;super(s,o),i=s.value?s.value:s.multiple?[""]:"",this.state={value:i}}onChange=s=>{let o,{onChange:i,multiple:a}=this.props,u=[].slice.call(s.target.options);o=a?u.filter((function(s){return s.selected})).map((function(s){return s.value})):s.target.value,this.setState({value:o}),i&&i(o)};UNSAFE_componentWillReceiveProps(s){s.value!==this.props.value&&this.setState({value:s.value})}render(){let{allowedValues:s,multiple:o,allowEmptyValue:i,disabled:a}=this.props,u=this.state.value?.toJS?.()||this.state.value;return Re.createElement("select",{className:this.props.className,multiple:o,value:u,onChange:this.onChange,disabled:a},i?Re.createElement("option",{value:""},"--"):null,s.map((function(s,o){return Re.createElement("option",{key:o,value:String(s)},String(s))})))}}class layout_utils_Link extends Re.Component{render(){return Re.createElement("a",Mn()({},this.props,{rel:"noopener noreferrer",className:xclass(this.props.className,"link")}))}}const NoMargin=({children:s})=>Re.createElement("div",{className:"no-margin"}," ",s," ");class Collapse extends Re.Component{static defaultProps={isOpened:!1,animated:!1};renderNotAnimated(){return this.props.isOpened?Re.createElement(NoMargin,null,this.props.children):Re.createElement("noscript",null)}render(){let{animated:s,isOpened:o,children:i}=this.props;return s?(i=o?i:null,Re.createElement(NoMargin,null,i)):this.renderNotAnimated()}}class Overview extends Re.Component{constructor(...s){super(...s),this.setTagShown=this._setTagShown.bind(this)}_setTagShown(s,o){this.props.layoutActions.show(s,o)}showOp(s,o){let{layoutActions:i}=this.props;i.show(s,o)}render(){let{specSelectors:s,layoutSelectors:o,layoutActions:i,getComponent:a}=this.props,u=s.taggedOperations();const _=a("Collapse");return Re.createElement("div",null,Re.createElement("h4",{className:"overview-title"},"Overview"),u.map(((s,a)=>{let u=s.get("operations"),w=["overview-tags",a],x=o.isShown(w,!0);return Re.createElement("div",{key:"overview-"+a},Re.createElement("h4",{onClick:()=>i.show(w,!x),className:"link overview-tag"}," ",x?"-":"+",a),Re.createElement(_,{isOpened:x,animated:!0},u.map((s=>{let{path:a,method:u,id:_}=s.toObject(),w="operations",x=_,C=o.isShown([w,x]);return Re.createElement(OperationLink,{key:_,path:a,method:u,id:a+"-"+u,shown:C,showOpId:x,showOpIdPrefix:w,href:`#operation-${x}`,onClick:i.show})})).toArray()))})).toArray(),u.size<1&&Re.createElement("h3",null," No operations defined in spec! "))}}class OperationLink extends Re.Component{constructor(s){super(s),this.onClick=this._onClick.bind(this)}_onClick(){let{showOpId:s,showOpIdPrefix:o,onClick:i,shown:a}=this.props;i([o,s],!a)}render(){let{id:s,method:o,shown:i,href:a}=this.props;return Re.createElement(layout_utils_Link,{href:a,onClick:this.onClick,className:"block opblock-link "+(i?"shown":"")},Re.createElement("div",null,Re.createElement("small",{className:`bold-label-${o}`},o.toUpperCase()),Re.createElement("span",{className:"bold-label"},s)))}}class InitializedInput extends Re.Component{componentDidMount(){this.props.initialValue&&(this.inputRef.value=this.props.initialValue)}render(){const{value:s,defaultValue:o,initialValue:i,...a}=this.props;return Re.createElement("input",Mn()({},a,{ref:s=>this.inputRef=s}))}}class InfoBasePath extends Re.Component{render(){const{host:s,basePath:o}=this.props;return Re.createElement("pre",{className:"base-url"},"[ Base URL: ",s,o," ]")}}class InfoUrl extends Re.PureComponent{render(){const{url:s,getComponent:o}=this.props,i=o("Link");return Re.createElement(i,{target:"_blank",href:sanitizeUrl(s)},Re.createElement("span",{className:"url"}," ",s))}}class info_Info extends Re.Component{render(){const{info:s,url:o,host:i,basePath:a,getComponent:u,externalDocs:_,selectedServer:w,url:x}=this.props,C=s.get("version"),j=s.get("description"),L=s.get("title"),B=safeBuildUrl(s.get("termsOfService"),x,{selectedServer:w}),$=s.get("contact"),U=s.get("license"),V=safeBuildUrl(_&&_.get("url"),x,{selectedServer:w}),z=_&&_.get("description"),Y=u("Markdown",!0),Z=u("Link"),ee=u("VersionStamp"),ie=u("OpenAPIVersion"),ae=u("InfoUrl"),ce=u("InfoBasePath"),le=u("License"),pe=u("Contact");return Re.createElement("div",{className:"info"},Re.createElement("hgroup",{className:"main"},Re.createElement("h1",{className:"title"},L,Re.createElement("span",null,C&&Re.createElement(ee,{version:C}),Re.createElement(ie,{oasVersion:"2.0"}))),i||a?Re.createElement(ce,{host:i,basePath:a}):null,o&&Re.createElement(ae,{getComponent:u,url:o})),Re.createElement("div",{className:"description"},Re.createElement(Y,{source:j})),B&&Re.createElement("div",{className:"info__tos"},Re.createElement(Z,{target:"_blank",href:sanitizeUrl(B)},"Terms of service")),$?.size>0&&Re.createElement(pe,{getComponent:u,data:$,selectedServer:w,url:o}),U?.size>0&&Re.createElement(le,{getComponent:u,license:U,selectedServer:w,url:o}),V?Re.createElement(Z,{className:"info__extdocs",target:"_blank",href:sanitizeUrl(V)},z||V):null)}}const tA=info_Info;class InfoContainer extends Re.Component{render(){const{specSelectors:s,getComponent:o,oas3Selectors:i}=this.props,a=s.info(),u=s.url(),_=s.basePath(),w=s.host(),x=s.externalDocs(),C=i.selectedServer(),j=o("info");return Re.createElement("div",null,a&&a.count()?Re.createElement(j,{info:a,url:u,host:w,basePath:_,externalDocs:x,getComponent:o,selectedServer:C}):null)}}class contact_Contact extends Re.Component{render(){const{data:s,getComponent:o,selectedServer:i,url:a}=this.props,u=s.get("name","the developer"),_=safeBuildUrl(s.get("url"),a,{selectedServer:i}),w=s.get("email"),x=o("Link");return Re.createElement("div",{className:"info__contact"},_&&Re.createElement("div",null,Re.createElement(x,{href:sanitizeUrl(_),target:"_blank"},u," - Website")),w&&Re.createElement(x,{href:sanitizeUrl(`mailto:${w}`)},_?`Send email to ${u}`:`Contact ${u}`))}}const rA=contact_Contact;class license_License extends Re.Component{render(){const{license:s,getComponent:o,selectedServer:i,url:a}=this.props,u=s.get("name","License"),_=safeBuildUrl(s.get("url"),a,{selectedServer:i}),w=o("Link");return Re.createElement("div",{className:"info__license"},_?Re.createElement("div",{className:"info__license__url"},Re.createElement(w,{target:"_blank",href:sanitizeUrl(_)},u)):Re.createElement("span",null,u))}}const nA=license_License;class JumpToPath extends Re.Component{render(){return null}}class CopyToClipboardBtn extends Re.Component{render(){let{getComponent:s}=this.props;const o=s("CopyIcon");return Re.createElement("div",{className:"view-line-link copy-to-clipboard",title:"Copy to clipboard"},Re.createElement(Hn.CopyToClipboard,{text:this.props.textToCopy},Re.createElement(o,null)))}}class Footer extends Re.Component{render(){return Re.createElement("div",{className:"footer"})}}class FilterContainer extends Re.Component{onFilterChange=s=>{const{target:{value:o}}=s;this.props.layoutActions.updateFilter(o)};render(){const{specSelectors:s,layoutSelectors:o,getComponent:i}=this.props,a=i("Col"),u="loading"===s.loadingStatus(),_="failed"===s.loadingStatus(),w=o.currentFilter(),x=["operation-filter-input"];return _&&x.push("failed"),u&&x.push("loading"),Re.createElement("div",null,!1===w?null:Re.createElement("div",{className:"filter-container"},Re.createElement(a,{className:"filter wrapper",mobile:12},Re.createElement("input",{className:x.join(" "),placeholder:"Filter by tag",type:"text",onChange:this.onFilterChange,value:"string"==typeof w?w:"",disabled:u}))))}}const sA=Function.prototype;class ParamBody extends Re.PureComponent{static defaultProp={consumes:(0,ze.fromJS)(["application/json"]),param:(0,ze.fromJS)({}),onChange:sA,onChangeConsumes:sA};constructor(s,o){super(s,o),this.state={isEditBox:!1,value:""}}componentDidMount(){this.updateValues.call(this,this.props)}UNSAFE_componentWillReceiveProps(s){this.updateValues.call(this,s)}updateValues=s=>{let{param:o,isExecute:i,consumesValue:a=""}=s,u=/xml/i.test(a),_=/json/i.test(a),w=u?o.get("value_xml"):o.get("value");if(void 0!==w){let s=!w&&_?"{}":w;this.setState({value:s}),this.onChange(s,{isXml:u,isEditBox:i})}else u?this.onChange(this.sample("xml"),{isXml:u,isEditBox:i}):this.onChange(this.sample(),{isEditBox:i})};sample=s=>{let{param:o,fn:i}=this.props,a=i.inferSchema(o.toJS());return i.getSampleSchema(a,s,{includeWriteOnly:!0})};onChange=(s,{isEditBox:o,isXml:i})=>{this.setState({value:s,isEditBox:o}),this._onChange(s,i)};_onChange=(s,o)=>{(this.props.onChange||sA)(s,o)};handleOnChange=s=>{const{consumesValue:o}=this.props,i=/xml/i.test(o),a=s.target.value;this.onChange(a,{isXml:i,isEditBox:this.state.isEditBox})};toggleIsEditBox=()=>this.setState((s=>({isEditBox:!s.isEditBox})));render(){let{onChangeConsumes:s,param:o,isExecute:i,specSelectors:a,pathMethod:u,getComponent:_}=this.props;const w=_("Button"),x=_("TextArea"),C=_("HighlightCode",!0),j=_("contentType");let L=(a?a.parameterWithMetaByIdentity(u,o):o).get("errors",(0,ze.List)()),B=a.contentTypeValues(u).get("requestContentType"),$=this.props.consumes&&this.props.consumes.size?this.props.consumes:ParamBody.defaultProp.consumes,{value:U,isEditBox:V}=this.state,z=null;getKnownSyntaxHighlighterLanguage(U)&&(z="json");const Y=`${createHtmlReadyId(`${u[1]}${u[0]}_parameters`)}_select`;return Re.createElement("div",{className:"body-param","data-param-name":o.get("name"),"data-param-in":o.get("in")},V&&i?Re.createElement(x,{className:"body-param__text"+(L.count()?" invalid":""),value:U,onChange:this.handleOnChange}):U&&Re.createElement(C,{className:"body-param__example",language:z},U),Re.createElement("div",{className:"body-param-options"},i?Re.createElement("div",{className:"body-param-edit"},Re.createElement(w,{className:V?"btn cancel body-param__example-edit":"btn edit body-param__example-edit",onClick:this.toggleIsEditBox},V?"Cancel":"Edit")):null,Re.createElement("label",{htmlFor:Y},Re.createElement("span",null,"Parameter content type"),Re.createElement(j,{value:B,contentTypes:$,onChange:s,className:"body-param-content-type",ariaLabel:"Parameter content type",controlId:Y}))))}}class Curl extends Re.Component{render(){const{request:s,getComponent:o}=this.props,i=requestSnippetGenerator_curl_bash(s),a=o("SyntaxHighlighter",!0);return Re.createElement("div",{className:"curl-command"},Re.createElement("h4",null,"Curl"),Re.createElement("div",{className:"copy-to-clipboard"},Re.createElement(Hn.CopyToClipboard,{text:i},Re.createElement("button",null))),Re.createElement("div",null,Re.createElement(a,{language:"bash",className:"curl microlight",renderPlainText:({children:s,PlainTextViewer:o})=>Re.createElement(o,{className:"curl"},s)},i)))}}const property=({propKey:s,propVal:o,propClass:i})=>Re.createElement("span",{className:i},Re.createElement("br",null),s,": ",stringify(o));class TryItOutButton extends Re.Component{static defaultProps={onTryoutClick:Function.prototype,onCancelClick:Function.prototype,onResetClick:Function.prototype,enabled:!1,hasUserEditedBody:!1,isOAS3:!1};render(){const{onTryoutClick:s,onCancelClick:o,onResetClick:i,enabled:a,hasUserEditedBody:u,isOAS3:_}=this.props,w=_&&u;return Re.createElement("div",{className:w?"try-out btn-group":"try-out"},a?Re.createElement("button",{className:"btn try-out__btn cancel",onClick:o},"Cancel"):Re.createElement("button",{className:"btn try-out__btn",onClick:s},"Try it out "),w&&Re.createElement("button",{className:"btn try-out__btn reset",onClick:i},"Reset"))}}class VersionPragmaFilter extends Re.PureComponent{static defaultProps={alsoShow:null,children:null,bypass:!1};render(){const{bypass:s,isSwagger2:o,isOAS3:i,alsoShow:a}=this.props;return s?Re.createElement("div",null,this.props.children):o&&i?Re.createElement("div",{className:"version-pragma"},a,Re.createElement("div",{className:"version-pragma__message version-pragma__message--ambiguous"},Re.createElement("div",null,Re.createElement("h3",null,"Unable to render this definition"),Re.createElement("p",null,Re.createElement("code",null,"swagger")," and ",Re.createElement("code",null,"openapi")," fields cannot be present in the same Swagger or OpenAPI definition. Please remove one of the fields."),Re.createElement("p",null,"Supported version fields are ",Re.createElement("code",null,"swagger: ",'"2.0"')," and those that match ",Re.createElement("code",null,"openapi: 3.0.n")," (for example, ",Re.createElement("code",null,"openapi: 3.0.4"),").")))):o||i?Re.createElement("div",null,this.props.children):Re.createElement("div",{className:"version-pragma"},a,Re.createElement("div",{className:"version-pragma__message version-pragma__message--missing"},Re.createElement("div",null,Re.createElement("h3",null,"Unable to render this definition"),Re.createElement("p",null,"The provided definition does not specify a valid version field."),Re.createElement("p",null,"Please indicate a valid Swagger or OpenAPI version field. Supported version fields are ",Re.createElement("code",null,"swagger: ",'"2.0"')," and those that match ",Re.createElement("code",null,"openapi: 3.0.n")," (for example, ",Re.createElement("code",null,"openapi: 3.0.4"),")."))))}}const version_stamp=({version:s})=>Re.createElement("small",null,Re.createElement("pre",{className:"version"}," ",s," ")),openapi_version=({oasVersion:s})=>Re.createElement("small",{className:"version-stamp"},Re.createElement("pre",{className:"version"},"OAS ",s)),deep_link=({enabled:s,path:o,text:i})=>Re.createElement("a",{className:"nostyle",onClick:s?s=>s.preventDefault():null,href:s?`#/${o}`:null},Re.createElement("span",null,i)),svg_assets=()=>Re.createElement("div",null,Re.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",className:"svg-assets"},Re.createElement("defs",null,Re.createElement("symbol",{viewBox:"0 0 20 20",id:"unlocked"},Re.createElement("path",{d:"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z"})),Re.createElement("symbol",{viewBox:"0 0 20 20",id:"locked"},Re.createElement("path",{d:"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z"})),Re.createElement("symbol",{viewBox:"0 0 20 20",id:"close"},Re.createElement("path",{d:"M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z"})),Re.createElement("symbol",{viewBox:"0 0 20 20",id:"large-arrow"},Re.createElement("path",{d:"M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z"})),Re.createElement("symbol",{viewBox:"0 0 20 20",id:"large-arrow-down"},Re.createElement("path",{d:"M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z"})),Re.createElement("symbol",{viewBox:"0 0 20 20",id:"large-arrow-up"},Re.createElement("path",{d:"M 17.418 14.908 C 17.69 15.176 18.127 15.176 18.397 14.908 C 18.667 14.64 18.668 14.207 18.397 13.939 L 10.489 6.109 C 10.219 5.841 9.782 5.841 9.51 6.109 L 1.602 13.939 C 1.332 14.207 1.332 14.64 1.602 14.908 C 1.873 15.176 2.311 15.176 2.581 14.908 L 10 7.767 L 17.418 14.908 Z"})),Re.createElement("symbol",{viewBox:"0 0 24 24",id:"jump-to"},Re.createElement("path",{d:"M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z"})),Re.createElement("symbol",{viewBox:"0 0 24 24",id:"expand"},Re.createElement("path",{d:"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"})),Re.createElement("symbol",{viewBox:"0 0 15 16",id:"copy"},Re.createElement("g",{transform:"translate(2, -1)"},Re.createElement("path",{fill:"#ffffff",fillRule:"evenodd",d:"M2 13h4v1H2v-1zm5-6H2v1h5V7zm2 3V8l-3 3 3 3v-2h5v-2H9zM4.5 9H2v1h2.5V9zM2 12h2.5v-1H2v1zm9 1h1v2c-.02.28-.11.52-.3.7-.19.18-.42.28-.7.3H1c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h3c0-1.11.89-2 2-2 1.11 0 2 .89 2 2h3c.55 0 1 .45 1 1v5h-1V6H1v9h10v-2zM2 5h8c0-.55-.45-1-1-1H8c-.55 0-1-.45-1-1s-.45-1-1-1-1 .45-1 1-.45 1-1 1H3c-.55 0-1 .45-1 1z"}))))));var oA;function decodeEntity(s){return(oA=oA||document.createElement("textarea")).innerHTML="&"+s+";",oA.value}var iA=Object.prototype.hasOwnProperty;function index_browser_has(s,o){return!!s&&iA.call(s,o)}function index_browser_assign(s){return[].slice.call(arguments,1).forEach((function(o){if(o){if("object"!=typeof o)throw new TypeError(o+"must be object");Object.keys(o).forEach((function(i){s[i]=o[i]}))}})),s}var aA=/\\([\\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g;function unescapeMd(s){return s.indexOf("\\")<0?s:s.replace(aA,"$1")}function isValidEntityCode(s){return!(s>=55296&&s<=57343)&&(!(s>=64976&&s<=65007)&&(!!(65535&~s&&65534!=(65535&s))&&(!(s>=0&&s<=8)&&(11!==s&&(!(s>=14&&s<=31)&&(!(s>=127&&s<=159)&&!(s>1114111)))))))}function fromCodePoint(s){if(s>65535){var o=55296+((s-=65536)>>10),i=56320+(1023&s);return String.fromCharCode(o,i)}return String.fromCharCode(s)}var cA=/&([a-z#][a-z0-9]{1,31});/gi,lA=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;function replaceEntityPattern(s,o){var i=0,a=decodeEntity(o);return o!==a?a:35===o.charCodeAt(0)&&lA.test(o)&&isValidEntityCode(i="x"===o[1].toLowerCase()?parseInt(o.slice(2),16):parseInt(o.slice(1),10))?fromCodePoint(i):s}function replaceEntities(s){return s.indexOf("&")<0?s:s.replace(cA,replaceEntityPattern)}var uA=/[&<>"]/,pA=/[&<>"]/g,hA={"&":"&","<":"<",">":">",'"':"""};function replaceUnsafeChar(s){return hA[s]}function escapeHtml(s){return uA.test(s)?s.replace(pA,replaceUnsafeChar):s}var dA={};function nextToken(s,o){return++o>=s.length-2?o:"paragraph_open"===s[o].type&&s[o].tight&&"inline"===s[o+1].type&&0===s[o+1].content.length&&"paragraph_close"===s[o+2].type&&s[o+2].tight?nextToken(s,o+2):o}dA.blockquote_open=function(){return"
\n"},dA.blockquote_close=function(s,o){return"
"+fA(s,o)},dA.code=function(s,o){return s[o].block?"
"+escapeHtml(s[o].content)+"
"+fA(s,o):""+escapeHtml(s[o].content)+""},dA.fence=function(s,o,i,a,u){var _,w,x=s[o],C="",j=i.langPrefix;if(x.params){if(w=(_=x.params.split(/\s+/g)).join(" "),index_browser_has(u.rules.fence_custom,_[0]))return u.rules.fence_custom[_[0]](s,o,i,a,u);C=' class="'+j+escapeHtml(replaceEntities(unescapeMd(w)))+'"'}return"
"+(i.highlight&&i.highlight.apply(i.highlight,[x.content].concat(_))||escapeHtml(x.content))+"
"+fA(s,o)},dA.fence_custom={},dA.heading_open=function(s,o){return""},dA.heading_close=function(s,o){return"\n"},dA.hr=function(s,o,i){return(i.xhtmlOut?"
":"
")+fA(s,o)},dA.bullet_list_open=function(){return"
    \n"},dA.bullet_list_close=function(s,o){return"
"+fA(s,o)},dA.list_item_open=function(){return"
  • "},dA.list_item_close=function(){return"
  • \n"},dA.ordered_list_open=function(s,o){var i=s[o];return"1?' start="'+i.order+'"':"")+">\n"},dA.ordered_list_close=function(s,o){return""+fA(s,o)},dA.paragraph_open=function(s,o){return s[o].tight?"":"

    "},dA.paragraph_close=function(s,o){var i=!(s[o].tight&&o&&"inline"===s[o-1].type&&!s[o-1].content);return(s[o].tight?"":"

    ")+(i?fA(s,o):"")},dA.link_open=function(s,o,i){var a=s[o].title?' title="'+escapeHtml(replaceEntities(s[o].title))+'"':"",u=i.linkTarget?' target="'+i.linkTarget+'"':"";return'"},dA.link_close=function(){return""},dA.image=function(s,o,i){var a=' src="'+escapeHtml(s[o].src)+'"',u=s[o].title?' title="'+escapeHtml(replaceEntities(s[o].title))+'"':"";return""},dA.table_open=function(){return"\n"},dA.table_close=function(){return"
    \n"},dA.thead_open=function(){return"\n"},dA.thead_close=function(){return"\n"},dA.tbody_open=function(){return"\n"},dA.tbody_close=function(){return"\n"},dA.tr_open=function(){return""},dA.tr_close=function(){return"\n"},dA.th_open=function(s,o){var i=s[o];return""},dA.th_close=function(){return""},dA.td_open=function(s,o){var i=s[o];return""},dA.td_close=function(){return""},dA.strong_open=function(){return""},dA.strong_close=function(){return""},dA.em_open=function(){return""},dA.em_close=function(){return""},dA.del_open=function(){return""},dA.del_close=function(){return""},dA.ins_open=function(){return""},dA.ins_close=function(){return""},dA.mark_open=function(){return""},dA.mark_close=function(){return""},dA.sub=function(s,o){return""+escapeHtml(s[o].content)+""},dA.sup=function(s,o){return""+escapeHtml(s[o].content)+""},dA.hardbreak=function(s,o,i){return i.xhtmlOut?"
    \n":"
    \n"},dA.softbreak=function(s,o,i){return i.breaks?i.xhtmlOut?"
    \n":"
    \n":"\n"},dA.text=function(s,o){return escapeHtml(s[o].content)},dA.htmlblock=function(s,o){return s[o].content},dA.htmltag=function(s,o){return s[o].content},dA.abbr_open=function(s,o){return''},dA.abbr_close=function(){return""},dA.footnote_ref=function(s,o){var i=Number(s[o].id+1).toString(),a="fnref"+i;return s[o].subId>0&&(a+=":"+s[o].subId),'['+i+"]"},dA.footnote_block_open=function(s,o,i){return(i.xhtmlOut?'
    \n':'
    \n')+'
    \n
      \n'},dA.footnote_block_close=function(){return"
    \n
    \n"},dA.footnote_open=function(s,o){return'
  • '},dA.footnote_close=function(){return"
  • \n"},dA.footnote_anchor=function(s,o){var i="fnref"+Number(s[o].id+1).toString();return s[o].subId>0&&(i+=":"+s[o].subId),' '},dA.dl_open=function(){return"
    \n"},dA.dt_open=function(){return"
    "},dA.dd_open=function(){return"
    "},dA.dl_close=function(){return"
    \n"},dA.dt_close=function(){return"\n"},dA.dd_close=function(){return"\n"};var fA=dA.getBreak=function getBreak(s,o){return(o=nextToken(s,o))1)break;if(41===i&&--a<0)break;o++}return _!==o&&(u=unescapeMd(s.src.slice(_,o)),!!s.parser.validateLink(u)&&(s.linkContent=u,s.pos=o,!0))}function parseLinkTitle(s,o){var i,a=o,u=s.posMax,_=s.src.charCodeAt(o);if(34!==_&&39!==_&&40!==_)return!1;for(o++,40===_&&(_=41);o=s.length)&&!SA.test(s[o])}function replaceAt(s,o,i){return s.substr(0,o)+i+s.substr(o+1)}var EA=[["block",function block(s){s.inlineMode?s.tokens.push({type:"inline",content:s.src.replace(/\n/g," ").trim(),level:0,lines:[0,1],children:[]}):s.block.parse(s.src,s.options,s.env,s.tokens)}],["abbr",function abbr(s){var o,i,a,u,_=s.tokens;if(!s.inlineMode)for(o=1,i=_.length-1;o0?w[o].count:1,a=0;a=0;o--)if("text"===(_=u[o]).type){for(C=0,w=_.content,L.lastIndex=0,j=_.level,x=[];B=L.exec(w);)L.lastIndex>C&&x.push({type:"text",content:w.slice(C,B.index+B[1].length),level:j}),x.push({type:"abbr_open",title:s.env.abbreviations[":"+B[2]],level:j++}),x.push({type:"text",content:B[2],level:j}),x.push({type:"abbr_close",level:--j}),C=L.lastIndex-B[3].length;x.length&&(C=0;_--)if("inline"===s.tokens[_].type)for(o=(u=s.tokens[_].children).length-1;o>=0;o--)"text"===(i=u[o]).type&&(a=replaceScopedAbbr(a=i.content),gA.test(a)&&(a=a.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---([^-]|$)/gm,"$1—$2").replace(/(^|\s)--(\s|$)/gm,"$1–$2").replace(/(^|[^-\s])--([^-\s]|$)/gm,"$1–$2")),i.content=a)}],["smartquotes",function smartquotes(s){var o,i,a,u,_,w,x,C,j,L,B,$,U,V,z,Y,Z;if(s.options.typographer)for(Z=[],z=s.tokens.length-1;z>=0;z--)if("inline"===s.tokens[z].type)for(Y=s.tokens[z].children,Z.length=0,o=0;o=0&&!(Z[U].level<=x);U--);Z.length=U+1,_=0,w=(a=i.content).length;e:for(;_=0&&(L=Z[U],!(Z[U].level=(u=s.eMarks[o])||42!==(i=s.src.charCodeAt(a++))&&45!==i&&43!==i||a=u)return-1;if((i=s.src.charCodeAt(a++))<48||i>57)return-1;for(;;){if(a>=u)return-1;if(!((i=s.src.charCodeAt(a++))>=48&&i<=57)){if(41===i||46===i)break;return-1}}return a=this.eMarks[s]},StateBlock.prototype.skipEmptyLines=function skipEmptyLines(s){for(var o=this.lineMax;si;)if(o!==this.src.charCodeAt(--s))return s+1;return s},StateBlock.prototype.getLines=function getLines(s,o,i,a){var u,_,w,x,C,j=s;if(s>=o)return"";if(j+1===o)return _=this.bMarks[j]+Math.min(this.tShift[j],i),w=a?this.eMarks[j]+1:this.eMarks[j],this.src.slice(_,w);for(x=new Array(o-s),u=0;ji&&(C=i),C<0&&(C=0),_=this.bMarks[j]+C,w=j+1]/,kA=/^<\/([a-zA-Z]{1,15})[\s>]/;function index_browser_getLine(s,o){var i=s.bMarks[o]+s.blkIndent,a=s.eMarks[o];return s.src.substr(i,a-i)}function skipMarker(s,o){var i,a,u=s.bMarks[o]+s.tShift[o],_=s.eMarks[o];return u>=_||126!==(a=s.src.charCodeAt(u++))&&58!==a||u===(i=s.skipSpaces(u))||i>=_?-1:i}var OA=[["code",function code(s,o,i){var a,u;if(s.tShift[o]-s.blkIndent<4)return!1;for(u=a=o+1;a=4))break;u=++a}return s.line=a,s.tokens.push({type:"code",content:s.getLines(o,u,4+s.blkIndent,!0),block:!0,lines:[o,s.line],level:s.level}),!0}],["fences",function fences(s,o,i,a){var u,_,w,x,C,j=!1,L=s.bMarks[o]+s.tShift[o],B=s.eMarks[o];if(L+3>B)return!1;if(126!==(u=s.src.charCodeAt(L))&&96!==u)return!1;if(C=L,(_=(L=s.skipChars(L,u))-C)<3)return!1;if((w=s.src.slice(L,B).trim()).indexOf("`")>=0)return!1;if(a)return!0;for(x=o;!(++x>=i)&&!((L=C=s.bMarks[x]+s.tShift[x])<(B=s.eMarks[x])&&s.tShift[x]=4||(L=s.skipChars(L,u))-C<_||(L=s.skipSpaces(L))Y)return!1;if(62!==s.src.charCodeAt(z++))return!1;if(s.level>=s.options.maxNesting)return!1;if(a)return!0;for(32===s.src.charCodeAt(z)&&z++,C=s.blkIndent,s.blkIndent=0,x=[s.bMarks[o]],s.bMarks[o]=z,_=(z=z=Y,w=[s.tShift[o]],s.tShift[o]=z-s.bMarks[o],B=s.parser.ruler.getRules("blockquote"),u=o+1;u=(Y=s.eMarks[u]));u++)if(62!==s.src.charCodeAt(z++)){if(_)break;for(V=!1,$=0,U=B.length;$=Y,w.push(s.tShift[u]),s.tShift[u]=z-s.bMarks[u];for(j=s.parentType,s.parentType="blockquote",s.tokens.push({type:"blockquote_open",lines:L=[o,0],level:s.level++}),s.parser.tokenize(s,o,u),s.tokens.push({type:"blockquote_close",level:--s.level}),s.parentType=j,L[1]=s.line,$=0;$C)return!1;if(42!==(u=s.src.charCodeAt(x++))&&45!==u&&95!==u)return!1;for(_=1;x=0)z=!0;else{if(!((B=skipBulletListMarker(s,o))>=0))return!1;z=!1}if(s.level>=s.options.maxNesting)return!1;if(V=s.src.charCodeAt(B-1),a)return!0;for(Z=s.tokens.length,z?(L=s.bMarks[o]+s.tShift[o],U=Number(s.src.substr(L,B-L-1)),s.tokens.push({type:"ordered_list_open",order:U,lines:ie=[o,0],level:s.level++})):s.tokens.push({type:"bullet_list_open",lines:ie=[o,0],level:s.level++}),u=o,ee=!1,ce=s.parser.ruler.getRules("list");!(!(u=s.eMarks[u]?1:Y-B)>4&&($=1),$<1&&($=1),_=B-s.bMarks[u]+$,s.tokens.push({type:"list_item_open",lines:ae=[o,0],level:s.level++}),x=s.blkIndent,C=s.tight,w=s.tShift[o],j=s.parentType,s.tShift[o]=Y-s.bMarks[o],s.blkIndent=_,s.tight=!0,s.parentType="list",s.parser.tokenize(s,o,i,!0),s.tight&&!ee||(fe=!1),ee=s.line-o>1&&s.isEmpty(s.line-1),s.blkIndent=x,s.tShift[o]=w,s.tight=C,s.parentType=j,s.tokens.push({type:"list_item_close",level:--s.level}),u=o=s.line,ae[1]=u,Y=s.bMarks[o],u>=i)||s.isEmpty(u)||s.tShift[u]L)return!1;if(91!==s.src.charCodeAt(j))return!1;if(94!==s.src.charCodeAt(j+1))return!1;if(s.level>=s.options.maxNesting)return!1;for(x=j+2;x=L||58!==s.src.charCodeAt(++x))&&(a||(x++,s.env.footnotes||(s.env.footnotes={}),s.env.footnotes.refs||(s.env.footnotes.refs={}),C=s.src.slice(j+2,x-2),s.env.footnotes.refs[":"+C]=-1,s.tokens.push({type:"footnote_reference_open",label:C,level:s.level++}),u=s.bMarks[o],_=s.tShift[o],w=s.parentType,s.tShift[o]=s.skipSpaces(x)-x,s.bMarks[o]=x,s.blkIndent+=4,s.parentType="footnote",s.tShift[o]=C)return!1;if(35!==(u=s.src.charCodeAt(x))||x>=C)return!1;for(_=1,u=s.src.charCodeAt(++x);35===u&&x6||xx&&32===s.src.charCodeAt(w-1)&&(C=w),s.line=o+1,s.tokens.push({type:"heading_open",hLevel:_,lines:[o,s.line],level:s.level}),x=i)&&(!(s.tShift[w]3)&&(!((u=s.bMarks[w]+s.tShift[w])>=(_=s.eMarks[w]))&&((45===(a=s.src.charCodeAt(u))||61===a)&&(u=s.skipChars(u,a),!((u=s.skipSpaces(u))<_)&&(u=s.bMarks[o]+s.tShift[o],s.line=w+1,s.tokens.push({type:"heading_open",hLevel:61===a?1:2,lines:[o,s.line],level:s.level}),s.tokens.push({type:"inline",content:s.src.slice(u,s.eMarks[o]).trim(),level:s.level+1,lines:[o,s.line-1],children:[]}),s.tokens.push({type:"heading_close",hLevel:61===a?1:2,level:s.level}),!0))))))}],["htmlblock",function htmlblock(s,o,i,a){var u,_,w,x=s.bMarks[o],C=s.eMarks[o],j=s.tShift[o];if(x+=j,!s.options.html)return!1;if(j>3||x+2>=C)return!1;if(60!==s.src.charCodeAt(x))return!1;if(33===(u=s.src.charCodeAt(x+1))||63===u){if(a)return!0}else{if(47!==u&&!function isLetter$1(s){var o=32|s;return o>=97&&o<=122}(u))return!1;if(47===u){if(!(_=s.src.slice(x,C).match(kA)))return!1}else if(!(_=s.src.slice(x,C).match(xA)))return!1;if(!0!==wA[_[1].toLowerCase()])return!1;if(a)return!0}for(w=o+1;wi)return!1;if(C=o+1,s.tShift[C]=s.eMarks[C])return!1;if(124!==(u=s.src.charCodeAt(w))&&45!==u&&58!==u)return!1;if(_=index_browser_getLine(s,o+1),!/^[-:| ]+$/.test(_))return!1;if((j=_.split("|"))<=2)return!1;for(B=[],x=0;x=0;if(L=o+1,s.isEmpty(L)&&++L>i)return!1;if(s.tShift[L]=s.options.maxNesting)return!1;j=s.tokens.length,s.tokens.push({type:"dl_open",lines:C=[o,0],level:s.level++}),w=o,_=L;e:for(;;){for(Z=!0,Y=!1,s.tokens.push({type:"dt_open",lines:[w,w],level:s.level++}),s.tokens.push({type:"inline",content:s.getLines(w,w+1,s.blkIndent,!1).trim(),level:s.level+1,lines:[w,w],children:[]}),s.tokens.push({type:"dt_close",level:--s.level});;){if(s.tokens.push({type:"dd_open",lines:x=[L,0],level:s.level++}),z=s.tight,$=s.ddIndent,B=s.blkIndent,V=s.tShift[_],U=s.parentType,s.blkIndent=s.ddIndent=s.tShift[_]+2,s.tShift[_]=u-s.bMarks[_],s.tight=!0,s.parentType="deflist",s.parser.tokenize(s,_,i,!0),s.tight&&!Y||(Z=!1),Y=s.line-_>1&&s.isEmpty(s.line-1),s.tShift[_]=V,s.tight=z,s.parentType=U,s.blkIndent=B,s.ddIndent=$,s.tokens.push({type:"dd_close",level:--s.level}),x[1]=L=s.line,L>=i)break e;if(s.tShift[L]=i)break;if(w=L,s.isEmpty(w))break;if(s.tShift[w]=i)break;if(s.isEmpty(_)&&_++,_>=i)break;if(s.tShift[_]3)){for(u=!1,_=0,w=x.length;_=i))&&!(s.tShift[w]=0&&(s=s.replace(AA,(function(o,i){var a;return 10===s.charCodeAt(i)?(_=i+1,w=0,o):(a=" ".slice((i-_-w)%4),w=i-_+1,a)}))),u=new StateBlock(s,this,o,i,a),this.tokenize(u,u.line,u.lineMax)};for(var PA=[],IA=0;IA<256;IA++)PA.push(0);function isAlphaNum(s){return s>=48&&s<=57||s>=65&&s<=90||s>=97&&s<=122}function scanDelims(s,o){var i,a,u,_=o,w=!0,x=!0,C=s.posMax,j=s.src.charCodeAt(o);for(i=o>0?s.src.charCodeAt(o-1):-1;_=C&&(w=!1),(u=_-o)>=4?w=x=!1:(32!==(a=_?@[]^_`{|}~-".split("").forEach((function(s){PA[s.charCodeAt(0)]=1}));var TA=/\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g;var NA=/\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g;var MA=["coap","doi","javascript","aaa","aaas","about","acap","cap","cid","crid","data","dav","dict","dns","file","ftp","geo","go","gopher","h323","http","https","iax","icap","im","imap","info","ipp","iris","iris.beep","iris.xpc","iris.xpcs","iris.lwz","ldap","mailto","mid","msrp","msrps","mtqp","mupdate","news","nfs","ni","nih","nntp","opaquelocktoken","pop","pres","rtsp","service","session","shttp","sieve","sip","sips","sms","snmp","soap.beep","soap.beeps","tag","tel","telnet","tftp","thismessage","tn3270","tip","tv","urn","vemmi","ws","wss","xcon","xcon-userid","xmlrpc.beep","xmlrpc.beeps","xmpp","z39.50r","z39.50s","adiumxtra","afp","afs","aim","apt","attachment","aw","beshare","bitcoin","bolo","callto","chrome","chrome-extension","com-eventbrite-attendee","content","cvs","dlna-playsingle","dlna-playcontainer","dtn","dvb","ed2k","facetime","feed","finger","fish","gg","git","gizmoproject","gtalk","hcp","icon","ipn","irc","irc6","ircs","itms","jar","jms","keyparc","lastfm","ldaps","magnet","maps","market","message","mms","ms-help","msnim","mumble","mvn","notes","oid","palm","paparazzi","platform","proxy","psyc","query","res","resource","rmi","rsync","rtmp","secondlife","sftp","sgn","skype","smb","soldat","spotify","ssh","steam","svn","teamspeak","things","udp","unreal","ut2004","ventrilo","view-source","webcal","wtai","wyciwyg","xfire","xri","ymsgr"],RA=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,DA=/^<([a-zA-Z.\-]{1,25}):([^<>\x00-\x20]*)>/;function replace$1(s,o){return s=s.source,o=o||"",function self(i,a){return i?(a=a.source||a,s=s.replace(i,a),self):new RegExp(s,o)}}var LA=replace$1(/(?:unquoted|single_quoted|double_quoted)/)("unquoted",/[^"'=<>`\x00-\x20]+/)("single_quoted",/'[^']*'/)("double_quoted",/"[^"]*"/)(),FA=replace$1(/(?:\s+attr_name(?:\s*=\s*attr_value)?)/)("attr_name",/[a-zA-Z_:][a-zA-Z0-9:._-]*/)("attr_value",LA)(),BA=replace$1(/<[A-Za-z][A-Za-z0-9]*attribute*\s*\/?>/)("attribute",FA)(),$A=replace$1(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)("open_tag",BA)("close_tag",/<\/[A-Za-z][A-Za-z0-9]*\s*>/)("comment",/|/)("processing",/<[?].*?[?]>/)("declaration",/]*>/)("cdata",//)();var qA=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i,UA=/^&([a-z][a-z0-9]{1,31});/i;var VA=[["text",function index_browser_text(s,o){for(var i=s.pos;i=0&&32===s.pending.charCodeAt(i))if(i>=1&&32===s.pending.charCodeAt(i-1)){for(var _=i-2;_>=0;_--)if(32!==s.pending.charCodeAt(_)){s.pending=s.pending.substring(0,_+1);break}s.push({type:"hardbreak",level:s.level})}else s.pending=s.pending.slice(0,-1),s.push({type:"softbreak",level:s.level});else s.push({type:"softbreak",level:s.level});for(u++;u=x)return!1;if(126!==s.src.charCodeAt(C+1))return!1;if(s.level>=s.options.maxNesting)return!1;if(_=C>0?s.src.charCodeAt(C-1):-1,w=s.src.charCodeAt(C+2),126===_)return!1;if(126===w)return!1;if(32===w||10===w)return!1;for(a=C+2;aC+3)return s.pos+=a-C,o||(s.pending+=s.src.slice(C,a)),!0;for(s.pos=C+2,u=1;s.pos+1=x)return!1;if(43!==s.src.charCodeAt(C+1))return!1;if(s.level>=s.options.maxNesting)return!1;if(_=C>0?s.src.charCodeAt(C-1):-1,w=s.src.charCodeAt(C+2),43===_)return!1;if(43===w)return!1;if(32===w||10===w)return!1;for(a=C+2;a=x)return!1;if(61!==s.src.charCodeAt(C+1))return!1;if(s.level>=s.options.maxNesting)return!1;if(_=C>0?s.src.charCodeAt(C-1):-1,w=s.src.charCodeAt(C+2),61===_)return!1;if(61===w)return!1;if(32===w||10===w)return!1;for(a=C+2;a=s.options.maxNesting)return!1;for(s.pos=L+i,x=[i];s.pos=u)return!1;if(s.level>=s.options.maxNesting)return!1;for(s.pos=_+1;s.pos=u)return!1;if(s.level>=s.options.maxNesting)return!1;for(s.pos=_+1;s.pos=s.options.maxNesting)return!1;if(i=U+1,(a=parseLinkLabel(s,U))<0)return!1;if((x=a+1)<$&&40===s.src.charCodeAt(x)){for(x++;x<$&&(32===(j=s.src.charCodeAt(x))||10===j);x++);if(x>=$)return!1;for(U=x,parseLinkDestination(s,x)?(_=s.linkContent,x=s.pos):_="",U=x;x<$&&(32===(j=s.src.charCodeAt(x))||10===j);x++);if(x<$&&U!==x&&parseLinkTitle(s,x))for(w=s.linkContent,x=s.pos;x<$&&(32===(j=s.src.charCodeAt(x))||10===j);x++);else w="";if(x>=$||41!==s.src.charCodeAt(x))return s.pos=B,!1;x++}else{if(s.linkLevel>0)return!1;for(;x<$&&(32===(j=s.src.charCodeAt(x))||10===j);x++);if(x<$&&91===s.src.charCodeAt(x)&&(U=x+1,(x=parseLinkLabel(s,x))>=0?u=s.src.slice(U,x++):x=U-1),u||(void 0===u&&(x=a+1),u=s.src.slice(i,a)),!(C=s.env.references[normalizeReference(u)]))return s.pos=B,!1;_=C.href,w=C.title}return o||(s.pos=i,s.posMax=a,L?s.push({type:"image",src:_,title:w,alt:s.src.substr(i,a-i),level:s.level}):(s.push({type:"link_open",href:_,title:w,level:s.level++}),s.linkLevel++,s.parser.tokenize(s),s.linkLevel--,s.push({type:"link_close",level:--s.level}))),s.pos=x,s.posMax=$,!0}],["footnote_inline",function footnote_inline(s,o){var i,a,u,_,w=s.posMax,x=s.pos;return!(x+2>=w)&&(94===s.src.charCodeAt(x)&&(91===s.src.charCodeAt(x+1)&&(!(s.level>=s.options.maxNesting)&&(i=x+2,!((a=parseLinkLabel(s,x+1))<0)&&(o||(s.env.footnotes||(s.env.footnotes={}),s.env.footnotes.list||(s.env.footnotes.list=[]),u=s.env.footnotes.list.length,s.pos=i,s.posMax=a,s.push({type:"footnote_ref",id:u,level:s.level}),s.linkLevel++,_=s.tokens.length,s.parser.tokenize(s),s.env.footnotes.list[u]={tokens:s.tokens.splice(_)},s.linkLevel--),s.pos=a+1,s.posMax=w,!0)))))}],["footnote_ref",function footnote_ref(s,o){var i,a,u,_,w=s.posMax,x=s.pos;if(x+3>w)return!1;if(!s.env.footnotes||!s.env.footnotes.refs)return!1;if(91!==s.src.charCodeAt(x))return!1;if(94!==s.src.charCodeAt(x+1))return!1;if(s.level>=s.options.maxNesting)return!1;for(a=x+2;a=w)&&(a++,i=s.src.slice(x+2,a-1),void 0!==s.env.footnotes.refs[":"+i]&&(o||(s.env.footnotes.list||(s.env.footnotes.list=[]),s.env.footnotes.refs[":"+i]<0?(u=s.env.footnotes.list.length,s.env.footnotes.list[u]={label:i,count:0},s.env.footnotes.refs[":"+i]=u):u=s.env.footnotes.refs[":"+i],_=s.env.footnotes.list[u].count,s.env.footnotes.list[u].count++,s.push({type:"footnote_ref",id:u,subId:_,level:s.level})),s.pos=a,s.posMax=w,!0)))}],["autolink",function autolink(s,o){var i,a,u,_,w,x=s.pos;return 60===s.src.charCodeAt(x)&&(!((i=s.src.slice(x)).indexOf(">")<0)&&((a=i.match(DA))?!(MA.indexOf(a[1].toLowerCase())<0)&&(w=normalizeLink(_=a[0].slice(1,-1)),!!s.parser.validateLink(_)&&(o||(s.push({type:"link_open",href:w,level:s.level}),s.push({type:"text",content:_,level:s.level+1}),s.push({type:"link_close",level:s.level})),s.pos+=a[0].length,!0)):!!(u=i.match(RA))&&(w=normalizeLink("mailto:"+(_=u[0].slice(1,-1))),!!s.parser.validateLink(w)&&(o||(s.push({type:"link_open",href:w,level:s.level}),s.push({type:"text",content:_,level:s.level+1}),s.push({type:"link_close",level:s.level})),s.pos+=u[0].length,!0))))}],["htmltag",function htmltag(s,o){var i,a,u,_=s.pos;return!!s.options.html&&(u=s.posMax,!(60!==s.src.charCodeAt(_)||_+2>=u)&&(!(33!==(i=s.src.charCodeAt(_+1))&&63!==i&&47!==i&&!function isLetter$2(s){var o=32|s;return o>=97&&o<=122}(i))&&(!!(a=s.src.slice(_).match($A))&&(o||s.push({type:"htmltag",content:s.src.slice(_,_+a[0].length),level:s.level}),s.pos+=a[0].length,!0))))}],["entity",function entity(s,o){var i,a,u=s.pos,_=s.posMax;if(38!==s.src.charCodeAt(u))return!1;if(u+1<_)if(35===s.src.charCodeAt(u+1)){if(a=s.src.slice(u).match(qA))return o||(i="x"===a[1][0].toLowerCase()?parseInt(a[1].slice(1),16):parseInt(a[1],10),s.pending+=isValidEntityCode(i)?fromCodePoint(i):fromCodePoint(65533)),s.pos+=a[0].length,!0}else if(a=s.src.slice(u).match(UA)){var w=decodeEntity(a[1]);if(a[1]!==w)return o||(s.pending+=w),s.pos+=a[0].length,!0}return o||(s.pending+="&"),s.pos++,!0}]];function ParserInline(){this.ruler=new Ruler;for(var s=0;s0)s.pos=i;else{for(o=0;o=_)break}else s.pending+=s.src[s.pos++]}s.pending&&s.pushPending()},ParserInline.prototype.parse=function(s,o,i,a){var u=new StateInline(s,this,o,i,a);this.tokenize(u)};var zA={default:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["block","inline","references","replacements","smartquotes","references","abbr2","footnote_tail"]},block:{rules:["blockquote","code","fences","footnote","heading","hr","htmlblock","lheading","list","paragraph","table"]},inline:{rules:["autolink","backticks","del","emphasis","entity","escape","footnote_ref","htmltag","links","newline","text"]}}},full:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{},block:{},inline:{}}},commonmark:{options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["block","inline","references","abbr2"]},block:{rules:["blockquote","code","fences","heading","hr","htmlblock","lheading","list","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","htmltag","links","newline","text"]}}}};function StateCore(s,o,i){this.src=o,this.env=i,this.options=s.options,this.tokens=[],this.inlineMode=!1,this.inline=s.inline,this.block=s.block,this.renderer=s.renderer,this.typographer=s.typographer}function Remarkable(s,o){"string"!=typeof s&&(o=s,s="default"),o&&null!=o.linkify&&console.warn("linkify option is removed. Use linkify plugin instead:\n\nimport Remarkable from 'remarkable';\nimport linkify from 'remarkable/linkify';\nnew Remarkable().use(linkify)\n"),this.inline=new ParserInline,this.block=new ParserBlock,this.core=new Core,this.renderer=new Renderer,this.ruler=new Ruler,this.options={},this.configure(zA[s]),this.set(o||{})}Remarkable.prototype.set=function(s){index_browser_assign(this.options,s)},Remarkable.prototype.configure=function(s){var o=this;if(!s)throw new Error("Wrong `remarkable` preset, check name/content");s.options&&o.set(s.options),s.components&&Object.keys(s.components).forEach((function(i){s.components[i].rules&&o[i].ruler.enable(s.components[i].rules,!0)}))},Remarkable.prototype.use=function(s,o){return s(this,o),this},Remarkable.prototype.parse=function(s,o){var i=new StateCore(this,s,o);return this.core.process(i),i.tokens},Remarkable.prototype.render=function(s,o){return o=o||{},this.renderer.render(this.parse(s,o),this.options,o)},Remarkable.prototype.parseInline=function(s,o){var i=new StateCore(this,s,o);return i.inlineMode=!0,this.core.process(i),i.tokens},Remarkable.prototype.renderInline=function(s,o){return o=o||{},this.renderer.render(this.parseInline(s,o),this.options,o)};function indexOf(s,o){if(Array.prototype.indexOf)return s.indexOf(o);for(var i=0,a=s.length;i=0;i--)!0===o(s[i])&&s.splice(i,1)}function throwUnhandledCaseError(s){throw new Error("Unhandled case for value: '".concat(s,"'"))}var WA=function(){function HtmlTag(s){void 0===s&&(s={}),this.tagName="",this.attrs={},this.innerHTML="",this.whitespaceRegex=/\s+/,this.tagName=s.tagName||"",this.attrs=s.attrs||{},this.innerHTML=s.innerHtml||s.innerHTML||""}return HtmlTag.prototype.setTagName=function(s){return this.tagName=s,this},HtmlTag.prototype.getTagName=function(){return this.tagName||""},HtmlTag.prototype.setAttr=function(s,o){return this.getAttrs()[s]=o,this},HtmlTag.prototype.getAttr=function(s){return this.getAttrs()[s]},HtmlTag.prototype.setAttrs=function(s){return Object.assign(this.getAttrs(),s),this},HtmlTag.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},HtmlTag.prototype.setClass=function(s){return this.setAttr("class",s)},HtmlTag.prototype.addClass=function(s){for(var o,i=this.getClass(),a=this.whitespaceRegex,u=i?i.split(a):[],_=s.split(a);o=_.shift();)-1===indexOf(u,o)&&u.push(o);return this.getAttrs().class=u.join(" "),this},HtmlTag.prototype.removeClass=function(s){for(var o,i=this.getClass(),a=this.whitespaceRegex,u=i?i.split(a):[],_=s.split(a);u.length&&(o=_.shift());){var w=indexOf(u,o);-1!==w&&u.splice(w,1)}return this.getAttrs().class=u.join(" "),this},HtmlTag.prototype.getClass=function(){return this.getAttrs().class||""},HtmlTag.prototype.hasClass=function(s){return-1!==(" "+this.getClass()+" ").indexOf(" "+s+" ")},HtmlTag.prototype.setInnerHTML=function(s){return this.innerHTML=s,this},HtmlTag.prototype.setInnerHtml=function(s){return this.setInnerHTML(s)},HtmlTag.prototype.getInnerHTML=function(){return this.innerHTML||""},HtmlTag.prototype.getInnerHtml=function(){return this.getInnerHTML()},HtmlTag.prototype.toAnchorString=function(){var s=this.getTagName(),o=this.buildAttrsStr();return["<",s,o=o?" "+o:"",">",this.getInnerHtml(),""].join("")},HtmlTag.prototype.buildAttrsStr=function(){if(!this.attrs)return"";var s=this.getAttrs(),o=[];for(var i in s)s.hasOwnProperty(i)&&o.push(i+'="'+s[i]+'"');return o.join(" ")},HtmlTag}();var JA=function(){function AnchorTagBuilder(s){void 0===s&&(s={}),this.newWindow=!1,this.truncate={},this.className="",this.newWindow=s.newWindow||!1,this.truncate=s.truncate||{},this.className=s.className||""}return AnchorTagBuilder.prototype.build=function(s){return new WA({tagName:"a",attrs:this.createAttrs(s),innerHtml:this.processAnchorText(s.getAnchorText())})},AnchorTagBuilder.prototype.createAttrs=function(s){var o={href:s.getAnchorHref()},i=this.createCssClass(s);return i&&(o.class=i),this.newWindow&&(o.target="_blank",o.rel="noopener noreferrer"),this.truncate&&this.truncate.length&&this.truncate.length=_)return w.host.length==o?(w.host.substr(0,o-u)+i).substr(0,_+a):buildSegment(C,_).substr(0,_+a);var j="";if(w.path&&(j+="/"+w.path),w.query&&(j+="?"+w.query),j){if((C+j).length>=_)return(C+j).length==o?(C+j).substr(0,o):(C+buildSegment(j,_-C.length)).substr(0,_+a);C+=j}if(w.fragment){var L="#"+w.fragment;if((C+L).length>=_)return(C+L).length==o?(C+L).substr(0,o):(C+buildSegment(L,_-C.length)).substr(0,_+a);C+=L}if(w.scheme&&w.host){var B=w.scheme+"://";if((C+B).length<_)return(B+C).substr(0,o)}if(C.length<=o)return C;var $="";return _>0&&($=C.substr(-1*Math.floor(_/2))),(C.substr(0,Math.ceil(_/2))+i+$).substr(0,_+a)}(s,i):"middle"===a?function truncateMiddle(s,o,i){if(s.length<=o)return s;var a,u;null==i?(i="…",a=8,u=3):(a=i.length,u=i.length);var _=o-u,w="";return _>0&&(w=s.substr(-1*Math.floor(_/2))),(s.substr(0,Math.ceil(_/2))+i+w).substr(0,_+a)}(s,i):function truncateEnd(s,o,i){return function ellipsis(s,o,i){var a;return s.length>o&&(null==i?(i="…",a=3):a=i.length,s=s.substring(0,o-a)+i),s}(s,o,i)}(s,i)},AnchorTagBuilder}(),HA=function(){function Match(s){this.__jsduckDummyDocProp=null,this.matchedText="",this.offset=0,this.tagBuilder=s.tagBuilder,this.matchedText=s.matchedText,this.offset=s.offset}return Match.prototype.getMatchedText=function(){return this.matchedText},Match.prototype.setOffset=function(s){this.offset=s},Match.prototype.getOffset=function(){return this.offset},Match.prototype.getCssClassSuffixes=function(){return[this.getType()]},Match.prototype.buildTag=function(){return this.tagBuilder.build(this)},Match}(),extendStatics=function(s,o){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(s,o){s.__proto__=o}||function(s,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(s[i]=o[i])},extendStatics(s,o)};function tslib_es6_extends(s,o){if("function"!=typeof o&&null!==o)throw new TypeError("Class extends value "+String(o)+" is not a constructor or null");function __(){this.constructor=s}extendStatics(s,o),s.prototype=null===o?Object.create(o):(__.prototype=o.prototype,new __)}var __assign=function(){return __assign=Object.assign||function __assign(s){for(var o,i=1,a=arguments.length;i-1},UrlMatchValidator.isValidUriScheme=function(s){var o=s.match(this.uriSchemeRegex),i=o&&o[0].toLowerCase();return"javascript:"!==i&&"vbscript:"!==i},UrlMatchValidator.urlMatchDoesNotHaveProtocolOrDot=function(s,o){return!(!s||o&&this.hasFullProtocolRegex.test(o)||-1!==s.indexOf("."))},UrlMatchValidator.urlMatchDoesNotHaveAtLeastOneWordChar=function(s,o){return!(!s||!o)&&(!this.hasFullProtocolRegex.test(o)&&!this.hasWordCharAfterProtocolRegex.test(s))},UrlMatchValidator.hasFullProtocolRegex=/^[A-Za-z][-.+A-Za-z0-9]*:\/\//,UrlMatchValidator.uriSchemeRegex=/^[A-Za-z][-.+A-Za-z0-9]*:/,UrlMatchValidator.hasWordCharAfterProtocolRegex=new RegExp(":[^\\s]*?["+aC+"]"),UrlMatchValidator.ipRegex=/[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?(:[0-9]*)?\/?$/,UrlMatchValidator}(),EC=(KA=new RegExp("[/?#](?:["+pC+"\\-+&@#/%=~_()|'$*\\[\\]{}?!:,.;^✓]*["+pC+"\\-+&@#/%=~_()|'$*\\[\\]{}✓])?"),new RegExp(["(?:","(",/(?:[A-Za-z][-.+A-Za-z0-9]{0,63}:(?![A-Za-z][-.+A-Za-z0-9]{0,63}:\/\/)(?!\d+\/?)(?:\/\/)?)/.source,getDomainNameStr(2),")","|","(","(//)?",/(?:www\.)/.source,getDomainNameStr(6),")","|","(","(//)?",getDomainNameStr(10)+"\\.",gC.source,"(?![-"+uC+"])",")",")","(?::[0-9]+)?","(?:"+KA.source+")?"].join(""),"gi")),wC=new RegExp("["+pC+"]"),xC=function(s){function UrlMatcher(o){var i=s.call(this,o)||this;return i.stripPrefix={scheme:!0,www:!0},i.stripTrailingSlash=!0,i.decodePercentEncoding=!0,i.matcherRegex=EC,i.wordCharRegExp=wC,i.stripPrefix=o.stripPrefix,i.stripTrailingSlash=o.stripTrailingSlash,i.decodePercentEncoding=o.decodePercentEncoding,i}return tslib_es6_extends(UrlMatcher,s),UrlMatcher.prototype.parseMatches=function(s){for(var o,i=this.matcherRegex,a=this.stripPrefix,u=this.stripTrailingSlash,_=this.decodePercentEncoding,w=this.tagBuilder,x=[],_loop_1=function(){var i=o[0],j=o[1],L=o[4],B=o[5],$=o[9],U=o.index,V=B||$,z=s.charAt(U-1);if(!SC.isValid(i,j))return"continue";if(U>0&&"@"===z)return"continue";if(U>0&&V&&C.wordCharRegExp.test(z))return"continue";if(/\?$/.test(i)&&(i=i.substr(0,i.length-1)),C.matchHasUnbalancedClosingParen(i))i=i.substr(0,i.length-1);else{var Y=C.matchHasInvalidCharAfterTld(i,j);Y>-1&&(i=i.substr(0,Y))}var Z=["http://","https://"].find((function(s){return!!j&&-1!==j.indexOf(s)}));if(Z){var ee=i.indexOf(Z);i=i.substr(ee),j=j.substr(ee),U+=ee}var ie=j?"scheme":L?"www":"tld",ae=!!j;x.push(new ZA({tagBuilder:w,matchedText:i,offset:U,urlMatchType:ie,url:i,protocolUrlMatch:ae,protocolRelativeMatch:!!V,stripPrefix:a,stripTrailingSlash:u,decodePercentEncoding:_}))},C=this;null!==(o=i.exec(s));)_loop_1();return x},UrlMatcher.prototype.matchHasUnbalancedClosingParen=function(s){var o,i=s.charAt(s.length-1);if(")"===i)o="(";else if("]"===i)o="[";else{if("}"!==i)return!1;o="{"}for(var a=0,u=0,_=s.length-1;u<_;u++){var w=s.charAt(u);w===o?a++:w===i&&(a=Math.max(a-1,0))}return 0===a},UrlMatcher.prototype.matchHasInvalidCharAfterTld=function(s,o){if(!s)return-1;var i=0;o&&(i=s.indexOf(":"),s=s.slice(i));var a=new RegExp("^((.?//)?[-."+pC+"]*[-"+pC+"]\\.[-"+pC+"]+)").exec(s);return null===a?-1:(i+=a[1].length,s=s.slice(a[1].length),/^[^-.A-Za-z0-9:\/?#]/.test(s)?i:-1)},UrlMatcher}(eC),kC=new RegExp("[_".concat(pC,"]")),OC=function(s){function HashtagMatcher(o){var i=s.call(this,o)||this;return i.serviceName="twitter",i.serviceName=o.serviceName,i}return tslib_es6_extends(HashtagMatcher,s),HashtagMatcher.prototype.parseMatches=function(s){for(var o=this.tagBuilder,i=this.serviceName,a=[],u=s.length,_=0,w=-1,x=0;_-1&&_-w<=140){var u=s.slice(w,_),x=new YA({tagBuilder:o,matchedText:u,offset:w,serviceName:i,hashtag:u.slice(1)});a.push(x)}}},HashtagMatcher}(eC),AC=["twitter","facebook","instagram","tiktok"],CC=new RegExp("".concat(/(?:(?:(?:(\+)?\d{1,3}[-\040.]?)?\(?\d{3}\)?[-\040.]?\d{3}[-\040.]?\d{4})|(?:(\+)(?:9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-\040.]?(?:\d[-\040.]?){6,12}\d+))([,;]+[0-9]+#?)*/.source,"|").concat(/(0([1-9]{1}-?[1-9]\d{3}|[1-9]{2}-?\d{3}|[1-9]{2}\d{1}-?\d{2}|[1-9]{2}\d{2}-?\d{1})-?\d{4}|0[789]0-?\d{4}-?\d{4}|050-?\d{4}-?\d{4})/.source),"g"),jC=function(s){function PhoneMatcher(){var o=null!==s&&s.apply(this,arguments)||this;return o.matcherRegex=CC,o}return tslib_es6_extends(PhoneMatcher,s),PhoneMatcher.prototype.parseMatches=function(s){for(var o,i=this.matcherRegex,a=this.tagBuilder,u=[];null!==(o=i.exec(s));){var _=o[0],w=_.replace(/[^0-9,;#]/g,""),x=!(!o[1]&&!o[2]),C=0==o.index?"":s.substr(o.index-1,1),j=s.substr(o.index+_.length,1),L=!C.match(/\d/)&&!j.match(/\d/);this.testMatch(o[3])&&this.testMatch(_)&&L&&u.push(new QA({tagBuilder:a,matchedText:_,offset:o.index,number:w,plusSign:x}))}return u},PhoneMatcher.prototype.testMatch=function(s){return nC.test(s)},PhoneMatcher}(eC),PC=new RegExp("@[_".concat(pC,"]{1,50}(?![_").concat(pC,"])"),"g"),IC=new RegExp("@[_.".concat(pC,"]{1,30}(?![_").concat(pC,"])"),"g"),TC=new RegExp("@[-_.".concat(pC,"]{1,50}(?![-_").concat(pC,"])"),"g"),NC=new RegExp("@[_.".concat(pC,"]{1,23}[_").concat(pC,"](?![_").concat(pC,"])"),"g"),MC=new RegExp("[^"+pC+"]"),RC=function(s){function MentionMatcher(o){var i=s.call(this,o)||this;return i.serviceName="twitter",i.matcherRegexes={twitter:PC,instagram:IC,soundcloud:TC,tiktok:NC},i.nonWordCharRegex=MC,i.serviceName=o.serviceName,i}return tslib_es6_extends(MentionMatcher,s),MentionMatcher.prototype.parseMatches=function(s){var o,i=this.serviceName,a=this.matcherRegexes[this.serviceName],u=this.nonWordCharRegex,_=this.tagBuilder,w=[];if(!a)return w;for(;null!==(o=a.exec(s));){var x=o.index,C=s.charAt(x-1);if(0===x||u.test(C)){var j=o[0].replace(/\.+$/g,""),L=j.slice(1);w.push(new XA({tagBuilder:_,matchedText:j,offset:x,serviceName:i,mention:L}))}}return w},MentionMatcher}(eC);function parseHtml(s,o){for(var i=o.onOpenTag,a=o.onCloseTag,u=o.onText,_=o.onComment,w=o.onDoctype,x=new DC,C=0,j=s.length,L=0,B=0,$=x;C"===s?($=new DC(__assign(__assign({},$),{name:captureTagName()})),emitTagAndPreviousTextNode()):tC.test(s)||rC.test(s)||":"===s||resetToDataState()}function stateEndTagOpen(s){">"===s?resetToDataState():tC.test(s)?L=3:resetToDataState()}function stateBeforeAttributeName(s){sC.test(s)||("/"===s?L=12:">"===s?emitTagAndPreviousTextNode():"<"===s?startNewTag():"="===s||oC.test(s)||iC.test(s)?resetToDataState():L=5)}function stateAttributeName(s){sC.test(s)?L=6:"/"===s?L=12:"="===s?L=7:">"===s?emitTagAndPreviousTextNode():"<"===s?startNewTag():oC.test(s)&&resetToDataState()}function stateAfterAttributeName(s){sC.test(s)||("/"===s?L=12:"="===s?L=7:">"===s?emitTagAndPreviousTextNode():"<"===s?startNewTag():oC.test(s)?resetToDataState():L=5)}function stateBeforeAttributeValue(s){sC.test(s)||('"'===s?L=8:"'"===s?L=9:/[>=`]/.test(s)?resetToDataState():"<"===s?startNewTag():L=10)}function stateAttributeValueDoubleQuoted(s){'"'===s&&(L=11)}function stateAttributeValueSingleQuoted(s){"'"===s&&(L=11)}function stateAttributeValueUnquoted(s){sC.test(s)?L=4:">"===s?emitTagAndPreviousTextNode():"<"===s&&startNewTag()}function stateAfterAttributeValueQuoted(s){sC.test(s)?L=4:"/"===s?L=12:">"===s?emitTagAndPreviousTextNode():"<"===s?startNewTag():(L=4,function reconsumeCurrentCharacter(){C--}())}function stateSelfClosingStartTag(s){">"===s?($=new DC(__assign(__assign({},$),{isClosing:!0})),emitTagAndPreviousTextNode()):L=4}function stateMarkupDeclarationOpen(o){"--"===s.substr(C,2)?(C+=2,$=new DC(__assign(__assign({},$),{type:"comment"})),L=14):"DOCTYPE"===s.substr(C,7).toUpperCase()?(C+=7,$=new DC(__assign(__assign({},$),{type:"doctype"})),L=20):resetToDataState()}function stateCommentStart(s){"-"===s?L=15:">"===s?resetToDataState():L=16}function stateCommentStartDash(s){"-"===s?L=18:">"===s?resetToDataState():L=16}function stateComment(s){"-"===s&&(L=17)}function stateCommentEndDash(s){L="-"===s?18:16}function stateCommentEnd(s){">"===s?emitTagAndPreviousTextNode():"!"===s?L=19:"-"===s||(L=16)}function stateCommentEndBang(s){"-"===s?L=17:">"===s?emitTagAndPreviousTextNode():L=16}function stateDoctype(s){">"===s?emitTagAndPreviousTextNode():"<"===s&&startNewTag()}function resetToDataState(){L=0,$=x}function startNewTag(){L=1,$=new DC({idx:C})}function emitTagAndPreviousTextNode(){var o=s.slice(B,$.idx);o&&u(o,B),"comment"===$.type?_($.idx):"doctype"===$.type?w($.idx):($.isOpening&&i($.name,$.idx),$.isClosing&&a($.name,$.idx)),resetToDataState(),B=C+1}function captureTagName(){var o=$.idx+($.isClosing?2:1);return s.slice(o,C).toLowerCase()}B=0&&a++},onText:function(s,i){if(0===a){var _=function splitAndCapture(s,o){if(!o.global)throw new Error("`splitRegex` must have the 'g' flag set");for(var i,a=[],u=0;i=o.exec(s);)a.push(s.substring(u,i.index)),a.push(i[0]),u=i.index+i[0].length;return a.push(s.substring(u)),a}(s,/( | |<|<|>|>|"|"|')/gi),w=i;_.forEach((function(s,i){if(i%2==0){var a=o.parseText(s,w);u.push.apply(u,a)}w+=s.length}))}},onCloseTag:function(s){i.indexOf(s)>=0&&(a=Math.max(a-1,0))},onComment:function(s){},onDoctype:function(s){}}),u=this.compactMatches(u),u=this.removeUnwantedMatches(u)},Autolinker.prototype.compactMatches=function(s){s.sort((function(s,o){return s.getOffset()-o.getOffset()}));for(var o=0;ou?o:o+1;s.splice(w,1);continue}if(s[o+1].getOffset()<_){s.splice(o+1,1);continue}}o++}return s},Autolinker.prototype.removeUnwantedMatches=function(s){return this.hashtag||utils_remove(s,(function(s){return"hashtag"===s.getType()})),this.email||utils_remove(s,(function(s){return"email"===s.getType()})),this.phone||utils_remove(s,(function(s){return"phone"===s.getType()})),this.mention||utils_remove(s,(function(s){return"mention"===s.getType()})),this.urls.schemeMatches||utils_remove(s,(function(s){return"url"===s.getType()&&"scheme"===s.getUrlMatchType()})),this.urls.wwwMatches||utils_remove(s,(function(s){return"url"===s.getType()&&"www"===s.getUrlMatchType()})),this.urls.tldMatches||utils_remove(s,(function(s){return"url"===s.getType()&&"tld"===s.getUrlMatchType()})),s},Autolinker.prototype.parseText=function(s,o){void 0===o&&(o=0),o=o||0;for(var i=this.getMatchers(),a=[],u=0,_=i.length;u<_;u++){for(var w=i[u].parseMatches(s),x=0,C=w.length;x/g,">"));for(var o=this.parse(s),i=[],a=0,u=0,_=o.length;u<_;u++){var w=o[u];i.push(s.substring(a,w.getOffset())),i.push(this.createMatchReturnVal(w)),a=w.getOffset()+w.getMatchedText().length}return i.push(s.substring(a)),i.join("")},Autolinker.prototype.createMatchReturnVal=function(s){var o;return this.replaceFn&&(o=this.replaceFn.call(this.context,s)),"string"==typeof o?o:!1===o?s.getMatchedText():o instanceof WA?o.toAnchorString():s.buildTag().toAnchorString()},Autolinker.prototype.getMatchers=function(){if(this.matchers)return this.matchers;var s=this.getTagBuilder(),o=[new OC({tagBuilder:s,serviceName:this.hashtag}),new bC({tagBuilder:s}),new jC({tagBuilder:s}),new RC({tagBuilder:s,serviceName:this.mention}),new xC({tagBuilder:s,stripPrefix:this.stripPrefix,stripTrailingSlash:this.stripTrailingSlash,decodePercentEncoding:this.decodePercentEncoding})];return this.matchers=o},Autolinker.prototype.getTagBuilder=function(){var s=this.tagBuilder;return s||(s=this.tagBuilder=new JA({newWindow:this.newWindow,truncate:this.truncate,className:this.className})),s},Autolinker.version="3.16.2",Autolinker.AnchorTagBuilder=JA,Autolinker.HtmlTag=WA,Autolinker.matcher={Email:bC,Hashtag:OC,Matcher:eC,Mention:RC,Phone:jC,Url:xC},Autolinker.match={Email:GA,Hashtag:YA,Match:HA,Mention:XA,Phone:QA,Url:ZA},Autolinker}();const FC=LC;var BC=/www|@|\:\/\//;function isLinkOpen(s){return/^\s]/i.test(s)}function isLinkClose(s){return/^<\/a\s*>/i.test(s)}function createLinkifier(){var s=[],o=new FC({stripPrefix:!1,url:!0,email:!0,replaceFn:function(o){switch(o.getType()){case"url":s.push({text:o.matchedText,url:o.getUrl()});break;case"email":s.push({text:o.matchedText,url:"mailto:"+o.getEmail().replace(/^mailto:/i,"")})}return!1}});return{links:s,autolinker:o}}function parseTokens(s){var o,i,a,u,_,w,x,C,j,L,B,$,U,V=s.tokens,z=null;for(i=0,a=V.length;i=0;o--)if("link_close"!==(_=u[o]).type){if("htmltag"===_.type&&(isLinkOpen(_.content)&&B>0&&B--,isLinkClose(_.content)&&B++),!(B>0)&&"text"===_.type&&BC.test(_.content)){if(z||($=(z=createLinkifier()).links,U=z.autolinker),w=_.content,$.length=0,U.link(w),!$.length)continue;for(x=[],L=_.level,C=0;C<$.length;C++)s.inline.validateLink($[C].url)&&((j=w.indexOf($[C].text))&&x.push({type:"text",content:w.slice(0,j),level:L}),x.push({type:"link_open",href:$[C].url,title:"",level:L++}),x.push({type:"text",content:$[C].text,level:L}),x.push({type:"link_close",level:--L}),w=w.slice(j+$[C].text.length));w.length&&x.push({type:"text",content:w,level:L}),V[i].children=u=[].concat(u.slice(0,o),x,u.slice(o+1))}}else for(o--;u[o].level!==_.level&&"link_open"!==u[o].type;)o--}function linkify(s){s.core.ruler.push("linkify",parseTokens)}const{entries:$C,setPrototypeOf:qC,isFrozen:UC,getPrototypeOf:VC,getOwnPropertyDescriptor:zC}=Object;let{freeze:WC,seal:JC,create:HC}=Object,{apply:KC,construct:GC}="undefined"!=typeof Reflect&&Reflect;WC||(WC=function freeze(s){return s}),JC||(JC=function seal(s){return s}),KC||(KC=function apply(s,o,i){return s.apply(o,i)}),GC||(GC=function construct(s,o){return new s(...o)});const YC=unapply(Array.prototype.forEach),XC=unapply(Array.prototype.lastIndexOf),QC=unapply(Array.prototype.pop),ZC=unapply(Array.prototype.push),ej=unapply(Array.prototype.splice),fj=unapply(String.prototype.toLowerCase),mj=unapply(String.prototype.toString),_j=unapply(String.prototype.match),Aj=unapply(String.prototype.replace),Cj=unapply(String.prototype.indexOf),Nj=unapply(String.prototype.trim),Bj=unapply(Object.prototype.hasOwnProperty),$j=unapply(RegExp.prototype.test),zj=function unconstruct(s){return function(){for(var o=arguments.length,i=new Array(o),a=0;a1?i-1:0),u=1;u2&&void 0!==arguments[2]?arguments[2]:fj;qC&&qC(s,null);let a=o.length;for(;a--;){let u=o[a];if("string"==typeof u){const s=i(u);s!==u&&(UC(o)||(o[a]=s),u=s)}s[u]=!0}return s}function purify_es_cleanArray(s){for(let o=0;o/gm),lP=JC(/\$\{[\w\W]*/gm),uP=JC(/^data-[\-\w.\u00B7-\uFFFF]+$/),pP=JC(/^aria-[\-\w]+$/),hP=JC(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),dP=JC(/^(?:\w+script|data):/i),fP=JC(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),mP=JC(/^html$/i),gP=JC(/^[a-z][.\w]*(-[.\w]+)+$/i);var yP=Object.freeze({__proto__:null,ARIA_ATTR:pP,ATTR_WHITESPACE:fP,CUSTOM_ELEMENT:gP,DATA_ATTR:uP,DOCTYPE_NAME:mP,ERB_EXPR:cP,IS_ALLOWED_URI:hP,IS_SCRIPT_OR_DATA:dP,MUSTACHE_EXPR:aP,TMPLIT_EXPR:lP});const vP=1,bP=3,_P=7,SP=8,EP=9,wP=function getGlobal(){return"undefined"==typeof window?null:window};var xP=function createDOMPurify(){let s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:wP();const DOMPurify=s=>createDOMPurify(s);if(DOMPurify.version="3.2.6",DOMPurify.removed=[],!s||!s.document||s.document.nodeType!==EP||!s.Element)return DOMPurify.isSupported=!1,DOMPurify;let{document:o}=s;const i=o,a=i.currentScript,{DocumentFragment:u,HTMLTemplateElement:_,Node:w,Element:x,NodeFilter:C,NamedNodeMap:j=s.NamedNodeMap||s.MozNamedAttrMap,HTMLFormElement:L,DOMParser:B,trustedTypes:$}=s,U=x.prototype,V=lookupGetter(U,"cloneNode"),z=lookupGetter(U,"remove"),Y=lookupGetter(U,"nextSibling"),Z=lookupGetter(U,"childNodes"),ee=lookupGetter(U,"parentNode");if("function"==typeof _){const s=o.createElement("template");s.content&&s.content.ownerDocument&&(o=s.content.ownerDocument)}let ie,ae="";const{implementation:ce,createNodeIterator:le,createDocumentFragment:pe,getElementsByTagName:de}=o,{importNode:fe}=i;let ye={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};DOMPurify.isSupported="function"==typeof $C&&"function"==typeof ee&&ce&&void 0!==ce.createHTMLDocument;const{MUSTACHE_EXPR:be,ERB_EXPR:_e,TMPLIT_EXPR:Se,DATA_ATTR:we,ARIA_ATTR:xe,IS_SCRIPT_OR_DATA:Pe,ATTR_WHITESPACE:Te,CUSTOM_ELEMENT:Re}=yP;let{IS_ALLOWED_URI:$e}=yP,qe=null;const ze=addToSet({},[...Jj,...Kj,...Gj,...eP,...rP]);let We=null;const He=addToSet({},[...nP,...sP,...oP,...iP]);let Ye=Object.seal(HC(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Xe=null,Qe=null,et=!0,tt=!0,rt=!1,nt=!0,st=!1,ot=!0,it=!1,at=!1,ct=!1,lt=!1,ut=!1,pt=!1,ht=!0,dt=!1,mt=!0,gt=!1,yt={},vt=null;const bt=addToSet({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let _t=null;const St=addToSet({},["audio","video","img","source","image","track"]);let Et=null;const wt=addToSet({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),xt="http://www.w3.org/1998/Math/MathML",kt="http://www.w3.org/2000/svg",Ot="http://www.w3.org/1999/xhtml";let At=Ot,Ct=!1,jt=null;const Pt=addToSet({},[xt,kt,Ot],mj);let It=addToSet({},["mi","mo","mn","ms","mtext"]),Tt=addToSet({},["annotation-xml"]);const Nt=addToSet({},["title","style","font","a","script"]);let Mt=null;const Rt=["application/xhtml+xml","text/html"];let Dt=null,Lt=null;const Ft=o.createElement("form"),Bt=function isRegexOrFunction(s){return s instanceof RegExp||s instanceof Function},$t=function _parseConfig(){let s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!Lt||Lt!==s){if(s&&"object"==typeof s||(s={}),s=clone(s),Mt=-1===Rt.indexOf(s.PARSER_MEDIA_TYPE)?"text/html":s.PARSER_MEDIA_TYPE,Dt="application/xhtml+xml"===Mt?mj:fj,qe=Bj(s,"ALLOWED_TAGS")?addToSet({},s.ALLOWED_TAGS,Dt):ze,We=Bj(s,"ALLOWED_ATTR")?addToSet({},s.ALLOWED_ATTR,Dt):He,jt=Bj(s,"ALLOWED_NAMESPACES")?addToSet({},s.ALLOWED_NAMESPACES,mj):Pt,Et=Bj(s,"ADD_URI_SAFE_ATTR")?addToSet(clone(wt),s.ADD_URI_SAFE_ATTR,Dt):wt,_t=Bj(s,"ADD_DATA_URI_TAGS")?addToSet(clone(St),s.ADD_DATA_URI_TAGS,Dt):St,vt=Bj(s,"FORBID_CONTENTS")?addToSet({},s.FORBID_CONTENTS,Dt):bt,Xe=Bj(s,"FORBID_TAGS")?addToSet({},s.FORBID_TAGS,Dt):clone({}),Qe=Bj(s,"FORBID_ATTR")?addToSet({},s.FORBID_ATTR,Dt):clone({}),yt=!!Bj(s,"USE_PROFILES")&&s.USE_PROFILES,et=!1!==s.ALLOW_ARIA_ATTR,tt=!1!==s.ALLOW_DATA_ATTR,rt=s.ALLOW_UNKNOWN_PROTOCOLS||!1,nt=!1!==s.ALLOW_SELF_CLOSE_IN_ATTR,st=s.SAFE_FOR_TEMPLATES||!1,ot=!1!==s.SAFE_FOR_XML,it=s.WHOLE_DOCUMENT||!1,lt=s.RETURN_DOM||!1,ut=s.RETURN_DOM_FRAGMENT||!1,pt=s.RETURN_TRUSTED_TYPE||!1,ct=s.FORCE_BODY||!1,ht=!1!==s.SANITIZE_DOM,dt=s.SANITIZE_NAMED_PROPS||!1,mt=!1!==s.KEEP_CONTENT,gt=s.IN_PLACE||!1,$e=s.ALLOWED_URI_REGEXP||hP,At=s.NAMESPACE||Ot,It=s.MATHML_TEXT_INTEGRATION_POINTS||It,Tt=s.HTML_INTEGRATION_POINTS||Tt,Ye=s.CUSTOM_ELEMENT_HANDLING||{},s.CUSTOM_ELEMENT_HANDLING&&Bt(s.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Ye.tagNameCheck=s.CUSTOM_ELEMENT_HANDLING.tagNameCheck),s.CUSTOM_ELEMENT_HANDLING&&Bt(s.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Ye.attributeNameCheck=s.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),s.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof s.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Ye.allowCustomizedBuiltInElements=s.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),st&&(tt=!1),ut&&(lt=!0),yt&&(qe=addToSet({},rP),We=[],!0===yt.html&&(addToSet(qe,Jj),addToSet(We,nP)),!0===yt.svg&&(addToSet(qe,Kj),addToSet(We,sP),addToSet(We,iP)),!0===yt.svgFilters&&(addToSet(qe,Gj),addToSet(We,sP),addToSet(We,iP)),!0===yt.mathMl&&(addToSet(qe,eP),addToSet(We,oP),addToSet(We,iP))),s.ADD_TAGS&&(qe===ze&&(qe=clone(qe)),addToSet(qe,s.ADD_TAGS,Dt)),s.ADD_ATTR&&(We===He&&(We=clone(We)),addToSet(We,s.ADD_ATTR,Dt)),s.ADD_URI_SAFE_ATTR&&addToSet(Et,s.ADD_URI_SAFE_ATTR,Dt),s.FORBID_CONTENTS&&(vt===bt&&(vt=clone(vt)),addToSet(vt,s.FORBID_CONTENTS,Dt)),mt&&(qe["#text"]=!0),it&&addToSet(qe,["html","head","body"]),qe.table&&(addToSet(qe,["tbody"]),delete Xe.tbody),s.TRUSTED_TYPES_POLICY){if("function"!=typeof s.TRUSTED_TYPES_POLICY.createHTML)throw zj('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof s.TRUSTED_TYPES_POLICY.createScriptURL)throw zj('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');ie=s.TRUSTED_TYPES_POLICY,ae=ie.createHTML("")}else void 0===ie&&(ie=function _createTrustedTypesPolicy(s,o){if("object"!=typeof s||"function"!=typeof s.createPolicy)return null;let i=null;const a="data-tt-policy-suffix";o&&o.hasAttribute(a)&&(i=o.getAttribute(a));const u="dompurify"+(i?"#"+i:"");try{return s.createPolicy(u,{createHTML:s=>s,createScriptURL:s=>s})}catch(s){return console.warn("TrustedTypes policy "+u+" could not be created."),null}}($,a)),null!==ie&&"string"==typeof ae&&(ae=ie.createHTML(""));WC&&WC(s),Lt=s}},qt=addToSet({},[...Kj,...Gj,...Xj]),Ut=addToSet({},[...eP,...tP]),Vt=function _forceRemove(s){ZC(DOMPurify.removed,{element:s});try{ee(s).removeChild(s)}catch(o){z(s)}},zt=function _removeAttribute(s,o){try{ZC(DOMPurify.removed,{attribute:o.getAttributeNode(s),from:o})}catch(s){ZC(DOMPurify.removed,{attribute:null,from:o})}if(o.removeAttribute(s),"is"===s)if(lt||ut)try{Vt(o)}catch(s){}else try{o.setAttribute(s,"")}catch(s){}},Wt=function _initDocument(s){let i=null,a=null;if(ct)s=""+s;else{const o=_j(s,/^[\r\n\t ]+/);a=o&&o[0]}"application/xhtml+xml"===Mt&&At===Ot&&(s=''+s+"");const u=ie?ie.createHTML(s):s;if(At===Ot)try{i=(new B).parseFromString(u,Mt)}catch(s){}if(!i||!i.documentElement){i=ce.createDocument(At,"template",null);try{i.documentElement.innerHTML=Ct?ae:u}catch(s){}}const _=i.body||i.documentElement;return s&&a&&_.insertBefore(o.createTextNode(a),_.childNodes[0]||null),At===Ot?de.call(i,it?"html":"body")[0]:it?i.documentElement:_},Jt=function _createNodeIterator(s){return le.call(s.ownerDocument||s,s,C.SHOW_ELEMENT|C.SHOW_COMMENT|C.SHOW_TEXT|C.SHOW_PROCESSING_INSTRUCTION|C.SHOW_CDATA_SECTION,null)},Ht=function _isClobbered(s){return s instanceof L&&("string"!=typeof s.nodeName||"string"!=typeof s.textContent||"function"!=typeof s.removeChild||!(s.attributes instanceof j)||"function"!=typeof s.removeAttribute||"function"!=typeof s.setAttribute||"string"!=typeof s.namespaceURI||"function"!=typeof s.insertBefore||"function"!=typeof s.hasChildNodes)},Kt=function _isNode(s){return"function"==typeof w&&s instanceof w};function _executeHooks(s,o,i){YC(s,(s=>{s.call(DOMPurify,o,i,Lt)}))}const Gt=function _sanitizeElements(s){let o=null;if(_executeHooks(ye.beforeSanitizeElements,s,null),Ht(s))return Vt(s),!0;const i=Dt(s.nodeName);if(_executeHooks(ye.uponSanitizeElement,s,{tagName:i,allowedTags:qe}),ot&&s.hasChildNodes()&&!Kt(s.firstElementChild)&&$j(/<[/\w!]/g,s.innerHTML)&&$j(/<[/\w!]/g,s.textContent))return Vt(s),!0;if(s.nodeType===_P)return Vt(s),!0;if(ot&&s.nodeType===SP&&$j(/<[/\w]/g,s.data))return Vt(s),!0;if(!qe[i]||Xe[i]){if(!Xe[i]&&Xt(i)){if(Ye.tagNameCheck instanceof RegExp&&$j(Ye.tagNameCheck,i))return!1;if(Ye.tagNameCheck instanceof Function&&Ye.tagNameCheck(i))return!1}if(mt&&!vt[i]){const o=ee(s)||s.parentNode,i=Z(s)||s.childNodes;if(i&&o){for(let a=i.length-1;a>=0;--a){const u=V(i[a],!0);u.__removalCount=(s.__removalCount||0)+1,o.insertBefore(u,Y(s))}}}return Vt(s),!0}return s instanceof x&&!function _checkValidNamespace(s){let o=ee(s);o&&o.tagName||(o={namespaceURI:At,tagName:"template"});const i=fj(s.tagName),a=fj(o.tagName);return!!jt[s.namespaceURI]&&(s.namespaceURI===kt?o.namespaceURI===Ot?"svg"===i:o.namespaceURI===xt?"svg"===i&&("annotation-xml"===a||It[a]):Boolean(qt[i]):s.namespaceURI===xt?o.namespaceURI===Ot?"math"===i:o.namespaceURI===kt?"math"===i&&Tt[a]:Boolean(Ut[i]):s.namespaceURI===Ot?!(o.namespaceURI===kt&&!Tt[a])&&!(o.namespaceURI===xt&&!It[a])&&!Ut[i]&&(Nt[i]||!qt[i]):!("application/xhtml+xml"!==Mt||!jt[s.namespaceURI]))}(s)?(Vt(s),!0):"noscript"!==i&&"noembed"!==i&&"noframes"!==i||!$j(/<\/no(script|embed|frames)/i,s.innerHTML)?(st&&s.nodeType===bP&&(o=s.textContent,YC([be,_e,Se],(s=>{o=Aj(o,s," ")})),s.textContent!==o&&(ZC(DOMPurify.removed,{element:s.cloneNode()}),s.textContent=o)),_executeHooks(ye.afterSanitizeElements,s,null),!1):(Vt(s),!0)},Yt=function _isValidAttribute(s,i,a){if(ht&&("id"===i||"name"===i)&&(a in o||a in Ft))return!1;if(tt&&!Qe[i]&&$j(we,i));else if(et&&$j(xe,i));else if(!We[i]||Qe[i]){if(!(Xt(s)&&(Ye.tagNameCheck instanceof RegExp&&$j(Ye.tagNameCheck,s)||Ye.tagNameCheck instanceof Function&&Ye.tagNameCheck(s))&&(Ye.attributeNameCheck instanceof RegExp&&$j(Ye.attributeNameCheck,i)||Ye.attributeNameCheck instanceof Function&&Ye.attributeNameCheck(i))||"is"===i&&Ye.allowCustomizedBuiltInElements&&(Ye.tagNameCheck instanceof RegExp&&$j(Ye.tagNameCheck,a)||Ye.tagNameCheck instanceof Function&&Ye.tagNameCheck(a))))return!1}else if(Et[i]);else if($j($e,Aj(a,Te,"")));else if("src"!==i&&"xlink:href"!==i&&"href"!==i||"script"===s||0!==Cj(a,"data:")||!_t[s]){if(rt&&!$j(Pe,Aj(a,Te,"")));else if(a)return!1}else;return!0},Xt=function _isBasicCustomElement(s){return"annotation-xml"!==s&&_j(s,Re)},Qt=function _sanitizeAttributes(s){_executeHooks(ye.beforeSanitizeAttributes,s,null);const{attributes:o}=s;if(!o||Ht(s))return;const i={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:We,forceKeepAttr:void 0};let a=o.length;for(;a--;){const u=o[a],{name:_,namespaceURI:w,value:x}=u,C=Dt(_),j=x;let L="value"===_?j:Nj(j);if(i.attrName=C,i.attrValue=L,i.keepAttr=!0,i.forceKeepAttr=void 0,_executeHooks(ye.uponSanitizeAttribute,s,i),L=i.attrValue,!dt||"id"!==C&&"name"!==C||(zt(_,s),L="user-content-"+L),ot&&$j(/((--!?|])>)|<\/(style|title)/i,L)){zt(_,s);continue}if(i.forceKeepAttr)continue;if(!i.keepAttr){zt(_,s);continue}if(!nt&&$j(/\/>/i,L)){zt(_,s);continue}st&&YC([be,_e,Se],(s=>{L=Aj(L,s," ")}));const B=Dt(s.nodeName);if(Yt(B,C,L)){if(ie&&"object"==typeof $&&"function"==typeof $.getAttributeType)if(w);else switch($.getAttributeType(B,C)){case"TrustedHTML":L=ie.createHTML(L);break;case"TrustedScriptURL":L=ie.createScriptURL(L)}if(L!==j)try{w?s.setAttributeNS(w,_,L):s.setAttribute(_,L),Ht(s)?Vt(s):QC(DOMPurify.removed)}catch(o){zt(_,s)}}else zt(_,s)}_executeHooks(ye.afterSanitizeAttributes,s,null)},Zt=function _sanitizeShadowDOM(s){let o=null;const i=Jt(s);for(_executeHooks(ye.beforeSanitizeShadowDOM,s,null);o=i.nextNode();)_executeHooks(ye.uponSanitizeShadowNode,o,null),Gt(o),Qt(o),o.content instanceof u&&_sanitizeShadowDOM(o.content);_executeHooks(ye.afterSanitizeShadowDOM,s,null)};return DOMPurify.sanitize=function(s){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=null,_=null,x=null,C=null;if(Ct=!s,Ct&&(s="\x3c!--\x3e"),"string"!=typeof s&&!Kt(s)){if("function"!=typeof s.toString)throw zj("toString is not a function");if("string"!=typeof(s=s.toString()))throw zj("dirty is not a string, aborting")}if(!DOMPurify.isSupported)return s;if(at||$t(o),DOMPurify.removed=[],"string"==typeof s&&(gt=!1),gt){if(s.nodeName){const o=Dt(s.nodeName);if(!qe[o]||Xe[o])throw zj("root node is forbidden and cannot be sanitized in-place")}}else if(s instanceof w)a=Wt("\x3c!----\x3e"),_=a.ownerDocument.importNode(s,!0),_.nodeType===vP&&"BODY"===_.nodeName||"HTML"===_.nodeName?a=_:a.appendChild(_);else{if(!lt&&!st&&!it&&-1===s.indexOf("<"))return ie&&pt?ie.createHTML(s):s;if(a=Wt(s),!a)return lt?null:pt?ae:""}a&&ct&&Vt(a.firstChild);const j=Jt(gt?s:a);for(;x=j.nextNode();)Gt(x),Qt(x),x.content instanceof u&&Zt(x.content);if(gt)return s;if(lt){if(ut)for(C=pe.call(a.ownerDocument);a.firstChild;)C.appendChild(a.firstChild);else C=a;return(We.shadowroot||We.shadowrootmode)&&(C=fe.call(i,C,!0)),C}let L=it?a.outerHTML:a.innerHTML;return it&&qe["!doctype"]&&a.ownerDocument&&a.ownerDocument.doctype&&a.ownerDocument.doctype.name&&$j(mP,a.ownerDocument.doctype.name)&&(L="\n"+L),st&&YC([be,_e,Se],(s=>{L=Aj(L,s," ")})),ie&&pt?ie.createHTML(L):L},DOMPurify.setConfig=function(){$t(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),at=!0},DOMPurify.clearConfig=function(){Lt=null,at=!1},DOMPurify.isValidAttribute=function(s,o,i){Lt||$t({});const a=Dt(s),u=Dt(o);return Yt(a,u,i)},DOMPurify.addHook=function(s,o){"function"==typeof o&&ZC(ye[s],o)},DOMPurify.removeHook=function(s,o){if(void 0!==o){const i=XC(ye[s],o);return-1===i?void 0:ej(ye[s],i,1)[0]}return QC(ye[s])},DOMPurify.removeHooks=function(s){ye[s]=[]},DOMPurify.removeAllHooks=function(){ye={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},DOMPurify}();xP.addHook&&xP.addHook("beforeSanitizeElements",(function(s){return s.href&&s.setAttribute("rel","noopener noreferrer"),s}));const kP=function Markdown({source:s,className:o="",getConfigs:i=()=>({useUnsafeMarkdown:!1})}){if("string"!=typeof s)return null;const a=new Remarkable({html:!0,typographer:!0,breaks:!0,linkTarget:"_blank"}).use(linkify);a.core.ruler.disable(["replacements","smartquotes"]);const{useUnsafeMarkdown:u}=i(),_=a.render(s),w=sanitizer(_,{useUnsafeMarkdown:u});return s&&_&&w?Re.createElement("div",{className:Jn()(o,"markdown"),dangerouslySetInnerHTML:{__html:w}}):null};function sanitizer(s,{useUnsafeMarkdown:o=!1}={}){const i=o,a=o?[]:["style","class"];return o&&!sanitizer.hasWarnedAboutDeprecation&&(console.warn("useUnsafeMarkdown display configuration parameter is deprecated since >3.26.0 and will be removed in v4.0.0."),sanitizer.hasWarnedAboutDeprecation=!0),xP.sanitize(s,{ADD_ATTR:["target"],FORBID_TAGS:["style","form"],ALLOW_DATA_ATTR:i,FORBID_ATTR:a})}sanitizer.hasWarnedAboutDeprecation=!1;class BaseLayout extends Re.Component{render(){const{errSelectors:s,specSelectors:o,getComponent:i}=this.props,a=i("SvgAssets"),u=i("InfoContainer",!0),_=i("VersionPragmaFilter"),w=i("operations",!0),x=i("Models",!0),C=i("Webhooks",!0),j=i("Row"),L=i("Col"),B=i("errors",!0),$=i("ServersContainer",!0),U=i("SchemesContainer",!0),V=i("AuthorizeBtnContainer",!0),z=i("FilterContainer",!0),Y=o.isSwagger2(),Z=o.isOAS3(),ee=o.isOAS31(),ie=!o.specStr(),ae=o.loadingStatus();let ce=null;if("loading"===ae&&(ce=Re.createElement("div",{className:"info"},Re.createElement("div",{className:"loading-container"},Re.createElement("div",{className:"loading"})))),"failed"===ae&&(ce=Re.createElement("div",{className:"info"},Re.createElement("div",{className:"loading-container"},Re.createElement("h4",{className:"title"},"Failed to load API definition."),Re.createElement(B,null)))),"failedConfig"===ae){const o=s.lastError(),i=o?o.get("message"):"";ce=Re.createElement("div",{className:"info failed-config"},Re.createElement("div",{className:"loading-container"},Re.createElement("h4",{className:"title"},"Failed to load remote configuration."),Re.createElement("p",null,i)))}if(!ce&&ie&&(ce=Re.createElement("h4",null,"No API definition provided.")),ce)return Re.createElement("div",{className:"swagger-ui"},Re.createElement("div",{className:"loading-container"},ce));const le=o.servers(),pe=o.schemes(),de=le&&le.size,fe=pe&&pe.size,ye=!!o.securityDefinitions();return Re.createElement("div",{className:"swagger-ui"},Re.createElement(a,null),Re.createElement(_,{isSwagger2:Y,isOAS3:Z,alsoShow:Re.createElement(B,null)},Re.createElement(B,null),Re.createElement(j,{className:"information-container"},Re.createElement(L,{mobile:12},Re.createElement(u,null))),de||fe||ye?Re.createElement("div",{className:"scheme-container"},Re.createElement(L,{className:"schemes wrapper",mobile:12},de||fe?Re.createElement("div",{className:"schemes-server-container"},de?Re.createElement($,null):null,fe?Re.createElement(U,null):null):null,ye?Re.createElement(V,null):null)):null,Re.createElement(z,null),Re.createElement(j,null,Re.createElement(L,{mobile:12,desktop:12},Re.createElement(w,null))),ee&&Re.createElement(j,{className:"webhooks-container"},Re.createElement(L,{mobile:12,desktop:12},Re.createElement(C,null))),Re.createElement(j,null,Re.createElement(L,{mobile:12,desktop:12},Re.createElement(x,null)))))}}const core_components=()=>({components:{App:JO,authorizationPopup:AuthorizationPopup,authorizeBtn:AuthorizeBtn,AuthorizeBtnContainer,authorizeOperationBtn:AuthorizeOperationBtn,auths:Auths,AuthItem:auth_item_Auths,authError:AuthError,oauth2:Oauth2,apiKeyAuth:ApiKeyAuth,basicAuth:BasicAuth,clear:Clear,liveResponse:LiveResponse,InitializedInput,info:tA,InfoContainer,InfoUrl,InfoBasePath,Contact:rA,License:nA,JumpToPath,CopyToClipboardBtn,onlineValidatorBadge:OnlineValidatorBadge,operations:Operations,operation:operation_Operation,OperationSummary,OperationSummaryMethod,OperationSummaryPath,responses:responses_Responses,response:response_Response,ResponseExtension:response_extension,responseBody:ResponseBody,parameters:Parameters,parameterRow:ParameterRow,execute:Execute,headers:headers_Headers,errors:Errors,contentType:ContentType,overview:Overview,footer:Footer,FilterContainer,ParamBody,curl:Curl,Property:property,TryItOutButton,Markdown:kP,BaseLayout,VersionPragmaFilter,VersionStamp:version_stamp,OperationExt:operation_extensions,OperationExtRow:operation_extension_row,ParameterExt:parameter_extension,ParameterIncludeEmpty,OperationTag,OperationContainer,OpenAPIVersion:openapi_version,DeepLink:deep_link,SvgAssets:svg_assets,Example:example_Example,ExamplesSelect,ExamplesSelectValueRetainer}}),form_components=()=>({components:{..._e}}),base=()=>[configsPlugin,util,logs,view,view_legacy,plugins_spec,err,icons,plugins_layout,json_schema_5,json_schema_5_samples,core_components,form_components,swagger_client,auth,downloadUrlPlugin,deep_linking,filter,on_complete,plugins_request_snippets,syntax_highlighting,versions,safe_render()],OP=(0,ze.Map)();function onlyOAS3(s){return(o,i)=>(...a)=>{if(i.getSystem().specSelectors.isOAS3()){const o=s(...a);return"function"==typeof o?o(i):o}return o(...a)}}const AP=onlyOAS3(xs()(null)),CP=onlyOAS3(((s,o)=>s=>s.getSystem().specSelectors.findSchema(o))),jP=onlyOAS3((()=>s=>{const o=s.getSystem().specSelectors.specJson().getIn(["components","schemas"]);return ze.Map.isMap(o)?o:OP})),PP=onlyOAS3((()=>s=>s.getSystem().specSelectors.specJson().hasIn(["servers",0]))),IP=onlyOAS3(Ut(Ns,(s=>s.getIn(["components","securitySchemes"])||null))),wrap_selectors_validOperationMethods=(s,o)=>(i,...a)=>o.specSelectors.isOAS3()?o.oas3Selectors.validOperationMethods():s(...a),TP=AP,NP=AP,MP=AP,RP=AP,DP=AP;const LP=function wrap_selectors_onlyOAS3(s){return(o,i)=>(...a)=>{if(i.getSystem().specSelectors.isOAS3()){let o=i.getState().getIn(["spec","resolvedSubtrees","components","securitySchemes"]);return s(i,o,...a)}return o(...a)}}(Ut((s=>s),(({specSelectors:s})=>s.securityDefinitions()),((s,o)=>{let i=(0,ze.List)();return o?(o.entrySeq().forEach((([s,o])=>{const a=o?.get("type");if("oauth2"===a&&o.get("flows").entrySeq().forEach((([a,u])=>{let _=(0,ze.fromJS)({flow:a,authorizationUrl:u.get("authorizationUrl"),tokenUrl:u.get("tokenUrl"),scopes:u.get("scopes"),type:o.get("type"),description:o.get("description")});i=i.push(new ze.Map({[s]:_.filter((s=>void 0!==s))}))})),"http"!==a&&"apiKey"!==a||(i=i.push(new ze.Map({[s]:o}))),"openIdConnect"===a&&o.get("openIdConnectData")){let a=o.get("openIdConnectData");(a.get("grant_types_supported")||["authorization_code","implicit"]).forEach((u=>{let _=a.get("scopes_supported")&&a.get("scopes_supported").reduce(((s,o)=>s.set(o,"")),new ze.Map),w=(0,ze.fromJS)({flow:u,authorizationUrl:a.get("authorization_endpoint"),tokenUrl:a.get("token_endpoint"),scopes:_,type:"oauth2",openIdConnectUrl:o.get("openIdConnectUrl")});i=i.push(new ze.Map({[s]:w.filter((s=>void 0!==s))}))}))}})),i):i})));function OAS3ComponentWrapFactory(s){return(o,i)=>a=>"function"==typeof i.specSelectors?.isOAS3?i.specSelectors.isOAS3()?Re.createElement(s,Mn()({},a,i,{Ori:o})):Re.createElement(o,a):(console.warn("OAS3 wrapper: couldn't get spec"),null)}const FP=(0,ze.Map)(),selectors_isSwagger2=()=>s=>function isSwagger2(s){const o=s.get("swagger");return"string"==typeof o&&"2.0"===o}(s.getSystem().specSelectors.specJson()),selectors_isOAS30=()=>s=>function isOAS30(s){const o=s.get("openapi");return"string"==typeof o&&/^3\.0\.(?:[1-9]\d*|0)$/.test(o)}(s.getSystem().specSelectors.specJson()),selectors_isOAS3=()=>s=>s.getSystem().specSelectors.isOAS30();function selectors_onlyOAS3(s){return(o,...i)=>a=>{if(a.specSelectors.isOAS3()){const u=s(o,...i);return"function"==typeof u?u(a):u}return null}}const BP=selectors_onlyOAS3((()=>s=>s.specSelectors.specJson().get("servers",FP))),findSchema=(s,o)=>{const i=s.getIn(["resolvedSubtrees","components","schemas",o],null),a=s.getIn(["json","components","schemas",o],null);return i||a||null},$P=selectors_onlyOAS3(((s,{callbacks:o,specPath:i})=>s=>{const a=s.specSelectors.validOperationMethods();return ze.Map.isMap(o)?o.reduce(((s,o,u)=>{if(!ze.Map.isMap(o))return s;const _=o.reduce(((s,o,_)=>{if(!ze.Map.isMap(o))return s;const w=o.entrySeq().filter((([s])=>a.includes(s))).map((([s,o])=>({operation:(0,ze.Map)({operation:o}),method:s,path:_,callbackName:u,specPath:i.concat([u,_,s])})));return s.concat(w)}),(0,ze.List)());return s.concat(_)}),(0,ze.List)()).groupBy((s=>s.callbackName)).map((s=>s.toArray())).toObject():{}})),callbacks=({callbacks:s,specPath:o,specSelectors:i,getComponent:a})=>{const u=i.callbacksOperations({callbacks:s,specPath:o}),_=Object.keys(u),w=a("OperationContainer",!0);return 0===_.length?Re.createElement("span",null,"No callbacks"):Re.createElement("div",null,_.map((s=>Re.createElement("div",{key:`${s}`},Re.createElement("h2",null,s),u[s].map((o=>Re.createElement(w,{key:`${s}-${o.path}-${o.method}`,op:o.operation,tag:"callbacks",method:o.method,path:o.path,specPath:o.specPath,allowTryItOut:!1})))))))},getDefaultRequestBodyValue=(s,o,i,a)=>{const u=s.getIn(["content",o])??(0,ze.OrderedMap)(),_=u.get("schema",(0,ze.OrderedMap)()).toJS(),w=void 0!==u.get("examples"),x=u.get("example"),C=w?u.getIn(["examples",i,"value"]):x;return stringify(a.getSampleSchema(_,o,{includeWriteOnly:!0},C))},components_request_body=({userHasEditedBody:s,requestBody:o,requestBodyValue:i,requestBodyInclusionSetting:a,requestBodyErrors:u,getComponent:_,getConfigs:w,specSelectors:x,fn:C,contentType:j,isExecute:L,specPath:B,onChange:$,onChangeIncludeEmpty:U,activeExamplesKey:V,updateActiveExamplesKey:z,setRetainRequestBodyValueFlag:Y})=>{const handleFile=s=>{$(s.target.files[0])},setIsIncludedOptions=s=>{let o={key:s,shouldDispatchInit:!1,defaultValue:!0};return"no value"===a.get(s,"no value")&&(o.shouldDispatchInit=!0),o},Z=_("Markdown",!0),ee=_("modelExample"),ie=_("RequestBodyEditor"),ae=_("HighlightCode",!0),ce=_("ExamplesSelectValueRetainer"),le=_("Example"),pe=_("ParameterIncludeEmpty"),{showCommonExtensions:de}=w(),fe=o?.get("description")??null,ye=o?.get("content")??new ze.OrderedMap;j=j||ye.keySeq().first()||"";const be=ye.get(j)??(0,ze.OrderedMap)(),_e=be.get("schema",(0,ze.OrderedMap)()),Se=be.get("examples",null),we=Se?.map(((s,i)=>{const a=s?.get("value",null);return a&&(s=s.set("value",getDefaultRequestBodyValue(o,j,i,C),a)),s}));u=ze.List.isList(u)?u:(0,ze.List)();if(C.isFileUploadIntended(be?.get("schema"),j)){const s=_("Input");return L?Re.createElement(s,{type:"file",onChange:handleFile}):Re.createElement("i",null,"Example values are not available for ",Re.createElement("code",null,j)," media types.")}if(!be.size)return null;if(C.hasSchemaType(be.get("schema"),"object")&&("application/x-www-form-urlencoded"===j||0===j.indexOf("multipart/"))&&_e.get("properties",(0,ze.OrderedMap)()).size>0){const s=_("JsonSchemaForm"),o=_("ParameterExt"),j=_e.get("properties",(0,ze.OrderedMap)());return i=ze.Map.isMap(i)?i:(0,ze.OrderedMap)(),Re.createElement("div",{className:"table-container"},fe&&Re.createElement(Z,{source:fe}),Re.createElement("table",null,Re.createElement("tbody",null,ze.Map.isMap(j)&&j.entrySeq().map((([j,V])=>{if(V.get("readOnly"))return;const z=V.get("oneOf")?.get(0)?.toJS(),Y=V.get("anyOf")?.get(0)?.toJS();V=(0,ze.fromJS)(C.mergeJsonSchema(V.toJS(),z??Y??{}));let ie=de?getCommonExtensions(V):null;const ae=_e.get("required",(0,ze.List)()).includes(j),ce=C.getSchemaObjectType(V),le=C.getSchemaObjectTypeLabel(V),fe=C.getSchemaObjectType(V?.get("items")),ye=V.get("format"),be=V.get("description"),Se=i.getIn([j,"value"]),we=i.getIn([j,"errors"])||u,xe=a.get(j)||!1;let Pe=C.getSampleSchema(V,!1,{includeWriteOnly:!0});!1===Pe&&(Pe="false"),0===Pe&&(Pe="0"),"string"!=typeof Pe&&"object"===ce&&(Pe=stringify(Pe)),"string"==typeof Pe&&"array"===ce&&(Pe=JSON.parse(Pe));const Te=C.isFileUploadIntended(V),$e=Re.createElement(s,{fn:C,dispatchInitialValue:!Te,schema:V,description:j,getComponent:_,value:void 0===Se?Pe:Se,required:ae,errors:we,onChange:s=>{$(s,[j])}});return Re.createElement("tr",{key:j,className:"parameters","data-property-name":j},Re.createElement("td",{className:"parameters-col_name"},Re.createElement("div",{className:ae?"parameter__name required":"parameter__name"},j,ae?Re.createElement("span",null," *"):null),Re.createElement("div",{className:"parameter__type"},le,ye&&Re.createElement("span",{className:"prop-format"},"($",ye,")"),de&&ie.size?ie.entrySeq().map((([s,i])=>Re.createElement(o,{key:`${s}-${i}`,xKey:s,xVal:i}))):null),Re.createElement("div",{className:"parameter__deprecated"},V.get("deprecated")?"deprecated":null)),Re.createElement("td",{className:"parameters-col_description"},Re.createElement(Z,{source:be}),L?Re.createElement("div",null,"object"===ce||"object"===fe?Re.createElement(ee,{getComponent:_,specPath:B.push("schema"),getConfigs:w,isExecute:L,specSelectors:x,schema:V,example:$e}):$e,ae?null:Re.createElement(pe,{onChange:s=>U(j,s),isIncluded:xe,isIncludedOptions:setIsIncludedOptions(j),isDisabled:Array.isArray(Se)?0!==Se.length:!isEmptyValue(Se)})):null))})))))}const xe=getDefaultRequestBodyValue(o,j,V,C);let Pe=null;getKnownSyntaxHighlighterLanguage(xe)&&(Pe="json");const Te=L?Re.createElement(ie,{value:i,errors:u,defaultValue:xe,onChange:$,getComponent:_}):Re.createElement(ae,{className:"body-param__example",language:Pe},stringify(i)||xe);return Re.createElement("div",null,fe&&Re.createElement(Z,{source:fe}),we?Re.createElement(ce,{userHasEditedBody:s,examples:we,currentKey:V,currentUserInputValue:i,onSelect:s=>{z(s)},updateValue:$,defaultToFirstExample:!0,getComponent:_,setRetainRequestBodyValueFlag:Y}):null,Re.createElement(ee,{getComponent:_,getConfigs:w,specSelectors:x,expandDepth:1,isExecute:L,schema:be.get("schema"),specPath:B.push("content",j,"schema"),example:Te,includeWriteOnly:!0}),we?Re.createElement(le,{example:we.get(V),getComponent:_,getConfigs:w}):null)};class operation_link_OperationLink extends Re.Component{render(){const{link:s,name:o,getComponent:i}=this.props,a=i("Markdown",!0);let u=s.get("operationId")||s.get("operationRef"),_=s.get("parameters")&&s.get("parameters").toJS(),w=s.get("description");return Re.createElement("div",{className:"operation-link"},Re.createElement("div",{className:"description"},Re.createElement("b",null,Re.createElement("code",null,o)),w?Re.createElement(a,{source:w}):null),Re.createElement("pre",null,"Operation `",u,"`",Re.createElement("br",null),Re.createElement("br",null),"Parameters ",function padString(s,o){if("string"!=typeof o)return"";return o.split("\n").map(((o,i)=>i>0?Array(s+1).join(" ")+o:o)).join("\n")}(0,JSON.stringify(_,null,2))||"{}",Re.createElement("br",null)))}}const qP=operation_link_OperationLink,components_servers=({servers:s,currentServer:o,setSelectedServer:i,setServerVariableValue:a,getServerVariable:u,getEffectiveServerValue:_})=>{const w=(s.find((s=>s.get("url")===o))||(0,ze.OrderedMap)()).get("variables")||(0,ze.OrderedMap)(),x=0!==w.size;(0,Re.useEffect)((()=>{o||i(s.first()?.get("url"))}),[]),(0,Re.useEffect)((()=>{const u=s.find((s=>s.get("url")===o));if(!u)return void i(s.first().get("url"));(u.get("variables")||(0,ze.OrderedMap)()).map(((s,i)=>{a({server:o,key:i,val:s.get("default")||""})}))}),[o,s]);const C=(0,Re.useCallback)((s=>{i(s.target.value)}),[i]),j=(0,Re.useCallback)((s=>{const i=s.target.getAttribute("data-variable"),u=s.target.value;a({server:o,key:i,val:u})}),[a,o]);return Re.createElement("div",{className:"servers"},Re.createElement("label",{htmlFor:"servers"},Re.createElement("select",{onChange:C,value:o,id:"servers"},s.valueSeq().map((s=>Re.createElement("option",{value:s.get("url"),key:s.get("url")},s.get("url"),s.get("description")&&` - ${s.get("description")}`))).toArray())),x&&Re.createElement("div",null,Re.createElement("div",{className:"computed-url"},"Computed URL:",Re.createElement("code",null,_(o))),Re.createElement("h4",null,"Server variables"),Re.createElement("table",null,Re.createElement("tbody",null,w.entrySeq().map((([s,i])=>Re.createElement("tr",{key:s},Re.createElement("td",null,s),Re.createElement("td",null,i.get("enum")?Re.createElement("select",{"data-variable":s,onChange:j},i.get("enum").map((i=>Re.createElement("option",{selected:i===u(o,s),key:i,value:i},i)))):Re.createElement("input",{type:"text",value:u(o,s)||"",onChange:j,"data-variable":s})))))))))};class ServersContainer extends Re.Component{render(){const{specSelectors:s,oas3Selectors:o,oas3Actions:i,getComponent:a}=this.props,u=s.servers(),_=a("Servers");return u&&u.size?Re.createElement("div",null,Re.createElement("span",{className:"servers-title"},"Servers"),Re.createElement(_,{servers:u,currentServer:o.selectedServer(),setSelectedServer:i.setSelectedServer,setServerVariableValue:i.setServerVariableValue,getServerVariable:o.serverVariableValue,getEffectiveServerValue:o.serverEffectiveValue})):null}}const UP=Function.prototype;class RequestBodyEditor extends Re.PureComponent{static defaultProps={onChange:UP,userHasEditedBody:!1};constructor(s,o){super(s,o),this.state={value:stringify(s.value)||s.defaultValue},s.onChange(s.value)}applyDefaultValue=s=>{const{onChange:o,defaultValue:i}=s||this.props;return this.setState({value:i}),o(i)};onChange=s=>{this.props.onChange(stringify(s))};onDomChange=s=>{const o=s.target.value;this.setState({value:o},(()=>this.onChange(o)))};UNSAFE_componentWillReceiveProps(s){this.props.value!==s.value&&s.value!==this.state.value&&this.setState({value:stringify(s.value)}),!s.value&&s.defaultValue&&this.state.value&&this.applyDefaultValue(s)}render(){let{getComponent:s,errors:o}=this.props,{value:i}=this.state,a=o.size>0;const u=s("TextArea");return Re.createElement("div",{className:"body-param"},Re.createElement(u,{className:Jn()("body-param__text",{invalid:a}),title:o.size?o.join(", "):"",value:i,onChange:this.onDomChange}))}}class HttpAuth extends Re.Component{constructor(s,o){super(s,o);let{name:i,schema:a}=this.props,u=this.getValue();this.state={name:i,schema:a,value:u}}getValue(){let{name:s,authorized:o}=this.props;return o&&o.getIn([s,"value"])}onChange=s=>{let{onChange:o}=this.props,{value:i,name:a}=s.target,u=Object.assign({},this.state.value);a?u[a]=i:u=i,this.setState({value:u},(()=>o(this.state)))};render(){let{schema:s,getComponent:o,errSelectors:i,name:a,authSelectors:u}=this.props;const _=o("Input"),w=o("Row"),x=o("Col"),C=o("authError"),j=o("Markdown",!0),L=o("JumpToPath",!0),B=(s.get("scheme")||"").toLowerCase(),$=u.selectAuthPath(a);let U=this.getValue(),V=i.allErrors().filter((s=>s.get("authId")===a));if("basic"===B){let o=U?U.get("username"):null;return Re.createElement("div",null,Re.createElement("h4",null,Re.createElement("code",null,a),"  (http, Basic)",Re.createElement(L,{path:$})),o&&Re.createElement("h6",null,"Authorized"),Re.createElement(w,null,Re.createElement(j,{source:s.get("description")})),Re.createElement(w,null,Re.createElement("label",{htmlFor:"auth-basic-username"},"Username:"),o?Re.createElement("code",null," ",o," "):Re.createElement(x,null,Re.createElement(_,{id:"auth-basic-username",type:"text",required:"required",name:"username","aria-label":"auth-basic-username",onChange:this.onChange,autoFocus:!0}))),Re.createElement(w,null,Re.createElement("label",{htmlFor:"auth-basic-password"},"Password:"),o?Re.createElement("code",null," ****** "):Re.createElement(x,null,Re.createElement(_,{id:"auth-basic-password",autoComplete:"new-password",name:"password",type:"password","aria-label":"auth-basic-password",onChange:this.onChange}))),V.valueSeq().map(((s,o)=>Re.createElement(C,{error:s,key:o}))))}return"bearer"===B?Re.createElement("div",null,Re.createElement("h4",null,Re.createElement("code",null,a),"  (http, Bearer)",Re.createElement(L,{path:$})),U&&Re.createElement("h6",null,"Authorized"),Re.createElement(w,null,Re.createElement(j,{source:s.get("description")})),Re.createElement(w,null,Re.createElement("label",{htmlFor:"auth-bearer-value"},"Value:"),U?Re.createElement("code",null," ****** "):Re.createElement(x,null,Re.createElement(_,{id:"auth-bearer-value",type:"text","aria-label":"auth-bearer-value",onChange:this.onChange,autoFocus:!0}))),V.valueSeq().map(((s,o)=>Re.createElement(C,{error:s,key:o})))):Re.createElement("div",null,Re.createElement("em",null,Re.createElement("b",null,a)," HTTP authentication: unsupported scheme ",`'${B}'`))}}class operation_servers_OperationServers extends Re.Component{setSelectedServer=s=>{const{path:o,method:i}=this.props;return this.forceUpdate(),this.props.setSelectedServer(s,`${o}:${i}`)};setServerVariableValue=s=>{const{path:o,method:i}=this.props;return this.forceUpdate(),this.props.setServerVariableValue({...s,namespace:`${o}:${i}`})};getSelectedServer=()=>{const{path:s,method:o}=this.props;return this.props.getSelectedServer(`${s}:${o}`)};getServerVariable=(s,o)=>{const{path:i,method:a}=this.props;return this.props.getServerVariable({namespace:`${i}:${a}`,server:s},o)};getEffectiveServerValue=s=>{const{path:o,method:i}=this.props;return this.props.getEffectiveServerValue({server:s,namespace:`${o}:${i}`})};render(){const{operationServers:s,pathServers:o,getComponent:i}=this.props;if(!s&&!o)return null;const a=i("Servers"),u=s||o,_=s?"operation":"path";return Re.createElement("div",{className:"opblock-section operation-servers"},Re.createElement("div",{className:"opblock-section-header"},Re.createElement("div",{className:"tab-header"},Re.createElement("h4",{className:"opblock-title"},"Servers"))),Re.createElement("div",{className:"opblock-description-wrapper"},Re.createElement("h4",{className:"message"},"These ",_,"-level options override the global server options."),Re.createElement(a,{servers:u,currentServer:this.getSelectedServer(),setSelectedServer:this.setSelectedServer,setServerVariableValue:this.setServerVariableValue,getServerVariable:this.getServerVariable,getEffectiveServerValue:this.getEffectiveServerValue})))}}const VP={Callbacks:callbacks,HttpAuth,RequestBody:components_request_body,Servers:components_servers,ServersContainer,RequestBodyEditor,OperationServers:operation_servers_OperationServers,operationLink:qP},zP=new Remarkable("commonmark");zP.block.ruler.enable(["table"]),zP.set({linkTarget:"_blank"});const WP=OAS3ComponentWrapFactory((({source:s,className:o="",getConfigs:i=()=>({useUnsafeMarkdown:!1})})=>{if("string"!=typeof s)return null;if(s){const{useUnsafeMarkdown:a}=i(),u=sanitizer(zP.render(s),{useUnsafeMarkdown:a});let _;return"string"==typeof u&&(_=u.trim()),Re.createElement("div",{dangerouslySetInnerHTML:{__html:_},className:Jn()(o,"renderedMarkdown")})}return null})),JP=OAS3ComponentWrapFactory((({Ori:s,...o})=>{const{schema:i,getComponent:a,errSelectors:u,authorized:_,onAuthChange:w,name:x,authSelectors:C}=o,j=a("HttpAuth");return"http"===i.get("type")?Re.createElement(j,{key:x,schema:i,name:x,errSelectors:u,authorized:_,getComponent:a,onChange:w,authSelectors:C}):Re.createElement(s,o)})),HP=OAS3ComponentWrapFactory(OnlineValidatorBadge);class ModelComponent extends Re.Component{render(){let{getConfigs:s,schema:o,Ori:i}=this.props,a=["model-box"],u=null;return!0===o.get("deprecated")&&(a.push("deprecated"),u=Re.createElement("span",{className:"model-deprecated-warning"},"Deprecated:")),Re.createElement("div",{className:a.join(" ")},u,Re.createElement(i,Mn()({},this.props,{getConfigs:s,depth:1,expandDepth:this.props.expandDepth||0})))}}const KP=OAS3ComponentWrapFactory(ModelComponent),GP=OAS3ComponentWrapFactory((({Ori:s,...o})=>{const{schema:i,getComponent:a,errors:u,onChange:_,fn:w}=o,x=w.isFileUploadIntended(i),C=a("Input");return x?Re.createElement(C,{type:"file",className:u.length?"invalid":"",title:u.length?u:"",onChange:s=>{_(s.target.files[0])},disabled:s.isDisabled}):Re.createElement(s,o)})),YP={Markdown:WP,AuthItem:JP,OpenAPIVersion:function OAS30ComponentWrapFactory(s){return(o,i)=>a=>"function"==typeof i.specSelectors?.isOAS30?i.specSelectors.isOAS30()?Re.createElement(s,Mn()({},a,i,{Ori:o})):Re.createElement(o,a):(console.warn("OAS30 wrapper: couldn't get spec"),null)}((s=>{const{Ori:o}=s;return Re.createElement(o,{oasVersion:"3.0"})})),JsonSchema_string:GP,model:KP,onlineValidatorBadge:HP},XP="oas3_set_servers",QP="oas3_set_request_body_value",ZP="oas3_set_request_body_retain_flag",eI="oas3_set_request_body_inclusion",tI="oas3_set_active_examples_member",rI="oas3_set_request_content_type",nI="oas3_set_response_content_type",sI="oas3_set_server_variable_value",oI="oas3_set_request_body_validate_error",iI="oas3_clear_request_body_validate_error",aI="oas3_clear_request_body_value";function setSelectedServer(s,o){return{type:XP,payload:{selectedServerUrl:s,namespace:o}}}function setRequestBodyValue({value:s,pathMethod:o}){return{type:QP,payload:{value:s,pathMethod:o}}}const setRetainRequestBodyValueFlag=({value:s,pathMethod:o})=>({type:ZP,payload:{value:s,pathMethod:o}});function setRequestBodyInclusion({value:s,pathMethod:o,name:i}){return{type:eI,payload:{value:s,pathMethod:o,name:i}}}function setActiveExamplesMember({name:s,pathMethod:o,contextType:i,contextName:a}){return{type:tI,payload:{name:s,pathMethod:o,contextType:i,contextName:a}}}function setRequestContentType({value:s,pathMethod:o}){return{type:rI,payload:{value:s,pathMethod:o}}}function setResponseContentType({value:s,path:o,method:i}){return{type:nI,payload:{value:s,path:o,method:i}}}function setServerVariableValue({server:s,namespace:o,key:i,val:a}){return{type:sI,payload:{server:s,namespace:o,key:i,val:a}}}const setRequestBodyValidateError=({path:s,method:o,validationErrors:i})=>({type:oI,payload:{path:s,method:o,validationErrors:i}}),clearRequestBodyValidateError=({path:s,method:o})=>({type:iI,payload:{path:s,method:o}}),initRequestBodyValidateError=({pathMethod:s})=>({type:iI,payload:{path:s[0],method:s[1]}}),clearRequestBodyValue=({pathMethod:s})=>({type:aI,payload:{pathMethod:s}});var cI=__webpack_require__(60680),lI=__webpack_require__.n(cI);const oas3_selectors_onlyOAS3=s=>(o,...i)=>a=>{if(a.getSystem().specSelectors.isOAS3()){const u=s(o,...i);return"function"==typeof u?u(a):u}return null};const uI=oas3_selectors_onlyOAS3(((s,o)=>{const i=o?[o,"selectedServer"]:["selectedServer"];return s.getIn(i)||""})),pI=oas3_selectors_onlyOAS3(((s,o,i)=>s.getIn(["requestData",o,i,"bodyValue"])||null)),hI=oas3_selectors_onlyOAS3(((s,o,i)=>s.getIn(["requestData",o,i,"retainBodyValue"])||!1)),selectDefaultRequestBodyValue=(s,o,i)=>s=>{const{oas3Selectors:a,specSelectors:u,fn:_}=s.getSystem();if(u.isOAS3()){const s=a.requestContentType(o,i);if(s)return getDefaultRequestBodyValue(u.specResolvedSubtree(["paths",o,i,"requestBody"]),s,a.activeExamplesMember(o,i,"requestBody","requestBody"),_)}return null},dI=oas3_selectors_onlyOAS3(((s,o,i)=>s=>{const{oas3Selectors:a,specSelectors:u,fn:_}=s;let w=!1;const x=a.requestContentType(o,i);let C=a.requestBodyValue(o,i);const j=u.specResolvedSubtree(["paths",o,i,"requestBody"]);if(!j)return!1;if(ze.Map.isMap(C)&&(C=stringify(C.mapEntries((s=>ze.Map.isMap(s[1])?[s[0],s[1].get("value")]:s)).toJS())),ze.List.isList(C)&&(C=stringify(C)),x){const s=getDefaultRequestBodyValue(j,x,a.activeExamplesMember(o,i,"requestBody","requestBody"),_);w=!!C&&C!==s}return w})),fI=oas3_selectors_onlyOAS3(((s,o,i)=>s.getIn(["requestData",o,i,"bodyInclusion"])||(0,ze.Map)())),mI=oas3_selectors_onlyOAS3(((s,o,i)=>s.getIn(["requestData",o,i,"errors"])||null)),gI=oas3_selectors_onlyOAS3(((s,o,i,a,u)=>s.getIn(["examples",o,i,a,u,"activeExample"])||null)),yI=oas3_selectors_onlyOAS3(((s,o,i)=>s.getIn(["requestData",o,i,"requestContentType"])||null)),vI=oas3_selectors_onlyOAS3(((s,o,i)=>s.getIn(["requestData",o,i,"responseContentType"])||null)),bI=oas3_selectors_onlyOAS3(((s,o,i)=>{let a;if("string"!=typeof o){const{server:s,namespace:u}=o;a=u?[u,"serverVariableValues",s,i]:["serverVariableValues",s,i]}else{a=["serverVariableValues",o,i]}return s.getIn(a)||null})),_I=oas3_selectors_onlyOAS3(((s,o)=>{let i;if("string"!=typeof o){const{server:s,namespace:a}=o;i=a?[a,"serverVariableValues",s]:["serverVariableValues",s]}else{i=["serverVariableValues",o]}return s.getIn(i)||(0,ze.OrderedMap)()})),SI=oas3_selectors_onlyOAS3(((s,o)=>{var i,a;if("string"!=typeof o){const{server:u,namespace:_}=o;a=u,i=_?s.getIn([_,"serverVariableValues",a]):s.getIn(["serverVariableValues",a])}else a=o,i=s.getIn(["serverVariableValues",a]);i=i||(0,ze.OrderedMap)();let u=a;return i.map(((s,o)=>{u=u.replace(new RegExp(`{${lI()(o)}}`,"g"),s)})),u})),EI=function validateRequestBodyIsRequired(s){return(...o)=>i=>{const a=i.getSystem().specSelectors.specJson();let u=[...o][1]||[];return!a.getIn(["paths",...u,"requestBody","required"])||s(...o)}}(((s,o)=>((s,o)=>(o=o||[],!!s.getIn(["requestData",...o,"bodyValue"])))(s,o))),validateShallowRequired=(s,{oas3RequiredRequestBodyContentType:o,oas3RequestContentType:i,oas3RequestBodyValue:a})=>{let u=[];if(!ze.Map.isMap(a))return u;let _=[];return Object.keys(o.requestContentType).forEach((s=>{if(s===i){o.requestContentType[s].forEach((s=>{_.indexOf(s)<0&&_.push(s)}))}})),_.forEach((s=>{a.getIn([s,"value"])||u.push(s)})),u},wI=xs()(["get","put","post","delete","options","head","patch","trace"]),xI={[XP]:(s,{payload:{selectedServerUrl:o,namespace:i}})=>{const a=i?[i,"selectedServer"]:["selectedServer"];return s.setIn(a,o)},[QP]:(s,{payload:{value:o,pathMethod:i}})=>{let[a,u]=i;if(!ze.Map.isMap(o))return s.setIn(["requestData",a,u,"bodyValue"],o);let _=s.getIn(["requestData",a,u,"bodyValue"])||(0,ze.Map)();ze.Map.isMap(_)||(_=(0,ze.Map)());let w=_;const[...x]=o.keys();return x.forEach((s=>{let i=o.getIn([s]);w.has(s)&&ze.Map.isMap(i)||(w=w.setIn([s,"value"],i))})),s.setIn(["requestData",a,u,"bodyValue"],w)},[ZP]:(s,{payload:{value:o,pathMethod:i}})=>{let[a,u]=i;return s.setIn(["requestData",a,u,"retainBodyValue"],o)},[eI]:(s,{payload:{value:o,pathMethod:i,name:a}})=>{let[u,_]=i;return s.setIn(["requestData",u,_,"bodyInclusion",a],o)},[tI]:(s,{payload:{name:o,pathMethod:i,contextType:a,contextName:u}})=>{let[_,w]=i;return s.setIn(["examples",_,w,a,u,"activeExample"],o)},[rI]:(s,{payload:{value:o,pathMethod:i}})=>{let[a,u]=i;return s.setIn(["requestData",a,u,"requestContentType"],o)},[nI]:(s,{payload:{value:o,path:i,method:a}})=>s.setIn(["requestData",i,a,"responseContentType"],o),[sI]:(s,{payload:{server:o,namespace:i,key:a,val:u}})=>{const _=i?[i,"serverVariableValues",o,a]:["serverVariableValues",o,a];return s.setIn(_,u)},[oI]:(s,{payload:{path:o,method:i,validationErrors:a}})=>{let u=[];if(u.push("Required field is not provided"),a.missingBodyValue)return s.setIn(["requestData",o,i,"errors"],(0,ze.fromJS)(u));if(a.missingRequiredKeys&&a.missingRequiredKeys.length>0){const{missingRequiredKeys:_}=a;return s.updateIn(["requestData",o,i,"bodyValue"],(0,ze.fromJS)({}),(s=>_.reduce(((s,o)=>s.setIn([o,"errors"],(0,ze.fromJS)(u))),s)))}return console.warn("unexpected result: SET_REQUEST_BODY_VALIDATE_ERROR"),s},[iI]:(s,{payload:{path:o,method:i}})=>{const a=s.getIn(["requestData",o,i,"bodyValue"]);if(!ze.Map.isMap(a))return s.setIn(["requestData",o,i,"errors"],(0,ze.fromJS)([]));const[...u]=a.keys();return u?s.updateIn(["requestData",o,i,"bodyValue"],(0,ze.fromJS)({}),(s=>u.reduce(((s,o)=>s.setIn([o,"errors"],(0,ze.fromJS)([]))),s))):s},[aI]:(s,{payload:{pathMethod:o}})=>{let[i,a]=o;const u=s.getIn(["requestData",i,a,"bodyValue"]);return u?ze.Map.isMap(u)?s.setIn(["requestData",i,a,"bodyValue"],(0,ze.Map)()):s.setIn(["requestData",i,a,"bodyValue"],""):s}};function oas3({getSystem:s}){const o=(s=>(o,i=null)=>{const{getConfigs:a,fn:u}=s(),{fileUploadMediaTypes:_}=a();if("string"==typeof i&&_.some((s=>i.startsWith(s))))return!0;const w=ze.Map.isMap(o);if(!w&&!as()(o))return!1;const x=w?o.get("format"):o.format;return u.hasSchemaType(o,"string")&&["binary","byte"].includes(x)})(s);return{components:VP,wrapComponents:YP,statePlugins:{spec:{wrapSelectors:Se,selectors:xe},auth:{wrapSelectors:we},oas3:{actions:{...Pe},reducers:xI,selectors:{...Te}}},fn:{isFileUploadIntended:o,isFileUploadIntendedOAS30:o}}}const webhooks=({specSelectors:s,getComponent:o})=>{const i=s.selectWebhooksOperations();if(!i)return null;const a=Object.keys(i),u=o("OperationContainer",!0);return 0===a.length?null:Re.createElement("div",{className:"webhooks"},Re.createElement("h2",null,"Webhooks"),a.map((s=>Re.createElement("div",{key:`${s}-webhook`},i[s].map((o=>Re.createElement(u,{key:`${s}-${o.method}-webhook`,op:o.operation,tag:"webhooks",method:o.method,path:s,specPath:(0,ze.List)(o.specPath),allowTryItOut:!1})))))))},oas31_components_license=({getComponent:s,specSelectors:o})=>{const i=o.selectLicenseNameField(),a=o.selectLicenseUrl(),u=s("Link");return Re.createElement("div",{className:"info__license"},a?Re.createElement("div",{className:"info__license__url"},Re.createElement(u,{target:"_blank",href:sanitizeUrl(a)},i)):Re.createElement("span",null,i))},oas31_components_contact=({getComponent:s,specSelectors:o})=>{const i=o.selectContactNameField(),a=o.selectContactUrl(),u=o.selectContactEmailField(),_=s("Link");return Re.createElement("div",{className:"info__contact"},a&&Re.createElement("div",null,Re.createElement(_,{href:sanitizeUrl(a),target:"_blank"},i," - Website")),u&&Re.createElement(_,{href:sanitizeUrl(`mailto:${u}`)},a?`Send email to ${i}`:`Contact ${i}`))},oas31_components_info=({getComponent:s,specSelectors:o})=>{const i=o.version(),a=o.url(),u=o.basePath(),_=o.host(),w=o.selectInfoSummaryField(),x=o.selectInfoDescriptionField(),C=o.selectInfoTitleField(),j=o.selectInfoTermsOfServiceUrl(),L=o.selectExternalDocsUrl(),B=o.selectExternalDocsDescriptionField(),$=o.contact(),U=o.license(),V=s("Markdown",!0),z=s("Link"),Y=s("VersionStamp"),Z=s("OpenAPIVersion"),ee=s("InfoUrl"),ie=s("InfoBasePath"),ae=s("License",!0),ce=s("Contact",!0),le=s("JsonSchemaDialect",!0);return Re.createElement("div",{className:"info"},Re.createElement("hgroup",{className:"main"},Re.createElement("h1",{className:"title"},C,Re.createElement("span",null,i&&Re.createElement(Y,{version:i}),Re.createElement(Z,{oasVersion:"3.1"}))),(_||u)&&Re.createElement(ie,{host:_,basePath:u}),a&&Re.createElement(ee,{getComponent:s,url:a})),w&&Re.createElement("p",{className:"info__summary"},w),Re.createElement("div",{className:"info__description description"},Re.createElement(V,{source:x})),j&&Re.createElement("div",{className:"info__tos"},Re.createElement(z,{target:"_blank",href:sanitizeUrl(j)},"Terms of service")),$.size>0&&Re.createElement(ce,null),U.size>0&&Re.createElement(ae,null),L&&Re.createElement(z,{className:"info__extdocs",target:"_blank",href:sanitizeUrl(L)},B||L),Re.createElement(le,null))},json_schema_dialect=({getComponent:s,specSelectors:o})=>{const i=o.selectJsonSchemaDialectField(),a=o.selectJsonSchemaDialectDefault(),u=s("Link");return Re.createElement(Re.Fragment,null,i&&i===a&&Re.createElement("p",{className:"info__jsonschemadialect"},"JSON Schema dialect:"," ",Re.createElement(u,{target:"_blank",href:sanitizeUrl(i)},i)),i&&i!==a&&Re.createElement("div",{className:"error-wrapper"},Re.createElement("div",{className:"no-margin"},Re.createElement("div",{className:"errors"},Re.createElement("div",{className:"errors-wrapper"},Re.createElement("h4",{className:"center"},"Warning"),Re.createElement("p",{className:"message"},Re.createElement("strong",null,"OpenAPI.jsonSchemaDialect")," field contains a value different from the default value of"," ",Re.createElement(u,{target:"_blank",href:a},a),". Values different from the default one are currently not supported. Please either omit the field or provide it with the default value."))))))},version_pragma_filter=({bypass:s,isSwagger2:o,isOAS3:i,isOAS31:a,alsoShow:u,children:_})=>s?Re.createElement("div",null,_):o&&(i||a)?Re.createElement("div",{className:"version-pragma"},u,Re.createElement("div",{className:"version-pragma__message version-pragma__message--ambiguous"},Re.createElement("div",null,Re.createElement("h3",null,"Unable to render this definition"),Re.createElement("p",null,Re.createElement("code",null,"swagger")," and ",Re.createElement("code",null,"openapi")," fields cannot be present in the same Swagger or OpenAPI definition. Please remove one of the fields."),Re.createElement("p",null,"Supported version fields are ",Re.createElement("code",null,'swagger: "2.0"')," and those that match ",Re.createElement("code",null,"openapi: 3.x.y")," (for example,"," ",Re.createElement("code",null,"openapi: 3.1.0"),").")))):o||i||a?Re.createElement("div",null,_):Re.createElement("div",{className:"version-pragma"},u,Re.createElement("div",{className:"version-pragma__message version-pragma__message--missing"},Re.createElement("div",null,Re.createElement("h3",null,"Unable to render this definition"),Re.createElement("p",null,"The provided definition does not specify a valid version field."),Re.createElement("p",null,"Please indicate a valid Swagger or OpenAPI version field. Supported version fields are ",Re.createElement("code",null,'swagger: "2.0"')," and those that match ",Re.createElement("code",null,"openapi: 3.x.y")," (for example,"," ",Re.createElement("code",null,"openapi: 3.1.0"),").")))),getModelName=s=>"string"==typeof s&&s.includes("#/components/schemas/")?(s=>{const o=s.replace(/~1/g,"/").replace(/~0/g,"~");try{return decodeURIComponent(o)}catch{return o}})(s.replace(/^.*#\/components\/schemas\//,"")):null,kI=(0,Re.forwardRef)((({schema:s,getComponent:o,onToggle:i=()=>{},specPath:a},u)=>{const _=o("JSONSchema202012"),w=getModelName(s.get("$$ref")),x=(0,Re.useCallback)(((s,o)=>{i(w,o)}),[w,i]);return Re.createElement(_,{name:w,schema:s.toJS(),ref:u,onExpand:x,identifier:a.toJS().join("_")})})),OI=kI,models=({specActions:s,specSelectors:o,layoutSelectors:i,layoutActions:a,getComponent:u,getConfigs:_,fn:w})=>{const x=o.selectSchemas(),C=Object.keys(x).length>0,j=["components","schemas"],{docExpansion:L,defaultModelsExpandDepth:B}=_(),$=B>0&&"none"!==L,U=i.isShown(j,$),V=u("Collapse"),z=u("JSONSchema202012"),Y=u("ArrowUpIcon"),Z=u("ArrowDownIcon"),{getTitle:ee}=w.jsonSchema202012.useFn();(0,Re.useEffect)((()=>{const a=Object.entries(x).some((([s])=>i.isShown([...j,s],!1))),u=U&&(B>1||a),_=null!=o.specResolvedSubtree(j);u&&!_&&s.requestResolvedSubtree(j)}),[U,B]);const ie=(0,Re.useCallback)((()=>{a.show(j,!U)}),[U]),ae=(0,Re.useCallback)((s=>{null!==s&&a.readyToScroll(j,s)}),[]),handleJSONSchema202012Ref=s=>o=>{null!==o&&a.readyToScroll([...j,s],o)},handleJSONSchema202012Expand=i=>(u,_)=>{const w=[...j,i];if(_){null!=o.specResolvedSubtree(w)||s.requestResolvedSubtree([...j,i]),a.show(w,!0)}else a.show(w,!1)};return!C||B<0?null:Re.createElement("section",{className:Jn()("models",{"is-open":U}),ref:ae},Re.createElement("h4",null,Re.createElement("button",{"aria-expanded":U,className:"models-control",onClick:ie},Re.createElement("span",null,"Schemas"),U?Re.createElement(Y,null):Re.createElement(Z,null))),Re.createElement(V,{isOpened:U},Object.entries(x).map((([s,o])=>{const i=ee(o,{lookup:"basic"})||s;return Re.createElement(z,{key:s,ref:handleJSONSchema202012Ref(s),schema:o,name:i,onExpand:handleJSONSchema202012Expand(s)})}))))},mutual_tls_auth=({schema:s,getComponent:o,name:i,authSelectors:a})=>{const u=o("JumpToPath",!0),_=a.selectAuthPath(i);return Re.createElement("div",null,Re.createElement("h4",null,i," (mutualTLS) ",Re.createElement(u,{path:_})),Re.createElement("p",null,"Mutual TLS is required by this API/Operation. Certificates are managed via your Operating System and/or your browser."),Re.createElement("p",null,s.get("description")))};class auths_Auths extends Re.Component{constructor(s,o){super(s,o),this.state={}}onAuthChange=s=>{let{name:o}=s;this.setState({[o]:s})};submitAuth=s=>{s.preventDefault();let{authActions:o}=this.props;o.authorizeWithPersistOption(this.state)};logoutClick=s=>{s.preventDefault();let{authActions:o,definitions:i}=this.props,a=i.map(((s,o)=>o)).toArray();this.setState(a.reduce(((s,o)=>(s[o]="",s)),{})),o.logoutWithPersistOption(a)};close=s=>{s.preventDefault();let{authActions:o}=this.props;o.showDefinitions(!1)};render(){let{definitions:s,getComponent:o,authSelectors:i,errSelectors:a}=this.props;const u=o("AuthItem"),_=o("oauth2",!0),w=o("Button"),x=i.authorized(),C=s.filter(((s,o)=>!!x.get(o))),j=s.filter((s=>"oauth2"!==s.get("type")&&"mutualTLS"!==s.get("type"))),L=s.filter((s=>"oauth2"===s.get("type"))),B=s.filter((s=>"mutualTLS"===s.get("type")));return Re.createElement("div",{className:"auth-container"},j.size>0&&Re.createElement("form",{onSubmit:this.submitAuth},j.map(((s,_)=>Re.createElement(u,{key:_,schema:s,name:_,getComponent:o,onAuthChange:this.onAuthChange,authorized:x,errSelectors:a,authSelectors:i}))).toArray(),Re.createElement("div",{className:"auth-btn-wrapper"},j.size===C.size?Re.createElement(w,{className:"btn modal-btn auth",onClick:this.logoutClick,"aria-label":"Remove authorization"},"Logout"):Re.createElement(w,{type:"submit",className:"btn modal-btn auth authorize","aria-label":"Apply credentials"},"Authorize"),Re.createElement(w,{className:"btn modal-btn auth btn-done",onClick:this.close},"Close"))),L.size>0?Re.createElement("div",null,Re.createElement("div",{className:"scope-def"},Re.createElement("p",null,"Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes."),Re.createElement("p",null,"API requires the following scopes. Select which ones you want to grant to Swagger UI.")),s.filter((s=>"oauth2"===s.get("type"))).map(((s,o)=>Re.createElement("div",{key:o},Re.createElement(_,{authorized:x,schema:s,name:o})))).toArray()):null,B.size>0&&Re.createElement("div",null,B.map(((s,_)=>Re.createElement(u,{key:_,schema:s,name:_,getComponent:o,onAuthChange:this.onAuthChange,authorized:x,errSelectors:a,authSelectors:i}))).toArray()))}}const AI=auths_Auths,isOAS31=s=>{const o=s.get("openapi");return"string"==typeof o&&/^3\.1\.(?:[1-9]\d*|0)$/.test(o)},fn_createOnlyOAS31Selector=s=>(o,...i)=>a=>{if(a.getSystem().specSelectors.isOAS31()){const u=s(o,...i);return"function"==typeof u?u(a):u}return null},createOnlyOAS31SelectorWrapper=s=>(o,i)=>(a,...u)=>{if(i.getSystem().specSelectors.isOAS31()){const _=s(a,...u);return"function"==typeof _?_(o,i):_}return o(...u)},fn_createSystemSelector=s=>(o,...i)=>a=>{const u=s(o,a,...i);return"function"==typeof u?u(a):u},createOnlyOAS31ComponentWrapper=s=>(o,i)=>a=>i.specSelectors.isOAS31()?Re.createElement(s,Mn()({},a,{originalComponent:o,getSystem:i.getSystem})):Re.createElement(o,a),wrapOAS31Fn=(s,o)=>{const{fn:i,specSelectors:a}=o;return Object.fromEntries(Object.entries(s).map((([s,o])=>{const u=i[s];return[s,(...s)=>a.isOAS31()?o(...s):"function"==typeof u?u(...s):void 0]})))},CI=createOnlyOAS31ComponentWrapper((({getSystem:s})=>{const o=s().getComponent("OAS31License",!0);return Re.createElement(o,null)})),jI=createOnlyOAS31ComponentWrapper((({getSystem:s})=>{const o=s().getComponent("OAS31Contact",!0);return Re.createElement(o,null)})),PI=createOnlyOAS31ComponentWrapper((({getSystem:s})=>{const o=s().getComponent("OAS31Info",!0);return Re.createElement(o,null)})),getProperties=(s,{includeReadOnly:o,includeWriteOnly:i})=>{if(!s?.properties)return{};const a=Object.entries(s.properties).filter((([,s])=>(!(!0===s?.readOnly)||o)&&(!(!0===s?.writeOnly)||i)));return Object.fromEntries(a)},makeGetSchemaKeywords=s=>{if("function"!=typeof s)return null;const o=s();return()=>[...o,"discriminator","xml","externalDocs","example","$$ref"]},II=createOnlyOAS31ComponentWrapper((({getSystem:s,...o})=>{const i=s(),{getComponent:a,fn:u,getConfigs:_}=i,w=_(),x=a("OAS31Model"),C=a("withJSONSchema202012SystemContext");return II.ModelWithJSONSchemaContext??=C(x,{config:{default$schema:"https://spec.openapis.org/oas/3.1/dialect/base",defaultExpandedLevels:w.defaultModelExpandDepth,includeReadOnly:o.includeReadOnly,includeWriteOnly:o.includeWriteOnly},fn:{getProperties:u.jsonSchema202012.getProperties,isExpandable:u.jsonSchema202012.isExpandable,getSchemaKeywords:makeGetSchemaKeywords(u.jsonSchema202012.getSchemaKeywords)}}),Re.createElement(II.ModelWithJSONSchemaContext,o)})),TI=II,NI=createOnlyOAS31ComponentWrapper((({getSystem:s})=>{const{getComponent:o,fn:i,getConfigs:a}=s(),u=a();if(NI.ModelsWithJSONSchemaContext)return Re.createElement(NI.ModelsWithJSONSchemaContext,null);const _=o("OAS31Models",!0),w=o("withJSONSchema202012SystemContext");return NI.ModelsWithJSONSchemaContext??=w(_,{config:{default$schema:"https://spec.openapis.org/oas/3.1/dialect/base",defaultExpandedLevels:u.defaultModelsExpandDepth-1,includeReadOnly:!0,includeWriteOnly:!0},fn:{getProperties:i.jsonSchema202012.getProperties,isExpandable:i.jsonSchema202012.isExpandable,getSchemaKeywords:makeGetSchemaKeywords(i.jsonSchema202012.getSchemaKeywords)}}),Re.createElement(NI.ModelsWithJSONSchemaContext,null)}));NI.ModelsWithJSONSchemaContext=null;const MI=NI,wrap_components_version_pragma_filter=(s,o)=>s=>{const i=o.specSelectors.isOAS31(),a=o.getComponent("OAS31VersionPragmaFilter");return Re.createElement(a,Mn()({isOAS31:i},s))},RI=createOnlyOAS31ComponentWrapper((({originalComponent:s,...o})=>{const{getComponent:i,schema:a,name:u}=o,_=i("MutualTLSAuth",!0);return"mutualTLS"===a.get("type")?Re.createElement(_,{schema:a,name:u}):Re.createElement(s,o)})),DI=RI,LI=createOnlyOAS31ComponentWrapper((({getSystem:s,...o})=>{const i=s().getComponent("OAS31Auths",!0);return Re.createElement(i,o)})),FI=(0,ze.Map)(),BI=Ut(((s,o)=>o.specSelectors.specJson()),isOAS31),selectors_webhooks=()=>s=>{const o=s.specSelectors.specJson().get("webhooks");return ze.Map.isMap(o)?o:FI},$I=Ut([(s,o)=>o.specSelectors.webhooks(),(s,o)=>o.specSelectors.validOperationMethods(),(s,o)=>o.specSelectors.specResolvedSubtree(["webhooks"])],((s,o)=>s.reduce(((s,i,a)=>{if(!ze.Map.isMap(i))return s;const u=i.entrySeq().filter((([s])=>o.includes(s))).map((([s,o])=>({operation:(0,ze.Map)({operation:o}),method:s,path:a,specPath:["webhooks",a,s]})));return s.concat(u)}),(0,ze.List)()).groupBy((s=>s.path)).map((s=>s.toArray())).toObject())),selectors_license=()=>s=>{const o=s.specSelectors.info().get("license");return ze.Map.isMap(o)?o:FI},selectLicenseNameField=()=>s=>s.specSelectors.license().get("name","License"),selectLicenseUrlField=()=>s=>s.specSelectors.license().get("url"),qI=Ut([(s,o)=>o.specSelectors.url(),(s,o)=>o.oas3Selectors.selectedServer(),(s,o)=>o.specSelectors.selectLicenseUrlField()],((s,o,i)=>{if(i)return safeBuildUrl(i,s,{selectedServer:o})})),selectLicenseIdentifierField=()=>s=>s.specSelectors.license().get("identifier"),selectors_contact=()=>s=>{const o=s.specSelectors.info().get("contact");return ze.Map.isMap(o)?o:FI},selectContactNameField=()=>s=>s.specSelectors.contact().get("name","the developer"),selectContactEmailField=()=>s=>s.specSelectors.contact().get("email"),selectContactUrlField=()=>s=>s.specSelectors.contact().get("url"),UI=Ut([(s,o)=>o.specSelectors.url(),(s,o)=>o.oas3Selectors.selectedServer(),(s,o)=>o.specSelectors.selectContactUrlField()],((s,o,i)=>{if(i)return safeBuildUrl(i,s,{selectedServer:o})})),selectInfoTitleField=()=>s=>s.specSelectors.info().get("title"),selectInfoSummaryField=()=>s=>s.specSelectors.info().get("summary"),selectInfoDescriptionField=()=>s=>s.specSelectors.info().get("description"),selectInfoTermsOfServiceField=()=>s=>s.specSelectors.info().get("termsOfService"),VI=Ut([(s,o)=>o.specSelectors.url(),(s,o)=>o.oas3Selectors.selectedServer(),(s,o)=>o.specSelectors.selectInfoTermsOfServiceField()],((s,o,i)=>{if(i)return safeBuildUrl(i,s,{selectedServer:o})})),selectExternalDocsDescriptionField=()=>s=>s.specSelectors.externalDocs().get("description"),selectExternalDocsUrlField=()=>s=>s.specSelectors.externalDocs().get("url"),zI=Ut([(s,o)=>o.specSelectors.url(),(s,o)=>o.oas3Selectors.selectedServer(),(s,o)=>o.specSelectors.selectExternalDocsUrlField()],((s,o,i)=>{if(i)return safeBuildUrl(i,s,{selectedServer:o})})),selectJsonSchemaDialectField=()=>s=>s.specSelectors.specJson().get("jsonSchemaDialect"),selectJsonSchemaDialectDefault=()=>"https://spec.openapis.org/oas/3.1/dialect/base",WI=Ut(((s,o)=>o.specSelectors.definitions()),((s,o)=>o.specSelectors.specResolvedSubtree(["components","schemas"])),((s,o)=>ze.Map.isMap(s)?ze.Map.isMap(o)?Object.entries(s.toJS()).reduce(((s,[i,a])=>{const u=o.get(i);return s[i]=u?.toJS()||a,s}),{}):s.toJS():{})),wrap_selectors_isOAS3=(s,o)=>(i,...a)=>o.specSelectors.isOAS31()||s(...a),JI=createOnlyOAS31SelectorWrapper((()=>(s,o)=>o.oas31Selectors.selectLicenseUrl())),HI=createOnlyOAS31SelectorWrapper((()=>(s,o)=>{const i=o.specSelectors.securityDefinitions();let a=s();return i?(i.entrySeq().forEach((([s,o])=>{const i=o?.get("type");"mutualTLS"===i&&(a=a.push(new ze.Map({[s]:o})))})),a):a})),KI=Ut([(s,o)=>o.specSelectors.url(),(s,o)=>o.oas3Selectors.selectedServer(),(s,o)=>o.specSelectors.selectLicenseUrlField(),(s,o)=>o.specSelectors.selectLicenseIdentifierField()],((s,o,i,a)=>i?safeBuildUrl(i,s,{selectedServer:o}):a?`https://spdx.org/licenses/${a}.html`:void 0)),keywords_Example=({schema:s,getSystem:o})=>{const{fn:i,getComponent:a}=o(),{hasKeyword:u}=i.jsonSchema202012.useFn(),_=a("JSONSchema202012JSONViewer");return u(s,"example")?Re.createElement(_,{name:"Example",value:s.example,className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--example"}):null},keywords_Xml=({schema:s,getSystem:o})=>{const i=s?.xml||{},{fn:a,getComponent:u,getConfigs:_}=o(),{showExtensions:w}=_(),{useComponent:x,useIsExpanded:C,usePath:j,useLevel:L}=a.jsonSchema202012,{path:B}=j("xml"),{isExpanded:$,setExpanded:U,setCollapsed:V}=C("xml"),[z,Y]=L(),Z=w?getExtensions(i):[],ee=!!(i.name||i.namespace||i.prefix||Z.length>0),ie=x("Accordion"),ae=x("ExpandDeepButton"),ce=u("OpenAPI31Extensions"),le=u("JSONSchema202012PathContext")(),pe=u("JSONSchema202012LevelContext")(),de=(0,Re.useCallback)((()=>{$?V():U()}),[$,U,V]),fe=(0,Re.useCallback)(((s,o)=>{o?U({deep:!0}):V({deep:!0})}),[U,V]);return 0===Object.keys(i).length?null:Re.createElement(le.Provider,{value:B},Re.createElement(pe.Provider,{value:Y},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--xml","data-json-schema-level":z},ee?Re.createElement(Re.Fragment,null,Re.createElement(ie,{expanded:$,onChange:de},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"XML")),Re.createElement(ae,{expanded:$,onClick:fe})):Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"XML"),!0===i.attribute&&Re.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--muted"},"attribute"),!0===i.wrapped&&Re.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--muted"},"wrapped"),Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!$})},$&&Re.createElement(Re.Fragment,null,i.name&&Re.createElement("li",{className:"json-schema-2020-12-property"},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"name"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},i.name))),i.namespace&&Re.createElement("li",{className:"json-schema-2020-12-property"},Re.createElement("div",{className:"json-schema-2020-12-keyword"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"namespace"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},i.namespace))),i.prefix&&Re.createElement("li",{className:"json-schema-2020-12-property"},Re.createElement("div",{className:"json-schema-2020-12-keyword"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"prefix"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},i.prefix)))),Z.length>0&&Re.createElement(ce,{openAPISpecObj:i,openAPIExtensions:Z,getSystem:o})))))},Discriminator_DiscriminatorMapping=({discriminator:s})=>{const o=s?.mapping||{};return 0===Object.keys(o).length?null:Object.entries(o).map((([s,o])=>Re.createElement("div",{key:`${s}-${o}`,className:"json-schema-2020-12-keyword"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},s),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},o))))},keywords_Discriminator_Discriminator=({schema:s,getSystem:o})=>{const i=s?.discriminator||{},{fn:a,getComponent:u,getConfigs:_}=o(),{showExtensions:w}=_(),{useComponent:x,useIsExpanded:C,usePath:j,useLevel:L}=a.jsonSchema202012,B="discriminator",{path:$}=j(B),{isExpanded:U,setExpanded:V,setCollapsed:z}=C(B),[Y,Z]=L(),ee=w?getExtensions(i):[],ie=!!(i.mapping||ee.length>0),ae=x("Accordion"),ce=x("ExpandDeepButton"),le=u("OpenAPI31Extensions"),pe=u("JSONSchema202012PathContext")(),de=u("JSONSchema202012LevelContext")(),fe=(0,Re.useCallback)((()=>{U?z():V()}),[U,V,z]),ye=(0,Re.useCallback)(((s,o)=>{o?V({deep:!0}):z({deep:!0})}),[V,z]);return 0===Object.keys(i).length?null:Re.createElement(pe.Provider,{value:$},Re.createElement(de.Provider,{value:Z},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--discriminator","data-json-schema-level":Y},ie?Re.createElement(Re.Fragment,null,Re.createElement(ae,{expanded:U,onChange:fe},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"Discriminator")),Re.createElement(ce,{expanded:U,onClick:ye})):Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"Discriminator"),i.propertyName&&Re.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--muted"},i.propertyName),Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!U})},U&&Re.createElement("li",{className:"json-schema-2020-12-property"},Re.createElement(Discriminator_DiscriminatorMapping,{discriminator:i})),ee.length>0&&Re.createElement(le,{openAPISpecObj:i,openAPIExtensions:ee,getSystem:o})))))},keywords_OpenAPIExtensions=({openAPISpecObj:s,getSystem:o,openAPIExtensions:i})=>{const{fn:a}=o(),{useComponent:u}=a.jsonSchema202012,_=u("JSONViewer");return i.map((o=>Re.createElement(_,{key:o,name:o,value:s[o],className:"json-schema-2020-12-json-viewer-extension-keyword"})))},keywords_ExternalDocs=({schema:s,getSystem:o})=>{const i=s?.externalDocs||{},{fn:a,getComponent:u,getConfigs:_}=o(),{showExtensions:w}=_(),{useComponent:x,useIsExpanded:C,usePath:j,useLevel:L}=a.jsonSchema202012,B="externalDocs",{path:$}=j(B),{isExpanded:U,setExpanded:V,setCollapsed:z}=C(B),[Y,Z]=L(),ee=w?getExtensions(i):[],ie=!!(i.description||i.url||ee.length>0),ae=x("Accordion"),ce=x("ExpandDeepButton"),le=u("JSONSchema202012KeywordDescription"),pe=u("Link"),de=u("OpenAPI31Extensions"),fe=u("JSONSchema202012PathContext")(),ye=u("JSONSchema202012LevelContext")(),be=(0,Re.useCallback)((()=>{U?z():V()}),[U,V,z]),_e=(0,Re.useCallback)(((s,o)=>{o?V({deep:!0}):z({deep:!0})}),[V,z]);return 0===Object.keys(i).length?null:Re.createElement(fe.Provider,{value:$},Re.createElement(ye.Provider,{value:Z},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--externalDocs","data-json-schema-level":Y},ie?Re.createElement(Re.Fragment,null,Re.createElement(ae,{expanded:U,onChange:be},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"External documentation")),Re.createElement(ce,{expanded:U,onClick:_e})):Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"External documentation"),Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!U})},U&&Re.createElement(Re.Fragment,null,i.description&&Re.createElement("li",{className:"json-schema-2020-12-property"},Re.createElement(le,{schema:i,getSystem:o})),i.url&&Re.createElement("li",{className:"json-schema-2020-12-property"},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"url"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},Re.createElement(pe,{target:"_blank",href:sanitizeUrl(i.url)},i.url))))),ee.length>0&&Re.createElement(de,{openAPISpecObj:i,openAPIExtensions:ee,getSystem:o})))))},keywords_Description=({schema:s,getSystem:o})=>{if(!s?.description)return null;const{getComponent:i}=o(),a=i("Markdown");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--description"},Re.createElement("div",{className:"json-schema-2020-12-core-keyword__value json-schema-2020-12-core-keyword__value--secondary"},Re.createElement(a,{source:s.description})))},GI=createOnlyOAS31ComponentWrapper(keywords_Description),YI=createOnlyOAS31ComponentWrapper((({schema:s,getSystem:o,originalComponent:i})=>{const{getComponent:a}=o(),u=a("JSONSchema202012KeywordDiscriminator"),_=a("JSONSchema202012KeywordXml"),w=a("JSONSchema202012KeywordExample"),x=a("JSONSchema202012KeywordExternalDocs");return Re.createElement(Re.Fragment,null,Re.createElement(i,{schema:s}),Re.createElement(u,{schema:s,getSystem:o}),Re.createElement(_,{schema:s,getSystem:o}),Re.createElement(x,{schema:s,getSystem:o}),Re.createElement(w,{schema:s,getSystem:o}))})),XI=YI,keywords_Properties=({schema:s,getSystem:o})=>{const{fn:i,getComponent:a}=o(),{useComponent:u,usePath:_}=i.jsonSchema202012,{getDependentRequired:w,getProperties:x}=i.jsonSchema202012.useFn(),C=i.jsonSchema202012.useConfig(),j=Array.isArray(s?.required)?s.required:[],{path:L}=_("properties"),B=u("JSONSchema"),$=a("JSONSchema202012PathContext")(),U=x(s,C);return 0===Object.keys(U).length?null:Re.createElement($.Provider,{value:L},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--properties"},Re.createElement("ul",null,Object.entries(U).map((([o,i])=>{const a=j.includes(o),u=w(o,s);return Re.createElement("li",{key:o,className:Jn()("json-schema-2020-12-property",{"json-schema-2020-12-property--required":a})},Re.createElement(B,{name:o,schema:i,dependentRequired:u}))})))))},QI=createOnlyOAS31ComponentWrapper(keywords_Properties);const ZI=function oas31_after_load_afterLoad({fn:s,getSystem:o}){if(s.jsonSchema202012){const i=((s,o)=>{const{fn:i}=o();if("function"!=typeof s)return null;const{hasKeyword:a}=i.jsonSchema202012;return o=>s(o)||a(o,"example")||o?.xml||o?.discriminator||o?.externalDocs})(s.jsonSchema202012.isExpandable,o);Object.assign(this.fn.jsonSchema202012,{isExpandable:i,getProperties})}if("function"==typeof s.sampleFromSchema&&s.jsonSchema202012){const i=wrapOAS31Fn({sampleFromSchema:s.jsonSchema202012.sampleFromSchema,sampleFromSchemaGeneric:s.jsonSchema202012.sampleFromSchemaGeneric,createXMLExample:s.jsonSchema202012.createXMLExample,memoizedSampleFromSchema:s.jsonSchema202012.memoizedSampleFromSchema,memoizedCreateXMLExample:s.jsonSchema202012.memoizedCreateXMLExample,getJsonSampleSchema:s.jsonSchema202012.getJsonSampleSchema,getYamlSampleSchema:s.jsonSchema202012.getYamlSampleSchema,getXmlSampleSchema:s.jsonSchema202012.getXmlSampleSchema,getSampleSchema:s.jsonSchema202012.getSampleSchema,mergeJsonSchema:s.jsonSchema202012.mergeJsonSchema,getSchemaObjectTypeLabel:o=>s.jsonSchema202012.getType(immutableToJS(o)),getSchemaObjectType:o=>s.jsonSchema202012.foldType(immutableToJS(o)?.type)},o());Object.assign(this.fn,i)}const i=(s=>(o,i=null)=>{const{fn:a}=s();if(a.isFileUploadIntendedOAS30(o,i))return!0;const u=ze.Map.isMap(o);if(!u&&!as()(o))return!1;const _=u?o.get("contentMediaType"):o.contentMediaType,w=u?o.get("contentEncoding"):o.contentEncoding;return"string"==typeof _&&""!==_||"string"==typeof w&&""!==w})(o),{isFileUploadIntended:a}=wrapOAS31Fn({isFileUploadIntended:i},o());if(this.fn.isFileUploadIntended=a,this.fn.isFileUploadIntendedOAS31=i,s.jsonSchema202012){const{hasSchemaType:i}=wrapOAS31Fn({hasSchemaType:s.jsonSchema202012.hasSchemaType},o());this.fn.hasSchemaType=i}},oas31=({fn:s})=>{const o=s.createSystemSelector||fn_createSystemSelector,i=s.createOnlyOAS31Selector||fn_createOnlyOAS31Selector;return{afterLoad:ZI,fn:{isOAS31,createSystemSelector:fn_createSystemSelector,createOnlyOAS31Selector:fn_createOnlyOAS31Selector},components:{Webhooks:webhooks,JsonSchemaDialect:json_schema_dialect,MutualTLSAuth:mutual_tls_auth,OAS31Info:oas31_components_info,OAS31License:oas31_components_license,OAS31Contact:oas31_components_contact,OAS31VersionPragmaFilter:version_pragma_filter,OAS31Model:OI,OAS31Models:models,OAS31Auths:AI,JSONSchema202012KeywordExample:keywords_Example,JSONSchema202012KeywordXml:keywords_Xml,JSONSchema202012KeywordDiscriminator:keywords_Discriminator_Discriminator,JSONSchema202012KeywordExternalDocs:keywords_ExternalDocs,OpenAPI31Extensions:keywords_OpenAPIExtensions},wrapComponents:{InfoContainer:PI,License:CI,Contact:jI,VersionPragmaFilter:wrap_components_version_pragma_filter,Model:TI,Models:MI,AuthItem:DI,auths:LI,JSONSchema202012KeywordDescription:GI,JSONSchema202012KeywordExamples:XI,JSONSchema202012KeywordProperties:QI},statePlugins:{auth:{wrapSelectors:{definitionsToAuthorize:HI}},spec:{selectors:{isOAS31:o(BI),license:selectors_license,selectLicenseNameField,selectLicenseUrlField,selectLicenseIdentifierField:i(selectLicenseIdentifierField),selectLicenseUrl:o(qI),contact:selectors_contact,selectContactNameField,selectContactEmailField,selectContactUrlField,selectContactUrl:o(UI),selectInfoTitleField,selectInfoSummaryField:i(selectInfoSummaryField),selectInfoDescriptionField,selectInfoTermsOfServiceField,selectInfoTermsOfServiceUrl:o(VI),selectExternalDocsDescriptionField,selectExternalDocsUrlField,selectExternalDocsUrl:o(zI),webhooks:i(selectors_webhooks),selectWebhooksOperations:i(o($I)),selectJsonSchemaDialectField,selectJsonSchemaDialectDefault,selectSchemas:o(WI)},wrapSelectors:{isOAS3:wrap_selectors_isOAS3,selectLicenseUrl:JI}},oas31:{selectors:{selectLicenseUrl:i(o(KI))}}}}},eT=es().object,tT=es().bool,rT=(es().oneOfType([eT,tT]),(0,Re.createContext)(null));rT.displayName="JSONSchemaContext";const nT=(0,Re.createContext)(0);nT.displayName="JSONSchemaLevelContext";const sT=(0,Re.createContext)(new Set),oT=(0,Re.createContext)([]);class JSONSchemaIsExpandedState{static Collapsed="collapsed";static Expanded="expanded";static DeeplyExpanded="deeply-expanded"}const useConfig=()=>{const{config:s}=(0,Re.useContext)(rT);return s},useComponent=s=>{const{components:o}=(0,Re.useContext)(rT);return o[s]||null},useFn=(s=void 0)=>{const{fn:o}=(0,Re.useContext)(rT);return void 0!==s?o[s]:o},useJSONSchemaContextState=()=>{const[,s]=(0,Re.useState)(null),{state:o}=(0,Re.useContext)(rT);return{state:o,setState:i=>{i(o),s({})}}},useLevel=()=>{const s=(0,Re.useContext)(nT);return[s,s+1]},usePath=s=>{const o=(0,Re.useContext)(oT),{setState:i}=useJSONSchemaContextState(),a="string"==typeof s?[...o,s]:o;return{path:a,pathMutator:(s,o={deep:!1})=>{const u=a.toString(),updateFn=o=>{o.paths[u]=s,s===JSONSchemaIsExpandedState.Collapsed&&Object.keys(o.paths).forEach((s=>{s.startsWith(u)&&o.paths[s]===JSONSchemaIsExpandedState.DeeplyExpanded&&(o.paths[s]=JSONSchemaIsExpandedState.Expanded)}))},updateDeepFn=o=>{Object.keys(o.paths).forEach((i=>{i.startsWith(u)&&(o.paths[i]=s)}))};o.deep?i(updateDeepFn):i(updateFn)}}},useIsExpanded=s=>{const[o]=useLevel(),{defaultExpandedLevels:i}=useConfig(),{path:a,pathMutator:u}=usePath(s),{path:_}=usePath(),{state:w}=useJSONSchemaContextState(),x=w.paths[a.toString()],C=w.paths[_.toString()]??w.paths[_.slice(0,-1).toString()],j=x??(i-o>0?JSONSchemaIsExpandedState.Expanded:JSONSchemaIsExpandedState.Collapsed),L=j!==JSONSchemaIsExpandedState.Collapsed;(0,Re.useEffect)((()=>{u(C===JSONSchemaIsExpandedState.DeeplyExpanded?JSONSchemaIsExpandedState.DeeplyExpanded:j)}),[C]);return{isExpanded:L,setExpanded:(0,Re.useCallback)(((s={deep:!1})=>{u(s.deep?JSONSchemaIsExpandedState.DeeplyExpanded:JSONSchemaIsExpandedState.Expanded)}),[]),setCollapsed:(0,Re.useCallback)(((s={deep:!1})=>{u(JSONSchemaIsExpandedState.Collapsed,s)}),[])}},useRenderedSchemas=(s=void 0)=>{if(void 0===s)return(0,Re.useContext)(sT);const o=(0,Re.useContext)(sT);return new Set([...o,s])},iT=(0,Re.forwardRef)((({schema:s,name:o="",dependentRequired:i=[],onExpand:a=()=>{},identifier:u=""},_)=>{const w=useFn(),x=u||s?.$id||o,{path:C}=usePath(x),{isExpanded:j,setExpanded:L,setCollapsed:B}=useIsExpanded(x),[$,U]=useLevel(),V=(()=>{const[s]=useLevel();return s>0})(),z=w.isExpandable(s)||i.length>0,Y=(s=>useRenderedSchemas().has(s))(s),Z=useRenderedSchemas(s),ee=w.stringifyConstraints(s),ie=useComponent("Accordion"),ae=useComponent("Keyword$schema"),ce=useComponent("Keyword$vocabulary"),le=useComponent("Keyword$id"),pe=useComponent("Keyword$anchor"),de=useComponent("Keyword$dynamicAnchor"),fe=useComponent("Keyword$ref"),ye=useComponent("Keyword$dynamicRef"),be=useComponent("Keyword$defs"),_e=useComponent("Keyword$comment"),Se=useComponent("KeywordAllOf"),we=useComponent("KeywordAnyOf"),xe=useComponent("KeywordOneOf"),Pe=useComponent("KeywordNot"),Te=useComponent("KeywordIf"),$e=useComponent("KeywordThen"),qe=useComponent("KeywordElse"),ze=useComponent("KeywordDependentSchemas"),We=useComponent("KeywordPrefixItems"),He=useComponent("KeywordItems"),Ye=useComponent("KeywordContains"),Xe=useComponent("KeywordProperties"),Qe=useComponent("KeywordPatternProperties"),et=useComponent("KeywordAdditionalProperties"),tt=useComponent("KeywordPropertyNames"),rt=useComponent("KeywordUnevaluatedItems"),nt=useComponent("KeywordUnevaluatedProperties"),st=useComponent("KeywordType"),ot=useComponent("KeywordEnum"),it=useComponent("KeywordConst"),at=useComponent("KeywordConstraint"),ct=useComponent("KeywordDependentRequired"),lt=useComponent("KeywordContentSchema"),ut=useComponent("KeywordTitle"),pt=useComponent("KeywordDescription"),ht=useComponent("KeywordDefault"),dt=useComponent("KeywordDeprecated"),mt=useComponent("KeywordReadOnly"),gt=useComponent("KeywordWriteOnly"),yt=useComponent("KeywordExamples"),vt=useComponent("ExtensionKeywords"),bt=useComponent("ExpandDeepButton"),_t=(0,Re.useCallback)(((s,o)=>{o?L():B(),a(s,o,!1)}),[a,L,B]),St=(0,Re.useCallback)(((s,o)=>{o?L({deep:!0}):B({deep:!0}),a(s,o,!0)}),[a,L,B]);return Re.createElement(oT.Provider,{value:C},Re.createElement(nT.Provider,{value:U},Re.createElement(sT.Provider,{value:Z},Re.createElement("article",{ref:_,"data-json-schema-level":$,className:Jn()("json-schema-2020-12",{"json-schema-2020-12--embedded":V,"json-schema-2020-12--circular":Y})},Re.createElement("div",{className:"json-schema-2020-12-head"},z&&!Y?Re.createElement(Re.Fragment,null,Re.createElement(ie,{expanded:j,onChange:_t},Re.createElement(ut,{title:o,schema:s})),Re.createElement(bt,{expanded:j,onClick:St})):Re.createElement(ut,{title:o,schema:s}),Re.createElement(dt,{schema:s}),Re.createElement(mt,{schema:s}),Re.createElement(gt,{schema:s}),Re.createElement(st,{schema:s,isCircular:Y}),ee.length>0&&ee.map((s=>Re.createElement(at,{key:`${s.scope}-${s.value}`,constraint:s})))),Re.createElement("div",{className:Jn()("json-schema-2020-12-body",{"json-schema-2020-12-body--collapsed":!j})},j&&Re.createElement(Re.Fragment,null,Re.createElement(pt,{schema:s}),!Y&&z&&Re.createElement(Re.Fragment,null,Re.createElement(Xe,{schema:s}),Re.createElement(Qe,{schema:s}),Re.createElement(et,{schema:s}),Re.createElement(nt,{schema:s}),Re.createElement(tt,{schema:s}),Re.createElement(Se,{schema:s}),Re.createElement(we,{schema:s}),Re.createElement(xe,{schema:s}),Re.createElement(Pe,{schema:s}),Re.createElement(Te,{schema:s}),Re.createElement($e,{schema:s}),Re.createElement(qe,{schema:s}),Re.createElement(ze,{schema:s}),Re.createElement(We,{schema:s}),Re.createElement(He,{schema:s}),Re.createElement(rt,{schema:s}),Re.createElement(Ye,{schema:s}),Re.createElement(lt,{schema:s})),Re.createElement(ot,{schema:s}),Re.createElement(it,{schema:s}),Re.createElement(ct,{schema:s,dependentRequired:i}),Re.createElement(ht,{schema:s}),Re.createElement(yt,{schema:s}),Re.createElement(ae,{schema:s}),Re.createElement(ce,{schema:s}),Re.createElement(le,{schema:s}),Re.createElement(pe,{schema:s}),Re.createElement(de,{schema:s}),Re.createElement(fe,{schema:s}),!Y&&z&&Re.createElement(be,{schema:s}),Re.createElement(ye,{schema:s}),Re.createElement(_e,{schema:s}),Re.createElement(vt,{schema:s})))))))})),aT=iT,keywords_$schema=({schema:s})=>s?.$schema?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$schema"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$schema"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$schema)):null,$vocabulary_$vocabulary=({schema:s})=>{const o="$vocabulary",{path:i}=usePath(o),{isExpanded:a,setExpanded:u,setCollapsed:_}=useIsExpanded(o),w=useComponent("Accordion"),x=(0,Re.useCallback)((()=>{a?_():u()}),[a,u,_]);return s?.$vocabulary?"object"!=typeof s.$vocabulary?null:Re.createElement(oT.Provider,{value:i},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$vocabulary"},Re.createElement(w,{expanded:a,onChange:x},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$vocabulary")),Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),Re.createElement("ul",null,a&&Object.entries(s.$vocabulary).map((([s,o])=>Re.createElement("li",{key:s,className:Jn()("json-schema-2020-12-$vocabulary-uri",{"json-schema-2020-12-$vocabulary-uri--disabled":!o})},Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s))))))):null},keywords_$id=({schema:s})=>s?.$id?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$id"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$id"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$id)):null,keywords_$anchor=({schema:s})=>s?.$anchor?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$anchor"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$anchor"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$anchor)):null,keywords_$dynamicAnchor=({schema:s})=>s?.$dynamicAnchor?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$dynamicAnchor"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$dynamicAnchor"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$dynamicAnchor)):null,keywords_$ref=({schema:s})=>s?.$ref?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$ref"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$ref"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$ref)):null,keywords_$dynamicRef=({schema:s})=>s?.$dynamicRef?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$dynamicRef"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$dynamicRef"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$dynamicRef)):null,keywords_$defs=({schema:s})=>{const o=s?.$defs||{},i="$defs",{path:a}=usePath(i),{isExpanded:u,setExpanded:_,setCollapsed:w}=useIsExpanded(i),[x,C]=useLevel(),j=useComponent("Accordion"),L=useComponent("ExpandDeepButton"),B=useComponent("JSONSchema"),$=(0,Re.useCallback)((()=>{u?w():_()}),[u,_,w]),U=(0,Re.useCallback)(((s,o)=>{o?_({deep:!0}):w({deep:!0})}),[_,w]);return 0===Object.keys(o).length?null:Re.createElement(oT.Provider,{value:a},Re.createElement(nT.Provider,{value:C},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$defs","data-json-schema-level":x},Re.createElement(j,{expanded:u,onChange:$},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$defs")),Re.createElement(L,{expanded:u,onClick:U}),Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!u})},u&&Re.createElement(Re.Fragment,null,Object.entries(o).map((([s,o])=>Re.createElement("li",{key:s,className:"json-schema-2020-12-property"},Re.createElement(B,{name:s,schema:o})))))))))},keywords_$comment=({schema:s})=>s?.$comment?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$comment"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$comment"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$comment)):null,keywords_AllOf=({schema:s})=>{const o=s?.allOf||[],i=useFn(),a="allOf",{path:u}=usePath(a),{isExpanded:_,setExpanded:w,setCollapsed:x}=useIsExpanded(a),[C,j]=useLevel(),L=useComponent("Accordion"),B=useComponent("ExpandDeepButton"),$=useComponent("JSONSchema"),U=useComponent("KeywordType"),V=(0,Re.useCallback)((()=>{_?x():w()}),[_,w,x]),z=(0,Re.useCallback)(((s,o)=>{o?w({deep:!0}):x({deep:!0})}),[w,x]);return Array.isArray(o)&&0!==o.length?Re.createElement(oT.Provider,{value:u},Re.createElement(nT.Provider,{value:j},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--allOf","data-json-schema-level":C},Re.createElement(L,{expanded:_,onChange:V},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"All of")),Re.createElement(B,{expanded:_,onClick:z}),Re.createElement(U,{schema:{allOf:o}}),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!_})},_&&Re.createElement(Re.Fragment,null,o.map(((s,o)=>Re.createElement("li",{key:`#${o}`,className:"json-schema-2020-12-property"},Re.createElement($,{name:`#${o} ${i.getTitle(s)}`,schema:s}))))))))):null},keywords_AnyOf=({schema:s})=>{const o=s?.anyOf||[],i=useFn(),a="anyOf",{path:u}=usePath(a),{isExpanded:_,setExpanded:w,setCollapsed:x}=useIsExpanded(a),[C,j]=useLevel(),L=useComponent("Accordion"),B=useComponent("ExpandDeepButton"),$=useComponent("JSONSchema"),U=useComponent("KeywordType"),V=(0,Re.useCallback)((()=>{_?x():w()}),[_,w,x]),z=(0,Re.useCallback)(((s,o)=>{o?w({deep:!0}):x({deep:!0})}),[w,x]);return Array.isArray(o)&&0!==o.length?Re.createElement(oT.Provider,{value:u},Re.createElement(nT.Provider,{value:j},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--anyOf","data-json-schema-level":C},Re.createElement(L,{expanded:_,onChange:V},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Any of")),Re.createElement(B,{expanded:_,onClick:z}),Re.createElement(U,{schema:{anyOf:o}}),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!_})},_&&Re.createElement(Re.Fragment,null,o.map(((s,o)=>Re.createElement("li",{key:`#${o}`,className:"json-schema-2020-12-property"},Re.createElement($,{name:`#${o} ${i.getTitle(s)}`,schema:s}))))))))):null},keywords_OneOf=({schema:s})=>{const o=s?.oneOf||[],i=useFn(),a="oneOf",{path:u}=usePath(a),{isExpanded:_,setExpanded:w,setCollapsed:x}=useIsExpanded(a),[C,j]=useLevel(),L=useComponent("Accordion"),B=useComponent("ExpandDeepButton"),$=useComponent("JSONSchema"),U=useComponent("KeywordType"),V=(0,Re.useCallback)((()=>{_?x():w()}),[_,w,x]),z=(0,Re.useCallback)(((s,o)=>{o?w({deep:!0}):x({deep:!0})}),[w,x]);return Array.isArray(o)&&0!==o.length?Re.createElement(oT.Provider,{value:u},Re.createElement(nT.Provider,{value:j},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--oneOf","data-json-schema-level":C},Re.createElement(L,{expanded:_,onChange:V},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"One of")),Re.createElement(B,{expanded:_,onClick:z}),Re.createElement(U,{schema:{oneOf:o}}),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!_})},_&&Re.createElement(Re.Fragment,null,o.map(((s,o)=>Re.createElement("li",{key:`#${o}`,className:"json-schema-2020-12-property"},Re.createElement($,{name:`#${o} ${i.getTitle(s)}`,schema:s}))))))))):null},keywords_Not=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"not"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Not");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--not"},Re.createElement(i,{name:a,schema:s.not,identifier:"not"}))},keywords_If=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"if"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"If");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--if"},Re.createElement(i,{name:a,schema:s.if,identifier:"if"}))},keywords_Then=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"then"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Then");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--then"},Re.createElement(i,{name:a,schema:s.then,identifier:"then"}))},keywords_Else=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"else"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Else");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--if"},Re.createElement(i,{name:a,schema:s.else,identifier:"else"}))},keywords_DependentSchemas=({schema:s})=>{const o=s?.dependentSchemas||[],i="dependentSchemas",{path:a}=usePath(i),{isExpanded:u,setExpanded:_,setCollapsed:w}=useIsExpanded(i),[x,C]=useLevel(),j=useComponent("Accordion"),L=useComponent("ExpandDeepButton"),B=useComponent("JSONSchema"),$=(0,Re.useCallback)((()=>{u?w():_()}),[u,_,w]),U=(0,Re.useCallback)(((s,o)=>{o?_({deep:!0}):w({deep:!0})}),[_,w]);return"object"!=typeof o||0===Object.keys(o).length?null:Re.createElement(oT.Provider,{value:a},Re.createElement(nT.Provider,{value:C},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--dependentSchemas","data-json-schema-level":x},Re.createElement(j,{expanded:u,onChange:$},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Dependent schemas")),Re.createElement(L,{expanded:u,onClick:U}),Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!u})},u&&Re.createElement(Re.Fragment,null,Object.entries(o).map((([s,o])=>Re.createElement("li",{key:s,className:"json-schema-2020-12-property"},Re.createElement(B,{name:s,schema:o})))))))))},keywords_PrefixItems=({schema:s})=>{const o=s?.prefixItems||[],i=useFn(),a="prefixItems",{path:u}=usePath(a),{isExpanded:_,setExpanded:w,setCollapsed:x}=useIsExpanded(a),[C,j]=useLevel(),L=useComponent("Accordion"),B=useComponent("ExpandDeepButton"),$=useComponent("JSONSchema"),U=useComponent("KeywordType"),V=(0,Re.useCallback)((()=>{_?x():w()}),[_,w,x]),z=(0,Re.useCallback)(((s,o)=>{o?w({deep:!0}):x({deep:!0})}),[w,x]);return Array.isArray(o)&&0!==o.length?Re.createElement(oT.Provider,{value:u},Re.createElement(nT.Provider,{value:j},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--prefixItems","data-json-schema-level":C},Re.createElement(L,{expanded:_,onChange:V},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Prefix items")),Re.createElement(B,{expanded:_,onClick:z}),Re.createElement(U,{schema:{prefixItems:o}}),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!_})},_&&Re.createElement(Re.Fragment,null,o.map(((s,o)=>Re.createElement("li",{key:`#${o}`,className:"json-schema-2020-12-property"},Re.createElement($,{name:`#${o} ${i.getTitle(s)}`,schema:s}))))))))):null},keywords_Items=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"items"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Items");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--items"},Re.createElement(i,{name:a,schema:s.items,identifier:"items"}))},keywords_Contains=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"contains"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Contains");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--contains"},Re.createElement(i,{name:a,schema:s.contains,identifier:"contains"}))},keywords_Properties_Properties=({schema:s})=>{const o=useFn(),i=s?.properties||{},a=Array.isArray(s?.required)?s.required:[],u=useComponent("JSONSchema"),{path:_}=usePath("properties");return 0===Object.keys(i).length?null:Re.createElement(oT.Provider,{value:_},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--properties"},Re.createElement("ul",null,Object.entries(i).map((([i,_])=>{const w=a.includes(i),x=o.getDependentRequired(i,s);return Re.createElement("li",{key:i,className:Jn()("json-schema-2020-12-property",{"json-schema-2020-12-property--required":w})},Re.createElement(u,{name:i,schema:_,dependentRequired:x}))})))))},PatternProperties_PatternProperties=({schema:s})=>{const o=s?.patternProperties||{},i=useComponent("JSONSchema"),{path:a}=usePath("patternProperties");return 0===Object.keys(o).length?null:Re.createElement(oT.Provider,{value:a},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--patternProperties"},Re.createElement("ul",null,Object.entries(o).map((([s,o])=>Re.createElement("li",{key:s,className:"json-schema-2020-12-property"},Re.createElement(i,{name:s,schema:o})))))))},keywords_AdditionalProperties=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"additionalProperties"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Additional properties");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--additionalProperties"},!0===s.additionalProperties?Re.createElement(Re.Fragment,null,a,Re.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"allowed")):!1===s.additionalProperties?Re.createElement(Re.Fragment,null,a,Re.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"forbidden")):Re.createElement(i,{name:a,schema:s.additionalProperties,identifier:"additionalProperties"}))},keywords_PropertyNames=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema"),a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Property names");return o.hasKeyword(s,"propertyNames")?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--propertyNames"},Re.createElement(i,{name:a,schema:s.propertyNames,identifier:"propertyNames"})):null},keywords_UnevaluatedItems=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"unevaluatedItems"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Unevaluated items");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--unevaluatedItems"},Re.createElement(i,{name:a,schema:s.unevaluatedItems,identifier:"unevaluatedItems"}))},keywords_UnevaluatedProperties=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"unevaluatedProperties"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Unevaluated properties");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--unevaluatedProperties"},Re.createElement(i,{name:a,schema:s.unevaluatedProperties,identifier:"unevaluatedProperties"}))},keywords_Type=({schema:s,isCircular:o=!1})=>{const i=useFn().getType(s),a=o?" [circular]":"";return Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},`${i}${a}`)},Enum_Enum=({schema:s})=>{const o=useComponent("JSONViewer");return Array.isArray(s?.enum)?Re.createElement(o,{name:"Enum",value:s.enum,className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--enum"}):null},Const_Const=({schema:s})=>{const o=useFn(),i=useComponent("JSONViewer");return o.hasKeyword(s,"const")?Re.createElement(i,{name:"Const",value:s.const,className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--const"}):null},fn_upperFirst=s=>"string"==typeof s?`${s.charAt(0).toUpperCase()}${s.slice(1)}`:s,makeGetTitle=s=>(o,{lookup:i="extended"}={})=>{const a=s();if(null!=o?.title)return a.upperFirst(String(o.title));if("extended"===i){if(null!=o?.$anchor)return a.upperFirst(String(o.$anchor));if(null!=o?.$id)return String(o.$id)}return""},makeGetType=s=>{const getType=(o,i=new WeakSet)=>{const a=s();if(null==o)return"any";if(a.isBooleanJSONSchema(o))return o?"any":"never";if("object"!=typeof o)return"any";if(i.has(o))return"any";i.add(o);const{type:u,prefixItems:_,items:w}=o,getArrayType=()=>{if(Array.isArray(_)){const s=_.map((s=>getType(s,i))),o=w?getType(w,i):"any";return`array<[${s.join(", ")}], ${o}>`}if(w){return`array<${getType(w,i)}>`}return"array"};if(o.not&&"any"===getType(o.not))return"never";const handleCombiningKeywords=(s,a)=>{if(Array.isArray(o[s])){return`(${o[s].map((s=>getType(s,i))).join(a)})`}return null},x=[Array.isArray(u)?u.map((s=>"array"===s?getArrayType():s)).join(" | "):"array"===u?getArrayType():["null","boolean","object","array","number","integer","string"].includes(u)?u:(()=>{if(Object.hasOwn(o,"prefixItems")||Object.hasOwn(o,"items")||Object.hasOwn(o,"contains"))return getArrayType();if(Object.hasOwn(o,"properties")||Object.hasOwn(o,"additionalProperties")||Object.hasOwn(o,"patternProperties"))return"object";if(["int32","int64"].includes(o.format))return"integer";if(["float","double"].includes(o.format))return"number";if(Object.hasOwn(o,"minimum")||Object.hasOwn(o,"maximum")||Object.hasOwn(o,"exclusiveMinimum")||Object.hasOwn(o,"exclusiveMaximum")||Object.hasOwn(o,"multipleOf"))return"number | integer";if(Object.hasOwn(o,"pattern")||Object.hasOwn(o,"format")||Object.hasOwn(o,"minLength")||Object.hasOwn(o,"maxLength")||Object.hasOwn(o,"contentEncoding")||Object.hasOwn(o,"contentMediaType"))return"string";if(void 0!==o.const){if(null===o.const)return"null";if("boolean"==typeof o.const)return"boolean";if("number"==typeof o.const)return Number.isInteger(o.const)?"integer":"number";if("string"==typeof o.const)return"string";if(Array.isArray(o.const))return"array";if("object"==typeof o.const)return"object"}return null})(),handleCombiningKeywords("oneOf"," | "),handleCombiningKeywords("anyOf"," | "),handleCombiningKeywords("allOf"," & ")].filter(Boolean).join(" | ");return i.delete(o),x||"any"};return getType},isBooleanJSONSchema=s=>"boolean"==typeof s,hasKeyword=(s,o)=>null!==s&&"object"==typeof s&&Object.hasOwn(s,o),fn_makeIsExpandable=s=>o=>{const i=s();return o?.$schema||o?.$vocabulary||o?.$id||o?.$anchor||o?.$dynamicAnchor||o?.$ref||o?.$dynamicRef||o?.$defs||o?.$comment||o?.allOf||o?.anyOf||o?.oneOf||i.hasKeyword(o,"not")||i.hasKeyword(o,"if")||i.hasKeyword(o,"then")||i.hasKeyword(o,"else")||o?.dependentSchemas||o?.prefixItems||i.hasKeyword(o,"items")||i.hasKeyword(o,"contains")||o?.properties||o?.patternProperties||i.hasKeyword(o,"additionalProperties")||i.hasKeyword(o,"propertyNames")||i.hasKeyword(o,"unevaluatedItems")||i.hasKeyword(o,"unevaluatedProperties")||o?.description||o?.enum||i.hasKeyword(o,"const")||i.hasKeyword(o,"contentSchema")||i.hasKeyword(o,"default")||o?.examples||i.getExtensionKeywords(o).length>0},fn_stringify=s=>null===s||["number","bigint","boolean"].includes(typeof s)?String(s):Array.isArray(s)?`[${s.map(fn_stringify).join(", ")}]`:JSON.stringify(s),stringifyConstraintRange=(s,o,i)=>{const a="number"==typeof o,u="number"==typeof i;return a&&u?o===i?`${o} ${s}`:`[${o}, ${i}] ${s}`:a?`≥ ${o} ${s}`:u?`≤ ${i} ${s}`:null},stringifyConstraints=s=>{const o=[],i=(s=>{if("number"!=typeof s?.multipleOf)return null;if(s.multipleOf<=0)return null;if(1===s.multipleOf)return null;const{multipleOf:o}=s;if(Number.isInteger(o))return`multiple of ${o}`;const i=10**o.toString().split(".")[1].length;return`multiple of ${o*i}/${i}`})(s);null!==i&&o.push({scope:"number",value:i});const a=(s=>{const o=s?.minimum,i=s?.maximum,a=s?.exclusiveMinimum,u=s?.exclusiveMaximum,_="number"==typeof o,w="number"==typeof i,x="number"==typeof a,C="number"==typeof u,j=x&&(!_||ou);if((_||x)&&(w||C))return`${j?"(":"["}${j?a:o}, ${L?u:i}${L?")":"]"}`;if(_||x)return`${j?">":"≥"} ${j?a:o}`;if(w||C)return`${L?"<":"≤"} ${L?u:i}`;return null})(s);null!==a&&o.push({scope:"number",value:a}),s?.format&&o.push({scope:"string",value:s.format});const u=stringifyConstraintRange("characters",s?.minLength,s?.maxLength);null!==u&&o.push({scope:"string",value:u}),s?.pattern&&o.push({scope:"string",value:`matches ${s?.pattern}`}),s?.contentMediaType&&o.push({scope:"string",value:`media type: ${s.contentMediaType}`}),s?.contentEncoding&&o.push({scope:"string",value:`encoding: ${s.contentEncoding}`});const _=stringifyConstraintRange(s?.uniqueItems?"unique items":"items",s?.minItems,s?.maxItems);null!==_&&o.push({scope:"array",value:_}),s?.uniqueItems&&!_&&o.push({scope:"array",value:"unique"});const w=stringifyConstraintRange("contained items",s?.minContains,s?.maxContains);null!==w&&o.push({scope:"array",value:w});const x=stringifyConstraintRange("properties",s?.minProperties,s?.maxProperties);return null!==x&&o.push({scope:"object",value:x}),o},getDependentRequired=(s,o)=>o?.dependentRequired?Array.from(Object.entries(o.dependentRequired).reduce(((o,[i,a])=>Array.isArray(a)&&a.includes(s)?(o.add(i),o):o),new Set)):[],fn_isPlainObject=s=>"object"==typeof s&&null!==s&&!Array.isArray(s)&&(null===Object.getPrototypeOf(s)||Object.getPrototypeOf(s)===Object.prototype),getSchemaKeywords=()=>["$schema","$vocabulary","$id","$anchor","$dynamicAnchor","$dynamicRef","$ref","$defs","$comment","allOf","anyOf","oneOf","not","if","then","else","dependentSchemas","prefixItems","items","contains","properties","patternProperties","additionalProperties","propertyNames","unevaluatedItems","unevaluatedProperties","type","enum","const","multipleOf","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","maxItems","minItems","uniqueItems","maxContains","minContains","maxProperties","minProperties","required","dependentRequired","title","description","default","deprecated","readOnly","writeOnly","examples","format","contentEncoding","contentMediaType","contentSchema"],makeGetExtensionKeywords=s=>o=>{const i=s().getSchemaKeywords();return fn_isPlainObject(o)?((s,o)=>{const i=new Set(o);return s.filter((s=>!i.has(s)))})(Object.keys(o),i):[]},fn_hasSchemaType=(s,o)=>{const i=ze.Map.isMap(s);if(!i&&!fn_isPlainObject(s))return!1;const hasType=s=>o===s||Array.isArray(o)&&o.includes(s),a=i?s.get("type"):s.type;return ze.List.isList(a)||Array.isArray(a)?a.some((s=>hasType(s))):hasType(a)},Constraint=({constraint:s})=>fn_isPlainObject(s)&&"string"==typeof s.scope&&"string"==typeof s.value?Re.createElement("span",{className:`json-schema-2020-12__constraint json-schema-2020-12__constraint--${s.scope}`},s.value):null,cT=Re.memo(Constraint),DependentRequired_DependentRequired=({dependentRequired:s})=>Array.isArray(s)&&0!==s.length?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--dependentRequired"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Required when defined"),Re.createElement("ul",null,s.map((s=>Re.createElement("li",{key:s},Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--warning"},s)))))):null,keywords_ContentSchema=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"contentSchema"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Content schema");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--contentSchema"},Re.createElement(i,{name:a,schema:s.contentSchema,identifier:"contentSchema"}))},Title_Title=({title:s="",schema:o})=>{const i=useFn(),a=s||i.getTitle(o);return a?Re.createElement("div",{className:"json-schema-2020-12__title"},a):null},keywords_Description_Description=({schema:s})=>s?.description?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--description"},Re.createElement("div",{className:"json-schema-2020-12-core-keyword__value json-schema-2020-12-core-keyword__value--secondary"},s.description)):null,Default_Default=({schema:s})=>{const o=useFn(),i=useComponent("JSONViewer");return o.hasKeyword(s,"default")?Re.createElement(i,{name:"Default",value:s.default,className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--default"}):null},keywords_Deprecated=({schema:s})=>!0!==s?.deprecated?null:Re.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--warning"},"deprecated"),keywords_ReadOnly=({schema:s})=>!0!==s?.readOnly?null:Re.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--muted"},"read-only"),keywords_WriteOnly=({schema:s})=>!0!==s?.writeOnly?null:Re.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--muted"},"write-only"),keywords_Examples_Examples=({schema:s})=>{const o=s?.examples||[],i=useComponent("JSONViewer");return Array.isArray(o)&&0!==o.length?Re.createElement(i,{name:"Examples",value:s.examples,className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--examples"}):null},ExtensionKeywords_ExtensionKeywords=({schema:s})=>{const o=useFn(),i="ExtensionKeywords",{path:a}=usePath(i),{isExpanded:u,setExpanded:_,setCollapsed:w}=useIsExpanded(i),[x,C]=useLevel(),j=useComponent("Accordion"),L=useComponent("ExpandDeepButton"),B=useComponent("JSONViewer"),{showExtensionKeywords:$}=useConfig(),U=o.getExtensionKeywords(s),V=(0,Re.useCallback)((()=>{u?w():_()}),[u,_,w]),z=(0,Re.useCallback)(((s,o)=>{o?_({deep:!0}):w({deep:!0})}),[_,w]);return $&&0!==U.length?Re.createElement(oT.Provider,{value:a},Re.createElement(nT.Provider,{value:C},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--extension-keywords","data-json-schema-level":x},Re.createElement(j,{expanded:u,onChange:V},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--extension"},"Extension Keywords")),Re.createElement(L,{expanded:u,onClick:z}),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!u})},u&&Re.createElement(Re.Fragment,null,U.map((o=>Re.createElement(B,{key:o,name:o,value:s[o],className:"json-schema-2020-12-json-viewer-extension-keyword"})))))))):null},JSONViewer=({name:s,value:o,className:i})=>{const a=useFn(),{path:u}=usePath(s),{isExpanded:_,setExpanded:w,setCollapsed:x}=useIsExpanded(s),[C,j]=useLevel(),L=useComponent("Accordion"),B=useComponent("ExpandDeepButton"),$="string"==typeof o||"number"==typeof o||"bigint"==typeof o||"boolean"==typeof o||"symbol"==typeof o||null==o,U=(s=>fn_isPlainObject(s)&&0===Object.keys(s).length)(o)||(s=>Array.isArray(s)&&0===s.length)(o),V=(0,Re.useCallback)((()=>{_?x():w()}),[_,w,x]),z=(0,Re.useCallback)(((s,o)=>{o?w({deep:!0}):x({deep:!0})}),[w,x]);return $?Re.createElement("div",{className:Jn()("json-schema-2020-12-json-viewer",i)},Re.createElement("span",{className:"json-schema-2020-12-json-viewer__name json-schema-2020-12-json-viewer__name--secondary"},s),Re.createElement("span",{className:"json-schema-2020-12-json-viewer__value json-schema-2020-12-json-viewer__value--secondary"},a.stringify(o))):U?Re.createElement("div",{className:Jn()("json-schema-2020-12-json-viewer",i)},Re.createElement("span",{className:"json-schema-2020-12-json-viewer__name json-schema-2020-12-json-viewer__name--secondary"},s),Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},Array.isArray(o)?"empty array":"empty object")):Re.createElement(oT.Provider,{value:u},Re.createElement(nT.Provider,{value:j},Re.createElement("div",{className:Jn()("json-schema-2020-12-json-viewer",i),"data-json-schema-level":C},Re.createElement(L,{expanded:_,onChange:V},Re.createElement("span",{className:"json-schema-2020-12-json-viewer__name json-schema-2020-12-json-viewer__name--secondary"},s)),Re.createElement(B,{expanded:_,onClick:z}),Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},Array.isArray(o)?"array":"object"),Re.createElement("ul",{className:Jn()("json-schema-2020-12-json-viewer__children",{"json-schema-2020-12-json-viewer__children--collapsed":!_})},_&&Re.createElement(Re.Fragment,null,Array.isArray(o)?o.map(((s,o)=>Re.createElement("li",{key:`#${o}`,className:"json-schema-2020-12-property"},Re.createElement(JSONViewer,{name:`#${o}`,value:s,className:i})))):Object.entries(o).map((([s,o])=>Re.createElement("li",{key:s,className:"json-schema-2020-12-property"},Re.createElement(JSONViewer,{name:s,value:o,className:i})))))))))},lT=JSONViewer,Accordion_Accordion=({expanded:s=!1,children:o,onChange:i})=>{const a=useComponent("ChevronRightIcon"),u=(0,Re.useCallback)((o=>{i(o,!s)}),[s,i]);return Re.createElement("button",{type:"button",className:"json-schema-2020-12-accordion",onClick:u},Re.createElement("div",{className:"json-schema-2020-12-accordion__children"},o),Re.createElement("span",{className:Jn()("json-schema-2020-12-accordion__icon",{"json-schema-2020-12-accordion__icon--expanded":s,"json-schema-2020-12-accordion__icon--collapsed":!s})},Re.createElement(a,null)))},ExpandDeepButton_ExpandDeepButton=({expanded:s,onClick:o})=>{const i=(0,Re.useCallback)((i=>{o(i,!s)}),[s,o]);return Re.createElement("button",{type:"button",className:"json-schema-2020-12-expand-deep-button",onClick:i},s?"Collapse all":"Expand all")},icons_ChevronRight=()=>Re.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},Re.createElement("path",{d:"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"})),withJSONSchemaContext=(s,o={})=>{const i={components:{JSONSchema:aT,Keyword$schema:keywords_$schema,Keyword$vocabulary:$vocabulary_$vocabulary,Keyword$id:keywords_$id,Keyword$anchor:keywords_$anchor,Keyword$dynamicAnchor:keywords_$dynamicAnchor,Keyword$ref:keywords_$ref,Keyword$dynamicRef:keywords_$dynamicRef,Keyword$defs:keywords_$defs,Keyword$comment:keywords_$comment,KeywordAllOf:keywords_AllOf,KeywordAnyOf:keywords_AnyOf,KeywordOneOf:keywords_OneOf,KeywordNot:keywords_Not,KeywordIf:keywords_If,KeywordThen:keywords_Then,KeywordElse:keywords_Else,KeywordDependentSchemas:keywords_DependentSchemas,KeywordPrefixItems:keywords_PrefixItems,KeywordItems:keywords_Items,KeywordContains:keywords_Contains,KeywordProperties:keywords_Properties_Properties,KeywordPatternProperties:PatternProperties_PatternProperties,KeywordAdditionalProperties:keywords_AdditionalProperties,KeywordPropertyNames:keywords_PropertyNames,KeywordUnevaluatedItems:keywords_UnevaluatedItems,KeywordUnevaluatedProperties:keywords_UnevaluatedProperties,KeywordType:keywords_Type,KeywordEnum:Enum_Enum,KeywordConst:Const_Const,KeywordConstraint:cT,KeywordDependentRequired:DependentRequired_DependentRequired,KeywordContentSchema:keywords_ContentSchema,KeywordTitle:Title_Title,KeywordDescription:keywords_Description_Description,KeywordDefault:Default_Default,KeywordDeprecated:keywords_Deprecated,KeywordReadOnly:keywords_ReadOnly,KeywordWriteOnly:keywords_WriteOnly,KeywordExamples:keywords_Examples_Examples,ExtensionKeywords:ExtensionKeywords_ExtensionKeywords,JSONViewer:lT,Accordion:Accordion_Accordion,ExpandDeepButton:ExpandDeepButton_ExpandDeepButton,ChevronRightIcon:icons_ChevronRight,...o.components},config:{default$schema:"https://json-schema.org/draft/2020-12/schema",defaultExpandedLevels:0,showExtensionKeywords:!0,...o.config},fn:{upperFirst:fn_upperFirst,getTitle:makeGetTitle(useFn),getType:makeGetType(useFn),isBooleanJSONSchema,hasKeyword,isExpandable:fn_makeIsExpandable(useFn),stringify:fn_stringify,stringifyConstraints,getDependentRequired,getSchemaKeywords,getExtensionKeywords:makeGetExtensionKeywords(useFn),...o.fn},state:{paths:{}}},HOC=o=>Re.createElement(rT.Provider,{value:i},Re.createElement(s,o));return HOC.contexts={JSONSchemaContext:rT},HOC.displayName=s.displayName,HOC},makeWithJSONSchemaSystemContext=({getSystem:s})=>(o,i={})=>{const{getComponent:a,getConfigs:u}=s(),_=u(),w=a("JSONSchema202012"),x=a("JSONSchema202012Keyword$schema"),C=a("JSONSchema202012Keyword$vocabulary"),j=a("JSONSchema202012Keyword$id"),L=a("JSONSchema202012Keyword$anchor"),B=a("JSONSchema202012Keyword$dynamicAnchor"),$=a("JSONSchema202012Keyword$ref"),U=a("JSONSchema202012Keyword$dynamicRef"),V=a("JSONSchema202012Keyword$defs"),z=a("JSONSchema202012Keyword$comment"),Y=a("JSONSchema202012KeywordAllOf"),Z=a("JSONSchema202012KeywordAnyOf"),ee=a("JSONSchema202012KeywordOneOf"),ie=a("JSONSchema202012KeywordNot"),ae=a("JSONSchema202012KeywordIf"),ce=a("JSONSchema202012KeywordThen"),le=a("JSONSchema202012KeywordElse"),pe=a("JSONSchema202012KeywordDependentSchemas"),de=a("JSONSchema202012KeywordPrefixItems"),fe=a("JSONSchema202012KeywordItems"),ye=a("JSONSchema202012KeywordContains"),be=a("JSONSchema202012KeywordProperties"),_e=a("JSONSchema202012KeywordPatternProperties"),Se=a("JSONSchema202012KeywordAdditionalProperties"),we=a("JSONSchema202012KeywordPropertyNames"),xe=a("JSONSchema202012KeywordUnevaluatedItems"),Pe=a("JSONSchema202012KeywordUnevaluatedProperties"),Te=a("JSONSchema202012KeywordType"),Re=a("JSONSchema202012KeywordEnum"),$e=a("JSONSchema202012KeywordConst"),qe=a("JSONSchema202012KeywordConstraint"),ze=a("JSONSchema202012KeywordDependentRequired"),We=a("JSONSchema202012KeywordContentSchema"),He=a("JSONSchema202012KeywordTitle"),Ye=a("JSONSchema202012KeywordDescription"),Xe=a("JSONSchema202012KeywordDefault"),Qe=a("JSONSchema202012KeywordDeprecated"),et=a("JSONSchema202012KeywordReadOnly"),tt=a("JSONSchema202012KeywordWriteOnly"),rt=a("JSONSchema202012KeywordExamples"),nt=a("JSONSchema202012ExtensionKeywords"),st=a("JSONSchema202012JSONViewer"),ot=a("JSONSchema202012Accordion"),it=a("JSONSchema202012ExpandDeepButton"),at=a("JSONSchema202012ChevronRightIcon");return withJSONSchemaContext(o,{components:{JSONSchema:w,Keyword$schema:x,Keyword$vocabulary:C,Keyword$id:j,Keyword$anchor:L,Keyword$dynamicAnchor:B,Keyword$ref:$,Keyword$dynamicRef:U,Keyword$defs:V,Keyword$comment:z,KeywordAllOf:Y,KeywordAnyOf:Z,KeywordOneOf:ee,KeywordNot:ie,KeywordIf:ae,KeywordThen:ce,KeywordElse:le,KeywordDependentSchemas:pe,KeywordPrefixItems:de,KeywordItems:fe,KeywordContains:ye,KeywordProperties:be,KeywordPatternProperties:_e,KeywordAdditionalProperties:Se,KeywordPropertyNames:we,KeywordUnevaluatedItems:xe,KeywordUnevaluatedProperties:Pe,KeywordType:Te,KeywordEnum:Re,KeywordConst:$e,KeywordConstraint:qe,KeywordDependentRequired:ze,KeywordContentSchema:We,KeywordTitle:He,KeywordDescription:Ye,KeywordDefault:Xe,KeywordDeprecated:Qe,KeywordReadOnly:et,KeywordWriteOnly:tt,KeywordExamples:rt,ExtensionKeywords:nt,JSONViewer:st,Accordion:ot,ExpandDeepButton:it,ChevronRightIcon:at,...i.components},config:{showExtensionKeywords:_.showExtensions,...i.config},fn:{...i.fn}})},json_schema_2020_12=({getSystem:s,fn:o})=>{const fnAccessor=()=>({upperFirst:o.upperFirst,...o.jsonSchema202012});return{components:{JSONSchema202012:aT,JSONSchema202012Keyword$schema:keywords_$schema,JSONSchema202012Keyword$vocabulary:$vocabulary_$vocabulary,JSONSchema202012Keyword$id:keywords_$id,JSONSchema202012Keyword$anchor:keywords_$anchor,JSONSchema202012Keyword$dynamicAnchor:keywords_$dynamicAnchor,JSONSchema202012Keyword$ref:keywords_$ref,JSONSchema202012Keyword$dynamicRef:keywords_$dynamicRef,JSONSchema202012Keyword$defs:keywords_$defs,JSONSchema202012Keyword$comment:keywords_$comment,JSONSchema202012KeywordAllOf:keywords_AllOf,JSONSchema202012KeywordAnyOf:keywords_AnyOf,JSONSchema202012KeywordOneOf:keywords_OneOf,JSONSchema202012KeywordNot:keywords_Not,JSONSchema202012KeywordIf:keywords_If,JSONSchema202012KeywordThen:keywords_Then,JSONSchema202012KeywordElse:keywords_Else,JSONSchema202012KeywordDependentSchemas:keywords_DependentSchemas,JSONSchema202012KeywordPrefixItems:keywords_PrefixItems,JSONSchema202012KeywordItems:keywords_Items,JSONSchema202012KeywordContains:keywords_Contains,JSONSchema202012KeywordProperties:keywords_Properties_Properties,JSONSchema202012KeywordPatternProperties:PatternProperties_PatternProperties,JSONSchema202012KeywordAdditionalProperties:keywords_AdditionalProperties,JSONSchema202012KeywordPropertyNames:keywords_PropertyNames,JSONSchema202012KeywordUnevaluatedItems:keywords_UnevaluatedItems,JSONSchema202012KeywordUnevaluatedProperties:keywords_UnevaluatedProperties,JSONSchema202012KeywordType:keywords_Type,JSONSchema202012KeywordEnum:Enum_Enum,JSONSchema202012KeywordConst:Const_Const,JSONSchema202012KeywordConstraint:cT,JSONSchema202012KeywordDependentRequired:DependentRequired_DependentRequired,JSONSchema202012KeywordContentSchema:keywords_ContentSchema,JSONSchema202012KeywordTitle:Title_Title,JSONSchema202012KeywordDescription:keywords_Description_Description,JSONSchema202012KeywordDefault:Default_Default,JSONSchema202012KeywordDeprecated:keywords_Deprecated,JSONSchema202012KeywordReadOnly:keywords_ReadOnly,JSONSchema202012KeywordWriteOnly:keywords_WriteOnly,JSONSchema202012KeywordExamples:keywords_Examples_Examples,JSONSchema202012ExtensionKeywords:ExtensionKeywords_ExtensionKeywords,JSONSchema202012JSONViewer:lT,JSONSchema202012Accordion:Accordion_Accordion,JSONSchema202012ExpandDeepButton:ExpandDeepButton_ExpandDeepButton,JSONSchema202012ChevronRightIcon:icons_ChevronRight,withJSONSchema202012Context:withJSONSchemaContext,withJSONSchema202012SystemContext:makeWithJSONSchemaSystemContext(s()),JSONSchema202012PathContext:()=>oT,JSONSchema202012LevelContext:()=>nT},fn:{upperFirst:fn_upperFirst,jsonSchema202012:{getTitle:makeGetTitle(fnAccessor),getType:makeGetType(fnAccessor),isExpandable:fn_makeIsExpandable(fnAccessor),isBooleanJSONSchema,hasKeyword,useFn,useConfig,useComponent,useIsExpanded,usePath,useLevel,getSchemaKeywords,getExtensionKeywords:makeGetExtensionKeywords(fnAccessor),hasSchemaType:fn_hasSchemaType}}}},array=(s,{sample:o=[]}={})=>((s,o={})=>{const{minItems:i,maxItems:a,uniqueItems:u}=o,{contains:_,minContains:w,maxContains:x}=o;let C=[...s];if(null!=_&&"object"==typeof _){if(Number.isInteger(w)&&w>1){const s=C.at(0);for(let o=1;o0&&(C=s.slice(0,a)),Number.isInteger(i)&&i>0)for(let s=0;C.length{throw new Error("Not implemented")},bytes=s=>xt()(s),random_pick=s=>s.at(0),predicates_isBooleanJSONSchema=s=>"boolean"==typeof s,isJSONSchemaObject=s=>as()(s),isJSONSchema=s=>predicates_isBooleanJSONSchema(s)||isJSONSchemaObject(s);const uT=class Registry{data={};register(s,o){this.data[s]=o}unregister(s){void 0===s?this.data={}:delete this.data[s]}get(s){return this.data[s]}},int32=()=>0,int64=()=>0,generators_float=()=>.1,generators_double=()=>.1,email=()=>"user@example.com",idn_email=()=>"실례@example.com",hostname=()=>"example.com",idn_hostname=()=>"실례.com",ipv4=()=>"198.51.100.42",ipv6=()=>"2001:0db8:5b96:0000:0000:426f:8e17:642a",uri=()=>"https://example.com/",uri_reference=()=>"path/index.html",iri=()=>"https://실례.com/",iri_reference=()=>"path/실례.html",uuid=()=>"3fa85f64-5717-4562-b3fc-2c963f66afa6",uri_template=()=>"https://example.com/dictionary/{term:1}/{term}",generators_json_pointer=()=>"/a/b/c",relative_json_pointer=()=>"1/0",date_time=()=>(new Date).toISOString(),date=()=>(new Date).toISOString().substring(0,10),time=()=>(new Date).toISOString().substring(11),duration=()=>"P3D",generators_password=()=>"********",regex=()=>"^[a-z]+$";const pT=new class FormatRegistry extends uT{#s={int32,int64,float:generators_float,double:generators_double,email,"idn-email":idn_email,hostname,"idn-hostname":idn_hostname,ipv4,ipv6,uri,"uri-reference":uri_reference,iri,"iri-reference":iri_reference,uuid,"uri-template":uri_template,"json-pointer":generators_json_pointer,"relative-json-pointer":relative_json_pointer,"date-time":date_time,date,time,duration,password:generators_password,regex};data={...this.#s};get defaults(){return{...this.#s}}},formatAPI=(s,o)=>"function"==typeof o?pT.register(s,o):null===o?pT.unregister(s):pT.get(s);formatAPI.getDefaults=()=>pT.defaults;const hT=formatAPI;var dT=__webpack_require__(48287).Buffer;const _7bit=s=>dT.from(s).toString("ascii");var fT=__webpack_require__(48287).Buffer;const _8bit=s=>fT.from(s).toString("utf8");var mT=__webpack_require__(48287).Buffer;const encoders_binary=s=>mT.from(s).toString("binary"),quoted_printable=s=>{let o="";for(let i=0;i=33&&a<=60||a>=62&&a<=126||9===a||32===a)o+=s.charAt(i);else if(13===a||10===a)o+="\r\n";else if(a>126){const a=unescape(encodeURIComponent(s.charAt(i)));for(let s=0;sgT.from(s).toString("hex");var yT=__webpack_require__(48287).Buffer;const base32=s=>{const o=yT.from(s).toString("utf8"),i="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";let a=0,u="",_=0,w=0;for(let s=0;s=5;)u+=i.charAt(_>>>w-5&31),w-=5;w>0&&(u+=i.charAt(_<<5-w&31),a=(8-8*o.length%5)%5);for(let s=0;svT.from(s).toString("base64");var bT=__webpack_require__(48287).Buffer;const base64url=s=>bT.from(s).toString("base64url");const _T=new class EncoderRegistry extends uT{#s={"7bit":_7bit,"8bit":_8bit,binary:encoders_binary,"quoted-printable":quoted_printable,base16,base32,base64,base64url};data={...this.#s};get defaults(){return{...this.#s}}},encoderAPI=(s,o)=>"function"==typeof o?_T.register(s,o):null===o?_T.unregister(s):_T.get(s);encoderAPI.getDefaults=()=>_T.defaults;const ST=encoderAPI,ET={"text/plain":()=>"string","text/css":()=>".selector { border: 1px solid red }","text/csv":()=>"value1,value2,value3","text/html":()=>"

    content

    ","text/calendar":()=>"BEGIN:VCALENDAR","text/javascript":()=>"console.dir('Hello world!');","text/xml":()=>'John Doe',"text/*":()=>"string"},wT={"image/*":()=>bytes(25).toString("binary")},xT={"audio/*":()=>bytes(25).toString("binary")},kT={"video/*":()=>bytes(25).toString("binary")},OT={"application/json":()=>'{"key":"value"}',"application/ld+json":()=>'{"name": "John Doe"}',"application/x-httpd-php":()=>"Hello World!

    '; ?>","application/rtf":()=>String.raw`{\rtf1\adeflang1025\ansi\ansicpg1252\uc1`,"application/x-sh":()=>'echo "Hello World!"',"application/xhtml+xml":()=>"

    content

    ","application/*":()=>bytes(25).toString("binary")};const AT=new class MediaTypeRegistry extends uT{#s={...ET,...wT,...xT,...kT,...OT};data={...this.#s};get defaults(){return{...this.#s}}},mediaTypeAPI=(s,o)=>{if("function"==typeof o)return AT.register(s,o);if(null===o)return AT.unregister(s);const i=s.split(";").at(0),a=`${i.split("/").at(0)}/*`;return AT.get(s)||AT.get(i)||AT.get(a)};mediaTypeAPI.getDefaults=()=>AT.defaults;const CT=mediaTypeAPI,applyStringConstraints=(s,o={})=>{const{maxLength:i,minLength:a}=o;let u=s;if(Number.isInteger(i)&&i>0&&(u=u.slice(0,i)),Number.isInteger(a)&&a>0){let s=0;for(;u.length{const{contentEncoding:i,contentMediaType:a,contentSchema:u}=s,{pattern:_,format:w}=s,x=ST(i)||gO();let C;return C="string"==typeof _?applyStringConstraints((s=>{try{const o=/(?<=(?{const{format:o}=s,i=hT(o);return"function"==typeof i?i(s):"string"})(s):isJSONSchema(u)&&"string"==typeof a&&void 0!==o?Array.isArray(o)||"object"==typeof o?JSON.stringify(o):applyStringConstraints(String(o),s):"string"==typeof a?(s=>{const{contentMediaType:o}=s,i=CT(o);return"function"==typeof i?i(s):"string"})(s):applyStringConstraints("string",s),x(C)},applyNumberConstraints=(s,o={})=>{const{minimum:i,maximum:a,exclusiveMinimum:u,exclusiveMaximum:_}=o,{multipleOf:w}=o,x=Number.isInteger(s)?1:Number.EPSILON;let C="number"==typeof i?i:null,j="number"==typeof a?a:null,L=s;if("number"==typeof u&&(C=null!==C?Math.max(C,u+x):u+x),"number"==typeof _&&(j=null!==j?Math.min(j,_-x):_-x),L=C>j&&s||C||j||L,"number"==typeof w&&w>0){const s=L%w;L=0===s?L:L+w-s}return L},types_number=s=>{const{format:o}=s;let i;return i="string"==typeof o?(s=>{const{format:o}=s,i=hT(o);return"function"==typeof i?i(s):0})(s):0,applyNumberConstraints(i,s)},types_integer=s=>{const{format:o}=s;let i;return i="string"==typeof o?(s=>{const{format:o}=s,i=hT(o);if("function"==typeof i)return i(s);switch(o){case"int32":return int32();case"int64":return int64()}return 0})(s):0,applyNumberConstraints(i,s)},types_boolean=s=>"boolean"!=typeof s.default||s.default,jT=new Proxy({array,object,string:types_string,number:types_number,integer:types_integer,boolean:types_boolean,null:()=>null},{get:(s,o)=>"string"==typeof o&&Object.hasOwn(s,o)?s[o]:()=>`Unknown Type: ${o}`}),PT=["array","object","number","integer","string","boolean","null"],hasExample=s=>{if(!isJSONSchemaObject(s))return!1;const{examples:o,example:i,default:a}=s;return!!(Array.isArray(o)&&o.length>=1)||(void 0!==a||void 0!==i)},extractExample=s=>{if(!isJSONSchemaObject(s))return null;const{examples:o,example:i,default:a}=s;return Array.isArray(o)&&o.length>=1?o.at(0):void 0!==a?a:void 0!==i?i:void 0},IT={array:["items","prefixItems","contains","maxContains","minContains","maxItems","minItems","uniqueItems","unevaluatedItems"],object:["properties","additionalProperties","patternProperties","propertyNames","minProperties","maxProperties","required","dependentSchemas","dependentRequired","unevaluatedProperties"],string:["pattern","format","minLength","maxLength","contentEncoding","contentMediaType","contentSchema"],integer:["minimum","maximum","exclusiveMinimum","exclusiveMaximum","multipleOf"]};IT.number=IT.integer;const TT="string",inferTypeFromValue=s=>void 0===s?null:null===s?"null":Array.isArray(s)?"array":Number.isInteger(s)?"integer":typeof s,foldType=s=>{if(Array.isArray(s)&&s.length>=1){if(s.includes("array"))return"array";if(s.includes("object"))return"object";{const o=s.filter((s=>"null"!==s)),i=random_pick(o.length>0?o:s);if(PT.includes(i))return i}}return PT.includes(s)?s:null},inferType=(s,o=new WeakSet)=>{if(!isJSONSchemaObject(s))return TT;if(o.has(s))return TT;o.add(s);let{type:i,const:a}=s;if(i=foldType(i),"string"!=typeof i){const o=Object.keys(IT);e:for(let a=0;a{if(Array.isArray(s[i])){const a=s[i].map((s=>inferType(s,o)));return foldType(a)}return null},a=combineTypes("allOf"),u=combineTypes("anyOf"),_=combineTypes("oneOf"),w=s.not?inferType(s.not,o):null;(a||u||_||w)&&(i=foldType([a,u,_,w].filter(Boolean)))}if("string"!=typeof i&&hasExample(s)){const o=extractExample(s),a=inferTypeFromValue(o);i="string"==typeof a?a:i}return o.delete(s),i||TT},type_getType=s=>inferType(s),typeCast=s=>predicates_isBooleanJSONSchema(s)?(s=>!1===s?{not:{}}:{})(s):isJSONSchemaObject(s)?s:{},merge_merge=(s,o,i={})=>{if(predicates_isBooleanJSONSchema(s)&&!0===s)return!0;if(predicates_isBooleanJSONSchema(s)&&!1===s)return!1;if(predicates_isBooleanJSONSchema(o)&&!0===o)return!0;if(predicates_isBooleanJSONSchema(o)&&!1===o)return!1;if(!isJSONSchema(s))return o;if(!isJSONSchema(o))return s;const a={...o,...s};if(o.type&&s.type&&Array.isArray(o.type)&&"string"==typeof o.type){const i=normalizeArray(o.type).concat(s.type);a.type=Array.from(new Set(i))}if(Array.isArray(o.required)&&Array.isArray(s.required)&&(a.required=[...new Set([...s.required,...o.required])]),o.properties&&s.properties){const u=new Set([...Object.keys(o.properties),...Object.keys(s.properties)]);a.properties={};for(const _ of u){const u=o.properties[_]||{},w=s.properties[_]||{};u.readOnly&&!i.includeReadOnly||u.writeOnly&&!i.includeWriteOnly?a.required=(a.required||[]).filter((s=>s!==_)):a.properties[_]=merge_merge(w,u,i)}}return isJSONSchema(o.items)&&isJSONSchema(s.items)&&(a.items=merge_merge(s.items,o.items,i)),isJSONSchema(o.contains)&&isJSONSchema(s.contains)&&(a.contains=merge_merge(s.contains,o.contains,i)),isJSONSchema(o.contentSchema)&&isJSONSchema(s.contentSchema)&&(a.contentSchema=merge_merge(s.contentSchema,o.contentSchema,i)),a},NT=merge_merge,main_sampleFromSchemaGeneric=(s,o={},i=void 0,a=!1)=>{if(null==s&&void 0===i)return;"function"==typeof s?.toJS&&(s=s.toJS()),s=typeCast(s);let u=void 0!==i||hasExample(s);const _=!u&&Array.isArray(s.oneOf)&&s.oneOf.length>0,w=!u&&Array.isArray(s.anyOf)&&s.anyOf.length>0;if(!u&&(_||w)){const i=typeCast(random_pick(_?s.oneOf:s.anyOf));!(s=NT(s,i,o)).xml&&i.xml&&(s.xml=i.xml),hasExample(s)&&hasExample(i)&&(u=!0)}const x={};let{xml:C,properties:j,additionalProperties:L,items:B,contains:$}=s||{},U=type_getType(s),{includeReadOnly:V,includeWriteOnly:z}=o;C=C||{};let Y,{name:Z,prefix:ee,namespace:ie}=C,ae={};if(Object.hasOwn(s,"type")||(s.type=U),a&&(Z=Z||"notagname",Y=(ee?`${ee}:`:"")+Z,ie)){x[ee?`xmlns:${ee}`:"xmlns"]=ie}a&&(ae[Y]=[]);const ce=objectify(j);let le,pe=0;const hasExceededMaxProperties=()=>Number.isInteger(s.maxProperties)&&s.maxProperties>0&&pe>=s.maxProperties,canAddProperty=o=>!(Number.isInteger(s.maxProperties)&&s.maxProperties>0)||!hasExceededMaxProperties()&&(!(o=>!Array.isArray(s.required)||0===s.required.length||!s.required.includes(o))(o)||s.maxProperties-pe-(()=>{if(!Array.isArray(s.required)||0===s.required.length)return 0;let o=0;return a?s.required.forEach((s=>o+=void 0===ae[s]?0:1)):s.required.forEach((s=>{o+=void 0===ae[Y]?.find((o=>void 0!==o[s]))?0:1})),s.required.length-o})()>0);if(le=a?(i,u=void 0)=>{if(s&&ce[i]){if(ce[i].xml=ce[i].xml||{},ce[i].xml.attribute){const s=Array.isArray(ce[i].enum)?random_pick(ce[i].enum):void 0;if(hasExample(ce[i]))x[ce[i].xml.name||i]=extractExample(ce[i]);else if(void 0!==s)x[ce[i].xml.name||i]=s;else{const s=typeCast(ce[i]),a=type_getType(s),_=ce[i].xml.name||i;if("array"===a){const s=main_sampleFromSchemaGeneric(ce[i],o,u,!1);x[_]=s.map((s=>as()(s)?"UnknownTypeObject":Array.isArray(s)?"UnknownTypeArray":s)).join(" ")}else x[_]="object"===a?"UnknownTypeObject":jT[a](s)}return}ce[i].xml.name=ce[i].xml.name||i}else ce[i]||!1===L||(ce[i]={xml:{name:i}});let _=main_sampleFromSchemaGeneric(ce[i],o,u,a);canAddProperty(i)&&(pe++,Array.isArray(_)?ae[Y]=ae[Y].concat(_):ae[Y].push(_))}:(i,u)=>{if(canAddProperty(i)){if(as()(s.discriminator?.mapping)&&s.discriminator.propertyName===i&&"string"==typeof s.$$ref){for(const o in s.discriminator.mapping)if(-1!==s.$$ref.search(s.discriminator.mapping[o])){ae[i]=o;break}}else ae[i]=main_sampleFromSchemaGeneric(ce[i],o,u,a);pe++}},u){let u;if(u=void 0!==i?i:extractExample(s),!a){if("number"==typeof u&&"string"===U)return`${u}`;if("string"!=typeof u||"string"===U)return u;try{return JSON.parse(u)}catch{return u}}if("array"===U){if(!Array.isArray(u)){if("string"==typeof u)return u;u=[u]}let i=[];return isJSONSchemaObject(B)&&(B.xml=B.xml||C||{},B.xml.name=B.xml.name||C.name,i=u.map((s=>main_sampleFromSchemaGeneric(B,o,s,a)))),isJSONSchemaObject($)&&($.xml=$.xml||C||{},$.xml.name=$.xml.name||C.name,i=[main_sampleFromSchemaGeneric($,o,void 0,a),...i]),i=jT.array(s,{sample:i}),C.wrapped?(ae[Y]=i,ds()(x)||ae[Y].push({_attr:x})):ae=i,ae}if("object"===U){if("string"==typeof u)return u;for(const s in u)Object.hasOwn(u,s)&&(ce[s]?.readOnly&&!V||ce[s]?.writeOnly&&!z||(ce[s]?.xml?.attribute?x[ce[s].xml.name||s]=u[s]:le(s,u[s])));return ds()(x)||ae[Y].push({_attr:x}),ae}return ae[Y]=ds()(x)?u:[{_attr:x},u],ae}if("array"===U){let i=[];if(isJSONSchemaObject($))if(a&&($.xml=$.xml||s.xml||{},$.xml.name=$.xml.name||C.name),Array.isArray($.anyOf)){const{anyOf:s,...u}=B;i.push(...$.anyOf.map((s=>main_sampleFromSchemaGeneric(NT(s,u,o),o,void 0,a))))}else if(Array.isArray($.oneOf)){const{oneOf:s,...u}=B;i.push(...$.oneOf.map((s=>main_sampleFromSchemaGeneric(NT(s,u,o),o,void 0,a))))}else{if(!(!a||a&&C.wrapped))return main_sampleFromSchemaGeneric($,o,void 0,a);i.push(main_sampleFromSchemaGeneric($,o,void 0,a))}if(isJSONSchemaObject(B))if(a&&(B.xml=B.xml||s.xml||{},B.xml.name=B.xml.name||C.name),Array.isArray(B.anyOf)){const{anyOf:s,...u}=B;i.push(...B.anyOf.map((s=>main_sampleFromSchemaGeneric(NT(s,u,o),o,void 0,a))))}else if(Array.isArray(B.oneOf)){const{oneOf:s,...u}=B;i.push(...B.oneOf.map((s=>main_sampleFromSchemaGeneric(NT(s,u,o),o,void 0,a))))}else{if(!(!a||a&&C.wrapped))return main_sampleFromSchemaGeneric(B,o,void 0,a);i.push(main_sampleFromSchemaGeneric(B,o,void 0,a))}return i=jT.array(s,{sample:i}),a&&C.wrapped?(ae[Y]=i,ds()(x)||ae[Y].push({_attr:x}),ae):i}if("object"===U){for(let s in ce)Object.hasOwn(ce,s)&&(ce[s]?.deprecated||ce[s]?.readOnly&&!V||ce[s]?.writeOnly&&!z||le(s));if(a&&x&&ae[Y].push({_attr:x}),hasExceededMaxProperties())return ae;if(predicates_isBooleanJSONSchema(L)&&L)a?ae[Y].push({additionalProp:"Anything can be here"}):ae.additionalProp1={},pe++;else if(isJSONSchemaObject(L)){const i=L,u=main_sampleFromSchemaGeneric(i,o,void 0,a);if(a&&"string"==typeof i?.xml?.name&&"notagname"!==i?.xml?.name)ae[Y].push(u);else{const o=i?.["x-additionalPropertiesName"]||"additionalProp",_=Number.isInteger(s.minProperties)&&s.minProperties>0&&pe{const a=main_sampleFromSchemaGeneric(s,o,i,!0);if(a)return"string"==typeof a?a:ls()(a,{declaration:!0,indent:"\t"})},main_sampleFromSchema=(s,o,i)=>main_sampleFromSchemaGeneric(s,o,i,!1),main_resolver=(s,o,i)=>[s,JSON.stringify(o),JSON.stringify(i)],MT=utils_memoizeN(main_createXMLExample,main_resolver),RT=utils_memoizeN(main_sampleFromSchema,main_resolver);const DT=new class OptionRegistry extends uT{#s={};data={...this.#s};get defaults(){return{...this.#s}}},api_optionAPI=(s,o)=>(void 0!==o&&DT.register(s,o),DT.get(s)),LT=[{when:/json/,shouldStringifyTypes:["string"]}],FT=["object"],fn_get_json_sample_schema=s=>(o,i,a,u)=>{const{fn:_}=s(),w=_.jsonSchema202012.memoizedSampleFromSchema(o,i,u),x=typeof w,C=LT.reduce(((s,o)=>o.when.test(a)?[...s,...o.shouldStringifyTypes]:s),FT);return gt()(C,(s=>s===x))?JSON.stringify(w,null,2):w},fn_get_yaml_sample_schema=s=>(o,i,a,u)=>{const{fn:_}=s(),w=_.jsonSchema202012.getJsonSampleSchema(o,i,a,u);let x;try{x=fn.dump(fn.load(w),{lineWidth:-1},{schema:rn}),"\n"===x[x.length-1]&&(x=x.slice(0,x.length-1))}catch(s){return console.error(s),"error: could not generate yaml example"}return x.replace(/\t/g," ")},fn_get_xml_sample_schema=s=>(o,i,a)=>{const{fn:u}=s();if(o&&!o.xml&&(o.xml={}),o&&!o.xml.name){if(!o.$$ref&&(o.type||o.items||o.properties||o.additionalProperties))return'\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e';if(o.$$ref){let s=o.$$ref.match(/\S*\/(\S+)$/);o.xml.name=s[1]}}return u.jsonSchema202012.memoizedCreateXMLExample(o,i,a)},fn_get_sample_schema=s=>(o,i="",a={},u=void 0)=>{const{fn:_}=s();return"function"==typeof o?.toJS&&(o=o.toJS()),"function"==typeof u?.toJS&&(u=u.toJS()),/xml/.test(i)?_.jsonSchema202012.getXmlSampleSchema(o,a,u):/(yaml|yml)/.test(i)?_.jsonSchema202012.getYamlSampleSchema(o,a,i,u):_.jsonSchema202012.getJsonSampleSchema(o,a,i,u)},json_schema_2020_12_samples=({getSystem:s})=>{const o=fn_get_json_sample_schema(s),i=fn_get_yaml_sample_schema(s),a=fn_get_xml_sample_schema(s),u=fn_get_sample_schema(s);return{fn:{jsonSchema202012:{sampleFromSchema:main_sampleFromSchema,sampleFromSchemaGeneric:main_sampleFromSchemaGeneric,sampleOptionAPI:api_optionAPI,sampleEncoderAPI:ST,sampleFormatAPI:hT,sampleMediaTypeAPI:CT,createXMLExample:main_createXMLExample,memoizedSampleFromSchema:RT,memoizedCreateXMLExample:MT,getJsonSampleSchema:o,getYamlSampleSchema:i,getXmlSampleSchema:a,getSampleSchema:u,mergeJsonSchema:NT,foldType}}}};function PresetApis(){return[base,oas3,json_schema_2020_12,json_schema_2020_12_samples,oas31]}const inline_plugin=s=>()=>({fn:s.fn,components:s.components}),factorization_system=s=>{const o=Ye()({layout:{layout:s.layout,filter:s.filter},spec:{spec:"",url:s.url},requestSnippets:s.requestSnippets},s.initialState);if(s.initialState)for(const[i,a]of Object.entries(s.initialState))void 0===a&&delete o[i];return{system:{configs:s.configs},plugins:s.presets,state:o}},sources_query=()=>s=>{const o=s.queryConfigEnabled?(()=>{const s=new URLSearchParams(lt.location.search);return Object.fromEntries(s)})():{};return Object.entries(o).reduce(((s,[o,i])=>("config"===o?s.configUrl=i:"urls.primaryName"===o?s[o]=i:s=co()(s,o,i),s)),{})},sources_url=({url:s,system:o})=>async i=>{if(!s)return{};if("function"!=typeof o.configsActions?.getConfigByUrl)return{};const a=(()=>{const s={};return s.promise=new Promise(((o,i)=>{s.resolve=o,s.reject=i})),s})();return o.configsActions.getConfigByUrl({url:s,loadRemoteConfig:!0,requestInterceptor:i.requestInterceptor,responseInterceptor:i.responseInterceptor},(s=>{a.resolve(s)})),a.promise},runtime=()=>()=>{const s={};return globalThis.location&&(s.oauth2RedirectUrl=`${globalThis.location.protocol}//${globalThis.location.host}${globalThis.location.pathname.substring(0,globalThis.location.pathname.lastIndexOf("/"))}/oauth2-redirect.html`),s},BT=Object.freeze({dom_id:null,domNode:null,spec:{},url:"",urls:null,configUrl:null,layout:"BaseLayout",docExpansion:"list",maxDisplayedTags:-1,filter:!1,validatorUrl:"https://validator.swagger.io/validator",oauth2RedirectUrl:void 0,persistAuthorization:!1,configs:{},displayOperationId:!1,displayRequestDuration:!1,deepLinking:!1,tryItOutEnabled:!1,requestInterceptor:s=>(s.curlOptions=[],s),responseInterceptor:s=>s,showMutatedRequest:!0,defaultModelRendering:"example",defaultModelExpandDepth:1,defaultModelsExpandDepth:1,showExtensions:!1,showCommonExtensions:!1,withCredentials:!1,requestSnippetsEnabled:!1,requestSnippets:{generators:{curl_bash:{title:"cURL (bash)",syntax:"bash"},curl_powershell:{title:"cURL (PowerShell)",syntax:"powershell"},curl_cmd:{title:"cURL (CMD)",syntax:"bash"}},defaultExpanded:!0,languages:null},supportedSubmitMethods:["get","put","post","delete","options","head","patch","trace"],queryConfigEnabled:!1,presets:[PresetApis],plugins:[],initialState:{},fn:{},components:{},syntaxHighlight:{activated:!0,theme:"agate"},operationsSorter:null,tagsSorter:null,onComplete:null,modelPropertyMacro:null,parameterMacro:null,fileUploadMediaTypes:["application/octet-stream","image/","audio/","video/"],uncaughtExceptionHandler:null});var $T=__webpack_require__(61448),qT=__webpack_require__.n($T),UT=__webpack_require__(77731),VT=__webpack_require__.n(UT);const type_casters_array=(s,o=[])=>Array.isArray(s)?s:o,type_casters_boolean=(s,o=!1)=>!0===s||"true"===s||1===s||"1"===s||!1!==s&&"false"!==s&&0!==s&&"0"!==s&&o,dom_node=s=>null===s||"null"===s?null:s,type_casters_filter=s=>{const o=String(s);return type_casters_boolean(s,o)},type_casters_function=(s,o)=>"function"==typeof s?s:o,nullable_array=s=>Array.isArray(s)?s:null,nullable_function=s=>"function"==typeof s?s:null,nullable_string=s=>null===s||"null"===s?null:String(s),type_casters_number=(s,o=-1)=>{const i=parseInt(s,10);return Number.isNaN(i)?o:i},type_casters_object=(s,o={})=>as()(s)?s:o,sorter=s=>"function"==typeof s||"string"==typeof s?s:null,type_casters_string=s=>String(s),syntax_highlight=(s,o)=>as()(s)?s:!1===s||"false"===s||0===s||"0"===s?{activated:!1}:o,undefined_string=s=>void 0===s||"undefined"===s?void 0:String(s),zT={components:{typeCaster:type_casters_object},configs:{typeCaster:type_casters_object},configUrl:{typeCaster:nullable_string},deepLinking:{typeCaster:type_casters_boolean,defaultValue:BT.deepLinking},defaultModelExpandDepth:{typeCaster:type_casters_number,defaultValue:BT.defaultModelExpandDepth},defaultModelRendering:{typeCaster:type_casters_string},defaultModelsExpandDepth:{typeCaster:type_casters_number,defaultValue:BT.defaultModelsExpandDepth},displayOperationId:{typeCaster:type_casters_boolean,defaultValue:BT.displayOperationId},displayRequestDuration:{typeCaster:type_casters_boolean,defaultValue:BT.displayRequestDuration},docExpansion:{typeCaster:type_casters_string},dom_id:{typeCaster:nullable_string},domNode:{typeCaster:dom_node},fileUploadMediaTypes:{typeCaster:type_casters_array,defaultValue:BT.fileUploadMediaTypes},filter:{typeCaster:type_casters_filter},fn:{typeCaster:type_casters_object},initialState:{typeCaster:type_casters_object},layout:{typeCaster:type_casters_string},maxDisplayedTags:{typeCaster:type_casters_number,defaultValue:BT.maxDisplayedTags},modelPropertyMacro:{typeCaster:nullable_function},oauth2RedirectUrl:{typeCaster:undefined_string},onComplete:{typeCaster:nullable_function},operationsSorter:{typeCaster:sorter},paramaterMacro:{typeCaster:nullable_function},persistAuthorization:{typeCaster:type_casters_boolean,defaultValue:BT.persistAuthorization},plugins:{typeCaster:type_casters_array,defaultValue:BT.plugins},presets:{typeCaster:type_casters_array,defaultValue:BT.presets},requestInterceptor:{typeCaster:type_casters_function,defaultValue:BT.requestInterceptor},requestSnippets:{typeCaster:type_casters_object,defaultValue:BT.requestSnippets},requestSnippetsEnabled:{typeCaster:type_casters_boolean,defaultValue:BT.requestSnippetsEnabled},responseInterceptor:{typeCaster:type_casters_function,defaultValue:BT.responseInterceptor},showCommonExtensions:{typeCaster:type_casters_boolean,defaultValue:BT.showCommonExtensions},showExtensions:{typeCaster:type_casters_boolean,defaultValue:BT.showExtensions},showMutatedRequest:{typeCaster:type_casters_boolean,defaultValue:BT.showMutatedRequest},spec:{typeCaster:type_casters_object,defaultValue:BT.spec},supportedSubmitMethods:{typeCaster:type_casters_array,defaultValue:BT.supportedSubmitMethods},syntaxHighlight:{typeCaster:syntax_highlight,defaultValue:BT.syntaxHighlight},"syntaxHighlight.activated":{typeCaster:type_casters_boolean,defaultValue:BT.syntaxHighlight.activated},"syntaxHighlight.theme":{typeCaster:type_casters_string},tagsSorter:{typeCaster:sorter},tryItOutEnabled:{typeCaster:type_casters_boolean,defaultValue:BT.tryItOutEnabled},url:{typeCaster:type_casters_string},urls:{typeCaster:nullable_array},"urls.primaryName":{typeCaster:type_casters_string},validatorUrl:{typeCaster:nullable_string},withCredentials:{typeCaster:type_casters_boolean,defaultValue:BT.withCredentials},uncaughtExceptionHandler:{typeCaster:nullable_function}},type_cast=s=>Object.entries(zT).reduce(((s,[o,{typeCaster:i,defaultValue:a}])=>{if(qT()(s,o)){const u=i(Cn()(s,o),a);s=VT()(o,u,s)}return s}),{...s}),config_merge=(s,...o)=>{let i=Symbol.for("domNode"),a=Symbol.for("primaryName");const u=[];for(const s of o){const o={...s};Object.hasOwn(o,"domNode")&&(i=o.domNode,delete o.domNode),Object.hasOwn(o,"urls.primaryName")?(a=o["urls.primaryName"],delete o["urls.primaryName"]):Array.isArray(o.urls)&&Object.hasOwn(o.urls,"primaryName")&&(a=o.urls.primaryName,delete o.urls.primaryName),u.push(o)}const _=Ye()(s,...u);return i!==Symbol.for("domNode")&&(_.domNode=i),a!==Symbol.for("primaryName")&&Array.isArray(_.urls)&&(_.urls.primaryName=a),type_cast(_)};function SwaggerUI(s){const o=sources_query()(s),i=runtime()(),a=SwaggerUI.config.merge({},SwaggerUI.config.defaults,i,s,o),u=factorization_system(a),_=inline_plugin(a),w=new Store(u);w.register([a.plugins,_]);const x=w.getSystem(),persistConfigs=s=>{w.setConfigs(s),x.configsActions.loaded()},updateSpec=s=>{!o.url&&"object"==typeof s.spec&&Object.keys(s.spec).length>0?(x.specActions.updateUrl(""),x.specActions.updateLoadingStatus("success"),x.specActions.updateSpec(JSON.stringify(s.spec))):"function"==typeof x.specActions.download&&s.url&&!s.urls&&(x.specActions.updateUrl(s.url),x.specActions.download(s.url))},render=s=>{if(s.domNode)x.render(s.domNode,"App");else if(s.dom_id){const o=document.querySelector(s.dom_id);x.render(o,"App")}else null===s.dom_id||null===s.domNode||console.error("Skipped rendering: no `dom_id` or `domNode` was specified")};return a.configUrl?((async()=>{const{configUrl:s}=a,i=await sources_url({url:s,system:x})(a),u=SwaggerUI.config.merge({},a,i,o);persistConfigs(u),null!==i&&updateSpec(u),render(u)})(),x):(persistConfigs(a),updateSpec(a),render(a),x)}SwaggerUI.System=Store,SwaggerUI.config={defaults:BT,merge:config_merge,typeCast:type_cast,typeCastMappings:zT},SwaggerUI.presets={base,apis:PresetApis},SwaggerUI.plugins={Auth:auth,Configs:configsPlugin,DeepLining:deep_linking,Err:err,Filter:filter,Icons:icons,JSONSchema5:json_schema_5,JSONSchema5Samples:json_schema_5_samples,JSONSchema202012:json_schema_2020_12,JSONSchema202012Samples:json_schema_2020_12_samples,Layout:plugins_layout,Logs:logs,OpenAPI30:oas3,OpenAPI31:oas3,OnComplete:on_complete,RequestSnippets:plugins_request_snippets,Spec:plugins_spec,SwaggerClient:swagger_client,Util:util,View:view,ViewLegacy:view_legacy,DownloadUrl:downloadUrlPlugin,SyntaxHighlighting:syntax_highlighting,Versions:versions,SafeRender:safe_render};const WT=SwaggerUI})(),i=i.default})())); \ No newline at end of file diff --git a/openapi/swagger-ui/swagger-ui-standalone-preset.js b/openapi/swagger-ui/swagger-ui-standalone-preset.js index faa41d10..1a92e4f9 100644 --- a/openapi/swagger-ui/swagger-ui-standalone-preset.js +++ b/openapi/swagger-ui/swagger-ui-standalone-preset.js @@ -1,2 +1,2 @@ /*! For license information please see swagger-ui-standalone-preset.js.LICENSE.txt */ -!function webpackUniversalModuleDefinition(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.SwaggerUIStandalonePreset=e():t.SwaggerUIStandalonePreset=e()}(this,(()=>(()=>{var t={9119:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BLANK_URL=e.relativeFirstCharacters=e.urlSchemeRegex=e.ctrlCharactersRegex=e.htmlCtrlEntityRegex=e.htmlEntitiesRegex=e.invalidProtocolRegex=void 0,e.invalidProtocolRegex=/^([^\w]*)(javascript|data|vbscript)/im,e.htmlEntitiesRegex=/&#(\w+)(^\w|;)?/g,e.htmlCtrlEntityRegex=/&(newline|tab);/gi,e.ctrlCharactersRegex=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,e.urlSchemeRegex=/^.+(:|:)/gim,e.relativeFirstCharacters=[".","/"],e.BLANK_URL="about:blank"},6750:(t,e,r)=>{"use strict";var n=r(9119)},7526:(t,e)=>{"use strict";e.byteLength=function byteLength(t){var e=getLens(t),r=e[0],n=e[1];return 3*(r+n)/4-n},e.toByteArray=function toByteArray(t){var e,r,o=getLens(t),a=o[0],s=o[1],u=new i(function _byteLength(t,e,r){return 3*(e+r)/4-r}(0,a,s)),c=0,f=s>0?a-4:a;for(r=0;r>16&255,u[c++]=e>>8&255,u[c++]=255&e;2===s&&(e=n[t.charCodeAt(r)]<<2|n[t.charCodeAt(r+1)]>>4,u[c++]=255&e);1===s&&(e=n[t.charCodeAt(r)]<<10|n[t.charCodeAt(r+1)]<<4|n[t.charCodeAt(r+2)]>>2,u[c++]=e>>8&255,u[c++]=255&e);return u},e.fromByteArray=function fromByteArray(t){for(var e,n=t.length,i=n%3,o=[],a=16383,s=0,u=n-i;su?u:s+a));1===i?(e=t[n-1],o.push(r[e>>2]+r[e<<4&63]+"==")):2===i&&(e=(t[n-2]<<8)+t[n-1],o.push(r[e>>10]+r[e>>4&63]+r[e<<2&63]+"="));return o.join("")};for(var r=[],n=[],i="undefined"!=typeof Uint8Array?Uint8Array:Array,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0;a<64;++a)r[a]=o[a],n[o.charCodeAt(a)]=a;function getLens(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function encodeChunk(t,e,n){for(var i,o,a=[],s=e;s>18&63]+r[o>>12&63]+r[o>>6&63]+r[63&o]);return a.join("")}n["-".charCodeAt(0)]=62,n["_".charCodeAt(0)]=63},8287:(t,e,r)=>{"use strict";const n=r(7526),i=r(251),o="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;e.Buffer=Buffer,e.SlowBuffer=function SlowBuffer(t){+t!=t&&(t=0);return Buffer.alloc(+t)},e.INSPECT_MAX_BYTES=50;const a=2147483647;function createBuffer(t){if(t>a)throw new RangeError('The value "'+t+'" is invalid for option "size"');const e=new Uint8Array(t);return Object.setPrototypeOf(e,Buffer.prototype),e}function Buffer(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return allocUnsafe(t)}return from(t,e,r)}function from(t,e,r){if("string"==typeof t)return function fromString(t,e){"string"==typeof e&&""!==e||(e="utf8");if(!Buffer.isEncoding(e))throw new TypeError("Unknown encoding: "+e);const r=0|byteLength(t,e);let n=createBuffer(r);const i=n.write(t,e);i!==r&&(n=n.slice(0,i));return n}(t,e);if(ArrayBuffer.isView(t))return function fromArrayView(t){if(isInstance(t,Uint8Array)){const e=new Uint8Array(t);return fromArrayBuffer(e.buffer,e.byteOffset,e.byteLength)}return fromArrayLike(t)}(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(isInstance(t,ArrayBuffer)||t&&isInstance(t.buffer,ArrayBuffer))return fromArrayBuffer(t,e,r);if("undefined"!=typeof SharedArrayBuffer&&(isInstance(t,SharedArrayBuffer)||t&&isInstance(t.buffer,SharedArrayBuffer)))return fromArrayBuffer(t,e,r);if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');const n=t.valueOf&&t.valueOf();if(null!=n&&n!==t)return Buffer.from(n,e,r);const i=function fromObject(t){if(Buffer.isBuffer(t)){const e=0|checked(t.length),r=createBuffer(e);return 0===r.length||t.copy(r,0,0,e),r}if(void 0!==t.length)return"number"!=typeof t.length||numberIsNaN(t.length)?createBuffer(0):fromArrayLike(t);if("Buffer"===t.type&&Array.isArray(t.data))return fromArrayLike(t.data)}(t);if(i)return i;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return Buffer.from(t[Symbol.toPrimitive]("string"),e,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}function assertSize(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function allocUnsafe(t){return assertSize(t),createBuffer(t<0?0:0|checked(t))}function fromArrayLike(t){const e=t.length<0?0:0|checked(t.length),r=createBuffer(e);for(let n=0;n=a)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+a.toString(16)+" bytes");return 0|t}function byteLength(t,e){if(Buffer.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||isInstance(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);const r=t.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;let i=!1;for(;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return utf8ToBytes(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return base64ToBytes(t).length;default:if(i)return n?-1:utf8ToBytes(t).length;e=(""+e).toLowerCase(),i=!0}}function slowToString(t,e,r){let n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return hexSlice(this,e,r);case"utf8":case"utf-8":return utf8Slice(this,e,r);case"ascii":return asciiSlice(this,e,r);case"latin1":case"binary":return latin1Slice(this,e,r);case"base64":return base64Slice(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function swap(t,e,r){const n=t[e];t[e]=t[r],t[r]=n}function bidirectionalIndexOf(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),numberIsNaN(r=+r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=Buffer.from(e,n)),Buffer.isBuffer(e))return 0===e.length?-1:arrayIndexOf(t,e,r,n,i);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):arrayIndexOf(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(t,e,r,n,i){let o,a=1,s=t.length,u=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;a=2,s/=2,u/=2,r/=2}function read(t,e){return 1===a?t[e]:t.readUInt16BE(e*a)}if(i){let n=-1;for(o=r;os&&(r=s-u),o=r;o>=0;o--){let r=!0;for(let n=0;ni&&(n=i):n=i;const o=e.length;let a;for(n>o/2&&(n=o/2),a=0;a>8,i=r%256,o.push(i),o.push(n);return o}(e,t.length-r),t,r,n)}function base64Slice(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function utf8Slice(t,e,r){r=Math.min(t.length,r);const n=[];let i=e;for(;i239?4:e>223?3:e>191?2:1;if(i+a<=r){let r,n,s,u;switch(a){case 1:e<128&&(o=e);break;case 2:r=t[i+1],128==(192&r)&&(u=(31&e)<<6|63&r,u>127&&(o=u));break;case 3:r=t[i+1],n=t[i+2],128==(192&r)&&128==(192&n)&&(u=(15&e)<<12|(63&r)<<6|63&n,u>2047&&(u<55296||u>57343)&&(o=u));break;case 4:r=t[i+1],n=t[i+2],s=t[i+3],128==(192&r)&&128==(192&n)&&128==(192&s)&&(u=(15&e)<<18|(63&r)<<12|(63&n)<<6|63&s,u>65535&&u<1114112&&(o=u))}}null===o?(o=65533,a=1):o>65535&&(o-=65536,n.push(o>>>10&1023|55296),o=56320|1023&o),n.push(o),i+=a}return function decodeCodePointsArray(t){const e=t.length;if(e<=s)return String.fromCharCode.apply(String,t);let r="",n=0;for(;nn.length?(Buffer.isBuffer(e)||(e=Buffer.from(e)),e.copy(n,i)):Uint8Array.prototype.set.call(n,e,i);else{if(!Buffer.isBuffer(e))throw new TypeError('"list" argument must be an Array of Buffers');e.copy(n,i)}i+=e.length}return n},Buffer.byteLength=byteLength,Buffer.prototype._isBuffer=!0,Buffer.prototype.swap16=function swap16(){const t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let e=0;er&&(t+=" ... "),""},o&&(Buffer.prototype[o]=Buffer.prototype.inspect),Buffer.prototype.compare=function compare(t,e,r,n,i){if(isInstance(t,Uint8Array)&&(t=Buffer.from(t,t.offset,t.byteLength)),!Buffer.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;let o=(i>>>=0)-(n>>>=0),a=(r>>>=0)-(e>>>=0);const s=Math.min(o,a),u=this.slice(n,i),c=t.slice(e,r);for(let t=0;t>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}const i=this.length-e;if((void 0===r||r>i)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");let o=!1;for(;;)switch(n){case"hex":return hexWrite(this,t,e,r);case"utf8":case"utf-8":return utf8Write(this,t,e,r);case"ascii":case"latin1":case"binary":return asciiWrite(this,t,e,r);case"base64":return base64Write(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,t,e,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},Buffer.prototype.toJSON=function toJSON(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const s=4096;function asciiSlice(t,e,r){let n="";r=Math.min(t.length,r);for(let i=e;in)&&(r=n);let i="";for(let n=e;nr)throw new RangeError("Trying to access beyond buffer length")}function checkInt(t,e,r,n,i,o){if(!Buffer.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError("Index out of range")}function wrtBigUInt64LE(t,e,r,n,i){checkIntBI(e,n,i,t,r,7);let o=Number(e&BigInt(4294967295));t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o;let a=Number(e>>BigInt(32)&BigInt(4294967295));return t[r++]=a,a>>=8,t[r++]=a,a>>=8,t[r++]=a,a>>=8,t[r++]=a,r}function wrtBigUInt64BE(t,e,r,n,i){checkIntBI(e,n,i,t,r,7);let o=Number(e&BigInt(4294967295));t[r+7]=o,o>>=8,t[r+6]=o,o>>=8,t[r+5]=o,o>>=8,t[r+4]=o;let a=Number(e>>BigInt(32)&BigInt(4294967295));return t[r+3]=a,a>>=8,t[r+2]=a,a>>=8,t[r+1]=a,a>>=8,t[r]=a,r+8}function checkIEEE754(t,e,r,n,i,o){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function writeFloat(t,e,r,n,o){return e=+e,r>>>=0,o||checkIEEE754(t,0,r,4),i.write(t,e,r,n,23,4),r+4}function writeDouble(t,e,r,n,o){return e=+e,r>>>=0,o||checkIEEE754(t,0,r,8),i.write(t,e,r,n,52,8),r+8}Buffer.prototype.slice=function slice(t,e){const r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e>>=0,e>>>=0,r||checkOffset(t,e,this.length);let n=this[t],i=1,o=0;for(;++o>>=0,e>>>=0,r||checkOffset(t,e,this.length);let n=this[t+--e],i=1;for(;e>0&&(i*=256);)n+=this[t+--e]*i;return n},Buffer.prototype.readUint8=Buffer.prototype.readUInt8=function readUInt8(t,e){return t>>>=0,e||checkOffset(t,1,this.length),this[t]},Buffer.prototype.readUint16LE=Buffer.prototype.readUInt16LE=function readUInt16LE(t,e){return t>>>=0,e||checkOffset(t,2,this.length),this[t]|this[t+1]<<8},Buffer.prototype.readUint16BE=Buffer.prototype.readUInt16BE=function readUInt16BE(t,e){return t>>>=0,e||checkOffset(t,2,this.length),this[t]<<8|this[t+1]},Buffer.prototype.readUint32LE=Buffer.prototype.readUInt32LE=function readUInt32LE(t,e){return t>>>=0,e||checkOffset(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},Buffer.prototype.readUint32BE=Buffer.prototype.readUInt32BE=function readUInt32BE(t,e){return t>>>=0,e||checkOffset(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},Buffer.prototype.readBigUInt64LE=defineBigIntMethod((function readBigUInt64LE(t){validateNumber(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||boundsError(t,this.length-8);const n=e+256*this[++t]+65536*this[++t]+this[++t]*2**24,i=this[++t]+256*this[++t]+65536*this[++t]+r*2**24;return BigInt(n)+(BigInt(i)<>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||boundsError(t,this.length-8);const n=e*2**24+65536*this[++t]+256*this[++t]+this[++t],i=this[++t]*2**24+65536*this[++t]+256*this[++t]+r;return(BigInt(n)<>>=0,e>>>=0,r||checkOffset(t,e,this.length);let n=this[t],i=1,o=0;for(;++o=i&&(n-=Math.pow(2,8*e)),n},Buffer.prototype.readIntBE=function readIntBE(t,e,r){t>>>=0,e>>>=0,r||checkOffset(t,e,this.length);let n=e,i=1,o=this[t+--n];for(;n>0&&(i*=256);)o+=this[t+--n]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*e)),o},Buffer.prototype.readInt8=function readInt8(t,e){return t>>>=0,e||checkOffset(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},Buffer.prototype.readInt16LE=function readInt16LE(t,e){t>>>=0,e||checkOffset(t,2,this.length);const r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},Buffer.prototype.readInt16BE=function readInt16BE(t,e){t>>>=0,e||checkOffset(t,2,this.length);const r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},Buffer.prototype.readInt32LE=function readInt32LE(t,e){return t>>>=0,e||checkOffset(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},Buffer.prototype.readInt32BE=function readInt32BE(t,e){return t>>>=0,e||checkOffset(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},Buffer.prototype.readBigInt64LE=defineBigIntMethod((function readBigInt64LE(t){validateNumber(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||boundsError(t,this.length-8);const n=this[t+4]+256*this[t+5]+65536*this[t+6]+(r<<24);return(BigInt(n)<>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||boundsError(t,this.length-8);const n=(e<<24)+65536*this[++t]+256*this[++t]+this[++t];return(BigInt(n)<>>=0,e||checkOffset(t,4,this.length),i.read(this,t,!0,23,4)},Buffer.prototype.readFloatBE=function readFloatBE(t,e){return t>>>=0,e||checkOffset(t,4,this.length),i.read(this,t,!1,23,4)},Buffer.prototype.readDoubleLE=function readDoubleLE(t,e){return t>>>=0,e||checkOffset(t,8,this.length),i.read(this,t,!0,52,8)},Buffer.prototype.readDoubleBE=function readDoubleBE(t,e){return t>>>=0,e||checkOffset(t,8,this.length),i.read(this,t,!1,52,8)},Buffer.prototype.writeUintLE=Buffer.prototype.writeUIntLE=function writeUIntLE(t,e,r,n){if(t=+t,e>>>=0,r>>>=0,!n){checkInt(this,t,e,r,Math.pow(2,8*r)-1,0)}let i=1,o=0;for(this[e]=255&t;++o>>=0,r>>>=0,!n){checkInt(this,t,e,r,Math.pow(2,8*r)-1,0)}let i=r-1,o=1;for(this[e+i]=255&t;--i>=0&&(o*=256);)this[e+i]=t/o&255;return e+r},Buffer.prototype.writeUint8=Buffer.prototype.writeUInt8=function writeUInt8(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,1,255,0),this[e]=255&t,e+1},Buffer.prototype.writeUint16LE=Buffer.prototype.writeUInt16LE=function writeUInt16LE(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},Buffer.prototype.writeUint16BE=Buffer.prototype.writeUInt16BE=function writeUInt16BE(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},Buffer.prototype.writeUint32LE=Buffer.prototype.writeUInt32LE=function writeUInt32LE(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},Buffer.prototype.writeUint32BE=Buffer.prototype.writeUInt32BE=function writeUInt32BE(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},Buffer.prototype.writeBigUInt64LE=defineBigIntMethod((function writeBigUInt64LE(t,e=0){return wrtBigUInt64LE(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeBigUInt64BE=defineBigIntMethod((function writeBigUInt64BE(t,e=0){return wrtBigUInt64BE(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeIntLE=function writeIntLE(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);checkInt(this,t,e,r,n-1,-n)}let i=0,o=1,a=0;for(this[e]=255&t;++i>0)-a&255;return e+r},Buffer.prototype.writeIntBE=function writeIntBE(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);checkInt(this,t,e,r,n-1,-n)}let i=r-1,o=1,a=0;for(this[e+i]=255&t;--i>=0&&(o*=256);)t<0&&0===a&&0!==this[e+i+1]&&(a=1),this[e+i]=(t/o>>0)-a&255;return e+r},Buffer.prototype.writeInt8=function writeInt8(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},Buffer.prototype.writeInt16LE=function writeInt16LE(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},Buffer.prototype.writeInt16BE=function writeInt16BE(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},Buffer.prototype.writeInt32LE=function writeInt32LE(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},Buffer.prototype.writeInt32BE=function writeInt32BE(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},Buffer.prototype.writeBigInt64LE=defineBigIntMethod((function writeBigInt64LE(t,e=0){return wrtBigUInt64LE(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeBigInt64BE=defineBigIntMethod((function writeBigInt64BE(t,e=0){return wrtBigUInt64BE(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeFloatLE=function writeFloatLE(t,e,r){return writeFloat(this,t,e,!0,r)},Buffer.prototype.writeFloatBE=function writeFloatBE(t,e,r){return writeFloat(this,t,e,!1,r)},Buffer.prototype.writeDoubleLE=function writeDoubleLE(t,e,r){return writeDouble(this,t,e,!0,r)},Buffer.prototype.writeDoubleBE=function writeDoubleBE(t,e,r){return writeDouble(this,t,e,!1,r)},Buffer.prototype.copy=function copy(t,e,r,n){if(!Buffer.isBuffer(t))throw new TypeError("argument should be a Buffer");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(i=e;i=n+4;r-=3)e=`_${t.slice(r-3,r)}${e}`;return`${t.slice(0,r)}${e}`}function checkIntBI(t,e,r,n,i,o){if(t>r||t3?0===e||e===BigInt(0)?`>= 0${n} and < 2${n} ** ${8*(o+1)}${n}`:`>= -(2${n} ** ${8*(o+1)-1}${n}) and < 2 ** ${8*(o+1)-1}${n}`:`>= ${e}${n} and <= ${r}${n}`,new u.ERR_OUT_OF_RANGE("value",i,t)}!function checkBounds(t,e,r){validateNumber(e,"offset"),void 0!==t[e]&&void 0!==t[e+r]||boundsError(e,t.length-(r+1))}(n,i,o)}function validateNumber(t,e){if("number"!=typeof t)throw new u.ERR_INVALID_ARG_TYPE(e,"number",t)}function boundsError(t,e,r){if(Math.floor(t)!==t)throw validateNumber(t,r),new u.ERR_OUT_OF_RANGE(r||"offset","an integer",t);if(e<0)throw new u.ERR_BUFFER_OUT_OF_BOUNDS;throw new u.ERR_OUT_OF_RANGE(r||"offset",`>= ${r?1:0} and <= ${e}`,t)}E("ERR_BUFFER_OUT_OF_BOUNDS",(function(t){return t?`${t} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),E("ERR_INVALID_ARG_TYPE",(function(t,e){return`The "${t}" argument must be of type number. Received type ${typeof e}`}),TypeError),E("ERR_OUT_OF_RANGE",(function(t,e,r){let n=`The value of "${t}" is out of range.`,i=r;return Number.isInteger(r)&&Math.abs(r)>2**32?i=addNumericalSeparator(String(r)):"bigint"==typeof r&&(i=String(r),(r>BigInt(2)**BigInt(32)||r<-(BigInt(2)**BigInt(32)))&&(i=addNumericalSeparator(i)),i+="n"),n+=` It must be ${e}. Received ${i}`,n}),RangeError);const c=/[^+/0-9A-Za-z-_]/g;function utf8ToBytes(t,e){let r;e=e||1/0;const n=t.length;let i=null;const o=[];for(let a=0;a55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(a+1===n){(e-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;o.push(r)}else if(r<2048){if((e-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function base64ToBytes(t){return n.toByteArray(function base64clean(t){if((t=(t=t.split("=")[0]).trim().replace(c,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function blitBuffer(t,e,r,n){let i;for(i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function isInstance(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function numberIsNaN(t){return t!=t}const f=function(){const t="0123456789abcdef",e=new Array(256);for(let r=0;r<16;++r){const n=16*r;for(let i=0;i<16;++i)e[n+i]=t[r]+t[i]}return e}();function defineBigIntMethod(t){return"undefined"==typeof BigInt?BufferBigIntNotDefined:t}function BufferBigIntNotDefined(){throw new Error("BigInt not supported")}},2205:function(t,e,r){var n;n=void 0!==r.g?r.g:this,t.exports=function(t){if(t.CSS&&t.CSS.escape)return t.CSS.escape;var cssEscape=function(t){if(0==arguments.length)throw new TypeError("`CSS.escape` requires an argument.");for(var e,r=String(t),n=r.length,i=-1,o="",a=r.charCodeAt(0);++i=1&&e<=31||127==e||0==i&&e>=48&&e<=57||1==i&&e>=48&&e<=57&&45==a?"\\"+e.toString(16)+" ":0==i&&1==n&&45==e||!(e>=128||45==e||95==e||e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122)?"\\"+r.charAt(i):r.charAt(i):o+="�";return o};return t.CSS||(t.CSS={}),t.CSS.escape=cssEscape,cssEscape}(n)},251:(t,e)=>{e.read=function(t,e,r,n,i){var o,a,s=8*i-n-1,u=(1<>1,f=-7,l=r?i-1:0,h=r?-1:1,p=t[e+l];for(l+=h,o=p&(1<<-f)-1,p>>=-f,f+=s;f>0;o=256*o+t[e+l],l+=h,f-=8);for(a=o&(1<<-f)-1,o>>=-f,f+=n;f>0;a=256*a+t[e+l],l+=h,f-=8);if(0===o)o=1-c;else{if(o===u)return a?NaN:1/0*(p?-1:1);a+=Math.pow(2,n),o-=c}return(p?-1:1)*a*Math.pow(2,o-n)},e.write=function(t,e,r,n,i,o){var a,s,u,c=8*o-i-1,f=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:o-1,d=n?1:-1,_=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,a=f):(a=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-a))<1&&(a--,u*=2),(e+=a+l>=1?h/u:h*Math.pow(2,1-l))*u>=2&&(a++,u/=2),a+l>=f?(s=0,a=f):a+l>=1?(s=(e*u-1)*Math.pow(2,i),a+=l):(s=e*Math.pow(2,l-1)*Math.pow(2,i),a=0));i>=8;t[r+p]=255&s,p+=d,s/=256,i-=8);for(a=a<0;t[r+p]=255&a,p+=d,a/=256,c-=8);t[r+p-d]|=128*_}},9404:function(t){t.exports=function(){"use strict";var t=Array.prototype.slice;function createClass(t,e){e&&(t.prototype=Object.create(e.prototype)),t.prototype.constructor=t}function Iterable(t){return isIterable(t)?t:Seq(t)}function KeyedIterable(t){return isKeyed(t)?t:KeyedSeq(t)}function IndexedIterable(t){return isIndexed(t)?t:IndexedSeq(t)}function SetIterable(t){return isIterable(t)&&!isAssociative(t)?t:SetSeq(t)}function isIterable(t){return!(!t||!t[e])}function isKeyed(t){return!(!t||!t[r])}function isIndexed(t){return!(!t||!t[n])}function isAssociative(t){return isKeyed(t)||isIndexed(t)}function isOrdered(t){return!(!t||!t[i])}createClass(KeyedIterable,Iterable),createClass(IndexedIterable,Iterable),createClass(SetIterable,Iterable),Iterable.isIterable=isIterable,Iterable.isKeyed=isKeyed,Iterable.isIndexed=isIndexed,Iterable.isAssociative=isAssociative,Iterable.isOrdered=isOrdered,Iterable.Keyed=KeyedIterable,Iterable.Indexed=IndexedIterable,Iterable.Set=SetIterable;var e="@@__IMMUTABLE_ITERABLE__@@",r="@@__IMMUTABLE_KEYED__@@",n="@@__IMMUTABLE_INDEXED__@@",i="@@__IMMUTABLE_ORDERED__@@",o="delete",a=5,s=1<>>0;if(""+r!==e||4294967295===r)return NaN;e=r}return e<0?ensureSize(t)+e:e}function returnTrue(){return!0}function wholeSlice(t,e,r){return(0===t||void 0!==r&&t<=-r)&&(void 0===e||void 0!==r&&e>=r)}function resolveBegin(t,e){return resolveIndex(t,e,0)}function resolveEnd(t,e){return resolveIndex(t,e,e)}function resolveIndex(t,e,r){return void 0===t?r:t<0?Math.max(0,e+t):void 0===e?t:Math.min(e,t)}var h=0,p=1,d=2,_="function"==typeof Symbol&&Symbol.iterator,y="@@iterator",m=_||y;function Iterator(t){this.next=t}function iteratorValue(t,e,r,n){var i=0===t?e:1===t?r:[e,r];return n?n.value=i:n={value:i,done:!1},n}function iteratorDone(){return{value:void 0,done:!0}}function hasIterator(t){return!!getIteratorFn(t)}function isIterator(t){return t&&"function"==typeof t.next}function getIterator(t){var e=getIteratorFn(t);return e&&e.call(t)}function getIteratorFn(t){var e=t&&(_&&t[_]||t[y]);if("function"==typeof e)return e}function isArrayLike(t){return t&&"number"==typeof t.length}function Seq(t){return null==t?emptySequence():isIterable(t)?t.toSeq():seqFromValue(t)}function KeyedSeq(t){return null==t?emptySequence().toKeyedSeq():isIterable(t)?isKeyed(t)?t.toSeq():t.fromEntrySeq():keyedSeqFromValue(t)}function IndexedSeq(t){return null==t?emptySequence():isIterable(t)?isKeyed(t)?t.entrySeq():t.toIndexedSeq():indexedSeqFromValue(t)}function SetSeq(t){return(null==t?emptySequence():isIterable(t)?isKeyed(t)?t.entrySeq():t:indexedSeqFromValue(t)).toSetSeq()}Iterator.prototype.toString=function(){return"[Iterator]"},Iterator.KEYS=h,Iterator.VALUES=p,Iterator.ENTRIES=d,Iterator.prototype.inspect=Iterator.prototype.toSource=function(){return this.toString()},Iterator.prototype[m]=function(){return this},createClass(Seq,Iterable),Seq.of=function(){return Seq(arguments)},Seq.prototype.toSeq=function(){return this},Seq.prototype.toString=function(){return this.__toString("Seq {","}")},Seq.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},Seq.prototype.__iterate=function(t,e){return seqIterate(this,t,e,!0)},Seq.prototype.__iterator=function(t,e){return seqIterator(this,t,e,!0)},createClass(KeyedSeq,Seq),KeyedSeq.prototype.toKeyedSeq=function(){return this},createClass(IndexedSeq,Seq),IndexedSeq.of=function(){return IndexedSeq(arguments)},IndexedSeq.prototype.toIndexedSeq=function(){return this},IndexedSeq.prototype.toString=function(){return this.__toString("Seq [","]")},IndexedSeq.prototype.__iterate=function(t,e){return seqIterate(this,t,e,!1)},IndexedSeq.prototype.__iterator=function(t,e){return seqIterator(this,t,e,!1)},createClass(SetSeq,Seq),SetSeq.of=function(){return SetSeq(arguments)},SetSeq.prototype.toSetSeq=function(){return this},Seq.isSeq=isSeq,Seq.Keyed=KeyedSeq,Seq.Set=SetSeq,Seq.Indexed=IndexedSeq;var g,v,b,w="@@__IMMUTABLE_SEQ__@@";function ArraySeq(t){this._array=t,this.size=t.length}function ObjectSeq(t){var e=Object.keys(t);this._object=t,this._keys=e,this.size=e.length}function IterableSeq(t){this._iterable=t,this.size=t.length||t.size}function IteratorSeq(t){this._iterator=t,this._iteratorCache=[]}function isSeq(t){return!(!t||!t[w])}function emptySequence(){return g||(g=new ArraySeq([]))}function keyedSeqFromValue(t){var e=Array.isArray(t)?new ArraySeq(t).fromEntrySeq():isIterator(t)?new IteratorSeq(t).fromEntrySeq():hasIterator(t)?new IterableSeq(t).fromEntrySeq():"object"==typeof t?new ObjectSeq(t):void 0;if(!e)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+t);return e}function indexedSeqFromValue(t){var e=maybeIndexedSeqFromValue(t);if(!e)throw new TypeError("Expected Array or iterable object of values: "+t);return e}function seqFromValue(t){var e=maybeIndexedSeqFromValue(t)||"object"==typeof t&&new ObjectSeq(t);if(!e)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+t);return e}function maybeIndexedSeqFromValue(t){return isArrayLike(t)?new ArraySeq(t):isIterator(t)?new IteratorSeq(t):hasIterator(t)?new IterableSeq(t):void 0}function seqIterate(t,e,r,n){var i=t._cache;if(i){for(var o=i.length-1,a=0;a<=o;a++){var s=i[r?o-a:a];if(!1===e(s[1],n?s[0]:a,t))return a+1}return a}return t.__iterateUncached(e,r)}function seqIterator(t,e,r,n){var i=t._cache;if(i){var o=i.length-1,a=0;return new Iterator((function(){var t=i[r?o-a:a];return a++>o?iteratorDone():iteratorValue(e,n?t[0]:a-1,t[1])}))}return t.__iteratorUncached(e,r)}function fromJS(t,e){return e?fromJSWith(e,t,"",{"":t}):fromJSDefault(t)}function fromJSWith(t,e,r,n){return Array.isArray(e)?t.call(n,r,IndexedSeq(e).map((function(r,n){return fromJSWith(t,r,n,e)}))):isPlainObj(e)?t.call(n,r,KeyedSeq(e).map((function(r,n){return fromJSWith(t,r,n,e)}))):e}function fromJSDefault(t){return Array.isArray(t)?IndexedSeq(t).map(fromJSDefault).toList():isPlainObj(t)?KeyedSeq(t).map(fromJSDefault).toMap():t}function isPlainObj(t){return t&&(t.constructor===Object||void 0===t.constructor)}function is(t,e){if(t===e||t!=t&&e!=e)return!0;if(!t||!e)return!1;if("function"==typeof t.valueOf&&"function"==typeof e.valueOf){if((t=t.valueOf())===(e=e.valueOf())||t!=t&&e!=e)return!0;if(!t||!e)return!1}return!("function"!=typeof t.equals||"function"!=typeof e.equals||!t.equals(e))}function deepEqual(t,e){if(t===e)return!0;if(!isIterable(e)||void 0!==t.size&&void 0!==e.size&&t.size!==e.size||void 0!==t.__hash&&void 0!==e.__hash&&t.__hash!==e.__hash||isKeyed(t)!==isKeyed(e)||isIndexed(t)!==isIndexed(e)||isOrdered(t)!==isOrdered(e))return!1;if(0===t.size&&0===e.size)return!0;var r=!isAssociative(t);if(isOrdered(t)){var n=t.entries();return e.every((function(t,e){var i=n.next().value;return i&&is(i[1],t)&&(r||is(i[0],e))}))&&n.next().done}var i=!1;if(void 0===t.size)if(void 0===e.size)"function"==typeof t.cacheResult&&t.cacheResult();else{i=!0;var o=t;t=e,e=o}var a=!0,s=e.__iterate((function(e,n){if(r?!t.has(e):i?!is(e,t.get(n,c)):!is(t.get(n,c),e))return a=!1,!1}));return a&&t.size===s}function Repeat(t,e){if(!(this instanceof Repeat))return new Repeat(t,e);if(this._value=t,this.size=void 0===e?1/0:Math.max(0,e),0===this.size){if(v)return v;v=this}}function invariant(t,e){if(!t)throw new Error(e)}function Range(t,e,r){if(!(this instanceof Range))return new Range(t,e,r);if(invariant(0!==r,"Cannot step a Range by 0"),t=t||0,void 0===e&&(e=1/0),r=void 0===r?1:Math.abs(r),en?iteratorDone():iteratorValue(t,i,r[e?n-i++:i++])}))},createClass(ObjectSeq,KeyedSeq),ObjectSeq.prototype.get=function(t,e){return void 0===e||this.has(t)?this._object[t]:e},ObjectSeq.prototype.has=function(t){return this._object.hasOwnProperty(t)},ObjectSeq.prototype.__iterate=function(t,e){for(var r=this._object,n=this._keys,i=n.length-1,o=0;o<=i;o++){var a=n[e?i-o:o];if(!1===t(r[a],a,this))return o+1}return o},ObjectSeq.prototype.__iterator=function(t,e){var r=this._object,n=this._keys,i=n.length-1,o=0;return new Iterator((function(){var a=n[e?i-o:o];return o++>i?iteratorDone():iteratorValue(t,a,r[a])}))},ObjectSeq.prototype[i]=!0,createClass(IterableSeq,IndexedSeq),IterableSeq.prototype.__iterateUncached=function(t,e){if(e)return this.cacheResult().__iterate(t,e);var r=getIterator(this._iterable),n=0;if(isIterator(r))for(var i;!(i=r.next()).done&&!1!==t(i.value,n++,this););return n},IterableSeq.prototype.__iteratorUncached=function(t,e){if(e)return this.cacheResult().__iterator(t,e);var r=getIterator(this._iterable);if(!isIterator(r))return new Iterator(iteratorDone);var n=0;return new Iterator((function(){var e=r.next();return e.done?e:iteratorValue(t,n++,e.value)}))},createClass(IteratorSeq,IndexedSeq),IteratorSeq.prototype.__iterateUncached=function(t,e){if(e)return this.cacheResult().__iterate(t,e);for(var r,n=this._iterator,i=this._iteratorCache,o=0;o=n.length){var e=r.next();if(e.done)return e;n[i]=e.value}return iteratorValue(t,i,n[i++])}))},createClass(Repeat,IndexedSeq),Repeat.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},Repeat.prototype.get=function(t,e){return this.has(t)?this._value:e},Repeat.prototype.includes=function(t){return is(this._value,t)},Repeat.prototype.slice=function(t,e){var r=this.size;return wholeSlice(t,e,r)?this:new Repeat(this._value,resolveEnd(e,r)-resolveBegin(t,r))},Repeat.prototype.reverse=function(){return this},Repeat.prototype.indexOf=function(t){return is(this._value,t)?0:-1},Repeat.prototype.lastIndexOf=function(t){return is(this._value,t)?this.size:-1},Repeat.prototype.__iterate=function(t,e){for(var r=0;r=0&&e=0&&rr?iteratorDone():iteratorValue(t,o++,a)}))},Range.prototype.equals=function(t){return t instanceof Range?this._start===t._start&&this._end===t._end&&this._step===t._step:deepEqual(this,t)},createClass(Collection,Iterable),createClass(KeyedCollection,Collection),createClass(IndexedCollection,Collection),createClass(SetCollection,Collection),Collection.Keyed=KeyedCollection,Collection.Indexed=IndexedCollection,Collection.Set=SetCollection;var I="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function imul(t,e){var r=65535&(t|=0),n=65535&(e|=0);return r*n+((t>>>16)*n+r*(e>>>16)<<16>>>0)|0};function smi(t){return t>>>1&1073741824|3221225471&t}function hash(t){if(!1===t||null==t)return 0;if("function"==typeof t.valueOf&&(!1===(t=t.valueOf())||null==t))return 0;if(!0===t)return 1;var e=typeof t;if("number"===e){if(t!=t||t===1/0)return 0;var r=0|t;for(r!==t&&(r^=4294967295*t);t>4294967295;)r^=t/=4294967295;return smi(r)}if("string"===e)return t.length>j?cachedHashString(t):hashString(t);if("function"==typeof t.hashCode)return t.hashCode();if("object"===e)return hashJSObj(t);if("function"==typeof t.toString)return hashString(t.toString());throw new Error("Value type "+e+" cannot be hashed.")}function cachedHashString(t){var e=D[t];return void 0===e&&(e=hashString(t),P===z&&(P=0,D={}),P++,D[t]=e),e}function hashString(t){for(var e=0,r=0;r0)switch(t.nodeType){case 1:return t.uniqueID;case 9:return t.documentElement&&t.documentElement.uniqueID}}var k,C="function"==typeof WeakMap;C&&(k=new WeakMap);var q=0,L="__immutablehash__";"function"==typeof Symbol&&(L=Symbol(L));var j=16,z=255,P=0,D={};function assertNotInfinite(t){invariant(t!==1/0,"Cannot perform this action with an infinite size.")}function Map(t){return null==t?emptyMap():isMap(t)&&!isOrdered(t)?t:emptyMap().withMutations((function(e){var r=KeyedIterable(t);assertNotInfinite(r.size),r.forEach((function(t,r){return e.set(r,t)}))}))}function isMap(t){return!(!t||!t[W])}createClass(Map,KeyedCollection),Map.of=function(){var e=t.call(arguments,0);return emptyMap().withMutations((function(t){for(var r=0;r=e.length)throw new Error("Missing value for key: "+e[r]);t.set(e[r],e[r+1])}}))},Map.prototype.toString=function(){return this.__toString("Map {","}")},Map.prototype.get=function(t,e){return this._root?this._root.get(0,void 0,t,e):e},Map.prototype.set=function(t,e){return updateMap(this,t,e)},Map.prototype.setIn=function(t,e){return this.updateIn(t,c,(function(){return e}))},Map.prototype.remove=function(t){return updateMap(this,t,c)},Map.prototype.deleteIn=function(t){return this.updateIn(t,(function(){return c}))},Map.prototype.update=function(t,e,r){return 1===arguments.length?t(this):this.updateIn([t],e,r)},Map.prototype.updateIn=function(t,e,r){r||(r=e,e=void 0);var n=updateInDeepMap(this,forceIterator(t),e,r);return n===c?void 0:n},Map.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):emptyMap()},Map.prototype.merge=function(){return mergeIntoMapWith(this,void 0,arguments)},Map.prototype.mergeWith=function(e){return mergeIntoMapWith(this,e,t.call(arguments,1))},Map.prototype.mergeIn=function(e){var r=t.call(arguments,1);return this.updateIn(e,emptyMap(),(function(t){return"function"==typeof t.merge?t.merge.apply(t,r):r[r.length-1]}))},Map.prototype.mergeDeep=function(){return mergeIntoMapWith(this,deepMerger,arguments)},Map.prototype.mergeDeepWith=function(e){var r=t.call(arguments,1);return mergeIntoMapWith(this,deepMergerWith(e),r)},Map.prototype.mergeDeepIn=function(e){var r=t.call(arguments,1);return this.updateIn(e,emptyMap(),(function(t){return"function"==typeof t.mergeDeep?t.mergeDeep.apply(t,r):r[r.length-1]}))},Map.prototype.sort=function(t){return OrderedMap(sortFactory(this,t))},Map.prototype.sortBy=function(t,e){return OrderedMap(sortFactory(this,e,t))},Map.prototype.withMutations=function(t){var e=this.asMutable();return t(e),e.wasAltered()?e.__ensureOwner(this.__ownerID):this},Map.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new OwnerID)},Map.prototype.asImmutable=function(){return this.__ensureOwner()},Map.prototype.wasAltered=function(){return this.__altered},Map.prototype.__iterator=function(t,e){return new MapIterator(this,t,e)},Map.prototype.__iterate=function(t,e){var r=this,n=0;return this._root&&this._root.iterate((function(e){return n++,t(e[1],e[0],r)}),e),n},Map.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?makeMap(this.size,this._root,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},Map.isMap=isMap;var U,W="@@__IMMUTABLE_MAP__@@",K=Map.prototype;function ArrayMapNode(t,e){this.ownerID=t,this.entries=e}function BitmapIndexedNode(t,e,r){this.ownerID=t,this.bitmap=e,this.nodes=r}function HashArrayMapNode(t,e,r){this.ownerID=t,this.count=e,this.nodes=r}function HashCollisionNode(t,e,r){this.ownerID=t,this.keyHash=e,this.entries=r}function ValueNode(t,e,r){this.ownerID=t,this.keyHash=e,this.entry=r}function MapIterator(t,e,r){this._type=e,this._reverse=r,this._stack=t._root&&mapIteratorFrame(t._root)}function mapIteratorValue(t,e){return iteratorValue(t,e[0],e[1])}function mapIteratorFrame(t,e){return{node:t,index:0,__prev:e}}function makeMap(t,e,r,n){var i=Object.create(K);return i.size=t,i._root=e,i.__ownerID=r,i.__hash=n,i.__altered=!1,i}function emptyMap(){return U||(U=makeMap(0))}function updateMap(t,e,r){var n,i;if(t._root){var o=MakeRef(f),a=MakeRef(l);if(n=updateNode(t._root,t.__ownerID,0,void 0,e,r,o,a),!a.value)return t;i=t.size+(o.value?r===c?-1:1:0)}else{if(r===c)return t;i=1,n=new ArrayMapNode(t.__ownerID,[[e,r]])}return t.__ownerID?(t.size=i,t._root=n,t.__hash=void 0,t.__altered=!0,t):n?makeMap(i,n):emptyMap()}function updateNode(t,e,r,n,i,o,a,s){return t?t.update(e,r,n,i,o,a,s):o===c?t:(SetRef(s),SetRef(a),new ValueNode(e,n,[i,o]))}function isLeafNode(t){return t.constructor===ValueNode||t.constructor===HashCollisionNode}function mergeIntoNode(t,e,r,n,i){if(t.keyHash===n)return new HashCollisionNode(e,n,[t.entry,i]);var o,s=(0===r?t.keyHash:t.keyHash>>>r)&u,c=(0===r?n:n>>>r)&u;return new BitmapIndexedNode(e,1<>>=1)a[u]=1&r?e[o++]:void 0;return a[n]=i,new HashArrayMapNode(t,o+1,a)}function mergeIntoMapWith(t,e,r){for(var n=[],i=0;i>1&1431655765))+(t>>2&858993459))+(t>>4)&252645135,t+=t>>8,127&(t+=t>>16)}function setIn(t,e,r,n){var i=n?t:arrCopy(t);return i[e]=r,i}function spliceIn(t,e,r,n){var i=t.length+1;if(n&&e+1===i)return t[e]=r,t;for(var o=new Array(i),a=0,s=0;s=V)return createNodes(t,u,n,i);var p=t&&t===this.ownerID,d=p?u:arrCopy(u);return h?s?f===l-1?d.pop():d[f]=d.pop():d[f]=[n,i]:d.push([n,i]),p?(this.entries=d,this):new ArrayMapNode(t,d)}},BitmapIndexedNode.prototype.get=function(t,e,r,n){void 0===e&&(e=hash(r));var i=1<<((0===t?e:e>>>t)&u),o=this.bitmap;return 0==(o&i)?n:this.nodes[popCount(o&i-1)].get(t+a,e,r,n)},BitmapIndexedNode.prototype.update=function(t,e,r,n,i,o,s){void 0===r&&(r=hash(n));var f=(0===e?r:r>>>e)&u,l=1<=$)return expandNodes(t,_,h,f,m);if(p&&!m&&2===_.length&&isLeafNode(_[1^d]))return _[1^d];if(p&&m&&1===_.length&&isLeafNode(m))return m;var g=t&&t===this.ownerID,v=p?m?h:h^l:h|l,b=p?m?setIn(_,d,m,g):spliceOut(_,d,g):spliceIn(_,d,m,g);return g?(this.bitmap=v,this.nodes=b,this):new BitmapIndexedNode(t,v,b)},HashArrayMapNode.prototype.get=function(t,e,r,n){void 0===e&&(e=hash(r));var i=(0===t?e:e>>>t)&u,o=this.nodes[i];return o?o.get(t+a,e,r,n):n},HashArrayMapNode.prototype.update=function(t,e,r,n,i,o,s){void 0===r&&(r=hash(n));var f=(0===e?r:r>>>e)&u,l=i===c,h=this.nodes,p=h[f];if(l&&!p)return this;var d=updateNode(p,t,e+a,r,n,i,o,s);if(d===p)return this;var _=this.count;if(p){if(!d&&--_0&&n=0&&t>>e&u;if(n>=this.array.length)return new VNode([],t);var i,o=0===n;if(e>0){var s=this.array[n];if((i=s&&s.removeBefore(t,e-a,r))===s&&o)return this}if(o&&!i)return this;var c=editableVNode(this,t);if(!o)for(var f=0;f>>e&u;if(i>=this.array.length)return this;if(e>0){var o=this.array[i];if((n=o&&o.removeAfter(t,e-a,r))===o&&i===this.array.length-1)return this}var s=editableVNode(this,t);return s.array.splice(i+1),n&&(s.array[i]=n),s};var J,tt,et={};function iterateList(t,e){var r=t._origin,n=t._capacity,i=getTailOffset(n),o=t._tail;return iterateNodeOrLeaf(t._root,t._level,0);function iterateNodeOrLeaf(t,e,r){return 0===e?iterateLeaf(t,r):iterateNode(t,e,r)}function iterateLeaf(t,a){var u=a===i?o&&o.array:t&&t.array,c=a>r?0:r-a,f=n-a;return f>s&&(f=s),function(){if(c===f)return et;var t=e?--f:c++;return u&&u[t]}}function iterateNode(t,i,o){var u,c=t&&t.array,f=o>r?0:r-o>>i,l=1+(n-o>>i);return l>s&&(l=s),function(){for(;;){if(u){var t=u();if(t!==et)return t;u=null}if(f===l)return et;var r=e?--l:f++;u=iterateNodeOrLeaf(c&&c[r],i-a,o+(r<=t.size||e<0)return t.withMutations((function(t){e<0?setListBounds(t,e).set(0,r):setListBounds(t,0,e+1).set(e,r)}));e+=t._origin;var n=t._tail,i=t._root,o=MakeRef(l);return e>=getTailOffset(t._capacity)?n=updateVNode(n,t.__ownerID,0,e,r,o):i=updateVNode(i,t.__ownerID,t._level,e,r,o),o.value?t.__ownerID?(t._root=i,t._tail=n,t.__hash=void 0,t.__altered=!0,t):makeList(t._origin,t._capacity,t._level,i,n):t}function updateVNode(t,e,r,n,i,o){var s,c=n>>>r&u,f=t&&c0){var l=t&&t.array[c],h=updateVNode(l,e,r-a,n,i,o);return h===l?t:((s=editableVNode(t,e)).array[c]=h,s)}return f&&t.array[c]===i?t:(SetRef(o),s=editableVNode(t,e),void 0===i&&c===s.array.length-1?s.array.pop():s.array[c]=i,s)}function editableVNode(t,e){return e&&t&&e===t.ownerID?t:new VNode(t?t.array.slice():[],e)}function listNodeFor(t,e){if(e>=getTailOffset(t._capacity))return t._tail;if(e<1<0;)r=r.array[e>>>n&u],n-=a;return r}}function setListBounds(t,e,r){void 0!==e&&(e|=0),void 0!==r&&(r|=0);var n=t.__ownerID||new OwnerID,i=t._origin,o=t._capacity,s=i+e,c=void 0===r?o:r<0?o+r:i+r;if(s===i&&c===o)return t;if(s>=c)return t.clear();for(var f=t._level,l=t._root,h=0;s+h<0;)l=new VNode(l&&l.array.length?[void 0,l]:[],n),h+=1<<(f+=a);h&&(s+=h,i+=h,c+=h,o+=h);for(var p=getTailOffset(o),d=getTailOffset(c);d>=1<p?new VNode([],n):_;if(_&&d>p&&sa;g-=a){var v=p>>>g&u;m=m.array[v]=editableVNode(m.array[v],n)}m.array[p>>>a&u]=_}if(c=d)s-=d,c-=d,f=a,l=null,y=y&&y.removeBefore(n,0,s);else if(s>i||d>>f&u;if(b!==d>>>f&u)break;b&&(h+=(1<i&&(l=l.removeBefore(n,f,s-h)),l&&di&&(i=s.size),isIterable(a)||(s=s.map((function(t){return fromJS(t)}))),n.push(s)}return i>t.size&&(t=t.setSize(i)),mergeIntoCollectionWith(t,e,n)}function getTailOffset(t){return t>>a<=s&&a.size>=2*o.size?(n=(i=a.filter((function(t,e){return void 0!==t&&u!==e}))).toKeyedSeq().map((function(t){return t[0]})).flip().toMap(),t.__ownerID&&(n.__ownerID=i.__ownerID=t.__ownerID)):(n=o.remove(e),i=u===a.size-1?a.pop():a.set(u,void 0))}else if(f){if(r===a.get(u)[1])return t;n=o,i=a.set(u,[e,r])}else n=o.set(e,a.size),i=a.set(a.size,[e,r]);return t.__ownerID?(t.size=n.size,t._map=n,t._list=i,t.__hash=void 0,t):makeOrderedMap(n,i)}function ToKeyedSequence(t,e){this._iter=t,this._useKeys=e,this.size=t.size}function ToIndexedSequence(t){this._iter=t,this.size=t.size}function ToSetSequence(t){this._iter=t,this.size=t.size}function FromEntriesSequence(t){this._iter=t,this.size=t.size}function flipFactory(t){var e=makeSequence(t);return e._iter=t,e.size=t.size,e.flip=function(){return t},e.reverse=function(){var e=t.reverse.apply(this);return e.flip=function(){return t.reverse()},e},e.has=function(e){return t.includes(e)},e.includes=function(e){return t.has(e)},e.cacheResult=cacheResultThrough,e.__iterateUncached=function(e,r){var n=this;return t.__iterate((function(t,r){return!1!==e(r,t,n)}),r)},e.__iteratorUncached=function(e,r){if(e===d){var n=t.__iterator(e,r);return new Iterator((function(){var t=n.next();if(!t.done){var e=t.value[0];t.value[0]=t.value[1],t.value[1]=e}return t}))}return t.__iterator(e===p?h:p,r)},e}function mapFactory(t,e,r){var n=makeSequence(t);return n.size=t.size,n.has=function(e){return t.has(e)},n.get=function(n,i){var o=t.get(n,c);return o===c?i:e.call(r,o,n,t)},n.__iterateUncached=function(n,i){var o=this;return t.__iterate((function(t,i,a){return!1!==n(e.call(r,t,i,a),i,o)}),i)},n.__iteratorUncached=function(n,i){var o=t.__iterator(d,i);return new Iterator((function(){var i=o.next();if(i.done)return i;var a=i.value,s=a[0];return iteratorValue(n,s,e.call(r,a[1],s,t),i)}))},n}function reverseFactory(t,e){var r=makeSequence(t);return r._iter=t,r.size=t.size,r.reverse=function(){return t},t.flip&&(r.flip=function(){var e=flipFactory(t);return e.reverse=function(){return t.flip()},e}),r.get=function(r,n){return t.get(e?r:-1-r,n)},r.has=function(r){return t.has(e?r:-1-r)},r.includes=function(e){return t.includes(e)},r.cacheResult=cacheResultThrough,r.__iterate=function(e,r){var n=this;return t.__iterate((function(t,r){return e(t,r,n)}),!r)},r.__iterator=function(e,r){return t.__iterator(e,!r)},r}function filterFactory(t,e,r,n){var i=makeSequence(t);return n&&(i.has=function(n){var i=t.get(n,c);return i!==c&&!!e.call(r,i,n,t)},i.get=function(n,i){var o=t.get(n,c);return o!==c&&e.call(r,o,n,t)?o:i}),i.__iterateUncached=function(i,o){var a=this,s=0;return t.__iterate((function(t,o,u){if(e.call(r,t,o,u))return s++,i(t,n?o:s-1,a)}),o),s},i.__iteratorUncached=function(i,o){var a=t.__iterator(d,o),s=0;return new Iterator((function(){for(;;){var o=a.next();if(o.done)return o;var u=o.value,c=u[0],f=u[1];if(e.call(r,f,c,t))return iteratorValue(i,n?c:s++,f,o)}}))},i}function countByFactory(t,e,r){var n=Map().asMutable();return t.__iterate((function(i,o){n.update(e.call(r,i,o,t),0,(function(t){return t+1}))})),n.asImmutable()}function groupByFactory(t,e,r){var n=isKeyed(t),i=(isOrdered(t)?OrderedMap():Map()).asMutable();t.__iterate((function(o,a){i.update(e.call(r,o,a,t),(function(t){return(t=t||[]).push(n?[a,o]:o),t}))}));var o=iterableClass(t);return i.map((function(e){return reify(t,o(e))}))}function sliceFactory(t,e,r,n){var i=t.size;if(void 0!==e&&(e|=0),void 0!==r&&(r===1/0?r=i:r|=0),wholeSlice(e,r,i))return t;var o=resolveBegin(e,i),a=resolveEnd(r,i);if(o!=o||a!=a)return sliceFactory(t.toSeq().cacheResult(),e,r,n);var s,u=a-o;u==u&&(s=u<0?0:u);var c=makeSequence(t);return c.size=0===s?s:t.size&&s||void 0,!n&&isSeq(t)&&s>=0&&(c.get=function(e,r){return(e=wrapIndex(this,e))>=0&&es)return iteratorDone();var t=i.next();return n||e===p?t:iteratorValue(e,u-1,e===h?void 0:t.value[1],t)}))},c}function takeWhileFactory(t,e,r){var n=makeSequence(t);return n.__iterateUncached=function(n,i){var o=this;if(i)return this.cacheResult().__iterate(n,i);var a=0;return t.__iterate((function(t,i,s){return e.call(r,t,i,s)&&++a&&n(t,i,o)})),a},n.__iteratorUncached=function(n,i){var o=this;if(i)return this.cacheResult().__iterator(n,i);var a=t.__iterator(d,i),s=!0;return new Iterator((function(){if(!s)return iteratorDone();var t=a.next();if(t.done)return t;var i=t.value,u=i[0],c=i[1];return e.call(r,c,u,o)?n===d?t:iteratorValue(n,u,c,t):(s=!1,iteratorDone())}))},n}function skipWhileFactory(t,e,r,n){var i=makeSequence(t);return i.__iterateUncached=function(i,o){var a=this;if(o)return this.cacheResult().__iterate(i,o);var s=!0,u=0;return t.__iterate((function(t,o,c){if(!s||!(s=e.call(r,t,o,c)))return u++,i(t,n?o:u-1,a)})),u},i.__iteratorUncached=function(i,o){var a=this;if(o)return this.cacheResult().__iterator(i,o);var s=t.__iterator(d,o),u=!0,c=0;return new Iterator((function(){var t,o,f;do{if((t=s.next()).done)return n||i===p?t:iteratorValue(i,c++,i===h?void 0:t.value[1],t);var l=t.value;o=l[0],f=l[1],u&&(u=e.call(r,f,o,a))}while(u);return i===d?t:iteratorValue(i,o,f,t)}))},i}function concatFactory(t,e){var r=isKeyed(t),n=[t].concat(e).map((function(t){return isIterable(t)?r&&(t=KeyedIterable(t)):t=r?keyedSeqFromValue(t):indexedSeqFromValue(Array.isArray(t)?t:[t]),t})).filter((function(t){return 0!==t.size}));if(0===n.length)return t;if(1===n.length){var i=n[0];if(i===t||r&&isKeyed(i)||isIndexed(t)&&isIndexed(i))return i}var o=new ArraySeq(n);return r?o=o.toKeyedSeq():isIndexed(t)||(o=o.toSetSeq()),(o=o.flatten(!0)).size=n.reduce((function(t,e){if(void 0!==t){var r=e.size;if(void 0!==r)return t+r}}),0),o}function flattenFactory(t,e,r){var n=makeSequence(t);return n.__iterateUncached=function(n,i){var o=0,a=!1;function flatDeep(t,s){var u=this;t.__iterate((function(t,i){return(!e||s0}function zipWithFactory(t,e,r){var n=makeSequence(t);return n.size=new ArraySeq(r).map((function(t){return t.size})).min(),n.__iterate=function(t,e){for(var r,n=this.__iterator(p,e),i=0;!(r=n.next()).done&&!1!==t(r.value,i++,this););return i},n.__iteratorUncached=function(t,n){var i=r.map((function(t){return t=Iterable(t),getIterator(n?t.reverse():t)})),o=0,a=!1;return new Iterator((function(){var r;return a||(r=i.map((function(t){return t.next()})),a=r.some((function(t){return t.done}))),a?iteratorDone():iteratorValue(t,o++,e.apply(null,r.map((function(t){return t.value}))))}))},n}function reify(t,e){return isSeq(t)?e:t.constructor(e)}function validateEntry(t){if(t!==Object(t))throw new TypeError("Expected [K, V] tuple: "+t)}function resolveSize(t){return assertNotInfinite(t.size),ensureSize(t)}function iterableClass(t){return isKeyed(t)?KeyedIterable:isIndexed(t)?IndexedIterable:SetIterable}function makeSequence(t){return Object.create((isKeyed(t)?KeyedSeq:isIndexed(t)?IndexedSeq:SetSeq).prototype)}function cacheResultThrough(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):Seq.prototype.cacheResult.call(this)}function defaultComparator(t,e){return t>e?1:t=0;r--)e={value:arguments[r],next:e};return this.__ownerID?(this.size=t,this._head=e,this.__hash=void 0,this.__altered=!0,this):makeStack(t,e)},Stack.prototype.pushAll=function(t){if(0===(t=IndexedIterable(t)).size)return this;assertNotInfinite(t.size);var e=this.size,r=this._head;return t.reverse().forEach((function(t){e++,r={value:t,next:r}})),this.__ownerID?(this.size=e,this._head=r,this.__hash=void 0,this.__altered=!0,this):makeStack(e,r)},Stack.prototype.pop=function(){return this.slice(1)},Stack.prototype.unshift=function(){return this.push.apply(this,arguments)},Stack.prototype.unshiftAll=function(t){return this.pushAll(t)},Stack.prototype.shift=function(){return this.pop.apply(this,arguments)},Stack.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):emptyStack()},Stack.prototype.slice=function(t,e){if(wholeSlice(t,e,this.size))return this;var r=resolveBegin(t,this.size);if(resolveEnd(e,this.size)!==this.size)return IndexedCollection.prototype.slice.call(this,t,e);for(var n=this.size-r,i=this._head;r--;)i=i.next;return this.__ownerID?(this.size=n,this._head=i,this.__hash=void 0,this.__altered=!0,this):makeStack(n,i)},Stack.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?makeStack(this.size,this._head,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},Stack.prototype.__iterate=function(t,e){if(e)return this.reverse().__iterate(t);for(var r=0,n=this._head;n&&!1!==t(n.value,r++,this);)n=n.next;return r},Stack.prototype.__iterator=function(t,e){if(e)return this.reverse().__iterator(t);var r=0,n=this._head;return new Iterator((function(){if(n){var e=n.value;return n=n.next,iteratorValue(t,r++,e)}return iteratorDone()}))},Stack.isStack=isStack;var ut,ct="@@__IMMUTABLE_STACK__@@",lt=Stack.prototype;function makeStack(t,e,r,n){var i=Object.create(lt);return i.size=t,i._head=e,i.__ownerID=r,i.__hash=n,i.__altered=!1,i}function emptyStack(){return ut||(ut=makeStack(0))}function mixin(t,e){var keyCopier=function(r){t.prototype[r]=e[r]};return Object.keys(e).forEach(keyCopier),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(e).forEach(keyCopier),t}lt[ct]=!0,lt.withMutations=K.withMutations,lt.asMutable=K.asMutable,lt.asImmutable=K.asImmutable,lt.wasAltered=K.wasAltered,Iterable.Iterator=Iterator,mixin(Iterable,{toArray:function(){assertNotInfinite(this.size);var t=new Array(this.size||0);return this.valueSeq().__iterate((function(e,r){t[r]=e})),t},toIndexedSeq:function(){return new ToIndexedSequence(this)},toJS:function(){return this.toSeq().map((function(t){return t&&"function"==typeof t.toJS?t.toJS():t})).__toJS()},toJSON:function(){return this.toSeq().map((function(t){return t&&"function"==typeof t.toJSON?t.toJSON():t})).__toJS()},toKeyedSeq:function(){return new ToKeyedSequence(this,!0)},toMap:function(){return Map(this.toKeyedSeq())},toObject:function(){assertNotInfinite(this.size);var t={};return this.__iterate((function(e,r){t[r]=e})),t},toOrderedMap:function(){return OrderedMap(this.toKeyedSeq())},toOrderedSet:function(){return OrderedSet(isKeyed(this)?this.valueSeq():this)},toSet:function(){return Set(isKeyed(this)?this.valueSeq():this)},toSetSeq:function(){return new ToSetSequence(this)},toSeq:function(){return isIndexed(this)?this.toIndexedSeq():isKeyed(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Stack(isKeyed(this)?this.valueSeq():this)},toList:function(){return List(isKeyed(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(t,e){return 0===this.size?t+e:t+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+e},concat:function(){return reify(this,concatFactory(this,t.call(arguments,0)))},includes:function(t){return this.some((function(e){return is(e,t)}))},entries:function(){return this.__iterator(d)},every:function(t,e){assertNotInfinite(this.size);var r=!0;return this.__iterate((function(n,i,o){if(!t.call(e,n,i,o))return r=!1,!1})),r},filter:function(t,e){return reify(this,filterFactory(this,t,e,!0))},find:function(t,e,r){var n=this.findEntry(t,e);return n?n[1]:r},forEach:function(t,e){return assertNotInfinite(this.size),this.__iterate(e?t.bind(e):t)},join:function(t){assertNotInfinite(this.size),t=void 0!==t?""+t:",";var e="",r=!0;return this.__iterate((function(n){r?r=!1:e+=t,e+=null!=n?n.toString():""})),e},keys:function(){return this.__iterator(h)},map:function(t,e){return reify(this,mapFactory(this,t,e))},reduce:function(t,e,r){var n,i;return assertNotInfinite(this.size),arguments.length<2?i=!0:n=e,this.__iterate((function(e,o,a){i?(i=!1,n=e):n=t.call(r,n,e,o,a)})),n},reduceRight:function(t,e,r){var n=this.toKeyedSeq().reverse();return n.reduce.apply(n,arguments)},reverse:function(){return reify(this,reverseFactory(this,!0))},slice:function(t,e){return reify(this,sliceFactory(this,t,e,!0))},some:function(t,e){return!this.every(not(t),e)},sort:function(t){return reify(this,sortFactory(this,t))},values:function(){return this.__iterator(p)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(t,e){return ensureSize(t?this.toSeq().filter(t,e):this)},countBy:function(t,e){return countByFactory(this,t,e)},equals:function(t){return deepEqual(this,t)},entrySeq:function(){var t=this;if(t._cache)return new ArraySeq(t._cache);var e=t.toSeq().map(entryMapper).toIndexedSeq();return e.fromEntrySeq=function(){return t.toSeq()},e},filterNot:function(t,e){return this.filter(not(t),e)},findEntry:function(t,e,r){var n=r;return this.__iterate((function(r,i,o){if(t.call(e,r,i,o))return n=[i,r],!1})),n},findKey:function(t,e){var r=this.findEntry(t,e);return r&&r[0]},findLast:function(t,e,r){return this.toKeyedSeq().reverse().find(t,e,r)},findLastEntry:function(t,e,r){return this.toKeyedSeq().reverse().findEntry(t,e,r)},findLastKey:function(t,e){return this.toKeyedSeq().reverse().findKey(t,e)},first:function(){return this.find(returnTrue)},flatMap:function(t,e){return reify(this,flatMapFactory(this,t,e))},flatten:function(t){return reify(this,flattenFactory(this,t,!0))},fromEntrySeq:function(){return new FromEntriesSequence(this)},get:function(t,e){return this.find((function(e,r){return is(r,t)}),void 0,e)},getIn:function(t,e){for(var r,n=this,i=forceIterator(t);!(r=i.next()).done;){var o=r.value;if((n=n&&n.get?n.get(o,c):c)===c)return e}return n},groupBy:function(t,e){return groupByFactory(this,t,e)},has:function(t){return this.get(t,c)!==c},hasIn:function(t){return this.getIn(t,c)!==c},isSubset:function(t){return t="function"==typeof t.includes?t:Iterable(t),this.every((function(e){return t.includes(e)}))},isSuperset:function(t){return(t="function"==typeof t.isSubset?t:Iterable(t)).isSubset(this)},keyOf:function(t){return this.findKey((function(e){return is(e,t)}))},keySeq:function(){return this.toSeq().map(keyMapper).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(t){return this.toKeyedSeq().reverse().keyOf(t)},max:function(t){return maxFactory(this,t)},maxBy:function(t,e){return maxFactory(this,e,t)},min:function(t){return maxFactory(this,t?neg(t):defaultNegComparator)},minBy:function(t,e){return maxFactory(this,e?neg(e):defaultNegComparator,t)},rest:function(){return this.slice(1)},skip:function(t){return this.slice(Math.max(0,t))},skipLast:function(t){return reify(this,this.toSeq().reverse().skip(t).reverse())},skipWhile:function(t,e){return reify(this,skipWhileFactory(this,t,e,!0))},skipUntil:function(t,e){return this.skipWhile(not(t),e)},sortBy:function(t,e){return reify(this,sortFactory(this,e,t))},take:function(t){return this.slice(0,Math.max(0,t))},takeLast:function(t){return reify(this,this.toSeq().reverse().take(t).reverse())},takeWhile:function(t,e){return reify(this,takeWhileFactory(this,t,e))},takeUntil:function(t,e){return this.takeWhile(not(t),e)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=hashIterable(this))}});var ht=Iterable.prototype;ht[e]=!0,ht[m]=ht.values,ht.__toJS=ht.toArray,ht.__toStringMapper=quoteString,ht.inspect=ht.toSource=function(){return this.toString()},ht.chain=ht.flatMap,ht.contains=ht.includes,mixin(KeyedIterable,{flip:function(){return reify(this,flipFactory(this))},mapEntries:function(t,e){var r=this,n=0;return reify(this,this.toSeq().map((function(i,o){return t.call(e,[o,i],n++,r)})).fromEntrySeq())},mapKeys:function(t,e){var r=this;return reify(this,this.toSeq().flip().map((function(n,i){return t.call(e,n,i,r)})).flip())}});var pt=KeyedIterable.prototype;function keyMapper(t,e){return e}function entryMapper(t,e){return[e,t]}function not(t){return function(){return!t.apply(this,arguments)}}function neg(t){return function(){return-t.apply(this,arguments)}}function quoteString(t){return"string"==typeof t?JSON.stringify(t):String(t)}function defaultZipper(){return arrCopy(arguments)}function defaultNegComparator(t,e){return te?-1:0}function hashIterable(t){if(t.size===1/0)return 0;var e=isOrdered(t),r=isKeyed(t),n=e?1:0;return murmurHashOfSize(t.__iterate(r?e?function(t,e){n=31*n+hashMerge(hash(t),hash(e))|0}:function(t,e){n=n+hashMerge(hash(t),hash(e))|0}:e?function(t){n=31*n+hash(t)|0}:function(t){n=n+hash(t)|0}),n)}function murmurHashOfSize(t,e){return e=I(e,3432918353),e=I(e<<15|e>>>-15,461845907),e=I(e<<13|e>>>-13,5),e=I((e=(e+3864292196|0)^t)^e>>>16,2246822507),e=smi((e=I(e^e>>>13,3266489909))^e>>>16)}function hashMerge(t,e){return t^e+2654435769+(t<<6)+(t>>2)|0}return pt[r]=!0,pt[m]=ht.entries,pt.__toJS=ht.toObject,pt.__toStringMapper=function(t,e){return JSON.stringify(e)+": "+quoteString(t)},mixin(IndexedIterable,{toKeyedSeq:function(){return new ToKeyedSequence(this,!1)},filter:function(t,e){return reify(this,filterFactory(this,t,e,!1))},findIndex:function(t,e){var r=this.findEntry(t,e);return r?r[0]:-1},indexOf:function(t){var e=this.keyOf(t);return void 0===e?-1:e},lastIndexOf:function(t){var e=this.lastKeyOf(t);return void 0===e?-1:e},reverse:function(){return reify(this,reverseFactory(this,!1))},slice:function(t,e){return reify(this,sliceFactory(this,t,e,!1))},splice:function(t,e){var r=arguments.length;if(e=Math.max(0|e,0),0===r||2===r&&!e)return this;t=resolveBegin(t,t<0?this.count():this.size);var n=this.slice(0,t);return reify(this,1===r?n:n.concat(arrCopy(arguments,2),this.slice(t+e)))},findLastIndex:function(t,e){var r=this.findLastEntry(t,e);return r?r[0]:-1},first:function(){return this.get(0)},flatten:function(t){return reify(this,flattenFactory(this,t,!1))},get:function(t,e){return(t=wrapIndex(this,t))<0||this.size===1/0||void 0!==this.size&&t>this.size?e:this.find((function(e,r){return r===t}),void 0,e)},has:function(t){return(t=wrapIndex(this,t))>=0&&(void 0!==this.size?this.size===1/0||t{"function"==typeof Object.create?t.exports=function inherits(t,e){e&&(t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}))}:t.exports=function inherits(t,e){if(e){t.super_=e;var TempCtor=function(){};TempCtor.prototype=e.prototype,t.prototype=new TempCtor,t.prototype.constructor=t}}},5580:(t,e,r)=>{var n=r(6110)(r(9325),"DataView");t.exports=n},1549:(t,e,r)=>{var n=r(2032),i=r(3862),o=r(6721),a=r(2749),s=r(5749);function Hash(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e{var n=r(3702),i=r(80),o=r(4739),a=r(8655),s=r(1175);function ListCache(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e{var n=r(6110)(r(9325),"Map");t.exports=n},3661:(t,e,r)=>{var n=r(3040),i=r(7670),o=r(289),a=r(4509),s=r(2949);function MapCache(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e{var n=r(6110)(r(9325),"Promise");t.exports=n},6545:(t,e,r)=>{var n=r(6110)(r(9325),"Set");t.exports=n},8859:(t,e,r)=>{var n=r(3661),i=r(1380),o=r(1459);function SetCache(t){var e=-1,r=null==t?0:t.length;for(this.__data__=new n;++e{var n=r(79),i=r(1420),o=r(938),a=r(3605),s=r(9817),u=r(945);function Stack(t){var e=this.__data__=new n(t);this.size=e.size}Stack.prototype.clear=i,Stack.prototype.delete=o,Stack.prototype.get=a,Stack.prototype.has=s,Stack.prototype.set=u,t.exports=Stack},1873:(t,e,r)=>{var n=r(9325).Symbol;t.exports=n},7828:(t,e,r)=>{var n=r(9325).Uint8Array;t.exports=n},8303:(t,e,r)=>{var n=r(6110)(r(9325),"WeakMap");t.exports=n},9770:t=>{t.exports=function arrayFilter(t,e){for(var r=-1,n=null==t?0:t.length,i=0,o=[];++r{var n=r(8096),i=r(2428),o=r(6449),a=r(3656),s=r(361),u=r(7167),c=Object.prototype.hasOwnProperty;t.exports=function arrayLikeKeys(t,e){var r=o(t),f=!r&&i(t),l=!r&&!f&&a(t),h=!r&&!f&&!l&&u(t),p=r||f||l||h,d=p?n(t.length,String):[],_=d.length;for(var y in t)!e&&!c.call(t,y)||p&&("length"==y||l&&("offset"==y||"parent"==y)||h&&("buffer"==y||"byteLength"==y||"byteOffset"==y)||s(y,_))||d.push(y);return d}},4932:t=>{t.exports=function arrayMap(t,e){for(var r=-1,n=null==t?0:t.length,i=Array(n);++r{t.exports=function arrayPush(t,e){for(var r=-1,n=e.length,i=t.length;++r{t.exports=function arrayReduce(t,e,r,n){var i=-1,o=null==t?0:t.length;for(n&&o&&(r=t[++i]);++i{t.exports=function arraySome(t,e){for(var r=-1,n=null==t?0:t.length;++r{t.exports=function asciiToArray(t){return t.split("")}},1733:t=>{var e=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;t.exports=function asciiWords(t){return t.match(e)||[]}},6547:(t,e,r)=>{var n=r(3360),i=r(5288),o=Object.prototype.hasOwnProperty;t.exports=function assignValue(t,e,r){var a=t[e];o.call(t,e)&&i(a,r)&&(void 0!==r||e in t)||n(t,e,r)}},6025:(t,e,r)=>{var n=r(5288);t.exports=function assocIndexOf(t,e){for(var r=t.length;r--;)if(n(t[r][0],e))return r;return-1}},3360:(t,e,r)=>{var n=r(3243);t.exports=function baseAssignValue(t,e,r){"__proto__"==e&&n?n(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}},909:(t,e,r)=>{var n=r(641),i=r(8329)(n);t.exports=i},2523:t=>{t.exports=function baseFindIndex(t,e,r,n){for(var i=t.length,o=r+(n?1:-1);n?o--:++o{var n=r(3221)();t.exports=n},641:(t,e,r)=>{var n=r(6649),i=r(5950);t.exports=function baseForOwn(t,e){return t&&n(t,e,i)}},7422:(t,e,r)=>{var n=r(1769),i=r(7797);t.exports=function baseGet(t,e){for(var r=0,o=(e=n(e,t)).length;null!=t&&r{var n=r(4528),i=r(6449);t.exports=function baseGetAllKeys(t,e,r){var o=e(t);return i(t)?o:n(o,r(t))}},2552:(t,e,r)=>{var n=r(1873),i=r(659),o=r(9350),a=n?n.toStringTag:void 0;t.exports=function baseGetTag(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":a&&a in Object(t)?i(t):o(t)}},8077:t=>{t.exports=function baseHasIn(t,e){return null!=t&&e in Object(t)}},7534:(t,e,r)=>{var n=r(2552),i=r(346);t.exports=function baseIsArguments(t){return i(t)&&"[object Arguments]"==n(t)}},270:(t,e,r)=>{var n=r(7068),i=r(346);t.exports=function baseIsEqual(t,e,r,o,a){return t===e||(null==t||null==e||!i(t)&&!i(e)?t!=t&&e!=e:n(t,e,r,o,baseIsEqual,a))}},7068:(t,e,r)=>{var n=r(7217),i=r(5911),o=r(1986),a=r(689),s=r(5861),u=r(6449),c=r(3656),f=r(7167),l="[object Arguments]",h="[object Array]",p="[object Object]",d=Object.prototype.hasOwnProperty;t.exports=function baseIsEqualDeep(t,e,r,_,y,m){var g=u(t),v=u(e),b=g?h:s(t),w=v?h:s(e),I=(b=b==l?p:b)==p,x=(w=w==l?p:w)==p,B=b==w;if(B&&c(t)){if(!c(e))return!1;g=!0,I=!1}if(B&&!I)return m||(m=new n),g||f(t)?i(t,e,r,_,y,m):o(t,e,b,r,_,y,m);if(!(1&r)){var k=I&&d.call(t,"__wrapped__"),C=x&&d.call(e,"__wrapped__");if(k||C){var q=k?t.value():t,L=C?e.value():e;return m||(m=new n),y(q,L,r,_,m)}}return!!B&&(m||(m=new n),a(t,e,r,_,y,m))}},1799:(t,e,r)=>{var n=r(7217),i=r(270);t.exports=function baseIsMatch(t,e,r,o){var a=r.length,s=a,u=!o;if(null==t)return!s;for(t=Object(t);a--;){var c=r[a];if(u&&c[2]?c[1]!==t[c[0]]:!(c[0]in t))return!1}for(;++a{var n=r(1882),i=r(7296),o=r(3805),a=r(7473),s=/^\[object .+?Constructor\]$/,u=Function.prototype,c=Object.prototype,f=u.toString,l=c.hasOwnProperty,h=RegExp("^"+f.call(l).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function baseIsNative(t){return!(!o(t)||i(t))&&(n(t)?h:s).test(a(t))}},4901:(t,e,r)=>{var n=r(2552),i=r(294),o=r(346),a={};a["[object Float32Array]"]=a["[object Float64Array]"]=a["[object Int8Array]"]=a["[object Int16Array]"]=a["[object Int32Array]"]=a["[object Uint8Array]"]=a["[object Uint8ClampedArray]"]=a["[object Uint16Array]"]=a["[object Uint32Array]"]=!0,a["[object Arguments]"]=a["[object Array]"]=a["[object ArrayBuffer]"]=a["[object Boolean]"]=a["[object DataView]"]=a["[object Date]"]=a["[object Error]"]=a["[object Function]"]=a["[object Map]"]=a["[object Number]"]=a["[object Object]"]=a["[object RegExp]"]=a["[object Set]"]=a["[object String]"]=a["[object WeakMap]"]=!1,t.exports=function baseIsTypedArray(t){return o(t)&&i(t.length)&&!!a[n(t)]}},5389:(t,e,r)=>{var n=r(3663),i=r(7978),o=r(3488),a=r(6449),s=r(583);t.exports=function baseIteratee(t){return"function"==typeof t?t:null==t?o:"object"==typeof t?a(t)?i(t[0],t[1]):n(t):s(t)}},8984:(t,e,r)=>{var n=r(5527),i=r(3650),o=Object.prototype.hasOwnProperty;t.exports=function baseKeys(t){if(!n(t))return i(t);var e=[];for(var r in Object(t))o.call(t,r)&&"constructor"!=r&&e.push(r);return e}},3663:(t,e,r)=>{var n=r(1799),i=r(776),o=r(7197);t.exports=function baseMatches(t){var e=i(t);return 1==e.length&&e[0][2]?o(e[0][0],e[0][1]):function(r){return r===t||n(r,t,e)}}},7978:(t,e,r)=>{var n=r(270),i=r(8156),o=r(631),a=r(8586),s=r(756),u=r(7197),c=r(7797);t.exports=function baseMatchesProperty(t,e){return a(t)&&s(e)?u(c(t),e):function(r){var a=i(r,t);return void 0===a&&a===e?o(r,t):n(e,a,3)}}},7237:t=>{t.exports=function baseProperty(t){return function(e){return null==e?void 0:e[t]}}},7255:(t,e,r)=>{var n=r(7422);t.exports=function basePropertyDeep(t){return function(e){return n(e,t)}}},4552:t=>{t.exports=function basePropertyOf(t){return function(e){return null==t?void 0:t[e]}}},5160:t=>{t.exports=function baseSlice(t,e,r){var n=-1,i=t.length;e<0&&(e=-e>i?0:i+e),(r=r>i?i:r)<0&&(r+=i),i=e>r?0:r-e>>>0,e>>>=0;for(var o=Array(i);++n{var n=r(909);t.exports=function baseSome(t,e){var r;return n(t,(function(t,n,i){return!(r=e(t,n,i))})),!!r}},8096:t=>{t.exports=function baseTimes(t,e){for(var r=-1,n=Array(t);++r{var n=r(1873),i=r(4932),o=r(6449),a=r(4394),s=n?n.prototype:void 0,u=s?s.toString:void 0;t.exports=function baseToString(t){if("string"==typeof t)return t;if(o(t))return i(t,baseToString)+"";if(a(t))return u?u.call(t):"";var e=t+"";return"0"==e&&1/t==-Infinity?"-0":e}},4128:(t,e,r)=>{var n=r(1800),i=/^\s+/;t.exports=function baseTrim(t){return t?t.slice(0,n(t)+1).replace(i,""):t}},7301:t=>{t.exports=function baseUnary(t){return function(e){return t(e)}}},1234:t=>{t.exports=function baseZipObject(t,e,r){for(var n=-1,i=t.length,o=e.length,a={};++n{t.exports=function cacheHas(t,e){return t.has(e)}},1769:(t,e,r)=>{var n=r(6449),i=r(8586),o=r(1802),a=r(3222);t.exports=function castPath(t,e){return n(t)?t:i(t,e)?[t]:o(a(t))}},8754:(t,e,r)=>{var n=r(5160);t.exports=function castSlice(t,e,r){var i=t.length;return r=void 0===r?i:r,!e&&r>=i?t:n(t,e,r)}},5481:(t,e,r)=>{var n=r(9325)["__core-js_shared__"];t.exports=n},8329:(t,e,r)=>{var n=r(4894);t.exports=function createBaseEach(t,e){return function(r,i){if(null==r)return r;if(!n(r))return t(r,i);for(var o=r.length,a=e?o:-1,s=Object(r);(e?a--:++a{t.exports=function createBaseFor(t){return function(e,r,n){for(var i=-1,o=Object(e),a=n(e),s=a.length;s--;){var u=a[t?s:++i];if(!1===r(o[u],u,o))break}return e}}},2507:(t,e,r)=>{var n=r(8754),i=r(9698),o=r(3912),a=r(3222);t.exports=function createCaseFirst(t){return function(e){e=a(e);var r=i(e)?o(e):void 0,s=r?r[0]:e.charAt(0),u=r?n(r,1).join(""):e.slice(1);return s[t]()+u}}},5539:(t,e,r)=>{var n=r(882),i=r(828),o=r(6645),a=RegExp("['’]","g");t.exports=function createCompounder(t){return function(e){return n(o(i(e).replace(a,"")),t,"")}}},2006:(t,e,r)=>{var n=r(5389),i=r(4894),o=r(5950);t.exports=function createFind(t){return function(e,r,a){var s=Object(e);if(!i(e)){var u=n(r,3);e=o(e),r=function(t){return u(s[t],t,s)}}var c=t(e,r,a);return c>-1?s[u?e[c]:c]:void 0}}},4647:(t,e,r)=>{var n=r(4552)({À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"});t.exports=n},3243:(t,e,r)=>{var n=r(6110),i=function(){try{var t=n(Object,"defineProperty");return t({},"",{}),t}catch(t){}}();t.exports=i},5911:(t,e,r)=>{var n=r(8859),i=r(4248),o=r(9219);t.exports=function equalArrays(t,e,r,a,s,u){var c=1&r,f=t.length,l=e.length;if(f!=l&&!(c&&l>f))return!1;var h=u.get(t),p=u.get(e);if(h&&p)return h==e&&p==t;var d=-1,_=!0,y=2&r?new n:void 0;for(u.set(t,e),u.set(e,t);++d{var n=r(1873),i=r(7828),o=r(5288),a=r(5911),s=r(317),u=r(4247),c=n?n.prototype:void 0,f=c?c.valueOf:void 0;t.exports=function equalByTag(t,e,r,n,c,l,h){switch(r){case"[object DataView]":if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case"[object ArrayBuffer]":return!(t.byteLength!=e.byteLength||!l(new i(t),new i(e)));case"[object Boolean]":case"[object Date]":case"[object Number]":return o(+t,+e);case"[object Error]":return t.name==e.name&&t.message==e.message;case"[object RegExp]":case"[object String]":return t==e+"";case"[object Map]":var p=s;case"[object Set]":var d=1&n;if(p||(p=u),t.size!=e.size&&!d)return!1;var _=h.get(t);if(_)return _==e;n|=2,h.set(t,e);var y=a(p(t),p(e),n,c,l,h);return h.delete(t),y;case"[object Symbol]":if(f)return f.call(t)==f.call(e)}return!1}},689:(t,e,r)=>{var n=r(2),i=Object.prototype.hasOwnProperty;t.exports=function equalObjects(t,e,r,o,a,s){var u=1&r,c=n(t),f=c.length;if(f!=n(e).length&&!u)return!1;for(var l=f;l--;){var h=c[l];if(!(u?h in e:i.call(e,h)))return!1}var p=s.get(t),d=s.get(e);if(p&&d)return p==e&&d==t;var _=!0;s.set(t,e),s.set(e,t);for(var y=u;++l{var n="object"==typeof r.g&&r.g&&r.g.Object===Object&&r.g;t.exports=n},2:(t,e,r)=>{var n=r(2199),i=r(4664),o=r(5950);t.exports=function getAllKeys(t){return n(t,o,i)}},2651:(t,e,r)=>{var n=r(4218);t.exports=function getMapData(t,e){var r=t.__data__;return n(e)?r["string"==typeof e?"string":"hash"]:r.map}},776:(t,e,r)=>{var n=r(756),i=r(5950);t.exports=function getMatchData(t){for(var e=i(t),r=e.length;r--;){var o=e[r],a=t[o];e[r]=[o,a,n(a)]}return e}},6110:(t,e,r)=>{var n=r(5083),i=r(392);t.exports=function getNative(t,e){var r=i(t,e);return n(r)?r:void 0}},659:(t,e,r)=>{var n=r(1873),i=Object.prototype,o=i.hasOwnProperty,a=i.toString,s=n?n.toStringTag:void 0;t.exports=function getRawTag(t){var e=o.call(t,s),r=t[s];try{t[s]=void 0;var n=!0}catch(t){}var i=a.call(t);return n&&(e?t[s]=r:delete t[s]),i}},4664:(t,e,r)=>{var n=r(9770),i=r(3345),o=Object.prototype.propertyIsEnumerable,a=Object.getOwnPropertySymbols,s=a?function(t){return null==t?[]:(t=Object(t),n(a(t),(function(e){return o.call(t,e)})))}:i;t.exports=s},5861:(t,e,r)=>{var n=r(5580),i=r(8223),o=r(2804),a=r(6545),s=r(8303),u=r(2552),c=r(7473),f="[object Map]",l="[object Promise]",h="[object Set]",p="[object WeakMap]",d="[object DataView]",_=c(n),y=c(i),m=c(o),g=c(a),v=c(s),b=u;(n&&b(new n(new ArrayBuffer(1)))!=d||i&&b(new i)!=f||o&&b(o.resolve())!=l||a&&b(new a)!=h||s&&b(new s)!=p)&&(b=function(t){var e=u(t),r="[object Object]"==e?t.constructor:void 0,n=r?c(r):"";if(n)switch(n){case _:return d;case y:return f;case m:return l;case g:return h;case v:return p}return e}),t.exports=b},392:t=>{t.exports=function getValue(t,e){return null==t?void 0:t[e]}},9326:(t,e,r)=>{var n=r(1769),i=r(2428),o=r(6449),a=r(361),s=r(294),u=r(7797);t.exports=function hasPath(t,e,r){for(var c=-1,f=(e=n(e,t)).length,l=!1;++c{var e=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");t.exports=function hasUnicode(t){return e.test(t)}},5434:t=>{var e=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;t.exports=function hasUnicodeWord(t){return e.test(t)}},2032:(t,e,r)=>{var n=r(1042);t.exports=function hashClear(){this.__data__=n?n(null):{},this.size=0}},3862:t=>{t.exports=function hashDelete(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}},6721:(t,e,r)=>{var n=r(1042),i=Object.prototype.hasOwnProperty;t.exports=function hashGet(t){var e=this.__data__;if(n){var r=e[t];return"__lodash_hash_undefined__"===r?void 0:r}return i.call(e,t)?e[t]:void 0}},2749:(t,e,r)=>{var n=r(1042),i=Object.prototype.hasOwnProperty;t.exports=function hashHas(t){var e=this.__data__;return n?void 0!==e[t]:i.call(e,t)}},5749:(t,e,r)=>{var n=r(1042);t.exports=function hashSet(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=n&&void 0===e?"__lodash_hash_undefined__":e,this}},361:t=>{var e=/^(?:0|[1-9]\d*)$/;t.exports=function isIndex(t,r){var n=typeof t;return!!(r=null==r?9007199254740991:r)&&("number"==n||"symbol"!=n&&e.test(t))&&t>-1&&t%1==0&&t{var n=r(5288),i=r(4894),o=r(361),a=r(3805);t.exports=function isIterateeCall(t,e,r){if(!a(r))return!1;var s=typeof e;return!!("number"==s?i(r)&&o(e,r.length):"string"==s&&e in r)&&n(r[e],t)}},8586:(t,e,r)=>{var n=r(6449),i=r(4394),o=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;t.exports=function isKey(t,e){if(n(t))return!1;var r=typeof t;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=t&&!i(t))||(a.test(t)||!o.test(t)||null!=e&&t in Object(e))}},4218:t=>{t.exports=function isKeyable(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},7296:(t,e,r)=>{var n,i=r(5481),o=(n=/[^.]+$/.exec(i&&i.keys&&i.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"";t.exports=function isMasked(t){return!!o&&o in t}},5527:t=>{var e=Object.prototype;t.exports=function isPrototype(t){var r=t&&t.constructor;return t===("function"==typeof r&&r.prototype||e)}},756:(t,e,r)=>{var n=r(3805);t.exports=function isStrictComparable(t){return t==t&&!n(t)}},3702:t=>{t.exports=function listCacheClear(){this.__data__=[],this.size=0}},80:(t,e,r)=>{var n=r(6025),i=Array.prototype.splice;t.exports=function listCacheDelete(t){var e=this.__data__,r=n(e,t);return!(r<0)&&(r==e.length-1?e.pop():i.call(e,r,1),--this.size,!0)}},4739:(t,e,r)=>{var n=r(6025);t.exports=function listCacheGet(t){var e=this.__data__,r=n(e,t);return r<0?void 0:e[r][1]}},8655:(t,e,r)=>{var n=r(6025);t.exports=function listCacheHas(t){return n(this.__data__,t)>-1}},1175:(t,e,r)=>{var n=r(6025);t.exports=function listCacheSet(t,e){var r=this.__data__,i=n(r,t);return i<0?(++this.size,r.push([t,e])):r[i][1]=e,this}},3040:(t,e,r)=>{var n=r(1549),i=r(79),o=r(8223);t.exports=function mapCacheClear(){this.size=0,this.__data__={hash:new n,map:new(o||i),string:new n}}},7670:(t,e,r)=>{var n=r(2651);t.exports=function mapCacheDelete(t){var e=n(this,t).delete(t);return this.size-=e?1:0,e}},289:(t,e,r)=>{var n=r(2651);t.exports=function mapCacheGet(t){return n(this,t).get(t)}},4509:(t,e,r)=>{var n=r(2651);t.exports=function mapCacheHas(t){return n(this,t).has(t)}},2949:(t,e,r)=>{var n=r(2651);t.exports=function mapCacheSet(t,e){var r=n(this,t),i=r.size;return r.set(t,e),this.size+=r.size==i?0:1,this}},317:t=>{t.exports=function mapToArray(t){var e=-1,r=Array(t.size);return t.forEach((function(t,n){r[++e]=[n,t]})),r}},7197:t=>{t.exports=function matchesStrictComparable(t,e){return function(r){return null!=r&&(r[t]===e&&(void 0!==e||t in Object(r)))}}},2224:(t,e,r)=>{var n=r(104);t.exports=function memoizeCapped(t){var e=n(t,(function(t){return 500===r.size&&r.clear(),t})),r=e.cache;return e}},1042:(t,e,r)=>{var n=r(6110)(Object,"create");t.exports=n},3650:(t,e,r)=>{var n=r(4335)(Object.keys,Object);t.exports=n},6009:(t,e,r)=>{t=r.nmd(t);var n=r(4840),i=e&&!e.nodeType&&e,o=i&&t&&!t.nodeType&&t,a=o&&o.exports===i&&n.process,s=function(){try{var t=o&&o.require&&o.require("util").types;return t||a&&a.binding&&a.binding("util")}catch(t){}}();t.exports=s},9350:t=>{var e=Object.prototype.toString;t.exports=function objectToString(t){return e.call(t)}},4335:t=>{t.exports=function overArg(t,e){return function(r){return t(e(r))}}},9325:(t,e,r)=>{var n=r(4840),i="object"==typeof self&&self&&self.Object===Object&&self,o=n||i||Function("return this")();t.exports=o},1380:t=>{t.exports=function setCacheAdd(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this}},1459:t=>{t.exports=function setCacheHas(t){return this.__data__.has(t)}},4247:t=>{t.exports=function setToArray(t){var e=-1,r=Array(t.size);return t.forEach((function(t){r[++e]=t})),r}},1420:(t,e,r)=>{var n=r(79);t.exports=function stackClear(){this.__data__=new n,this.size=0}},938:t=>{t.exports=function stackDelete(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}},3605:t=>{t.exports=function stackGet(t){return this.__data__.get(t)}},9817:t=>{t.exports=function stackHas(t){return this.__data__.has(t)}},945:(t,e,r)=>{var n=r(79),i=r(8223),o=r(3661);t.exports=function stackSet(t,e){var r=this.__data__;if(r instanceof n){var a=r.__data__;if(!i||a.length<199)return a.push([t,e]),this.size=++r.size,this;r=this.__data__=new o(a)}return r.set(t,e),this.size=r.size,this}},3912:(t,e,r)=>{var n=r(1074),i=r(9698),o=r(2054);t.exports=function stringToArray(t){return i(t)?o(t):n(t)}},1802:(t,e,r)=>{var n=r(2224),i=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,o=/\\(\\)?/g,a=n((function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(i,(function(t,r,n,i){e.push(n?i.replace(o,"$1"):r||t)})),e}));t.exports=a},7797:(t,e,r)=>{var n=r(4394);t.exports=function toKey(t){if("string"==typeof t||n(t))return t;var e=t+"";return"0"==e&&1/t==-Infinity?"-0":e}},7473:t=>{var e=Function.prototype.toString;t.exports=function toSource(t){if(null!=t){try{return e.call(t)}catch(t){}try{return t+""}catch(t){}}return""}},1800:t=>{var e=/\s/;t.exports=function trimmedEndIndex(t){for(var r=t.length;r--&&e.test(t.charAt(r)););return r}},2054:t=>{var e="\\ud800-\\udfff",r="["+e+"]",n="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",i="\\ud83c[\\udffb-\\udfff]",o="[^"+e+"]",a="(?:\\ud83c[\\udde6-\\uddff]){2}",s="[\\ud800-\\udbff][\\udc00-\\udfff]",u="(?:"+n+"|"+i+")"+"?",c="[\\ufe0e\\ufe0f]?",f=c+u+("(?:\\u200d(?:"+[o,a,s].join("|")+")"+c+u+")*"),l="(?:"+[o+n+"?",n,a,s,r].join("|")+")",h=RegExp(i+"(?="+i+")|"+l+f,"g");t.exports=function unicodeToArray(t){return t.match(h)||[]}},2225:t=>{var e="\\ud800-\\udfff",r="\\u2700-\\u27bf",n="a-z\\xdf-\\xf6\\xf8-\\xff",i="A-Z\\xc0-\\xd6\\xd8-\\xde",o="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",a="["+o+"]",s="\\d+",u="["+r+"]",c="["+n+"]",f="[^"+e+o+s+r+n+i+"]",l="(?:\\ud83c[\\udde6-\\uddff]){2}",h="[\\ud800-\\udbff][\\udc00-\\udfff]",p="["+i+"]",d="(?:"+c+"|"+f+")",_="(?:"+p+"|"+f+")",y="(?:['’](?:d|ll|m|re|s|t|ve))?",m="(?:['’](?:D|LL|M|RE|S|T|VE))?",g="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",v="[\\ufe0e\\ufe0f]?",b=v+g+("(?:\\u200d(?:"+["[^"+e+"]",l,h].join("|")+")"+v+g+")*"),w="(?:"+[u,l,h].join("|")+")"+b,I=RegExp([p+"?"+c+"+"+y+"(?="+[a,p,"$"].join("|")+")",_+"+"+m+"(?="+[a,p+d,"$"].join("|")+")",p+"?"+d+"+"+y,p+"+"+m,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",s,w].join("|"),"g");t.exports=function unicodeWords(t){return t.match(I)||[]}},4058:(t,e,r)=>{var n=r(4792),i=r(5539)((function(t,e,r){return e=e.toLowerCase(),t+(r?n(e):e)}));t.exports=i},4792:(t,e,r)=>{var n=r(3222),i=r(5808);t.exports=function capitalize(t){return i(n(t).toLowerCase())}},828:(t,e,r)=>{var n=r(4647),i=r(3222),o=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,a=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");t.exports=function deburr(t){return(t=i(t))&&t.replace(o,n).replace(a,"")}},5288:t=>{t.exports=function eq(t,e){return t===e||t!=t&&e!=e}},7309:(t,e,r)=>{var n=r(2006)(r(4713));t.exports=n},4713:(t,e,r)=>{var n=r(2523),i=r(5389),o=r(1489),a=Math.max;t.exports=function findIndex(t,e,r){var s=null==t?0:t.length;if(!s)return-1;var u=null==r?0:o(r);return u<0&&(u=a(s+u,0)),n(t,i(e,3),u)}},8156:(t,e,r)=>{var n=r(7422);t.exports=function get(t,e,r){var i=null==t?void 0:n(t,e);return void 0===i?r:i}},631:(t,e,r)=>{var n=r(8077),i=r(9326);t.exports=function hasIn(t,e){return null!=t&&i(t,e,n)}},3488:t=>{t.exports=function identity(t){return t}},2428:(t,e,r)=>{var n=r(7534),i=r(346),o=Object.prototype,a=o.hasOwnProperty,s=o.propertyIsEnumerable,u=n(function(){return arguments}())?n:function(t){return i(t)&&a.call(t,"callee")&&!s.call(t,"callee")};t.exports=u},6449:t=>{var e=Array.isArray;t.exports=e},4894:(t,e,r)=>{var n=r(1882),i=r(294);t.exports=function isArrayLike(t){return null!=t&&i(t.length)&&!n(t)}},3656:(t,e,r)=>{t=r.nmd(t);var n=r(9325),i=r(9935),o=e&&!e.nodeType&&e,a=o&&t&&!t.nodeType&&t,s=a&&a.exports===o?n.Buffer:void 0,u=(s?s.isBuffer:void 0)||i;t.exports=u},1882:(t,e,r)=>{var n=r(2552),i=r(3805);t.exports=function isFunction(t){if(!i(t))return!1;var e=n(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}},294:t=>{t.exports=function isLength(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}},3805:t=>{t.exports=function isObject(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},346:t=>{t.exports=function isObjectLike(t){return null!=t&&"object"==typeof t}},4394:(t,e,r)=>{var n=r(2552),i=r(346);t.exports=function isSymbol(t){return"symbol"==typeof t||i(t)&&"[object Symbol]"==n(t)}},7167:(t,e,r)=>{var n=r(4901),i=r(7301),o=r(6009),a=o&&o.isTypedArray,s=a?i(a):n;t.exports=s},5950:(t,e,r)=>{var n=r(695),i=r(8984),o=r(4894);t.exports=function keys(t){return o(t)?n(t):i(t)}},104:(t,e,r)=>{var n=r(3661);function memoize(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var memoized=function(){var r=arguments,n=e?e.apply(this,r):r[0],i=memoized.cache;if(i.has(n))return i.get(n);var o=t.apply(this,r);return memoized.cache=i.set(n,o)||i,o};return memoized.cache=new(memoize.Cache||n),memoized}memoize.Cache=n,t.exports=memoize},583:(t,e,r)=>{var n=r(7237),i=r(7255),o=r(8586),a=r(7797);t.exports=function property(t){return o(t)?n(a(t)):i(t)}},2426:(t,e,r)=>{var n=r(4248),i=r(5389),o=r(916),a=r(6449),s=r(6800);t.exports=function some(t,e,r){var u=a(t)?n:o;return r&&s(t,e,r)&&(e=void 0),u(t,i(e,3))}},3345:t=>{t.exports=function stubArray(){return[]}},9935:t=>{t.exports=function stubFalse(){return!1}},7400:(t,e,r)=>{var n=r(9374),i=1/0;t.exports=function toFinite(t){return t?(t=n(t))===i||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}},1489:(t,e,r)=>{var n=r(7400);t.exports=function toInteger(t){var e=n(t),r=e%1;return e==e?r?e-r:e:0}},9374:(t,e,r)=>{var n=r(4128),i=r(3805),o=r(4394),a=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,u=/^0o[0-7]+$/i,c=parseInt;t.exports=function toNumber(t){if("number"==typeof t)return t;if(o(t))return NaN;if(i(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=i(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=n(t);var r=s.test(t);return r||u.test(t)?c(t.slice(2),r?2:8):a.test(t)?NaN:+t}},3222:(t,e,r)=>{var n=r(7556);t.exports=function toString(t){return null==t?"":n(t)}},5808:(t,e,r)=>{var n=r(2507)("toUpperCase");t.exports=n},6645:(t,e,r)=>{var n=r(1733),i=r(5434),o=r(3222),a=r(2225);t.exports=function words(t,e,r){return t=o(t),void 0===(e=r?void 0:e)?i(t)?a(t):n(t):t.match(e)||[]}},7248:(t,e,r)=>{var n=r(6547),i=r(1234);t.exports=function zipObject(t,e){return i(t||[],e||[],n)}},5606:t=>{var e,r,n=t.exports={};function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(t){if(e===setTimeout)return setTimeout(t,0);if((e===defaultSetTimout||!e)&&setTimeout)return e=setTimeout,setTimeout(t,0);try{return e(t,0)}catch(r){try{return e.call(null,t,0)}catch(r){return e.call(this,t,0)}}}!function(){try{e="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(t){e=defaultSetTimout}try{r="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(t){r=defaultClearTimeout}}();var i,o=[],a=!1,s=-1;function cleanUpNextTick(){a&&i&&(a=!1,i.length?o=i.concat(o):s=-1,o.length&&drainQueue())}function drainQueue(){if(!a){var t=runTimeout(cleanUpNextTick);a=!0;for(var e=o.length;e;){for(i=o,o=[];++s1)for(var r=1;r{"use strict";var n=r(5606),i=65536,o=4294967295;var a=r(2861).Buffer,s=r.g.crypto||r.g.msCrypto;s&&s.getRandomValues?t.exports=function randomBytes(t,e){if(t>o)throw new RangeError("requested too many random bytes");var r=a.allocUnsafe(t);if(t>0)if(t>i)for(var u=0;u{"use strict";var r=Symbol.for("react.element"),n=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),u=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),l=Symbol.for("react.memo"),h=Symbol.for("react.lazy"),p=Symbol.iterator;var d={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_=Object.assign,y={};function E(t,e,r){this.props=t,this.context=e,this.refs=y,this.updater=r||d}function F(){}function G(t,e,r){this.props=t,this.context=e,this.refs=y,this.updater=r||d}E.prototype.isReactComponent={},E.prototype.setState=function(t,e){if("object"!=typeof t&&"function"!=typeof t&&null!=t)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,t,e,"setState")},E.prototype.forceUpdate=function(t){this.updater.enqueueForceUpdate(this,t,"forceUpdate")},F.prototype=E.prototype;var m=G.prototype=new F;m.constructor=G,_(m,E.prototype),m.isPureReactComponent=!0;var g=Array.isArray,v=Object.prototype.hasOwnProperty,b={current:null},w={key:!0,ref:!0,__self:!0,__source:!0};function M(t,e,n){var i,o={},a=null,s=null;if(null!=e)for(i in void 0!==e.ref&&(s=e.ref),void 0!==e.key&&(a=""+e.key),e)v.call(e,i)&&!w.hasOwnProperty(i)&&(o[i]=e[i]);var u=arguments.length-2;if(1===u)o.children=n;else if(1{"use strict";t.exports=r(5287)},2861:(t,e,r)=>{var n=r(8287),i=n.Buffer;function copyProps(t,e){for(var r in t)e[r]=t[r]}function SafeBuffer(t,e,r){return i(t,e,r)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?t.exports=n:(copyProps(n,e),e.Buffer=SafeBuffer),SafeBuffer.prototype=Object.create(i.prototype),copyProps(i,SafeBuffer),SafeBuffer.from=function(t,e,r){if("number"==typeof t)throw new TypeError("Argument must not be a number");return i(t,e,r)},SafeBuffer.alloc=function(t,e,r){if("number"!=typeof t)throw new TypeError("Argument must be a number");var n=i(t);return void 0!==e?"string"==typeof r?n.fill(e,r):n.fill(e):n.fill(0),n},SafeBuffer.allocUnsafe=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return i(t)},SafeBuffer.allocUnsafeSlow=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return n.SlowBuffer(t)}},8011:(t,e,r)=>{var n=r(2861).Buffer;function Hash(t,e){this._block=n.alloc(t),this._finalSize=e,this._blockSize=t,this._len=0}Hash.prototype.update=function(t,e){"string"==typeof t&&(e=e||"utf8",t=n.from(t,e));for(var r=this._block,i=this._blockSize,o=t.length,a=this._len,s=0;s=this._finalSize&&(this._update(this._block),this._block.fill(0));var r=8*this._len;if(r<=4294967295)this._block.writeUInt32BE(r,this._blockSize-4);else{var n=(4294967295&r)>>>0,i=(r-n)/4294967296;this._block.writeUInt32BE(i,this._blockSize-8),this._block.writeUInt32BE(n,this._blockSize-4)}this._update(this._block);var o=this._hash();return t?o.toString(t):o},Hash.prototype._update=function(){throw new Error("_update must be implemented by subclass")},t.exports=Hash},2802:(t,e,r)=>{var n=t.exports=function SHA(t){t=t.toLowerCase();var e=n[t];if(!e)throw new Error(t+" is not supported (we accept pull requests)");return new e};n.sha=r(7816),n.sha1=r(3737),n.sha224=r(6710),n.sha256=r(4107),n.sha384=r(2827),n.sha512=r(2890)},7816:(t,e,r)=>{var n=r(6698),i=r(8011),o=r(2861).Buffer,a=[1518500249,1859775393,-1894007588,-899497514],s=new Array(80);function Sha(){this.init(),this._w=s,i.call(this,64,56)}function rotl30(t){return t<<30|t>>>2}function ft(t,e,r,n){return 0===t?e&r|~e&n:2===t?e&r|e&n|r&n:e^r^n}n(Sha,i),Sha.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},Sha.prototype._update=function(t){for(var e,r=this._w,n=0|this._a,i=0|this._b,o=0|this._c,s=0|this._d,u=0|this._e,c=0;c<16;++c)r[c]=t.readInt32BE(4*c);for(;c<80;++c)r[c]=r[c-3]^r[c-8]^r[c-14]^r[c-16];for(var f=0;f<80;++f){var l=~~(f/20),h=0|((e=n)<<5|e>>>27)+ft(l,i,o,s)+u+r[f]+a[l];u=s,s=o,o=rotl30(i),i=n,n=h}this._a=n+this._a|0,this._b=i+this._b|0,this._c=o+this._c|0,this._d=s+this._d|0,this._e=u+this._e|0},Sha.prototype._hash=function(){var t=o.allocUnsafe(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},t.exports=Sha},3737:(t,e,r)=>{var n=r(6698),i=r(8011),o=r(2861).Buffer,a=[1518500249,1859775393,-1894007588,-899497514],s=new Array(80);function Sha1(){this.init(),this._w=s,i.call(this,64,56)}function rotl5(t){return t<<5|t>>>27}function rotl30(t){return t<<30|t>>>2}function ft(t,e,r,n){return 0===t?e&r|~e&n:2===t?e&r|e&n|r&n:e^r^n}n(Sha1,i),Sha1.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},Sha1.prototype._update=function(t){for(var e,r=this._w,n=0|this._a,i=0|this._b,o=0|this._c,s=0|this._d,u=0|this._e,c=0;c<16;++c)r[c]=t.readInt32BE(4*c);for(;c<80;++c)r[c]=(e=r[c-3]^r[c-8]^r[c-14]^r[c-16])<<1|e>>>31;for(var f=0;f<80;++f){var l=~~(f/20),h=rotl5(n)+ft(l,i,o,s)+u+r[f]+a[l]|0;u=s,s=o,o=rotl30(i),i=n,n=h}this._a=n+this._a|0,this._b=i+this._b|0,this._c=o+this._c|0,this._d=s+this._d|0,this._e=u+this._e|0},Sha1.prototype._hash=function(){var t=o.allocUnsafe(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},t.exports=Sha1},6710:(t,e,r)=>{var n=r(6698),i=r(4107),o=r(8011),a=r(2861).Buffer,s=new Array(64);function Sha224(){this.init(),this._w=s,o.call(this,64,56)}n(Sha224,i),Sha224.prototype.init=function(){return this._a=3238371032,this._b=914150663,this._c=812702999,this._d=4144912697,this._e=4290775857,this._f=1750603025,this._g=1694076839,this._h=3204075428,this},Sha224.prototype._hash=function(){var t=a.allocUnsafe(28);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t},t.exports=Sha224},4107:(t,e,r)=>{var n=r(6698),i=r(8011),o=r(2861).Buffer,a=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],s=new Array(64);function Sha256(){this.init(),this._w=s,i.call(this,64,56)}function ch(t,e,r){return r^t&(e^r)}function maj(t,e,r){return t&e|r&(t|e)}function sigma0(t){return(t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10)}function sigma1(t){return(t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7)}function gamma0(t){return(t>>>7|t<<25)^(t>>>18|t<<14)^t>>>3}n(Sha256,i),Sha256.prototype.init=function(){return this._a=1779033703,this._b=3144134277,this._c=1013904242,this._d=2773480762,this._e=1359893119,this._f=2600822924,this._g=528734635,this._h=1541459225,this},Sha256.prototype._update=function(t){for(var e,r=this._w,n=0|this._a,i=0|this._b,o=0|this._c,s=0|this._d,u=0|this._e,c=0|this._f,f=0|this._g,l=0|this._h,h=0;h<16;++h)r[h]=t.readInt32BE(4*h);for(;h<64;++h)r[h]=0|(((e=r[h-2])>>>17|e<<15)^(e>>>19|e<<13)^e>>>10)+r[h-7]+gamma0(r[h-15])+r[h-16];for(var p=0;p<64;++p){var d=l+sigma1(u)+ch(u,c,f)+a[p]+r[p]|0,_=sigma0(n)+maj(n,i,o)|0;l=f,f=c,c=u,u=s+d|0,s=o,o=i,i=n,n=d+_|0}this._a=n+this._a|0,this._b=i+this._b|0,this._c=o+this._c|0,this._d=s+this._d|0,this._e=u+this._e|0,this._f=c+this._f|0,this._g=f+this._g|0,this._h=l+this._h|0},Sha256.prototype._hash=function(){var t=o.allocUnsafe(32);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t.writeInt32BE(this._h,28),t},t.exports=Sha256},2827:(t,e,r)=>{var n=r(6698),i=r(2890),o=r(8011),a=r(2861).Buffer,s=new Array(160);function Sha384(){this.init(),this._w=s,o.call(this,128,112)}n(Sha384,i),Sha384.prototype.init=function(){return this._ah=3418070365,this._bh=1654270250,this._ch=2438529370,this._dh=355462360,this._eh=1731405415,this._fh=2394180231,this._gh=3675008525,this._hh=1203062813,this._al=3238371032,this._bl=914150663,this._cl=812702999,this._dl=4144912697,this._el=4290775857,this._fl=1750603025,this._gl=1694076839,this._hl=3204075428,this},Sha384.prototype._hash=function(){var t=a.allocUnsafe(48);function writeInt64BE(e,r,n){t.writeInt32BE(e,n),t.writeInt32BE(r,n+4)}return writeInt64BE(this._ah,this._al,0),writeInt64BE(this._bh,this._bl,8),writeInt64BE(this._ch,this._cl,16),writeInt64BE(this._dh,this._dl,24),writeInt64BE(this._eh,this._el,32),writeInt64BE(this._fh,this._fl,40),t},t.exports=Sha384},2890:(t,e,r)=>{var n=r(6698),i=r(8011),o=r(2861).Buffer,a=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],s=new Array(160);function Sha512(){this.init(),this._w=s,i.call(this,128,112)}function Ch(t,e,r){return r^t&(e^r)}function maj(t,e,r){return t&e|r&(t|e)}function sigma0(t,e){return(t>>>28|e<<4)^(e>>>2|t<<30)^(e>>>7|t<<25)}function sigma1(t,e){return(t>>>14|e<<18)^(t>>>18|e<<14)^(e>>>9|t<<23)}function Gamma0(t,e){return(t>>>1|e<<31)^(t>>>8|e<<24)^t>>>7}function Gamma0l(t,e){return(t>>>1|e<<31)^(t>>>8|e<<24)^(t>>>7|e<<25)}function Gamma1(t,e){return(t>>>19|e<<13)^(e>>>29|t<<3)^t>>>6}function Gamma1l(t,e){return(t>>>19|e<<13)^(e>>>29|t<<3)^(t>>>6|e<<26)}function getCarry(t,e){return t>>>0>>0?1:0}n(Sha512,i),Sha512.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this},Sha512.prototype._update=function(t){for(var e=this._w,r=0|this._ah,n=0|this._bh,i=0|this._ch,o=0|this._dh,s=0|this._eh,u=0|this._fh,c=0|this._gh,f=0|this._hh,l=0|this._al,h=0|this._bl,p=0|this._cl,d=0|this._dl,_=0|this._el,y=0|this._fl,m=0|this._gl,g=0|this._hl,v=0;v<32;v+=2)e[v]=t.readInt32BE(4*v),e[v+1]=t.readInt32BE(4*v+4);for(;v<160;v+=2){var b=e[v-30],w=e[v-30+1],I=Gamma0(b,w),x=Gamma0l(w,b),B=Gamma1(b=e[v-4],w=e[v-4+1]),k=Gamma1l(w,b),C=e[v-14],q=e[v-14+1],L=e[v-32],j=e[v-32+1],z=x+q|0,P=I+C+getCarry(z,x)|0;P=(P=P+B+getCarry(z=z+k|0,k)|0)+L+getCarry(z=z+j|0,j)|0,e[v]=P,e[v+1]=z}for(var D=0;D<160;D+=2){P=e[D],z=e[D+1];var U=maj(r,n,i),W=maj(l,h,p),K=sigma0(r,l),V=sigma0(l,r),$=sigma1(s,_),H=sigma1(_,s),Y=a[D],Z=a[D+1],J=Ch(s,u,c),tt=Ch(_,y,m),et=g+H|0,rt=f+$+getCarry(et,g)|0;rt=(rt=(rt=rt+J+getCarry(et=et+tt|0,tt)|0)+Y+getCarry(et=et+Z|0,Z)|0)+P+getCarry(et=et+z|0,z)|0;var nt=V+W|0,it=K+U+getCarry(nt,V)|0;f=c,g=m,c=u,m=y,u=s,y=_,s=o+rt+getCarry(_=d+et|0,d)|0,o=i,d=p,i=n,p=h,n=r,h=l,r=rt+it+getCarry(l=et+nt|0,et)|0}this._al=this._al+l|0,this._bl=this._bl+h|0,this._cl=this._cl+p|0,this._dl=this._dl+d|0,this._el=this._el+_|0,this._fl=this._fl+y|0,this._gl=this._gl+m|0,this._hl=this._hl+g|0,this._ah=this._ah+r+getCarry(this._al,l)|0,this._bh=this._bh+n+getCarry(this._bl,h)|0,this._ch=this._ch+i+getCarry(this._cl,p)|0,this._dh=this._dh+o+getCarry(this._dl,d)|0,this._eh=this._eh+s+getCarry(this._el,_)|0,this._fh=this._fh+u+getCarry(this._fl,y)|0,this._gh=this._gh+c+getCarry(this._gl,m)|0,this._hh=this._hh+f+getCarry(this._hl,g)|0},Sha512.prototype._hash=function(){var t=o.allocUnsafe(64);function writeInt64BE(e,r,n){t.writeInt32BE(e,n),t.writeInt32BE(r,n+4)}return writeInt64BE(this._ah,this._al,0),writeInt64BE(this._bh,this._bl,8),writeInt64BE(this._ch,this._cl,16),writeInt64BE(this._dh,this._dl,24),writeInt64BE(this._eh,this._el,32),writeInt64BE(this._fh,this._fl,40),writeInt64BE(this._gh,this._gl,48),writeInt64BE(this._hh,this._hl,56),t},t.exports=Sha512},7666:(t,e,r)=>{var n=r(4851),i=r(953);function _extends(){var e;return t.exports=_extends=n?i(e=n).call(e):function(t){for(var e=1;e{"use strict";var n=r(9709);t.exports=n},462:(t,e,r)=>{"use strict";var n=r(975);t.exports=n},2567:(t,e,r)=>{"use strict";r(9307);var n=r(1747);t.exports=n("Function","bind")},3034:(t,e,r)=>{"use strict";var n=r(8280),i=r(2567),o=Function.prototype;t.exports=function(t){var e=t.bind;return t===o||n(o,t)&&e===o.bind?i:e}},9748:(t,e,r)=>{"use strict";r(1340);var n=r(2046);t.exports=n.Object.assign},953:(t,e,r)=>{"use strict";t.exports=r(3375)},4851:(t,e,r)=>{"use strict";t.exports=r(5401)},3375:(t,e,r)=>{"use strict";var n=r(3700);t.exports=n},5401:(t,e,r)=>{"use strict";var n=r(462);t.exports=n},2159:(t,e,r)=>{"use strict";var n=r(2250),i=r(4640),o=TypeError;t.exports=function(t){if(n(t))return t;throw new o(i(t)+" is not a function")}},6624:(t,e,r)=>{"use strict";var n=r(6285),i=String,o=TypeError;t.exports=function(t){if(n(t))return t;throw new o(i(t)+" is not an object")}},4436:(t,e,r)=>{"use strict";var n=r(7374),i=r(4849),o=r(575),createMethod=function(t){return function(e,r,a){var s,u=n(e),c=o(u),f=i(a,c);if(t&&r!=r){for(;c>f;)if((s=u[f++])!=s)return!0}else for(;c>f;f++)if((t||f in u)&&u[f]===r)return t||f||0;return!t&&-1}};t.exports={includes:createMethod(!0),indexOf:createMethod(!1)}},3427:(t,e,r)=>{"use strict";var n=r(1907);t.exports=n([].slice)},5807:(t,e,r)=>{"use strict";var n=r(1907),i=n({}.toString),o=n("".slice);t.exports=function(t){return o(i(t),8,-1)}},1626:(t,e,r)=>{"use strict";var n=r(9447),i=r(4284),o=r(5817);t.exports=n?function(t,e,r){return i.f(t,e,o(1,r))}:function(t,e,r){return t[e]=r,t}},5817:t=>{"use strict";t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},2532:(t,e,r)=>{"use strict";var n=r(1010),i=Object.defineProperty;t.exports=function(t,e){try{i(n,t,{value:e,configurable:!0,writable:!0})}catch(r){n[t]=e}return e}},9447:(t,e,r)=>{"use strict";var n=r(8828);t.exports=!n((function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]}))},7882:t=>{"use strict";var e="object"==typeof document&&document.all,r=void 0===e&&void 0!==e;t.exports={all:e,IS_HTMLDDA:r}},9552:(t,e,r)=>{"use strict";var n=r(1010),i=r(6285),o=n.document,a=i(o)&&i(o.createElement);t.exports=function(t){return a?o.createElement(t):{}}},4723:t=>{"use strict";t.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},5683:(t,e,r)=>{"use strict";var n,i,o=r(1010),a=r(4723),s=o.process,u=o.Deno,c=s&&s.versions||u&&u.version,f=c&&c.v8;f&&(i=(n=f.split("."))[0]>0&&n[0]<4?1:+(n[0]+n[1])),!i&&a&&(!(n=a.match(/Edge\/(\d+)/))||n[1]>=74)&&(n=a.match(/Chrome\/(\d+)/))&&(i=+n[1]),t.exports=i},376:t=>{"use strict";t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},1091:(t,e,r)=>{"use strict";var n=r(1010),i=r(6024),o=r(2361),a=r(2250),s=r(3846).f,u=r(7463),c=r(2046),f=r(8311),l=r(1626),h=r(9724),wrapConstructor=function(t){var Wrapper=function(e,r,n){if(this instanceof Wrapper){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,r)}return new t(e,r,n)}return i(t,this,arguments)};return Wrapper.prototype=t.prototype,Wrapper};t.exports=function(t,e){var r,i,p,d,_,y,m,g,v,b=t.target,w=t.global,I=t.stat,x=t.proto,B=w?n:I?n[b]:(n[b]||{}).prototype,k=w?c:c[b]||l(c,b,{})[b],C=k.prototype;for(d in e)i=!(r=u(w?d:b+(I?".":"#")+d,t.forced))&&B&&h(B,d),y=k[d],i&&(m=t.dontCallGetSet?(v=s(B,d))&&v.value:B[d]),_=i&&m?m:e[d],i&&typeof y==typeof _||(g=t.bind&&i?f(_,n):t.wrap&&i?wrapConstructor(_):x&&a(_)?o(_):_,(t.sham||_&&_.sham||y&&y.sham)&&l(g,"sham",!0),l(k,d,g),x&&(h(c,p=b+"Prototype")||l(c,p,{}),l(c[p],d,_),t.real&&C&&(r||!C[d])&&l(C,d,_)))}},8828:t=>{"use strict";t.exports=function(t){try{return!!t()}catch(t){return!0}}},6024:(t,e,r)=>{"use strict";var n=r(1505),i=Function.prototype,o=i.apply,a=i.call;t.exports="object"==typeof Reflect&&Reflect.apply||(n?a.bind(o):function(){return a.apply(o,arguments)})},8311:(t,e,r)=>{"use strict";var n=r(2361),i=r(2159),o=r(1505),a=n(n.bind);t.exports=function(t,e){return i(t),void 0===e?t:o?a(t,e):function(){return t.apply(e,arguments)}}},1505:(t,e,r)=>{"use strict";var n=r(8828);t.exports=!n((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},4673:(t,e,r)=>{"use strict";var n=r(1907),i=r(2159),o=r(6285),a=r(9724),s=r(3427),u=r(1505),c=Function,f=n([].concat),l=n([].join),h={};t.exports=u?c.bind:function bind(t){var e=i(this),r=e.prototype,n=s(arguments,1),u=function bound(){var r=f(n,s(arguments));return this instanceof u?function(t,e,r){if(!a(h,e)){for(var n=[],i=0;i{"use strict";var n=r(1505),i=Function.prototype.call;t.exports=n?i.bind(i):function(){return i.apply(i,arguments)}},2361:(t,e,r)=>{"use strict";var n=r(5807),i=r(1907);t.exports=function(t){if("Function"===n(t))return i(t)}},1907:(t,e,r)=>{"use strict";var n=r(1505),i=Function.prototype,o=i.call,a=n&&i.bind.bind(o,o);t.exports=n?a:function(t){return function(){return o.apply(t,arguments)}}},1747:(t,e,r)=>{"use strict";var n=r(1010),i=r(2046);t.exports=function(t,e){var r=i[t+"Prototype"],o=r&&r[e];if(o)return o;var a=n[t],s=a&&a.prototype;return s&&s[e]}},5582:(t,e,r)=>{"use strict";var n=r(2046),i=r(1010),o=r(2250),aFunction=function(t){return o(t)?t:void 0};t.exports=function(t,e){return arguments.length<2?aFunction(n[t])||aFunction(i[t]):n[t]&&n[t][e]||i[t]&&i[t][e]}},9367:(t,e,r)=>{"use strict";var n=r(2159),i=r(7136);t.exports=function(t,e){var r=t[e];return i(r)?void 0:n(r)}},1010:function(t,e,r){"use strict";var check=function(t){return t&&t.Math===Math&&t};t.exports=check("object"==typeof globalThis&&globalThis)||check("object"==typeof window&&window)||check("object"==typeof self&&self)||check("object"==typeof r.g&&r.g)||check("object"==typeof this&&this)||function(){return this}()||Function("return this")()},9724:(t,e,r)=>{"use strict";var n=r(1907),i=r(9298),o=n({}.hasOwnProperty);t.exports=Object.hasOwn||function hasOwn(t,e){return o(i(t),e)}},8530:t=>{"use strict";t.exports={}},3648:(t,e,r)=>{"use strict";var n=r(9447),i=r(8828),o=r(9552);t.exports=!n&&!i((function(){return 7!==Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a}))},6946:(t,e,r)=>{"use strict";var n=r(1907),i=r(8828),o=r(5807),a=Object,s=n("".split);t.exports=i((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"===o(t)?s(t,""):a(t)}:a},2250:(t,e,r)=>{"use strict";var n=r(7882),i=n.all;t.exports=n.IS_HTMLDDA?function(t){return"function"==typeof t||t===i}:function(t){return"function"==typeof t}},7463:(t,e,r)=>{"use strict";var n=r(8828),i=r(2250),o=/#|\.prototype\./,isForced=function(t,e){var r=s[a(t)];return r===c||r!==u&&(i(e)?n(e):!!e)},a=isForced.normalize=function(t){return String(t).replace(o,".").toLowerCase()},s=isForced.data={},u=isForced.NATIVE="N",c=isForced.POLYFILL="P";t.exports=isForced},7136:t=>{"use strict";t.exports=function(t){return null==t}},6285:(t,e,r)=>{"use strict";var n=r(2250),i=r(7882),o=i.all;t.exports=i.IS_HTMLDDA?function(t){return"object"==typeof t?null!==t:n(t)||t===o}:function(t){return"object"==typeof t?null!==t:n(t)}},7376:t=>{"use strict";t.exports=!0},5594:(t,e,r)=>{"use strict";var n=r(5582),i=r(2250),o=r(8280),a=r(3556),s=Object;t.exports=a?function(t){return"symbol"==typeof t}:function(t){var e=n("Symbol");return i(e)&&o(e.prototype,s(t))}},575:(t,e,r)=>{"use strict";var n=r(3121);t.exports=function(t){return n(t.length)}},1176:t=>{"use strict";var e=Math.ceil,r=Math.floor;t.exports=Math.trunc||function trunc(t){var n=+t;return(n>0?r:e)(n)}},9538:(t,e,r)=>{"use strict";var n=r(9447),i=r(1907),o=r(3930),a=r(8828),s=r(2875),u=r(7170),c=r(2574),f=r(9298),l=r(6946),h=Object.assign,p=Object.defineProperty,d=i([].concat);t.exports=!h||a((function(){if(n&&1!==h({b:1},h(p({},"a",{enumerable:!0,get:function(){p(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},e={},r=Symbol("assign detection"),i="abcdefghijklmnopqrst";return t[r]=7,i.split("").forEach((function(t){e[t]=t})),7!==h({},t)[r]||s(h({},e)).join("")!==i}))?function assign(t,e){for(var r=f(t),i=arguments.length,a=1,h=u.f,p=c.f;i>a;)for(var _,y=l(arguments[a++]),m=h?d(s(y),h(y)):s(y),g=m.length,v=0;g>v;)_=m[v++],n&&!o(p,y,_)||(r[_]=y[_]);return r}:h},4284:(t,e,r)=>{"use strict";var n=r(9447),i=r(3648),o=r(8661),a=r(6624),s=r(470),u=TypeError,c=Object.defineProperty,f=Object.getOwnPropertyDescriptor,l="enumerable",h="configurable",p="writable";e.f=n?o?function defineProperty(t,e,r){if(a(t),e=s(e),a(r),"function"==typeof t&&"prototype"===e&&"value"in r&&p in r&&!r[p]){var n=f(t,e);n&&n[p]&&(t[e]=r.value,r={configurable:h in r?r[h]:n[h],enumerable:l in r?r[l]:n[l],writable:!1})}return c(t,e,r)}:c:function defineProperty(t,e,r){if(a(t),e=s(e),a(r),i)try{return c(t,e,r)}catch(t){}if("get"in r||"set"in r)throw new u("Accessors not supported");return"value"in r&&(t[e]=r.value),t}},3846:(t,e,r)=>{"use strict";var n=r(9447),i=r(3930),o=r(2574),a=r(5817),s=r(7374),u=r(470),c=r(9724),f=r(3648),l=Object.getOwnPropertyDescriptor;e.f=n?l:function getOwnPropertyDescriptor(t,e){if(t=s(t),e=u(e),f)try{return l(t,e)}catch(t){}if(c(t,e))return a(!i(o.f,t,e),t[e])}},7170:(t,e)=>{"use strict";e.f=Object.getOwnPropertySymbols},8280:(t,e,r)=>{"use strict";var n=r(1907);t.exports=n({}.isPrototypeOf)},3045:(t,e,r)=>{"use strict";var n=r(1907),i=r(9724),o=r(7374),a=r(4436).indexOf,s=r(8530),u=n([].push);t.exports=function(t,e){var r,n=o(t),c=0,f=[];for(r in n)!i(s,r)&&i(n,r)&&u(f,r);for(;e.length>c;)i(n,r=e[c++])&&(~a(f,r)||u(f,r));return f}},2875:(t,e,r)=>{"use strict";var n=r(3045),i=r(376);t.exports=Object.keys||function keys(t){return n(t,i)}},2574:(t,e)=>{"use strict";var r={}.propertyIsEnumerable,n=Object.getOwnPropertyDescriptor,i=n&&!r.call({1:2},1);e.f=i?function propertyIsEnumerable(t){var e=n(this,t);return!!e&&e.enumerable}:r},581:(t,e,r)=>{"use strict";var n=r(3930),i=r(2250),o=r(6285),a=TypeError;t.exports=function(t,e){var r,s;if("string"===e&&i(r=t.toString)&&!o(s=n(r,t)))return s;if(i(r=t.valueOf)&&!o(s=n(r,t)))return s;if("string"!==e&&i(r=t.toString)&&!o(s=n(r,t)))return s;throw new a("Can't convert object to primitive value")}},2046:t=>{"use strict";t.exports={}},4239:(t,e,r)=>{"use strict";var n=r(7136),i=TypeError;t.exports=function(t){if(n(t))throw new i("Can't call method on "+t);return t}},6128:(t,e,r)=>{"use strict";var n=r(1010),i=r(2532),o="__core-js_shared__",a=n[o]||i(o,{});t.exports=a},5816:(t,e,r)=>{"use strict";var n=r(7376),i=r(6128);(t.exports=function(t,e){return i[t]||(i[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.34.0",mode:n?"pure":"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.34.0/LICENSE",source:"https://github.com/zloirock/core-js"})},9846:(t,e,r)=>{"use strict";var n=r(5683),i=r(8828),o=r(1010).String;t.exports=!!Object.getOwnPropertySymbols&&!i((function(){var t=Symbol("symbol detection");return!o(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&n&&n<41}))},4849:(t,e,r)=>{"use strict";var n=r(5482),i=Math.max,o=Math.min;t.exports=function(t,e){var r=n(t);return r<0?i(r+e,0):o(r,e)}},7374:(t,e,r)=>{"use strict";var n=r(6946),i=r(4239);t.exports=function(t){return n(i(t))}},5482:(t,e,r)=>{"use strict";var n=r(1176);t.exports=function(t){var e=+t;return e!=e||0===e?0:n(e)}},3121:(t,e,r)=>{"use strict";var n=r(5482),i=Math.min;t.exports=function(t){return t>0?i(n(t),9007199254740991):0}},9298:(t,e,r)=>{"use strict";var n=r(4239),i=Object;t.exports=function(t){return i(n(t))}},6028:(t,e,r)=>{"use strict";var n=r(3930),i=r(6285),o=r(5594),a=r(9367),s=r(581),u=r(6264),c=TypeError,f=u("toPrimitive");t.exports=function(t,e){if(!i(t)||o(t))return t;var r,u=a(t,f);if(u){if(void 0===e&&(e="default"),r=n(u,t,e),!i(r)||o(r))return r;throw new c("Can't convert object to primitive value")}return void 0===e&&(e="number"),s(t,e)}},470:(t,e,r)=>{"use strict";var n=r(6028),i=r(5594);t.exports=function(t){var e=n(t,"string");return i(e)?e:e+""}},4640:t=>{"use strict";var e=String;t.exports=function(t){try{return e(t)}catch(t){return"Object"}}},6499:(t,e,r)=>{"use strict";var n=r(1907),i=0,o=Math.random(),a=n(1..toString);t.exports=function(t){return"Symbol("+(void 0===t?"":t)+")_"+a(++i+o,36)}},3556:(t,e,r)=>{"use strict";var n=r(9846);t.exports=n&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},8661:(t,e,r)=>{"use strict";var n=r(9447),i=r(8828);t.exports=n&&i((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},6264:(t,e,r)=>{"use strict";var n=r(1010),i=r(5816),o=r(9724),a=r(6499),s=r(9846),u=r(3556),c=n.Symbol,f=i("wks"),l=u?c.for||c:c&&c.withoutSetter||a;t.exports=function(t){return o(f,t)||(f[t]=s&&o(c,t)?c[t]:l("Symbol."+t)),f[t]}},9307:(t,e,r)=>{"use strict";var n=r(1091),i=r(4673);n({target:"Function",proto:!0,forced:Function.bind!==i},{bind:i})},1340:(t,e,r)=>{"use strict";var n=r(1091),i=r(9538);n({target:"Object",stat:!0,arity:2,forced:Object.assign!==i},{assign:i})},9709:(t,e,r)=>{"use strict";var n=r(3034);t.exports=n},975:(t,e,r)=>{"use strict";var n=r(9748);t.exports=n}},e={};function __webpack_require__(r){var n=e[r];if(void 0!==n)return n.exports;var i=e[r]={id:r,loaded:!1,exports:{}};return t[r].call(i.exports,i,i.exports,__webpack_require__),i.loaded=!0,i.exports}__webpack_require__.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return __webpack_require__.d(e,{a:e}),e},__webpack_require__.d=(t,e)=>{for(var r in e)__webpack_require__.o(e,r)&&!__webpack_require__.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),__webpack_require__.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),__webpack_require__.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},__webpack_require__.nmd=t=>(t.paths=[],t.children||(t.children=[]),t);var r={};return(()=>{"use strict";__webpack_require__.d(r,{default:()=>Ke});var t={};__webpack_require__.r(t),__webpack_require__.d(t,{TOGGLE_CONFIGS:()=>Te,UPDATE_CONFIGS:()=>je,downloadConfig:()=>downloadConfig,getConfigByUrl:()=>getConfigByUrl,loaded:()=>loaded,toggle:()=>toggle,update:()=>update});var e={};__webpack_require__.r(e),__webpack_require__.d(e,{get:()=>get});var n=__webpack_require__(6540);class StandaloneLayout extends n.Component{render(){const{getComponent:t}=this.props,e=t("Container"),r=t("Row"),i=t("Col"),o=t("Topbar",!0),a=t("BaseLayout",!0),s=t("onlineValidatorBadge",!0);return n.createElement(e,{className:"swagger-ui"},o?n.createElement(o,null):null,n.createElement(a,null),n.createElement(r,null,n.createElement(i,null,n.createElement(s,null))))}}const i=StandaloneLayout,stadalone_layout=()=>({components:{StandaloneLayout:i}});var o=__webpack_require__(9404),a=__webpack_require__.n(o);__webpack_require__(6750),__webpack_require__(4058),__webpack_require__(5808),__webpack_require__(104),__webpack_require__(7309),__webpack_require__(2426),__webpack_require__(5288),__webpack_require__(1882),__webpack_require__(2205),__webpack_require__(3209),__webpack_require__(2802);const s=function makeWindow(){var t={location:{},history:{},open:()=>{},close:()=>{},File:function(){},FormData:function(){}};if("undefined"==typeof window)return t;try{t=window;for(var e of["File","Blob","FormData"])e in window&&(t[e]=window[e])}catch(t){console.error(t)}return t}();a().Set.of("type","format","items","default","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","maxItems","minItems","uniqueItems","enum","multipleOf");__webpack_require__(8287).Buffer;const parseSearch=()=>{const t=new URLSearchParams(s.location.search);return Object.fromEntries(t)};class TopBar extends n.Component{constructor(t,e){super(t,e),this.state={url:t.specSelectors.url(),selectedIndex:0}}UNSAFE_componentWillReceiveProps(t){this.setState({url:t.specSelectors.url()})}onUrlChange=t=>{let{target:{value:e}}=t;this.setState({url:e})};flushAuthData(){const{persistAuthorization:t}=this.props.getConfigs();t||this.props.authActions.restoreAuthorization({authorized:{}})}loadSpec=t=>{this.flushAuthData(),this.props.specActions.updateUrl(t),this.props.specActions.download(t)};onUrlSelect=t=>{let e=t.target.value||t.target.href;this.loadSpec(e),this.setSelectedUrl(e),t.preventDefault()};downloadUrl=t=>{this.loadSpec(this.state.url),t.preventDefault()};setSearch=t=>{let e=parseSearch();e["urls.primaryName"]=t.name;const r=`${window.location.protocol}//${window.location.host}${window.location.pathname}`;window&&window.history&&window.history.pushState&&window.history.replaceState(null,"",`${r}?${(t=>{const e=new URLSearchParams(Object.entries(t));return String(e)})(e)}`)};setSelectedUrl=t=>{const e=this.props.getConfigs().urls||[];e&&e.length&&t&&e.forEach(((e,r)=>{e.url===t&&(this.setState({selectedIndex:r}),this.setSearch(e))}))};componentDidMount(){const t=this.props.getConfigs(),e=t.urls||[];if(e&&e.length){var r=this.state.selectedIndex;let n=parseSearch()["urls.primaryName"]||t.urls.primaryName;n&&e.forEach(((t,e)=>{t.name===n&&(this.setState({selectedIndex:e}),r=e)})),this.loadSpec(e[r].url)}}onFilterChange=t=>{let{target:{value:e}}=t;this.props.layoutActions.updateFilter(e)};render(){let{getComponent:t,specSelectors:e,getConfigs:r}=this.props;const i=t("Button"),o=t("Link"),a=t("Logo");let s="loading"===e.loadingStatus();const u=["download-url-input"];"failed"===e.loadingStatus()&&u.push("failed"),s&&u.push("loading");const{urls:c}=r();let f=[],l=null;if(c){let t=[];c.forEach(((e,r)=>{t.push(n.createElement("option",{key:r,value:e.url},e.name))})),f.push(n.createElement("label",{className:"select-label",htmlFor:"select"},n.createElement("span",null,"Select a definition"),n.createElement("select",{id:"select",disabled:s,onChange:this.onUrlSelect,value:c[this.state.selectedIndex].url},t)))}else l=this.downloadUrl,f.push(n.createElement("input",{className:u.join(" "),type:"text",onChange:this.onUrlChange,value:this.state.url,disabled:s,id:"download-url-input"})),f.push(n.createElement(i,{className:"download-url-button",onClick:this.downloadUrl},"Explore"));return n.createElement("div",{className:"topbar"},n.createElement("div",{className:"wrapper"},n.createElement("div",{className:"topbar-wrapper"},n.createElement(o,null,n.createElement(a,null)),n.createElement("form",{className:"download-url-wrapper",onSubmit:l},f.map(((t,e)=>(0,n.cloneElement)(t,{key:e})))))))}}const u=TopBar;var c,f,l,h,p,d,_,y,m,g,v,b,w,I,x,B,k,C,q,L,j,z,P,D,U,W,K,V,$,H,Y,Z;function _extends(){return _extends=Object.assign?Object.assign.bind():function(t){for(var e=1;en.createElement("svg",_extends({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 407 116"},t),c||(c=n.createElement("defs",null,n.createElement("clipPath",{id:"logo_small_svg__clip-SW_TM-logo-on-dark"},n.createElement("path",{d:"M0 0h407v116H0z"})),n.createElement("style",null,".logo_small_svg__cls-2{fill:#fff}.logo_small_svg__cls-3{fill:#85ea2d}"))),n.createElement("g",{id:"logo_small_svg__SW_TM-logo-on-dark",style:{clipPath:"url(#logo_small_svg__clip-SW_TM-logo-on-dark)"}},n.createElement("g",{id:"logo_small_svg__SW_In-Product",transform:"translate(-.301)"},f||(f=n.createElement("path",{id:"logo_small_svg__Path_2936",d:"M359.15 70.674h-.7v-3.682h-1.26v-.6h3.219v.6h-1.259Z",className:"logo_small_svg__cls-2","data-name":"Path 2936"})),l||(l=n.createElement("path",{id:"logo_small_svg__Path_2937",d:"m363.217 70.674-1.242-3.574h-.023q.05.8.05 1.494v2.083h-.636v-4.286h.987l1.19 3.407h.017l1.225-3.407h.99v4.283h-.675v-2.118a30 30 0 0 1 .044-1.453h-.023l-1.286 3.571Z",className:"logo_small_svg__cls-2","data-name":"Path 2937"})),h||(h=n.createElement("path",{id:"logo_small_svg__Path_2938",d:"M50.328 97.669a47.642 47.642 0 1 1 47.643-47.642 47.64 47.64 0 0 1-47.643 47.642",className:"logo_small_svg__cls-3","data-name":"Path 2938"})),p||(p=n.createElement("path",{id:"logo_small_svg__Path_2939",d:"M50.328 4.769A45.258 45.258 0 1 1 5.07 50.027 45.26 45.26 0 0 1 50.328 4.769m0-4.769a50.027 50.027 0 1 0 50.027 50.027A50.027 50.027 0 0 0 50.328 0",className:"logo_small_svg__cls-3","data-name":"Path 2939"})),n.createElement("path",{id:"logo_small_svg__Path_2940",d:"M31.8 33.854c-.154 1.712.058 3.482-.057 5.213a43 43 0 0 1-.693 5.156 9.53 9.53 0 0 1-4.1 5.829c4.079 2.654 4.54 6.771 4.81 10.946.135 2.25.077 4.52.308 6.752.173 1.731.846 2.174 2.636 2.231.73.02 1.48 0 2.327 0v5.349c-5.29.9-9.657-.6-10.734-5.079a31 31 0 0 1-.654-5c-.117-1.789.076-3.578-.058-5.367-.386-4.906-1.02-6.56-5.713-6.791v-6.1a9 9 0 0 1 1.028-.173c2.577-.135 3.674-.924 4.231-3.463a29 29 0 0 0 .481-4.329 82 82 0 0 1 .6-8.406c.673-3.982 3.136-5.906 7.234-6.137 1.154-.057 2.327 0 3.655 0v5.464c-.558.038-1.039.115-1.539.115-3.336-.115-3.51 1.02-3.762 3.79m6.406 12.658h-.077a3.515 3.515 0 1 0-.346 7.021h.231a3.46 3.46 0 0 0 3.655-3.251v-.192a3.523 3.523 0 0 0-3.461-3.578Zm12.062 0a3.373 3.373 0 0 0-3.482 3.251 2 2 0 0 0 .02.327 3.3 3.3 0 0 0 3.578 3.443 3.263 3.263 0 0 0 3.443-3.558 3.308 3.308 0 0 0-3.557-3.463Zm12.351 0a3.59 3.59 0 0 0-3.655 3.482 3.53 3.53 0 0 0 3.536 3.539h.039c1.769.309 3.559-1.4 3.674-3.462a3.57 3.57 0 0 0-3.6-3.559Zm16.948.288c-2.232-.1-3.348-.846-3.9-2.962a21.5 21.5 0 0 1-.635-4.136c-.154-2.578-.135-5.175-.308-7.753-.4-6.117-4.828-8.252-11.254-7.195v5.31c1.019 0 1.808 0 2.6.019 1.366.019 2.4.539 2.539 2.059.135 1.385.135 2.789.27 4.193.269 2.79.422 5.618.9 8.369a8.72 8.72 0 0 0 3.921 5.348c-3.4 2.289-4.406 5.559-4.578 9.234-.1 2.52-.154 5.059-.289 7.6-.115 2.308-.923 3.058-3.251 3.116-.654.019-1.289.077-2.019.115v5.445c1.365 0 2.616.077 3.866 0 3.886-.231 6.233-2.117 7-5.887A49 49 0 0 0 75 63.4c.135-1.923.116-3.866.308-5.771.289-2.982 1.655-4.213 4.636-4.4a4 4 0 0 0 .828-.192v-6.1c-.5-.058-.843-.115-1.208-.135Z","data-name":"Path 2940",style:{fill:"#173647"}}),d||(d=n.createElement("path",{id:"logo_small_svg__Path_2941",d:"M152.273 58.122a11.23 11.23 0 0 1-4.384 9.424q-4.383 3.382-11.9 3.382-8.14 0-12.524-2.1V63.7a33 33 0 0 0 6.137 1.879 32.3 32.3 0 0 0 6.575.689q5.322 0 8.015-2.02a6.63 6.63 0 0 0 2.692-5.62 7.2 7.2 0 0 0-.954-3.9 8.9 8.9 0 0 0-3.194-2.8 44.6 44.6 0 0 0-6.81-2.911q-6.387-2.286-9.126-5.417a11.96 11.96 0 0 1-2.74-8.172A10.16 10.16 0 0 1 128.039 27q3.977-3.131 10.52-3.131a31 31 0 0 1 12.555 2.5L149.455 31a28.4 28.4 0 0 0-11.021-2.38 10.67 10.67 0 0 0-6.606 1.816 5.98 5.98 0 0 0-2.38 5.041 7.7 7.7 0 0 0 .877 3.9 8.24 8.24 0 0 0 2.959 2.786 36.7 36.7 0 0 0 6.371 2.8q7.2 2.566 9.91 5.51a10.84 10.84 0 0 1 2.708 7.649",className:"logo_small_svg__cls-2","data-name":"Path 2941"})),_||(_=n.createElement("path",{id:"logo_small_svg__Path_2942",d:"M185.288 70.3 179 50.17q-.594-1.848-2.222-8.391h-.251q-1.252 5.479-2.192 8.453L167.849 70.3h-6.011l-9.361-34.315h5.447q3.318 12.931 5.057 19.693a80 80 0 0 1 1.988 9.111h.25q.345-1.785 1.112-4.618t1.33-4.493l6.294-19.693h5.635l6.137 19.693a66 66 0 0 1 2.379 9.048h.251a33 33 0 0 1 .673-3.475q.548-2.347 6.528-25.266h5.385L191.456 70.3Z",className:"logo_small_svg__cls-2","data-name":"Path 2942"})),y||(y=n.createElement("path",{id:"logo_small_svg__Path_2943",d:"m225.115 70.3-1.033-4.885h-.25a14.45 14.45 0 0 1-5.119 4.368 15.6 15.6 0 0 1-6.372 1.143q-5.1 0-8-2.63t-2.9-7.483q0-10.4 16.626-10.9l5.823-.188V47.6q0-4.038-1.738-5.964t-5.552-1.923a22.6 22.6 0 0 0-9.706 2.63l-1.6-3.977a24.4 24.4 0 0 1 5.557-2.16 24 24 0 0 1 6.058-.783q6.136 0 9.1 2.724t2.959 8.735V70.3Zm-11.741-3.663a10.55 10.55 0 0 0 7.626-2.66 9.85 9.85 0 0 0 2.771-7.451v-3.1l-5.2.219q-6.2.219-8.939 1.926a5.8 5.8 0 0 0-2.74 5.306 5.35 5.35 0 0 0 1.707 4.29 7.08 7.08 0 0 0 4.775 1.472Z",className:"logo_small_svg__cls-2","data-name":"Path 2943"})),m||(m=n.createElement("path",{id:"logo_small_svg__Path_2944",d:"M264.6 35.987v3.287l-6.356.752a11.16 11.16 0 0 1 2.255 6.856 10.15 10.15 0 0 1-3.444 8.047q-3.444 3-9.456 3a15.7 15.7 0 0 1-2.88-.25Q241.4 59.438 241.4 62.1a2.24 2.24 0 0 0 1.159 2.082 8.46 8.46 0 0 0 3.976.673h6.074q5.573 0 8.563 2.348a8.16 8.16 0 0 1 2.99 6.825 9.74 9.74 0 0 1-4.571 8.688q-4.572 2.989-13.338 2.99-6.732 0-10.379-2.5a8.09 8.09 0 0 1-3.647-7.076 7.95 7.95 0 0 1 2-5.417 10.2 10.2 0 0 1 5.636-3.1 5.43 5.43 0 0 1-2.207-1.847 4.9 4.9 0 0 1-.893-2.912 5.53 5.53 0 0 1 1-3.288 10.5 10.5 0 0 1 3.162-2.723 9.28 9.28 0 0 1-4.336-3.726 10.95 10.95 0 0 1-1.675-6.012q0-5.634 3.382-8.688t9.58-3.052a17.4 17.4 0 0 1 4.853.626Zm-27.367 40.075a4.66 4.66 0 0 0 2.348 4.227 12.97 12.97 0 0 0 6.732 1.44q6.543 0 9.69-1.956a5.99 5.99 0 0 0 3.147-5.307q0-2.787-1.723-3.867t-6.481-1.08h-6.23a8.2 8.2 0 0 0-5.51 1.69 6.04 6.04 0 0 0-1.973 4.853m2.818-29.086a6.98 6.98 0 0 0 2.035 5.448 8.12 8.12 0 0 0 5.667 1.847q7.608 0 7.608-7.389 0-7.733-7.7-7.733a7.63 7.63 0 0 0-5.635 1.972q-1.976 1.973-1.975 5.855",className:"logo_small_svg__cls-2","data-name":"Path 2944"})),g||(g=n.createElement("path",{id:"logo_small_svg__Path_2945",d:"M299.136 35.987v3.287l-6.356.752a11.17 11.17 0 0 1 2.254 6.856 10.15 10.15 0 0 1-3.444 8.047q-3.444 3-9.455 3a15.7 15.7 0 0 1-2.88-.25q-3.32 1.754-3.319 4.415a2.24 2.24 0 0 0 1.158 2.082 8.46 8.46 0 0 0 3.976.673h6.074q5.574 0 8.563 2.348a8.16 8.16 0 0 1 2.99 6.825 9.74 9.74 0 0 1-4.571 8.688q-4.57 2.989-13.337 2.99-6.732 0-10.379-2.5a8.09 8.09 0 0 1-3.648-7.076 7.95 7.95 0 0 1 2-5.417 10.2 10.2 0 0 1 5.636-3.1 5.43 5.43 0 0 1-2.208-1.847 4.9 4.9 0 0 1-.892-2.912 5.53 5.53 0 0 1 1-3.288 10.5 10.5 0 0 1 3.162-2.723 9.27 9.27 0 0 1-4.336-3.726 10.95 10.95 0 0 1-1.675-6.012q0-5.634 3.381-8.688t9.581-3.052a17.4 17.4 0 0 1 4.853.626Zm-27.364 40.075a4.66 4.66 0 0 0 2.348 4.227 12.97 12.97 0 0 0 6.731 1.44q6.544 0 9.691-1.956a5.99 5.99 0 0 0 3.146-5.307q0-2.787-1.722-3.867t-6.481-1.08h-6.23a8.2 8.2 0 0 0-5.511 1.69 6.04 6.04 0 0 0-1.972 4.853m2.818-29.086a6.98 6.98 0 0 0 2.035 5.448 8.12 8.12 0 0 0 5.667 1.847q7.607 0 7.608-7.389 0-7.733-7.7-7.733a7.63 7.63 0 0 0-5.635 1.972q-1.975 1.973-1.975 5.855",className:"logo_small_svg__cls-2","data-name":"Path 2945"})),v||(v=n.createElement("path",{id:"logo_small_svg__Path_2946",d:"M316.778 70.928q-7.608 0-12.007-4.634t-4.4-12.868q0-8.3 4.086-13.181a13.57 13.57 0 0 1 10.974-4.884 12.94 12.94 0 0 1 10.207 4.239q3.762 4.247 3.762 11.2v3.287h-23.643q.156 6.044 3.053 9.174t8.156 3.131a27.6 27.6 0 0 0 10.958-2.317v4.634a27.5 27.5 0 0 1-5.213 1.706 29.3 29.3 0 0 1-5.933.513m-1.409-31.215a8.49 8.49 0 0 0-6.591 2.692 12.4 12.4 0 0 0-2.9 7.452h17.94q0-4.916-2.191-7.53a7.71 7.71 0 0 0-6.258-2.614",className:"logo_small_svg__cls-2","data-name":"Path 2946"})),b||(b=n.createElement("path",{id:"logo_small_svg__Path_2947",d:"M350.9 35.361a20.4 20.4 0 0 1 4.1.375l-.721 4.822a17.7 17.7 0 0 0-3.757-.47 9.14 9.14 0 0 0-7.122 3.382 12.33 12.33 0 0 0-2.959 8.422V70.3h-5.2V35.987h4.29l.6 6.356h.25a15.1 15.1 0 0 1 4.6-5.166 10.36 10.36 0 0 1 5.919-1.816",className:"logo_small_svg__cls-2","data-name":"Path 2947"})),w||(w=n.createElement("path",{id:"logo_small_svg__Path_2948",d:"M255.857 96.638s-3.43-.391-4.85-.391c-2.058 0-3.111.735-3.111 2.18 0 1.568.882 1.935 3.748 2.719 3.527.98 4.8 1.911 4.8 4.777 0 3.675-2.3 5.267-5.61 5.267a36 36 0 0 1-5.487-.662l.27-2.18s3.306.441 5.046.441c2.082 0 3.037-.931 3.037-2.7 0-1.421-.759-1.91-3.331-2.523-3.626-.93-5.193-2.033-5.193-4.948 0-3.381 2.229-4.776 5.585-4.776a37 37 0 0 1 5.315.587Z",className:"logo_small_svg__cls-2","data-name":"Path 2948"})),I||(I=n.createElement("path",{id:"logo_small_svg__Path_2949",d:"M262.967 94.14h4.733l3.748 13.106L275.2 94.14h4.752v16.78H277.2v-14.5h-.145l-4.191 13.816h-2.842l-4.191-13.816h-.145v14.5h-2.719Z",className:"logo_small_svg__cls-2","data-name":"Path 2949"})),x||(x=n.createElement("path",{id:"logo_small_svg__Path_2950",d:"M322.057 94.14H334.3v2.425h-4.728v14.355h-2.743V96.565h-4.777Z",className:"logo_small_svg__cls-2","data-name":"Path 2950"})),B||(B=n.createElement("path",{id:"logo_small_svg__Path_2951",d:"M346.137 94.14c3.332 0 5.12 1.249 5.12 4.361 0 2.033-.637 3.037-1.984 3.772 1.445.563 2.4 1.592 2.4 3.9 0 3.43-2.081 4.752-5.339 4.752h-6.566V94.14Zm-3.65 2.352v4.8h3.6c1.666 0 2.4-.832 2.4-2.474 0-1.617-.833-2.327-2.5-2.327Zm0 7.1v4.973h3.7c1.689 0 2.694-.539 2.694-2.548 0-1.911-1.421-2.425-2.744-2.425Z",className:"logo_small_svg__cls-2","data-name":"Path 2951"})),k||(k=n.createElement("path",{id:"logo_small_svg__Path_2952",d:"M358.414 94.14H369v2.377h-7.864v4.751h6.394v2.332h-6.394v4.924H369v2.4h-10.586Z",className:"logo_small_svg__cls-2","data-name":"Path 2952"})),C||(C=n.createElement("path",{id:"logo_small_svg__Path_2953",d:"M378.747 94.14h5.414l4.164 16.78h-2.744l-1.239-4.92h-5.777l-1.239 4.923h-2.719Zm.361 9.456h4.708l-1.737-7.178h-1.225Z",className:"logo_small_svg__cls-2","data-name":"Path 2953"})),q||(q=n.createElement("path",{id:"logo_small_svg__Path_2954",d:"M397.1 105.947v4.973h-2.719V94.14h6.37c3.7 0 5.683 2.12 5.683 5.843 0 2.376-.956 4.519-2.744 5.352l2.769 5.585h-2.989l-2.426-4.973Zm3.651-9.455H397.1v7.1h3.7c2.057 0 2.841-1.85 2.841-3.589 0-1.9-.934-3.511-2.894-3.511Z",className:"logo_small_svg__cls-2","data-name":"Path 2954"})),L||(L=n.createElement("path",{id:"logo_small_svg__Path_2955",d:"M290.013 94.14h5.413l4.164 16.78h-2.743l-1.239-4.92h-5.777l-1.239 4.923h-2.719Zm.361 9.456h4.707l-1.737-7.178h-1.225Z",className:"logo_small_svg__cls-2","data-name":"Path 2955"})),j||(j=n.createElement("path",{id:"logo_small_svg__Path_2956",d:"M308.362 105.947v4.973h-2.719V94.14h6.369c3.7 0 5.683 2.12 5.683 5.843 0 2.376-.955 4.519-2.743 5.352l2.768 5.585h-2.989l-2.425-4.973Zm3.65-9.455h-3.65v7.1h3.7c2.058 0 2.841-1.85 2.841-3.589-.003-1.903-.931-3.511-2.891-3.511",className:"logo_small_svg__cls-2","data-name":"Path 2956"})),z||(z=n.createElement("path",{id:"logo_small_svg__Path_2957",d:"M130.606 107.643a3.02 3.02 0 0 1-1.18 2.537 5.1 5.1 0 0 1-3.2.91 8 8 0 0 1-3.371-.564v-1.383a9 9 0 0 0 1.652.506 8.7 8.7 0 0 0 1.77.186 3.57 3.57 0 0 0 2.157-.544 1.78 1.78 0 0 0 .725-1.512 1.95 1.95 0 0 0-.257-1.05 2.4 2.4 0 0 0-.86-.754 12 12 0 0 0-1.833-.784 5.84 5.84 0 0 1-2.456-1.458 3.2 3.2 0 0 1-.738-2.2 2.74 2.74 0 0 1 1.071-2.267 4.44 4.44 0 0 1 2.831-.843 8.3 8.3 0 0 1 3.38.675l-.447 1.247a7.6 7.6 0 0 0-2.966-.641 2.88 2.88 0 0 0-1.779.489 1.61 1.61 0 0 0-.64 1.357 2.1 2.1 0 0 0 .236 1.049 2.2 2.2 0 0 0 .8.75 10 10 0 0 0 1.715.754 6.8 6.8 0 0 1 2.667 1.483 2.92 2.92 0 0 1 .723 2.057",className:"logo_small_svg__cls-2","data-name":"Path 2957"})),P||(P=n.createElement("path",{id:"logo_small_svg__Path_2958",d:"M134.447 101.686v5.991a2.4 2.4 0 0 0 .515 1.686 2.1 2.1 0 0 0 1.609.556 2.63 2.63 0 0 0 2.12-.792 4 4 0 0 0 .67-2.587v-4.854h1.4v9.236H139.6l-.2-1.239h-.075a2.8 2.8 0 0 1-1.193 1.045 4 4 0 0 1-1.74.362 3.53 3.53 0 0 1-2.524-.8 3.4 3.4 0 0 1-.839-2.562v-6.042Z",className:"logo_small_svg__cls-2","data-name":"Path 2958"})),D||(D=n.createElement("path",{id:"logo_small_svg__Path_2959",d:"M148.206 111.09a4 4 0 0 1-1.647-.333 3.1 3.1 0 0 1-1.252-1.023h-.1a12 12 0 0 1 .1 1.533v3.8h-1.4v-13.381h1.137l.194 1.264h.067a3.26 3.26 0 0 1 1.256-1.1 3.8 3.8 0 0 1 1.643-.337 3.41 3.41 0 0 1 2.836 1.256 6.68 6.68 0 0 1-.017 7.057 3.42 3.42 0 0 1-2.817 1.264m-.2-8.385a2.48 2.48 0 0 0-2.048.784 4.04 4.04 0 0 0-.649 2.494v.312a4.63 4.63 0 0 0 .649 2.785 2.47 2.47 0 0 0 2.082.839 2.16 2.16 0 0 0 1.875-.969 4.6 4.6 0 0 0 .678-2.671 4.43 4.43 0 0 0-.678-2.651 2.23 2.23 0 0 0-1.915-.923Z",className:"logo_small_svg__cls-2","data-name":"Path 2959"})),U||(U=n.createElement("path",{id:"logo_small_svg__Path_2960",d:"M159.039 111.09a4 4 0 0 1-1.647-.333 3.1 3.1 0 0 1-1.252-1.023h-.1a12 12 0 0 1 .1 1.533v3.8h-1.4v-13.381h1.137l.194 1.264h.067a3.26 3.26 0 0 1 1.256-1.1 3.8 3.8 0 0 1 1.643-.337 3.41 3.41 0 0 1 2.836 1.256 6.68 6.68 0 0 1-.017 7.057 3.42 3.42 0 0 1-2.817 1.264m-.2-8.385a2.48 2.48 0 0 0-2.048.784 4.04 4.04 0 0 0-.649 2.494v.312a4.63 4.63 0 0 0 .649 2.785 2.47 2.47 0 0 0 2.082.839 2.16 2.16 0 0 0 1.875-.969 4.6 4.6 0 0 0 .678-2.671 4.43 4.43 0 0 0-.678-2.651 2.23 2.23 0 0 0-1.911-.923Z",className:"logo_small_svg__cls-2","data-name":"Path 2960"})),W||(W=n.createElement("path",{id:"logo_small_svg__Path_2961",d:"M173.612 106.3a5.1 5.1 0 0 1-1.137 3.527 4 4 0 0 1-3.143 1.268 4.17 4.17 0 0 1-2.2-.581 3.84 3.84 0 0 1-1.483-1.669 5.8 5.8 0 0 1-.522-2.545 5.1 5.1 0 0 1 1.129-3.518 4 4 0 0 1 3.135-1.26 3.9 3.9 0 0 1 3.08 1.29 5.07 5.07 0 0 1 1.141 3.488m-7.036 0a4.4 4.4 0 0 0 .708 2.7 2.81 2.81 0 0 0 4.167 0 4.37 4.37 0 0 0 .712-2.7 4.3 4.3 0 0 0-.712-2.675 2.5 2.5 0 0 0-2.1-.915 2.46 2.46 0 0 0-2.072.9 4.33 4.33 0 0 0-.7 2.69Z",className:"logo_small_svg__cls-2","data-name":"Path 2961"})),K||(K=n.createElement("path",{id:"logo_small_svg__Path_2962",d:"M180.525 101.517a5.5 5.5 0 0 1 1.1.1l-.194 1.3a4.8 4.8 0 0 0-1.011-.127 2.46 2.46 0 0 0-1.917.911 3.32 3.32 0 0 0-.8 2.267v4.955h-1.4v-9.236h1.154l.16 1.71h.068a4.05 4.05 0 0 1 1.238-1.39 2.8 2.8 0 0 1 1.6-.49Z",className:"logo_small_svg__cls-2","data-name":"Path 2962"})),V||(V=n.createElement("path",{id:"logo_small_svg__Path_2963",d:"M187.363 109.936a4.5 4.5 0 0 0 .716-.055 4 4 0 0 0 .548-.114v1.07a2.5 2.5 0 0 1-.67.181 5 5 0 0 1-.8.072q-2.68 0-2.68-2.823v-5.494h-1.323v-.673l1.323-.582.59-1.972h.809v2.141h2.68v1.087h-2.68v5.435a1.87 1.87 0 0 0 .4 1.281 1.38 1.38 0 0 0 1.087.446",className:"logo_small_svg__cls-2","data-name":"Path 2963"})),$||($=n.createElement("path",{id:"logo_small_svg__Path_2964",d:"M194.538 111.09a4.24 4.24 0 0 1-3.231-1.247 4.82 4.82 0 0 1-1.184-3.463 5.36 5.36 0 0 1 1.1-3.548 3.65 3.65 0 0 1 2.954-1.315 3.48 3.48 0 0 1 2.747 1.142 4.38 4.38 0 0 1 1.011 3.013v.885h-6.362a3.66 3.66 0 0 0 .822 2.469 2.84 2.84 0 0 0 2.2.843 7.4 7.4 0 0 0 2.949-.624v1.247a7.4 7.4 0 0 1-1.4.459 8 8 0 0 1-1.6.139Zm-.379-8.4a2.29 2.29 0 0 0-1.774.725 3.34 3.34 0 0 0-.779 2.006h4.828a3.07 3.07 0 0 0-.59-2.027 2.08 2.08 0 0 0-1.685-.706Z",className:"logo_small_svg__cls-2","data-name":"Path 2964"})),H||(H=n.createElement("path",{id:"logo_small_svg__Path_2965",d:"M206.951 109.683h-.076a3.29 3.29 0 0 1-2.9 1.407 3.43 3.43 0 0 1-2.819-1.239 5.45 5.45 0 0 1-1.006-3.522 5.54 5.54 0 0 1 1.011-3.548 3.4 3.4 0 0 1 2.814-1.264 3.36 3.36 0 0 1 2.883 1.365h.109l-.059-.665-.034-.649v-3.759h1.4v13.113h-1.138Zm-2.8.236a2.55 2.55 0 0 0 2.078-.779 3.95 3.95 0 0 0 .644-2.516v-.3a4.64 4.64 0 0 0-.653-2.8 2.48 2.48 0 0 0-2.086-.839 2.14 2.14 0 0 0-1.883.957 4.76 4.76 0 0 0-.653 2.7 4.55 4.55 0 0 0 .649 2.671 2.2 2.2 0 0 0 1.906.906Z",className:"logo_small_svg__cls-2","data-name":"Path 2965"})),Y||(Y=n.createElement("path",{id:"logo_small_svg__Path_2966",d:"M220.712 101.534a3.44 3.44 0 0 1 2.827 1.243 6.65 6.65 0 0 1-.009 7.053 3.42 3.42 0 0 1-2.818 1.26 4 4 0 0 1-1.648-.333 3.1 3.1 0 0 1-1.251-1.023h-.1l-.295 1.188h-1V97.809h1.4V101q0 1.069-.068 1.921h.068a3.32 3.32 0 0 1 2.894-1.387m-.2 1.171a2.44 2.44 0 0 0-2.064.822 6.34 6.34 0 0 0 .017 5.553 2.46 2.46 0 0 0 2.081.839 2.16 2.16 0 0 0 1.922-.94 4.83 4.83 0 0 0 .632-2.7 4.64 4.64 0 0 0-.632-2.689 2.24 2.24 0 0 0-1.959-.885Z",className:"logo_small_svg__cls-2","data-name":"Path 2966"})),Z||(Z=n.createElement("path",{id:"logo_small_svg__Path_2967",d:"M225.758 101.686h1.5l2.023 5.267a20 20 0 0 1 .826 2.6h.067q.109-.431.459-1.471t2.288-6.4h1.5l-3.969 10.518a5.25 5.25 0 0 1-1.378 2.212 2.93 2.93 0 0 1-1.934.653 5.7 5.7 0 0 1-1.264-.143V113.8a5 5 0 0 0 1.037.1 2.136 2.136 0 0 0 2.056-1.618l.514-1.314Z",className:"logo_small_svg__cls-2","data-name":"Path 2967"}))))),components_Logo=()=>n.createElement(logo_small,{height:"40"}),top_bar=()=>({components:{Topbar:u,Logo:components_Logo}});function isNothing(t){return null==t}var J={isNothing,isObject:function js_yaml_isObject(t){return"object"==typeof t&&null!==t},toArray:function toArray(t){return Array.isArray(t)?t:isNothing(t)?[]:[t]},repeat:function repeat(t,e){var r,n="";for(r=0;rs&&(e=n-s+(o=" ... ").length),r-n>s&&(r=n+s-(a=" ...").length),{str:o+t.slice(e,r).replace(/\t/g,"→")+a,pos:n-e+o.length}}function padStart(t,e){return J.repeat(" ",e-t.length)+t}var et=function makeSnippet(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),"number"!=typeof e.indent&&(e.indent=1),"number"!=typeof e.linesBefore&&(e.linesBefore=3),"number"!=typeof e.linesAfter&&(e.linesAfter=2);for(var r,n=/\r?\n|\r|\0/g,i=[0],o=[],a=-1;r=n.exec(t.buffer);)o.push(r.index),i.push(r.index+r[0].length),t.position<=r.index&&a<0&&(a=i.length-2);a<0&&(a=i.length-1);var s,u,c="",f=Math.min(t.line+e.linesAfter,o.length).toString().length,l=e.maxLength-(e.indent+f+3);for(s=1;s<=e.linesBefore&&!(a-s<0);s++)u=getLine(t.buffer,i[a-s],o[a-s],t.position-(i[a]-i[a-s]),l),c=J.repeat(" ",e.indent)+padStart((t.line-s+1).toString(),f)+" | "+u.str+"\n"+c;for(u=getLine(t.buffer,i[a],o[a],t.position,l),c+=J.repeat(" ",e.indent)+padStart((t.line+1).toString(),f)+" | "+u.str+"\n",c+=J.repeat("-",e.indent+f+3+u.pos)+"^\n",s=1;s<=e.linesAfter&&!(a+s>=o.length);s++)u=getLine(t.buffer,i[a+s],o[a+s],t.position-(i[a]-i[a+s]),l),c+=J.repeat(" ",e.indent)+padStart((t.line+s+1).toString(),f)+" | "+u.str+"\n";return c.replace(/\n$/,"")},rt=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],nt=["scalar","sequence","mapping"];var it=function Type$1(t,e){if(e=e||{},Object.keys(e).forEach((function(e){if(-1===rt.indexOf(e))throw new tt('Unknown option "'+e+'" is met in definition of "'+t+'" YAML type.')})),this.options=e,this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.representName=e.representName||null,this.defaultStyle=e.defaultStyle||null,this.multi=e.multi||!1,this.styleAliases=function compileStyleAliases(t){var e={};return null!==t&&Object.keys(t).forEach((function(r){t[r].forEach((function(t){e[String(t)]=r}))})),e}(e.styleAliases||null),-1===nt.indexOf(this.kind))throw new tt('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')};function compileList(t,e){var r=[];return t[e].forEach((function(t){var e=r.length;r.forEach((function(r,n){r.tag===t.tag&&r.kind===t.kind&&r.multi===t.multi&&(e=n)})),r[e]=t})),r}function Schema$1(t){return this.extend(t)}Schema$1.prototype.extend=function extend(t){var e=[],r=[];if(t instanceof it)r.push(t);else if(Array.isArray(t))r=r.concat(t);else{if(!t||!Array.isArray(t.implicit)&&!Array.isArray(t.explicit))throw new tt("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");t.implicit&&(e=e.concat(t.implicit)),t.explicit&&(r=r.concat(t.explicit))}e.forEach((function(t){if(!(t instanceof it))throw new tt("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(t.loadKind&&"scalar"!==t.loadKind)throw new tt("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(t.multi)throw new tt("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")})),r.forEach((function(t){if(!(t instanceof it))throw new tt("Specified list of YAML types (or a single Type object) contains a non-Type object.")}));var n=Object.create(Schema$1.prototype);return n.implicit=(this.implicit||[]).concat(e),n.explicit=(this.explicit||[]).concat(r),n.compiledImplicit=compileList(n,"implicit"),n.compiledExplicit=compileList(n,"explicit"),n.compiledTypeMap=function compileMap(){var t,e,r={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function collectType(t){t.multi?(r.multi[t.kind].push(t),r.multi.fallback.push(t)):r[t.kind][t.tag]=r.fallback[t.tag]=t}for(t=0,e=arguments.length;t=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0o"+t.toString(8):"-0o"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),dt=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var _t=/^[-+]?[0-9]+e/;var yt=new it("tag:yaml.org,2002:float",{kind:"scalar",resolve:function resolveYamlFloat(t){return null!==t&&!(!dt.test(t)||"_"===t[t.length-1])},construct:function constructYamlFloat(t){var e,r;return r="-"===(e=t.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(e[0])>=0&&(e=e.slice(1)),".inf"===e?1===r?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===e?NaN:r*parseFloat(e,10)},predicate:function isFloat(t){return"[object Number]"===Object.prototype.toString.call(t)&&(t%1!=0||J.isNegativeZero(t))},represent:function representYamlFloat(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(J.isNegativeZero(t))return"-0.0";return r=t.toString(10),_t.test(r)?r.replace("e",".e"):r},defaultStyle:"lowercase"}),mt=ct.extend({implicit:[lt,ht,pt,yt]}),gt=mt,vt=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),bt=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");var St=new it("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function resolveYamlTimestamp(t){return null!==t&&(null!==vt.exec(t)||null!==bt.exec(t))},construct:function constructYamlTimestamp(t){var e,r,n,i,o,a,s,u,c=0,f=null;if(null===(e=vt.exec(t))&&(e=bt.exec(t)),null===e)throw new Error("Date resolve error");if(r=+e[1],n=+e[2]-1,i=+e[3],!e[4])return new Date(Date.UTC(r,n,i));if(o=+e[4],a=+e[5],s=+e[6],e[7]){for(c=e[7].slice(0,3);c.length<3;)c+="0";c=+c}return e[9]&&(f=6e4*(60*+e[10]+ +(e[11]||0)),"-"===e[9]&&(f=-f)),u=new Date(Date.UTC(r,n,i,o,a,s,c)),f&&u.setTime(u.getTime()-f),u},instanceOf:Date,represent:function representYamlTimestamp(t){return t.toISOString()}});var wt=new it("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function resolveYamlMerge(t){return"<<"===t||null===t}}),It="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";var xt=new it("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function resolveYamlBinary(t){if(null===t)return!1;var e,r,n=0,i=t.length,o=It;for(r=0;r64)){if(e<0)return!1;n+=6}return n%8==0},construct:function constructYamlBinary(t){var e,r,n=t.replace(/[\r\n=]/g,""),i=n.length,o=It,a=0,s=[];for(e=0;e>16&255),s.push(a>>8&255),s.push(255&a)),a=a<<6|o.indexOf(n.charAt(e));return 0===(r=i%4*6)?(s.push(a>>16&255),s.push(a>>8&255),s.push(255&a)):18===r?(s.push(a>>10&255),s.push(a>>2&255)):12===r&&s.push(a>>4&255),new Uint8Array(s)},predicate:function isBinary(t){return"[object Uint8Array]"===Object.prototype.toString.call(t)},represent:function representYamlBinary(t){var e,r,n="",i=0,o=t.length,a=It;for(e=0;e>18&63],n+=a[i>>12&63],n+=a[i>>6&63],n+=a[63&i]),i=(i<<8)+t[e];return 0===(r=o%3)?(n+=a[i>>18&63],n+=a[i>>12&63],n+=a[i>>6&63],n+=a[63&i]):2===r?(n+=a[i>>10&63],n+=a[i>>4&63],n+=a[i<<2&63],n+=a[64]):1===r&&(n+=a[i>>2&63],n+=a[i<<4&63],n+=a[64],n+=a[64]),n}}),Et=Object.prototype.hasOwnProperty,Ot=Object.prototype.toString;var Bt=new it("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function resolveYamlOmap(t){if(null===t)return!0;var e,r,n,i,o,a=[],s=t;for(e=0,r=s.length;e>10),56320+(t-65536&1023))}for(var $t=new Array(256),Ht=new Array(256),Yt=0;Yt<256;Yt++)$t[Yt]=simpleEscapeSequence(Yt)?1:0,Ht[Yt]=simpleEscapeSequence(Yt);function State$1(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||qt,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function generateError(t,e){var r={name:t.filename,buffer:t.input.slice(0,-1),position:t.position,line:t.line,column:t.position-t.lineStart};return r.snippet=et(r),new tt(e,r)}function throwError(t,e){throw generateError(t,e)}function throwWarning(t,e){t.onWarning&&t.onWarning.call(null,generateError(t,e))}var Zt={YAML:function handleYamlDirective(t,e,r){var n,i,o;null!==t.version&&throwError(t,"duplication of %YAML directive"),1!==r.length&&throwError(t,"YAML directive accepts exactly one argument"),null===(n=/^([0-9]+)\.([0-9]+)$/.exec(r[0]))&&throwError(t,"ill-formed argument of the YAML directive"),i=parseInt(n[1],10),o=parseInt(n[2],10),1!==i&&throwError(t,"unacceptable YAML version of the document"),t.version=r[0],t.checkLineBreaks=o<2,1!==o&&2!==o&&throwWarning(t,"unsupported YAML version of the document")},TAG:function handleTagDirective(t,e,r){var n,i;2!==r.length&&throwError(t,"TAG directive accepts exactly two arguments"),n=r[0],i=r[1],Kt.test(n)||throwError(t,"ill-formed tag handle (first argument) of the TAG directive"),Lt.call(t.tagMap,n)&&throwError(t,'there is a previously declared suffix for "'+n+'" tag handle'),Vt.test(i)||throwError(t,"ill-formed tag prefix (second argument) of the TAG directive");try{i=decodeURIComponent(i)}catch(e){throwError(t,"tag prefix is malformed: "+i)}t.tagMap[n]=i}};function captureSegment(t,e,r,n){var i,o,a,s;if(e1&&(t.result+=J.repeat("\n",e-1))}function readBlockSequence(t,e){var r,n,i=t.tag,o=t.anchor,a=[],s=!1;if(-1!==t.firstTabInLine)return!1;for(null!==t.anchor&&(t.anchorMap[t.anchor]=a),n=t.input.charCodeAt(t.position);0!==n&&(-1!==t.firstTabInLine&&(t.position=t.firstTabInLine,throwError(t,"tab characters must not be used in indentation")),45===n)&&is_WS_OR_EOL(t.input.charCodeAt(t.position+1));)if(s=!0,t.position++,skipSeparationSpace(t,!0,-1)&&t.lineIndent<=e)a.push(null),n=t.input.charCodeAt(t.position);else if(r=t.line,composeNode(t,e,Tt,!1,!0),a.push(t.result),skipSeparationSpace(t,!0,-1),n=t.input.charCodeAt(t.position),(t.line===r||t.lineIndent>e)&&0!==n)throwError(t,"bad indentation of a sequence entry");else if(t.lineIndente?d=1:t.lineIndent===e?d=0:t.lineIndente?d=1:t.lineIndent===e?d=0:t.lineIndente)&&(m&&(a=t.line,s=t.lineStart,u=t.position),composeNode(t,e,Rt,!0,i)&&(m?_=t.result:y=t.result),m||(storeMappingPair(t,h,p,d,_,y,a,s,u),d=_=y=null),skipSeparationSpace(t,!0,-1),c=t.input.charCodeAt(t.position)),(t.line===o||t.lineIndent>e)&&0!==c)throwError(t,"bad indentation of a mapping entry");else if(t.lineIndent=0))break;0===i?throwError(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):c?throwError(t,"repeat of an indentation width identifier"):(f=e+i-1,c=!0)}if(is_WHITE_SPACE(o)){do{o=t.input.charCodeAt(++t.position)}while(is_WHITE_SPACE(o));if(35===o)do{o=t.input.charCodeAt(++t.position)}while(!is_EOL(o)&&0!==o)}for(;0!==o;){for(readLineBreak(t),t.lineIndent=0,o=t.input.charCodeAt(t.position);(!c||t.lineIndentf&&(f=t.lineIndent),is_EOL(o))l++;else{if(t.lineIndent0){for(i=a,o=0;i>0;i--)(a=fromHexCode(s=t.input.charCodeAt(++t.position)))>=0?o=(o<<4)+a:throwError(t,"expected hexadecimal character");t.result+=charFromCodepoint(o),t.position++}else throwError(t,"unknown escape sequence");r=n=t.position}else is_EOL(s)?(captureSegment(t,r,n,!0),writeFoldedLines(t,skipSeparationSpace(t,!1,e)),r=n=t.position):t.position===t.lineStart&&testDocumentSeparator(t)?throwError(t,"unexpected end of the document within a double quoted scalar"):(t.position++,n=t.position)}throwError(t,"unexpected end of the stream within a double quoted scalar")}(t,h)?y=!0:!function readAlias(t){var e,r,n;if(42!==(n=t.input.charCodeAt(t.position)))return!1;for(n=t.input.charCodeAt(++t.position),e=t.position;0!==n&&!is_WS_OR_EOL(n)&&!is_FLOW_INDICATOR(n);)n=t.input.charCodeAt(++t.position);return t.position===e&&throwError(t,"name of an alias node must contain at least one character"),r=t.input.slice(e,t.position),Lt.call(t.anchorMap,r)||throwError(t,'unidentified alias "'+r+'"'),t.result=t.anchorMap[r],skipSeparationSpace(t,!0,-1),!0}(t)?function readPlainScalar(t,e,r){var n,i,o,a,s,u,c,f,l=t.kind,h=t.result;if(is_WS_OR_EOL(f=t.input.charCodeAt(t.position))||is_FLOW_INDICATOR(f)||35===f||38===f||42===f||33===f||124===f||62===f||39===f||34===f||37===f||64===f||96===f)return!1;if((63===f||45===f)&&(is_WS_OR_EOL(n=t.input.charCodeAt(t.position+1))||r&&is_FLOW_INDICATOR(n)))return!1;for(t.kind="scalar",t.result="",i=o=t.position,a=!1;0!==f;){if(58===f){if(is_WS_OR_EOL(n=t.input.charCodeAt(t.position+1))||r&&is_FLOW_INDICATOR(n))break}else if(35===f){if(is_WS_OR_EOL(t.input.charCodeAt(t.position-1)))break}else{if(t.position===t.lineStart&&testDocumentSeparator(t)||r&&is_FLOW_INDICATOR(f))break;if(is_EOL(f)){if(s=t.line,u=t.lineStart,c=t.lineIndent,skipSeparationSpace(t,!1,-1),t.lineIndent>=e){a=!0,f=t.input.charCodeAt(t.position);continue}t.position=o,t.line=s,t.lineStart=u,t.lineIndent=c;break}}a&&(captureSegment(t,i,o,!1),writeFoldedLines(t,t.line-s),i=o=t.position,a=!1),is_WHITE_SPACE(f)||(o=t.position+1),f=t.input.charCodeAt(++t.position)}return captureSegment(t,i,o,!1),!!t.result||(t.kind=l,t.result=h,!1)}(t,h,Nt===r)&&(y=!0,null===t.tag&&(t.tag="?")):(y=!0,null===t.tag&&null===t.anchor||throwError(t,"alias node should not have any properties")),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):0===d&&(y=s&&readBlockSequence(t,p))),null===t.tag)null!==t.anchor&&(t.anchorMap[t.anchor]=t.result);else if("?"===t.tag){for(null!==t.result&&"scalar"!==t.kind&&throwError(t,'unacceptable node kind for ! tag; it should be "scalar", not "'+t.kind+'"'),u=0,c=t.implicitTypes.length;u"),null!==t.result&&l.kind!==t.kind&&throwError(t,"unacceptable node kind for !<"+t.tag+'> tag; it should be "'+l.kind+'", not "'+t.kind+'"'),l.resolve(t.result,t.tag)?(t.result=l.construct(t.result,t.tag),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):throwError(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")}return null!==t.listener&&t.listener("close",t),null!==t.tag||null!==t.anchor||y}function readDocument(t){var e,r,n,i,o=t.position,a=!1;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap=Object.create(null),t.anchorMap=Object.create(null);0!==(i=t.input.charCodeAt(t.position))&&(skipSeparationSpace(t,!0,-1),i=t.input.charCodeAt(t.position),!(t.lineIndent>0||37!==i));){for(a=!0,i=t.input.charCodeAt(++t.position),e=t.position;0!==i&&!is_WS_OR_EOL(i);)i=t.input.charCodeAt(++t.position);for(n=[],(r=t.input.slice(e,t.position)).length<1&&throwError(t,"directive name must not be less than one character in length");0!==i;){for(;is_WHITE_SPACE(i);)i=t.input.charCodeAt(++t.position);if(35===i){do{i=t.input.charCodeAt(++t.position)}while(0!==i&&!is_EOL(i));break}if(is_EOL(i))break;for(e=t.position;0!==i&&!is_WS_OR_EOL(i);)i=t.input.charCodeAt(++t.position);n.push(t.input.slice(e,t.position))}0!==i&&readLineBreak(t),Lt.call(Zt,r)?Zt[r](t,r,n):throwWarning(t,'unknown document directive "'+r+'"')}skipSeparationSpace(t,!0,-1),0===t.lineIndent&&45===t.input.charCodeAt(t.position)&&45===t.input.charCodeAt(t.position+1)&&45===t.input.charCodeAt(t.position+2)?(t.position+=3,skipSeparationSpace(t,!0,-1)):a&&throwError(t,"directives end mark is expected"),composeNode(t,t.lineIndent-1,Rt,!1,!0),skipSeparationSpace(t,!0,-1),t.checkLineBreaks&&Ut.test(t.input.slice(o,t.position))&&throwWarning(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&testDocumentSeparator(t)?46===t.input.charCodeAt(t.position)&&(t.position+=3,skipSeparationSpace(t,!0,-1)):t.position=55296&&n<=56319&&e+1=56320&&r<=57343?1024*(n-55296)+r-56320+65536:n}function needIndentIndicator(t){return/^\n* /.test(t)}var Ae=1,Ce=2,Me=3,qe=4,Le=5;function chooseScalarStyle(t,e,r,n,i,o,a,s){var u,c=0,f=null,l=!1,h=!1,p=-1!==n,d=-1,_=function isPlainSafeFirst(t){return isPrintable(t)&&t!==Xt&&!isWhitespace(t)&&t!==he&&t!==ye&&t!==pe&&t!==le&&t!==ge&&t!==ve&&t!==Se&&t!==Ie&&t!==ae&&t!==ue&&t!==fe&&t!==ie&&t!==we&&t!==de&&t!==_e&&t!==ce&&t!==oe&&t!==se&&t!==me&&t!==be}(codePointAt(t,0))&&function isPlainSafeLast(t){return!isWhitespace(t)&&t!==pe}(codePointAt(t,t.length-1));if(e||a)for(u=0;u=65536?u+=2:u++){if(!isPrintable(c=codePointAt(t,u)))return Le;_=_&&isPlainSafe(c,f,s),f=c}else{for(u=0;u=65536?u+=2:u++){if((c=codePointAt(t,u))===ee)l=!0,p&&(h=h||u-d-1>n&&" "!==t[d+1],d=u);else if(!isPrintable(c))return Le;_=_&&isPlainSafe(c,f,s),f=c}h=h||p&&u-d-1>n&&" "!==t[d+1]}return l||h?r>9&&needIndentIndicator(t)?Le:a?o===ke?Le:Ce:h?qe:Me:!_||a||i(t)?o===ke?Le:Ce:Ae}function writeScalar(t,e,r,n,i){t.dump=function(){if(0===e.length)return t.quotingType===ke?'""':"''";if(!t.noCompatMode&&(-1!==Ee.indexOf(e)||Oe.test(e)))return t.quotingType===ke?'"'+e+'"':"'"+e+"'";var o=t.indent*Math.max(1,r),a=-1===t.lineWidth?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-o),s=n||t.flowLevel>-1&&r>=t.flowLevel;switch(chooseScalarStyle(e,s,t.indent,a,(function testAmbiguity(e){return function testImplicitResolving(t,e){var r,n;for(r=0,n=t.implicitTypes.length;r"+blockHeader(e,t.indent)+dropEndingNewline(indentString(function foldString(t,e){var r,n,i=/(\n+)([^\n]*)/g,o=(s=t.indexOf("\n"),s=-1!==s?s:t.length,i.lastIndex=s,foldLine(t.slice(0,s),e)),a="\n"===t[0]||" "===t[0];var s;for(;n=i.exec(t);){var u=n[1],c=n[2];r=" "===c[0],o+=u+(a||r||""===c?"":"\n")+foldLine(c,e),a=r}return o}(e,a),o));case Le:return'"'+function escapeString(t){for(var e,r="",n=0,i=0;i=65536?i+=2:i++)n=codePointAt(t,i),!(e=xe[n])&&isPrintable(n)?(r+=t[i],n>=65536&&(r+=t[i+1])):r+=e||encodeHex(n);return r}(e)+'"';default:throw new tt("impossible error: invalid scalar style")}}()}function blockHeader(t,e){var r=needIndentIndicator(t)?String(e):"",n="\n"===t[t.length-1];return r+(n&&("\n"===t[t.length-2]||"\n"===t)?"+":n?"":"-")+"\n"}function dropEndingNewline(t){return"\n"===t[t.length-1]?t.slice(0,-1):t}function foldLine(t,e){if(""===t||" "===t[0])return t;for(var r,n,i=/ [^ ]/g,o=0,a=0,s=0,u="";r=i.exec(t);)(s=r.index)-o>e&&(n=a>o?a:s,u+="\n"+t.slice(o,n),o=n+1),a=s;return u+="\n",t.length-o>e&&a>o?u+=t.slice(o,a)+"\n"+t.slice(a+1):u+=t.slice(o),u.slice(1)}function writeBlockSequence(t,e,r,n){var i,o,a,s="",u=t.tag;for(i=0,o=r.length;i tag resolver accepts not "'+u+'" style');n=s.represent[u](e,u)}t.dump=n}return!0}return!1}function writeNode(t,e,r,n,i,o,a){t.tag=null,t.dump=r,detectType(t,r,!1)||detectType(t,r,!0);var s,u=Jt.call(t.dump),c=n;n&&(n=t.flowLevel<0||t.flowLevel>e);var f,l,h="[object Object]"===u||"[object Array]"===u;if(h&&(l=-1!==(f=t.duplicates.indexOf(r))),(null!==t.tag&&"?"!==t.tag||l||2!==t.indent&&e>0)&&(i=!1),l&&t.usedDuplicates[f])t.dump="*ref_"+f;else{if(h&&l&&!t.usedDuplicates[f]&&(t.usedDuplicates[f]=!0),"[object Object]"===u)n&&0!==Object.keys(t.dump).length?(!function writeBlockMapping(t,e,r,n){var i,o,a,s,u,c,f="",l=t.tag,h=Object.keys(r);if(!0===t.sortKeys)h.sort();else if("function"==typeof t.sortKeys)h.sort(t.sortKeys);else if(t.sortKeys)throw new tt("sortKeys must be a boolean or a function");for(i=0,o=h.length;i1024)&&(t.dump&&ee===t.dump.charCodeAt(0)?c+="?":c+="? "),c+=t.dump,u&&(c+=generateNextLine(t,e)),writeNode(t,e+1,s,!0,u)&&(t.dump&&ee===t.dump.charCodeAt(0)?c+=":":c+=": ",f+=c+=t.dump));t.tag=l,t.dump=f||"{}"}(t,e,t.dump,i),l&&(t.dump="&ref_"+f+t.dump)):(!function writeFlowMapping(t,e,r){var n,i,o,a,s,u="",c=t.tag,f=Object.keys(r);for(n=0,i=f.length;n1024&&(s+="? "),s+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),writeNode(t,e,a,!1,!1)&&(u+=s+=t.dump));t.tag=c,t.dump="{"+u+"}"}(t,e,t.dump),l&&(t.dump="&ref_"+f+" "+t.dump));else if("[object Array]"===u)n&&0!==t.dump.length?(t.noArrayIndent&&!a&&e>0?writeBlockSequence(t,e-1,t.dump,i):writeBlockSequence(t,e,t.dump,i),l&&(t.dump="&ref_"+f+t.dump)):(!function writeFlowSequence(t,e,r){var n,i,o,a="",s=t.tag;for(n=0,i=r.length;n",t.dump=s+" "+t.dump)}return!0}function getDuplicateReferences(t,e){var r,n,i=[],o=[];for(inspectNode(t,i,o),r=0,n=o.length;r()=>{},downloadConfig=t=>e=>{const{fn:{fetch:r}}=e;return r(t)},getConfigByUrl=(t,e)=>r=>{const{specActions:n,configsActions:i}=r;if(t)return i.downloadConfig(t).then(next,next);function next(i){i instanceof Error||i.status>=400?(n.updateLoadingStatus("failedConfig"),n.updateLoadingStatus("failedConfig"),n.updateUrl(""),console.error(i.statusText+" "+t.url),e(null)):e(((t,e)=>{try{return Ne.load(t)}catch(t){return e&&e.errActions.newThrownErr(new Error(t)),{}}})(i.text,r))}},get=(t,e)=>t.getIn(Array.isArray(e)?e:[e]),Re={[je]:(t,e)=>t.merge((0,o.fromJS)(e.payload)),[Te]:(t,e)=>{const r=e.payload,n=t.get(r);return t.set(r,!n)}};var ze=__webpack_require__(7248),Pe=__webpack_require__.n(ze),Fe=__webpack_require__(7666),De=__webpack_require__.n(Fe);const Ue=console.error,withErrorBoundary=t=>e=>{const{getComponent:r,fn:i}=t(),o=r("ErrorBoundary"),a=i.getDisplayName(e);class WithErrorBoundary extends n.Component{render(){return n.createElement(o,{targetName:a,getComponent:r,fn:i},n.createElement(e,De()({},this.props,this.context)))}}var s;return WithErrorBoundary.displayName=`WithErrorBoundary(${a})`,(s=e).prototype&&s.prototype.isReactComponent&&(WithErrorBoundary.prototype.mapStateToProps=e.prototype.mapStateToProps),WithErrorBoundary},fallback=({name:t})=>n.createElement("div",{className:"fallback"},"😱 ",n.createElement("i",null,"Could not render ","t"===t?"this component":t,", see the console."));class ErrorBoundary extends n.Component{static defaultProps={targetName:"this component",getComponent:()=>fallback,fn:{componentDidCatch:Ue},children:null};static getDerivedStateFromError(t){return{hasError:!0,error:t}}constructor(...t){super(...t),this.state={hasError:!1,error:null}}componentDidCatch(t,e){this.props.fn.componentDidCatch(t,e)}render(){const{getComponent:t,targetName:e,children:r}=this.props;if(this.state.hasError){const r=t("Fallback");return n.createElement(r,{name:e})}return r}}const We=ErrorBoundary,Ke=[top_bar,function configsPlugin(){return{statePlugins:{configs:{reducers:Re,actions:t,selectors:e}}}},stadalone_layout,(({componentList:t=[],fullOverride:e=!1}={})=>({getSystem:r})=>{const n=e?t:["App","BaseLayout","VersionPragmaFilter","InfoContainer","ServersContainer","SchemesContainer","AuthorizeBtnContainer","FilterContainer","Operations","OperationContainer","parameters","responses","OperationServers","Models","ModelWrapper",...t],i=Pe()(n,Array(n.length).fill(((t,{fn:e})=>e.withErrorBoundary(t))));return{fn:{componentDidCatch:Ue,withErrorBoundary:withErrorBoundary(r)},components:{ErrorBoundary:We,Fallback:fallback},wrapComponents:i}})({fullOverride:!0,componentList:["Topbar","StandaloneLayout","onlineValidatorBadge"]})]})(),r=r.default})())); \ No newline at end of file +!function webpackUniversalModuleDefinition(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.SwaggerUIStandalonePreset=e():t.SwaggerUIStandalonePreset=e()}(this,(()=>(()=>{var t={2:(t,e,r)=>{var n=r(2199),o=r(4664),i=r(5950);t.exports=function getAllKeys(t){return n(t,i,o)}},41:(t,e,r)=>{"use strict";var n=r(655),o=r(8068),i=r(9675),a=r(5795);t.exports=function defineDataProperty(t,e,r){if(!t||"object"!=typeof t&&"function"!=typeof t)throw new i("`obj` must be an object or a function`");if("string"!=typeof e&&"symbol"!=typeof e)throw new i("`property` must be a string or a symbol`");if(arguments.length>3&&"boolean"!=typeof arguments[3]&&null!==arguments[3])throw new i("`nonEnumerable`, if provided, must be a boolean or null");if(arguments.length>4&&"boolean"!=typeof arguments[4]&&null!==arguments[4])throw new i("`nonWritable`, if provided, must be a boolean or null");if(arguments.length>5&&"boolean"!=typeof arguments[5]&&null!==arguments[5])throw new i("`nonConfigurable`, if provided, must be a boolean or null");if(arguments.length>6&&"boolean"!=typeof arguments[6])throw new i("`loose`, if provided, must be a boolean");var s=arguments.length>3?arguments[3]:null,u=arguments.length>4?arguments[4]:null,c=arguments.length>5?arguments[5]:null,f=arguments.length>6&&arguments[6],l=!!a&&a(t,e);if(n)n(t,e,{configurable:null===c&&l?l.configurable:!c,enumerable:null===s&&l?l.enumerable:!s,value:r,writable:null===u&&l?l.writable:!u});else{if(!f&&(s||u||c))throw new o("This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.");t[e]=r}}},76:t=>{"use strict";t.exports=Function.prototype.call},79:(t,e,r)=>{var n=r(3702),o=r(80),i=r(4739),a=r(8655),s=r(1175);function ListCache(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e{var n=r(6025),o=Array.prototype.splice;t.exports=function listCacheDelete(t){var e=this.__data__,r=n(e,t);return!(r<0)&&(r==e.length-1?e.pop():o.call(e,r,1),--this.size,!0)}},104:(t,e,r)=>{var n=r(3661);function memoize(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var memoized=function(){var r=arguments,n=e?e.apply(this,r):r[0],o=memoized.cache;if(o.has(n))return o.get(n);var i=t.apply(this,r);return memoized.cache=o.set(n,i)||o,i};return memoized.cache=new(memoize.Cache||n),memoized}memoize.Cache=n,t.exports=memoize},251:(t,e)=>{e.read=function(t,e,r,n,o){var i,a,s=8*o-n-1,u=(1<>1,f=-7,l=r?o-1:0,p=r?-1:1,h=t[e+l];for(l+=p,i=h&(1<<-f)-1,h>>=-f,f+=s;f>0;i=256*i+t[e+l],l+=p,f-=8);for(a=i&(1<<-f)-1,i>>=-f,f+=n;f>0;a=256*a+t[e+l],l+=p,f-=8);if(0===i)i=1-c;else{if(i===u)return a?NaN:1/0*(h?-1:1);a+=Math.pow(2,n),i-=c}return(h?-1:1)*a*Math.pow(2,i-n)},e.write=function(t,e,r,n,o,i){var a,s,u,c=8*i-o-1,f=(1<>1,p=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,h=n?0:i-1,d=n?1:-1,y=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,a=f):(a=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-a))<1&&(a--,u*=2),(e+=a+l>=1?p/u:p*Math.pow(2,1-l))*u>=2&&(a++,u/=2),a+l>=f?(s=0,a=f):a+l>=1?(s=(e*u-1)*Math.pow(2,o),a+=l):(s=e*Math.pow(2,l-1)*Math.pow(2,o),a=0));o>=8;t[r+h]=255&s,h+=d,s/=256,o-=8);for(a=a<0;t[r+h]=255&a,h+=d,a/=256,c-=8);t[r+h-d]|=128*y}},270:(t,e,r)=>{var n=r(7068),o=r(346);t.exports=function baseIsEqual(t,e,r,i,a){return t===e||(null==t||null==e||!o(t)&&!o(e)?t!=t&&e!=e:n(t,e,r,i,baseIsEqual,a))}},289:(t,e,r)=>{var n=r(2651);t.exports=function mapCacheGet(t){return n(this,t).get(t)}},294:t=>{t.exports=function isLength(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}},317:t=>{t.exports=function mapToArray(t){var e=-1,r=Array(t.size);return t.forEach((function(t,n){r[++e]=[n,t]})),r}},346:t=>{t.exports=function isObjectLike(t){return null!=t&&"object"==typeof t}},361:t=>{var e=/^(?:0|[1-9]\d*)$/;t.exports=function isIndex(t,r){var n=typeof t;return!!(r=null==r?9007199254740991:r)&&("number"==n||"symbol"!=n&&e.test(t))&&t>-1&&t%1==0&&t{"use strict";t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},392:t=>{t.exports=function getValue(t,e){return null==t?void 0:t[e]}},414:t=>{"use strict";t.exports=Math.round},453:(t,e,r)=>{"use strict";var n,o=r(9612),i=r(9383),a=r(1237),s=r(9290),u=r(9538),c=r(8068),f=r(9675),l=r(5345),p=r(1514),h=r(8968),d=r(6188),y=r(8002),_=r(5880),g=r(414),m=r(3093),v=Function,getEvalledConstructor=function(t){try{return v('"use strict"; return ('+t+").constructor;")()}catch(t){}},b=r(5795),w=r(655),throwTypeError=function(){throw new f},I=b?function(){try{return throwTypeError}catch(t){try{return b(arguments,"callee").get}catch(t){return throwTypeError}}}():throwTypeError,x=r(4039)(),B=r(3628),k=r(1064),C=r(8648),j=r(1002),q=r(76),L={},P="undefined"!=typeof Uint8Array&&B?B(Uint8Array):n,U={__proto__:null,"%AggregateError%":"undefined"==typeof AggregateError?n:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?n:ArrayBuffer,"%ArrayIteratorPrototype%":x&&B?B([][Symbol.iterator]()):n,"%AsyncFromSyncIteratorPrototype%":n,"%AsyncFunction%":L,"%AsyncGenerator%":L,"%AsyncGeneratorFunction%":L,"%AsyncIteratorPrototype%":L,"%Atomics%":"undefined"==typeof Atomics?n:Atomics,"%BigInt%":"undefined"==typeof BigInt?n:BigInt,"%BigInt64Array%":"undefined"==typeof BigInt64Array?n:BigInt64Array,"%BigUint64Array%":"undefined"==typeof BigUint64Array?n:BigUint64Array,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?n:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":i,"%eval%":eval,"%EvalError%":a,"%Float32Array%":"undefined"==typeof Float32Array?n:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?n:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?n:FinalizationRegistry,"%Function%":v,"%GeneratorFunction%":L,"%Int8Array%":"undefined"==typeof Int8Array?n:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?n:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?n:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":x&&B?B(B([][Symbol.iterator]())):n,"%JSON%":"object"==typeof JSON?JSON:n,"%Map%":"undefined"==typeof Map?n:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&x&&B?B((new Map)[Symbol.iterator]()):n,"%Math%":Math,"%Number%":Number,"%Object%":o,"%Object.getOwnPropertyDescriptor%":b,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?n:Promise,"%Proxy%":"undefined"==typeof Proxy?n:Proxy,"%RangeError%":s,"%ReferenceError%":u,"%Reflect%":"undefined"==typeof Reflect?n:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?n:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&x&&B?B((new Set)[Symbol.iterator]()):n,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?n:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":x&&B?B(""[Symbol.iterator]()):n,"%Symbol%":x?Symbol:n,"%SyntaxError%":c,"%ThrowTypeError%":I,"%TypedArray%":P,"%TypeError%":f,"%Uint8Array%":"undefined"==typeof Uint8Array?n:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?n:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?n:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?n:Uint32Array,"%URIError%":l,"%WeakMap%":"undefined"==typeof WeakMap?n:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?n:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?n:WeakSet,"%Function.prototype.call%":q,"%Function.prototype.apply%":j,"%Object.defineProperty%":w,"%Object.getPrototypeOf%":k,"%Math.abs%":p,"%Math.floor%":h,"%Math.max%":d,"%Math.min%":y,"%Math.pow%":_,"%Math.round%":g,"%Math.sign%":m,"%Reflect.getPrototypeOf%":C};if(B)try{null.error}catch(t){var D=B(B(t));U["%Error.prototype%"]=D}var z=function doEval(t){var e;if("%AsyncFunction%"===t)e=getEvalledConstructor("async function () {}");else if("%GeneratorFunction%"===t)e=getEvalledConstructor("function* () {}");else if("%AsyncGeneratorFunction%"===t)e=getEvalledConstructor("async function* () {}");else if("%AsyncGenerator%"===t){var r=doEval("%AsyncGeneratorFunction%");r&&(e=r.prototype)}else if("%AsyncIteratorPrototype%"===t){var n=doEval("%AsyncGenerator%");n&&B&&(e=B(n.prototype))}return U[t]=e,e},W={__proto__:null,"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},V=r(6743),K=r(9957),$=V.call(q,Array.prototype.concat),H=V.call(j,Array.prototype.splice),Y=V.call(q,String.prototype.replace),Z=V.call(q,String.prototype.slice),J=V.call(q,RegExp.prototype.exec),tt=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,et=/\\(\\)?/g,rt=function getBaseIntrinsic(t,e){var r,n=t;if(K(W,n)&&(n="%"+(r=W[n])[0]+"%"),K(U,n)){var o=U[n];if(o===L&&(o=z(n)),void 0===o&&!e)throw new f("intrinsic "+t+" exists, but is not available. Please file an issue!");return{alias:r,name:n,value:o}}throw new c("intrinsic "+t+" does not exist!")};t.exports=function GetIntrinsic(t,e){if("string"!=typeof t||0===t.length)throw new f("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof e)throw new f('"allowMissing" argument must be a boolean');if(null===J(/^%?[^%]*%?$/,t))throw new c("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var r=function stringToPath(t){var e=Z(t,0,1),r=Z(t,-1);if("%"===e&&"%"!==r)throw new c("invalid intrinsic syntax, expected closing `%`");if("%"===r&&"%"!==e)throw new c("invalid intrinsic syntax, expected opening `%`");var n=[];return Y(t,tt,(function(t,e,r,o){n[n.length]=r?Y(o,et,"$1"):e||t})),n}(t),n=r.length>0?r[0]:"",o=rt("%"+n+"%",e),i=o.name,a=o.value,s=!1,u=o.alias;u&&(n=u[0],H(r,$([0,1],u)));for(var l=1,p=!0;l=r.length){var _=b(a,h);a=(p=!!_)&&"get"in _&&!("originalValue"in _.get)?_.get:a[h]}else p=K(a,h),a=a[h];p&&!s&&(U[i]=a)}}return a}},462:(t,e,r)=>{"use strict";var n=r(975);t.exports=n},470:(t,e,r)=>{"use strict";var n=r(6028),o=r(5594);t.exports=function(t){var e=n(t,"string");return o(e)?e:e+""}},487:(t,e,r)=>{"use strict";var n=r(6897),o=r(655),i=r(3126),a=r(4586);t.exports=function callBind(t){var e=i(arguments),r=t.length-(arguments.length-1);return n(e,1+(r>0?r:0),!0)},o?o(t.exports,"apply",{value:a}):t.exports.apply=a},575:(t,e,r)=>{"use strict";var n=r(3121);t.exports=function(t){return n(t.length)}},581:(t,e,r)=>{"use strict";var n=r(3930),o=r(2250),i=r(6285),a=TypeError;t.exports=function(t,e){var r,s;if("string"===e&&o(r=t.toString)&&!i(s=n(r,t)))return s;if(o(r=t.valueOf)&&!i(s=n(r,t)))return s;if("string"!==e&&o(r=t.toString)&&!i(s=n(r,t)))return s;throw new a("Can't convert object to primitive value")}},583:(t,e,r)=>{var n=r(7237),o=r(7255),i=r(8586),a=r(7797);t.exports=function property(t){return i(t)?n(a(t)):o(t)}},592:(t,e,r)=>{"use strict";var n=r(655),o=function hasPropertyDescriptors(){return!!n};o.hasArrayLengthDefineBug=function hasArrayLengthDefineBug(){if(!n)return null;try{return 1!==n([],"length",{value:1}).length}catch(t){return!0}},t.exports=o},631:(t,e,r)=>{var n=r(8077),o=r(9326);t.exports=function hasIn(t,e){return null!=t&&o(t,e,n)}},641:(t,e,r)=>{var n=r(6649),o=r(5950);t.exports=function baseForOwn(t,e){return t&&n(t,e,o)}},655:t=>{"use strict";var e=Object.defineProperty||!1;if(e)try{e({},"a",{value:1})}catch(t){e=!1}t.exports=e},659:(t,e,r)=>{var n=r(1873),o=Object.prototype,i=o.hasOwnProperty,a=o.toString,s=n?n.toStringTag:void 0;t.exports=function getRawTag(t){var e=i.call(t,s),r=t[s];try{t[s]=void 0;var n=!0}catch(t){}var o=a.call(t);return n&&(e?t[s]=r:delete t[s]),o}},689:(t,e,r)=>{var n=r(2),o=Object.prototype.hasOwnProperty;t.exports=function equalObjects(t,e,r,i,a,s){var u=1&r,c=n(t),f=c.length;if(f!=n(e).length&&!u)return!1;for(var l=f;l--;){var p=c[l];if(!(u?p in e:o.call(e,p)))return!1}var h=s.get(t),d=s.get(e);if(h&&d)return h==e&&d==t;var y=!0;s.set(t,e),s.set(e,t);for(var _=u;++l{var n=r(8096),o=r(2428),i=r(6449),a=r(3656),s=r(361),u=r(7167),c=Object.prototype.hasOwnProperty;t.exports=function arrayLikeKeys(t,e){var r=i(t),f=!r&&o(t),l=!r&&!f&&a(t),p=!r&&!f&&!l&&u(t),h=r||f||l||p,d=h?n(t.length,String):[],y=d.length;for(var _ in t)!e&&!c.call(t,_)||h&&("length"==_||l&&("offset"==_||"parent"==_)||p&&("buffer"==_||"byteLength"==_||"byteOffset"==_)||s(_,y))||d.push(_);return d}},756:(t,e,r)=>{var n=r(3805);t.exports=function isStrictComparable(t){return t==t&&!n(t)}},776:(t,e,r)=>{var n=r(756),o=r(5950);t.exports=function getMatchData(t){for(var e=o(t),r=e.length;r--;){var i=e[r],a=t[i];e[r]=[i,a,n(a)]}return e}},798:(t,e,r)=>{"use strict";var n,o,i=r(5951),a=r(6794),s=i.process,u=i.Deno,c=s&&s.versions||u&&u.version,f=c&&c.v8;f&&(o=(n=f.split("."))[0]>0&&n[0]<4?1:+(n[0]+n[1])),!o&&a&&(!(n=a.match(/Edge\/(\d+)/))||n[1]>=74)&&(n=a.match(/Chrome\/(\d+)/))&&(o=+n[1]),t.exports=o},828:(t,e,r)=>{var n=r(4647),o=r(3222),i=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,a=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");t.exports=function deburr(t){return(t=o(t))&&t.replace(i,n).replace(a,"")}},882:t=>{t.exports=function arrayReduce(t,e,r,n){var o=-1,i=null==t?0:t.length;for(n&&i&&(r=t[++o]);++o{var n=r(641),o=r(8329)(n);t.exports=o},916:(t,e,r)=>{var n=r(909);t.exports=function baseSome(t,e){var r;return n(t,(function(t,n,o){return!(r=e(t,n,o))})),!!r}},938:t=>{t.exports=function stackDelete(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}},945:(t,e,r)=>{var n=r(79),o=r(8223),i=r(3661);t.exports=function stackSet(t,e){var r=this.__data__;if(r instanceof n){var a=r.__data__;if(!o||a.length<199)return a.push([t,e]),this.size=++r.size,this;r=this.__data__=new i(a)}return r.set(t,e),this.size=r.size,this}},953:(t,e,r)=>{"use strict";t.exports=r(3375)},975:(t,e,r)=>{"use strict";var n=r(9748);t.exports=n},1002:t=>{"use strict";t.exports=Function.prototype.apply},1042:(t,e,r)=>{var n=r(6110)(Object,"create");t.exports=n},1064:(t,e,r)=>{"use strict";var n=r(9612);t.exports=n.getPrototypeOf||null},1074:t=>{t.exports=function asciiToArray(t){return t.split("")}},1091:(t,e,r)=>{"use strict";var n=r(5951),o=r(6024),i=r(2361),a=r(2250),s=r(3846).f,u=r(7463),c=r(2046),f=r(8311),l=r(1626),p=r(9724);r(6128);var wrapConstructor=function(t){var Wrapper=function(e,r,n){if(this instanceof Wrapper){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,r)}return new t(e,r,n)}return o(t,this,arguments)};return Wrapper.prototype=t.prototype,Wrapper};t.exports=function(t,e){var r,o,h,d,y,_,g,m,v,b=t.target,w=t.global,I=t.stat,x=t.proto,B=w?n:I?n[b]:n[b]&&n[b].prototype,k=w?c:c[b]||l(c,b,{})[b],C=k.prototype;for(d in e)o=!(r=u(w?d:b+(I?".":"#")+d,t.forced))&&B&&p(B,d),_=k[d],o&&(g=t.dontCallGetSet?(v=s(B,d))&&v.value:B[d]),y=o&&g?g:e[d],(r||x||typeof _!=typeof y)&&(m=t.bind&&o?f(y,n):t.wrap&&o?wrapConstructor(y):x&&a(y)?i(y):y,(t.sham||y&&y.sham||_&&_.sham)&&l(m,"sham",!0),l(k,d,m),x&&(p(c,h=b+"Prototype")||l(c,h,{}),l(c[h],d,y),t.real&&C&&(r||!C[d])&&l(C,d,y)))}},1175:(t,e,r)=>{var n=r(6025);t.exports=function listCacheSet(t,e){var r=this.__data__,o=n(r,t);return o<0?(++this.size,r.push([t,e])):r[o][1]=e,this}},1176:t=>{"use strict";var e=Math.ceil,r=Math.floor;t.exports=Math.trunc||function trunc(t){var n=+t;return(n>0?r:e)(n)}},1234:t=>{t.exports=function baseZipObject(t,e,r){for(var n=-1,o=t.length,i=e.length,a={};++n{"use strict";t.exports=EvalError},1333:t=>{"use strict";t.exports=function hasSymbols(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var t={},e=Symbol("test"),r=Object(e);if("string"==typeof e)return!1;if("[object Symbol]"!==Object.prototype.toString.call(e))return!1;if("[object Symbol]"!==Object.prototype.toString.call(r))return!1;for(var n in t[e]=42,t)return!1;if("function"==typeof Object.keys&&0!==Object.keys(t).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(t).length)return!1;var o=Object.getOwnPropertySymbols(t);if(1!==o.length||o[0]!==e)return!1;if(!Object.prototype.propertyIsEnumerable.call(t,e))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var i=Object.getOwnPropertyDescriptor(t,e);if(42!==i.value||!0!==i.enumerable)return!1}return!0}},1340:(t,e,r)=>{"use strict";var n=r(1091),o=r(7157);n({target:"Object",stat:!0,arity:2,forced:Object.assign!==o},{assign:o})},1380:t=>{t.exports=function setCacheAdd(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this}},1420:(t,e,r)=>{var n=r(79);t.exports=function stackClear(){this.__data__=new n,this.size=0}},1459:t=>{t.exports=function setCacheHas(t){return this.__data__.has(t)}},1489:(t,e,r)=>{var n=r(7400);t.exports=function toInteger(t){var e=n(t),r=e%1;return e==e?r?e-r:e:0}},1505:(t,e,r)=>{"use strict";var n=r(8828);t.exports=!n((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},1514:t=>{"use strict";t.exports=Math.abs},1549:(t,e,r)=>{var n=r(2032),o=r(3862),i=r(6721),a=r(2749),s=r(5749);function Hash(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e{"use strict";var n=r(9447),o=r(4284),i=r(5817);t.exports=n?function(t,e,r){return o.f(t,e,i(1,r))}:function(t,e,r){return t[e]=r,t}},1733:t=>{var e=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;t.exports=function asciiWords(t){return t.match(e)||[]}},1747:(t,e,r)=>{"use strict";var n=r(5951),o=r(2046);t.exports=function(t,e){var r=o[t+"Prototype"],i=r&&r[e];if(i)return i;var a=n[t],s=a&&a.prototype;return s&&s[e]}},1769:(t,e,r)=>{var n=r(6449),o=r(8586),i=r(1802),a=r(3222);t.exports=function castPath(t,e){return n(t)?t:o(t,e)?[t]:i(a(t))}},1799:(t,e,r)=>{var n=r(7217),o=r(270);t.exports=function baseIsMatch(t,e,r,i){var a=r.length,s=a,u=!i;if(null==t)return!s;for(t=Object(t);a--;){var c=r[a];if(u&&c[2]?c[1]!==t[c[0]]:!(c[0]in t))return!1}for(;++a{var e=/\s/;t.exports=function trimmedEndIndex(t){for(var r=t.length;r--&&e.test(t.charAt(r)););return r}},1802:(t,e,r)=>{var n=r(2224),o=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,i=/\\(\\)?/g,a=n((function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(o,(function(t,r,n,o){e.push(n?o.replace(i,"$1"):r||t)})),e}));t.exports=a},1873:(t,e,r)=>{var n=r(9325).Symbol;t.exports=n},1882:(t,e,r)=>{var n=r(2552),o=r(3805);t.exports=function isFunction(t){if(!o(t))return!1;var e=n(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}},1907:(t,e,r)=>{"use strict";var n=r(1505),o=Function.prototype,i=o.call,a=n&&o.bind.bind(i,i);t.exports=n?a:function(t){return function(){return i.apply(t,arguments)}}},1986:(t,e,r)=>{var n=r(1873),o=r(7828),i=r(5288),a=r(5911),s=r(317),u=r(4247),c=n?n.prototype:void 0,f=c?c.valueOf:void 0;t.exports=function equalByTag(t,e,r,n,c,l,p){switch(r){case"[object DataView]":if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case"[object ArrayBuffer]":return!(t.byteLength!=e.byteLength||!l(new o(t),new o(e)));case"[object Boolean]":case"[object Date]":case"[object Number]":return i(+t,+e);case"[object Error]":return t.name==e.name&&t.message==e.message;case"[object RegExp]":case"[object String]":return t==e+"";case"[object Map]":var h=s;case"[object Set]":var d=1&n;if(h||(h=u),t.size!=e.size&&!d)return!1;var y=p.get(t);if(y)return y==e;n|=2,p.set(t,e);var _=a(h(t),h(e),n,c,l,p);return p.delete(t),_;case"[object Symbol]":if(f)return f.call(t)==f.call(e)}return!1}},2006:(t,e,r)=>{var n=r(5389),o=r(4894),i=r(5950);t.exports=function createFind(t){return function(e,r,a){var s=Object(e);if(!o(e)){var u=n(r,3);e=i(e),r=function(t){return u(s[t],t,s)}}var c=t(e,r,a);return c>-1?s[u?e[c]:c]:void 0}}},2032:(t,e,r)=>{var n=r(1042);t.exports=function hashClear(){this.__data__=n?n(null):{},this.size=0}},2046:t=>{"use strict";t.exports={}},2054:t=>{var e="\\ud800-\\udfff",r="["+e+"]",n="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",o="\\ud83c[\\udffb-\\udfff]",i="[^"+e+"]",a="(?:\\ud83c[\\udde6-\\uddff]){2}",s="[\\ud800-\\udbff][\\udc00-\\udfff]",u="(?:"+n+"|"+o+")"+"?",c="[\\ufe0e\\ufe0f]?",f=c+u+("(?:\\u200d(?:"+[i,a,s].join("|")+")"+c+u+")*"),l="(?:"+[i+n+"?",n,a,s,r].join("|")+")",p=RegExp(o+"(?="+o+")|"+l+f,"g");t.exports=function unicodeToArray(t){return t.match(p)||[]}},2159:(t,e,r)=>{"use strict";var n=r(2250),o=r(4640),i=TypeError;t.exports=function(t){if(n(t))return t;throw new i(o(t)+" is not a function")}},2199:(t,e,r)=>{var n=r(4528),o=r(6449);t.exports=function baseGetAllKeys(t,e,r){var i=e(t);return o(t)?i:n(i,r(t))}},2205:function(t,e,r){var n;n=void 0!==r.g?r.g:this,t.exports=function(t){if(t.CSS&&t.CSS.escape)return t.CSS.escape;var cssEscape=function(t){if(0==arguments.length)throw new TypeError("`CSS.escape` requires an argument.");for(var e,r=String(t),n=r.length,o=-1,i="",a=r.charCodeAt(0);++o=1&&e<=31||127==e||0==o&&e>=48&&e<=57||1==o&&e>=48&&e<=57&&45==a?"\\"+e.toString(16)+" ":0==o&&1==n&&45==e||!(e>=128||45==e||95==e||e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122)?"\\"+r.charAt(o):r.charAt(o):i+="�";return i};return t.CSS||(t.CSS={}),t.CSS.escape=cssEscape,cssEscape}(n)},2224:(t,e,r)=>{var n=r(104);t.exports=function memoizeCapped(t){var e=n(t,(function(t){return 500===r.size&&r.clear(),t})),r=e.cache;return e}},2225:t=>{var e="\\ud800-\\udfff",r="\\u2700-\\u27bf",n="a-z\\xdf-\\xf6\\xf8-\\xff",o="A-Z\\xc0-\\xd6\\xd8-\\xde",i="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",a="["+i+"]",s="\\d+",u="["+r+"]",c="["+n+"]",f="[^"+e+i+s+r+n+o+"]",l="(?:\\ud83c[\\udde6-\\uddff]){2}",p="[\\ud800-\\udbff][\\udc00-\\udfff]",h="["+o+"]",d="(?:"+c+"|"+f+")",y="(?:"+h+"|"+f+")",_="(?:['’](?:d|ll|m|re|s|t|ve))?",g="(?:['’](?:D|LL|M|RE|S|T|VE))?",m="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",v="[\\ufe0e\\ufe0f]?",b=v+m+("(?:\\u200d(?:"+["[^"+e+"]",l,p].join("|")+")"+v+m+")*"),w="(?:"+[u,l,p].join("|")+")"+b,I=RegExp([h+"?"+c+"+"+_+"(?="+[a,h,"$"].join("|")+")",y+"+"+g+"(?="+[a,h+d,"$"].join("|")+")",h+"?"+d+"+"+_,h+"+"+g,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",s,w].join("|"),"g");t.exports=function unicodeWords(t){return t.match(I)||[]}},2250:t=>{"use strict";var e="object"==typeof document&&document.all;t.exports=void 0===e&&void 0!==e?function(t){return"function"==typeof t||t===e}:function(t){return"function"==typeof t}},2361:(t,e,r)=>{"use strict";var n=r(5807),o=r(1907);t.exports=function(t){if("Function"===n(t))return o(t)}},2426:(t,e,r)=>{var n=r(4248),o=r(5389),i=r(916),a=r(6449),s=r(6800);t.exports=function some(t,e,r){var u=a(t)?n:i;return r&&s(t,e,r)&&(e=void 0),u(t,o(e,3))}},2428:(t,e,r)=>{var n=r(7534),o=r(346),i=Object.prototype,a=i.hasOwnProperty,s=i.propertyIsEnumerable,u=n(function(){return arguments}())?n:function(t){return o(t)&&a.call(t,"callee")&&!s.call(t,"callee")};t.exports=u},2507:(t,e,r)=>{var n=r(8754),o=r(9698),i=r(3912),a=r(3222);t.exports=function createCaseFirst(t){return function(e){e=a(e);var r=o(e)?i(e):void 0,s=r?r[0]:e.charAt(0),u=r?n(r,1).join(""):e.slice(1);return s[t]()+u}}},2523:t=>{t.exports=function baseFindIndex(t,e,r,n){for(var o=t.length,i=r+(n?1:-1);n?i--:++i{"use strict";var n=r(5951),o=Object.defineProperty;t.exports=function(t,e){try{o(n,t,{value:e,configurable:!0,writable:!0})}catch(r){n[t]=e}return e}},2552:(t,e,r)=>{var n=r(1873),o=r(659),i=r(9350),a=n?n.toStringTag:void 0;t.exports=function baseGetTag(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":a&&a in Object(t)?o(t):i(t)}},2567:(t,e,r)=>{"use strict";r(9307);var n=r(1747);t.exports=n("Function","bind")},2574:(t,e)=>{"use strict";var r={}.propertyIsEnumerable,n=Object.getOwnPropertyDescriptor,o=n&&!r.call({1:2},1);e.f=o?function propertyIsEnumerable(t){var e=n(this,t);return!!e&&e.enumerable}:r},2651:(t,e,r)=>{var n=r(4218);t.exports=function getMapData(t,e){var r=t.__data__;return n(e)?r["string"==typeof e?"string":"hash"]:r.map}},2682:(t,e,r)=>{"use strict";var n=r(9600),o=Object.prototype.toString,i=Object.prototype.hasOwnProperty;t.exports=function forEach(t,e,r){if(!n(e))throw new TypeError("iterator must be a function");var a;arguments.length>=3&&(a=r),function isArray(t){return"[object Array]"===o.call(t)}(t)?function forEachArray(t,e,r){for(var n=0,o=t.length;n{var n=r(1042),o=Object.prototype.hasOwnProperty;t.exports=function hashHas(t){var e=this.__data__;return n?void 0!==e[t]:o.call(e,t)}},2802:(t,e,r)=>{"use strict";t.exports=function SHA(e){var r=e.toLowerCase(),n=t.exports[r];if(!n)throw new Error(r+" is not supported (we accept pull requests)");return new n},t.exports.sha=r(7816),t.exports.sha1=r(3737),t.exports.sha224=r(6710),t.exports.sha256=r(4107),t.exports.sha384=r(2827),t.exports.sha512=r(2890)},2804:(t,e,r)=>{var n=r(6110)(r(9325),"Promise");t.exports=n},2827:(t,e,r)=>{"use strict";var n=r(6698),o=r(2890),i=r(8011),a=r(2861).Buffer,s=new Array(160);function Sha384(){this.init(),this._w=s,i.call(this,128,112)}n(Sha384,o),Sha384.prototype.init=function(){return this._ah=3418070365,this._bh=1654270250,this._ch=2438529370,this._dh=355462360,this._eh=1731405415,this._fh=2394180231,this._gh=3675008525,this._hh=1203062813,this._al=3238371032,this._bl=914150663,this._cl=812702999,this._dl=4144912697,this._el=4290775857,this._fl=1750603025,this._gl=1694076839,this._hl=3204075428,this},Sha384.prototype._hash=function(){var t=a.allocUnsafe(48);function writeInt64BE(e,r,n){t.writeInt32BE(e,n),t.writeInt32BE(r,n+4)}return writeInt64BE(this._ah,this._al,0),writeInt64BE(this._bh,this._bl,8),writeInt64BE(this._ch,this._cl,16),writeInt64BE(this._dh,this._dl,24),writeInt64BE(this._eh,this._el,32),writeInt64BE(this._fh,this._fl,40),t},t.exports=Sha384},2861:(t,e,r)=>{var n=r(8287),o=n.Buffer;function copyProps(t,e){for(var r in t)e[r]=t[r]}function SafeBuffer(t,e,r){return o(t,e,r)}o.from&&o.alloc&&o.allocUnsafe&&o.allocUnsafeSlow?t.exports=n:(copyProps(n,e),e.Buffer=SafeBuffer),SafeBuffer.prototype=Object.create(o.prototype),copyProps(o,SafeBuffer),SafeBuffer.from=function(t,e,r){if("number"==typeof t)throw new TypeError("Argument must not be a number");return o(t,e,r)},SafeBuffer.alloc=function(t,e,r){if("number"!=typeof t)throw new TypeError("Argument must be a number");var n=o(t);return void 0!==e?"string"==typeof r?n.fill(e,r):n.fill(e):n.fill(0),n},SafeBuffer.allocUnsafe=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return o(t)},SafeBuffer.allocUnsafeSlow=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return n.SlowBuffer(t)}},2875:(t,e,r)=>{"use strict";var n=r(3045),o=r(376);t.exports=Object.keys||function keys(t){return n(t,o)}},2890:(t,e,r)=>{"use strict";var n=r(6698),o=r(8011),i=r(2861).Buffer,a=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],s=new Array(160);function Sha512(){this.init(),this._w=s,o.call(this,128,112)}function Ch(t,e,r){return r^t&(e^r)}function maj(t,e,r){return t&e|r&(t|e)}function sigma0(t,e){return(t>>>28|e<<4)^(e>>>2|t<<30)^(e>>>7|t<<25)}function sigma1(t,e){return(t>>>14|e<<18)^(t>>>18|e<<14)^(e>>>9|t<<23)}function Gamma0(t,e){return(t>>>1|e<<31)^(t>>>8|e<<24)^t>>>7}function Gamma0l(t,e){return(t>>>1|e<<31)^(t>>>8|e<<24)^(t>>>7|e<<25)}function Gamma1(t,e){return(t>>>19|e<<13)^(e>>>29|t<<3)^t>>>6}function Gamma1l(t,e){return(t>>>19|e<<13)^(e>>>29|t<<3)^(t>>>6|e<<26)}function getCarry(t,e){return t>>>0>>0?1:0}n(Sha512,o),Sha512.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this},Sha512.prototype._update=function(t){for(var e=this._w,r=0|this._ah,n=0|this._bh,o=0|this._ch,i=0|this._dh,s=0|this._eh,u=0|this._fh,c=0|this._gh,f=0|this._hh,l=0|this._al,p=0|this._bl,h=0|this._cl,d=0|this._dl,y=0|this._el,_=0|this._fl,g=0|this._gl,m=0|this._hl,v=0;v<32;v+=2)e[v]=t.readInt32BE(4*v),e[v+1]=t.readInt32BE(4*v+4);for(;v<160;v+=2){var b=e[v-30],w=e[v-30+1],I=Gamma0(b,w),x=Gamma0l(w,b),B=Gamma1(b=e[v-4],w=e[v-4+1]),k=Gamma1l(w,b),C=e[v-14],j=e[v-14+1],q=e[v-32],L=e[v-32+1],P=x+j|0,U=I+C+getCarry(P,x)|0;U=(U=U+B+getCarry(P=P+k|0,k)|0)+q+getCarry(P=P+L|0,L)|0,e[v]=U,e[v+1]=P}for(var D=0;D<160;D+=2){U=e[D],P=e[D+1];var z=maj(r,n,o),W=maj(l,p,h),V=sigma0(r,l),K=sigma0(l,r),$=sigma1(s,y),H=sigma1(y,s),Y=a[D],Z=a[D+1],J=Ch(s,u,c),tt=Ch(y,_,g),et=m+H|0,rt=f+$+getCarry(et,m)|0;rt=(rt=(rt=rt+J+getCarry(et=et+tt|0,tt)|0)+Y+getCarry(et=et+Z|0,Z)|0)+U+getCarry(et=et+P|0,P)|0;var nt=K+W|0,ot=V+z+getCarry(nt,K)|0;f=c,m=g,c=u,g=_,u=s,_=y,s=i+rt+getCarry(y=d+et|0,d)|0,i=o,d=h,o=n,h=p,n=r,p=l,r=rt+ot+getCarry(l=et+nt|0,et)|0}this._al=this._al+l|0,this._bl=this._bl+p|0,this._cl=this._cl+h|0,this._dl=this._dl+d|0,this._el=this._el+y|0,this._fl=this._fl+_|0,this._gl=this._gl+g|0,this._hl=this._hl+m|0,this._ah=this._ah+r+getCarry(this._al,l)|0,this._bh=this._bh+n+getCarry(this._bl,p)|0,this._ch=this._ch+o+getCarry(this._cl,h)|0,this._dh=this._dh+i+getCarry(this._dl,d)|0,this._eh=this._eh+s+getCarry(this._el,y)|0,this._fh=this._fh+u+getCarry(this._fl,_)|0,this._gh=this._gh+c+getCarry(this._gl,g)|0,this._hh=this._hh+f+getCarry(this._hl,m)|0},Sha512.prototype._hash=function(){var t=i.allocUnsafe(64);function writeInt64BE(e,r,n){t.writeInt32BE(e,n),t.writeInt32BE(r,n+4)}return writeInt64BE(this._ah,this._al,0),writeInt64BE(this._bh,this._bl,8),writeInt64BE(this._ch,this._cl,16),writeInt64BE(this._dh,this._dl,24),writeInt64BE(this._eh,this._el,32),writeInt64BE(this._fh,this._fl,40),writeInt64BE(this._gh,this._gl,48),writeInt64BE(this._hh,this._hl,56),t},t.exports=Sha512},2949:(t,e,r)=>{var n=r(2651);t.exports=function mapCacheSet(t,e){var r=n(this,t),o=r.size;return r.set(t,e),this.size+=r.size==o?0:1,this}},3034:(t,e,r)=>{"use strict";var n=r(8280),o=r(2567),i=Function.prototype;t.exports=function(t){var e=t.bind;return t===i||n(i,t)&&e===i.bind?o:e}},3040:(t,e,r)=>{var n=r(1549),o=r(79),i=r(8223);t.exports=function mapCacheClear(){this.size=0,this.__data__={hash:new n,map:new(i||o),string:new n}}},3045:(t,e,r)=>{"use strict";var n=r(1907),o=r(9724),i=r(7374),a=r(4436).indexOf,s=r(8530),u=n([].push);t.exports=function(t,e){var r,n=i(t),c=0,f=[];for(r in n)!o(s,r)&&o(n,r)&&u(f,r);for(;e.length>c;)o(n,r=e[c++])&&(~a(f,r)||u(f,r));return f}},3093:(t,e,r)=>{"use strict";var n=r(4459);t.exports=function sign(t){return n(t)||0===t?t:t<0?-1:1}},3121:(t,e,r)=>{"use strict";var n=r(5482),o=Math.min;t.exports=function(t){var e=n(t);return e>0?o(e,9007199254740991):0}},3126:(t,e,r)=>{"use strict";var n=r(6743),o=r(9675),i=r(76),a=r(3144);t.exports=function callBindBasic(t){if(t.length<1||"function"!=typeof t[0])throw new o("a function is required");return a(n,i,t)}},3144:(t,e,r)=>{"use strict";var n=r(6743),o=r(1002),i=r(76),a=r(7119);t.exports=a||n.call(i,o)},3209:(t,e,r)=>{"use strict";var n=r(5606),o=65536,i=4294967295;var a=r(2861).Buffer,s=r.g.crypto||r.g.msCrypto;s&&s.getRandomValues?t.exports=function randomBytes(t,e){if(t>i)throw new RangeError("requested too many random bytes");var r=a.allocUnsafe(t);if(t>0)if(t>o)for(var u=0;u{t.exports=function createBaseFor(t){return function(e,r,n){for(var o=-1,i=Object(e),a=n(e),s=a.length;s--;){var u=a[t?s:++o];if(!1===r(i[u],u,i))break}return e}}},3222:(t,e,r)=>{var n=r(7556);t.exports=function toString(t){return null==t?"":n(t)}},3243:(t,e,r)=>{var n=r(6110),o=function(){try{var t=n(Object,"defineProperty");return t({},"",{}),t}catch(t){}}();t.exports=o},3345:t=>{t.exports=function stubArray(){return[]}},3360:(t,e,r)=>{var n=r(3243);t.exports=function baseAssignValue(t,e,r){"__proto__"==e&&n?n(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}},3375:(t,e,r)=>{"use strict";var n=r(3700);t.exports=n},3427:(t,e,r)=>{"use strict";var n=r(1907);t.exports=n([].slice)},3488:t=>{t.exports=function identity(t){return t}},3556:(t,e,r)=>{"use strict";var n=r(9846);t.exports=n&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3605:t=>{t.exports=function stackGet(t){return this.__data__.get(t)}},3628:(t,e,r)=>{"use strict";var n=r(8648),o=r(1064),i=r(7176);t.exports=n?function getProto(t){return n(t)}:o?function getProto(t){if(!t||"object"!=typeof t&&"function"!=typeof t)throw new TypeError("getProto: not an object");return o(t)}:i?function getProto(t){return i(t)}:null},3648:(t,e,r)=>{"use strict";var n=r(9447),o=r(8828),i=r(9552);t.exports=!n&&!o((function(){return 7!==Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},3650:(t,e,r)=>{var n=r(4335)(Object.keys,Object);t.exports=n},3656:(t,e,r)=>{t=r.nmd(t);var n=r(9325),o=r(9935),i=e&&!e.nodeType&&e,a=i&&t&&!t.nodeType&&t,s=a&&a.exports===i?n.Buffer:void 0,u=(s?s.isBuffer:void 0)||o;t.exports=u},3661:(t,e,r)=>{var n=r(3040),o=r(7670),i=r(289),a=r(4509),s=r(2949);function MapCache(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e{var n=r(1799),o=r(776),i=r(7197);t.exports=function baseMatches(t){var e=o(t);return 1==e.length&&e[0][2]?i(e[0][0],e[0][1]):function(r){return r===t||n(r,t,e)}}},3700:(t,e,r)=>{"use strict";var n=r(9709);t.exports=n},3702:t=>{t.exports=function listCacheClear(){this.__data__=[],this.size=0}},3737:(t,e,r)=>{"use strict";var n=r(6698),o=r(8011),i=r(2861).Buffer,a=[1518500249,1859775393,-1894007588,-899497514],s=new Array(80);function Sha1(){this.init(),this._w=s,o.call(this,64,56)}function rotl5(t){return t<<5|t>>>27}function rotl30(t){return t<<30|t>>>2}function ft(t,e,r,n){return 0===t?e&r|~e&n:2===t?e&r|e&n|r&n:e^r^n}n(Sha1,o),Sha1.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},Sha1.prototype._update=function(t){for(var e,r=this._w,n=0|this._a,o=0|this._b,i=0|this._c,s=0|this._d,u=0|this._e,c=0;c<16;++c)r[c]=t.readInt32BE(4*c);for(;c<80;++c)r[c]=(e=r[c-3]^r[c-8]^r[c-14]^r[c-16])<<1|e>>>31;for(var f=0;f<80;++f){var l=~~(f/20),p=rotl5(n)+ft(l,o,i,s)+u+r[f]+a[l]|0;u=s,s=i,i=rotl30(o),o=n,n=p}this._a=n+this._a|0,this._b=o+this._b|0,this._c=i+this._c|0,this._d=s+this._d|0,this._e=u+this._e|0},Sha1.prototype._hash=function(){var t=i.allocUnsafe(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},t.exports=Sha1},3805:t=>{t.exports=function isObject(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},3846:(t,e,r)=>{"use strict";var n=r(9447),o=r(3930),i=r(2574),a=r(5817),s=r(7374),u=r(470),c=r(9724),f=r(3648),l=Object.getOwnPropertyDescriptor;e.f=n?l:function getOwnPropertyDescriptor(t,e){if(t=s(t),e=u(e),f)try{return l(t,e)}catch(t){}if(c(t,e))return a(!o(i.f,t,e),t[e])}},3862:t=>{t.exports=function hashDelete(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}},3912:(t,e,r)=>{var n=r(1074),o=r(9698),i=r(2054);t.exports=function stringToArray(t){return o(t)?i(t):n(t)}},3930:(t,e,r)=>{"use strict";var n=r(1505),o=Function.prototype.call;t.exports=n?o.bind(o):function(){return o.apply(o,arguments)}},4039:(t,e,r)=>{"use strict";var n="undefined"!=typeof Symbol&&Symbol,o=r(1333);t.exports=function hasNativeSymbols(){return"function"==typeof n&&("function"==typeof Symbol&&("symbol"==typeof n("foo")&&("symbol"==typeof Symbol("bar")&&o())))}},4058:(t,e,r)=>{var n=r(4792),o=r(5539)((function(t,e,r){return e=e.toLowerCase(),t+(r?n(e):e)}));t.exports=o},4107:(t,e,r)=>{"use strict";var n=r(6698),o=r(8011),i=r(2861).Buffer,a=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],s=new Array(64);function Sha256(){this.init(),this._w=s,o.call(this,64,56)}function ch(t,e,r){return r^t&(e^r)}function maj(t,e,r){return t&e|r&(t|e)}function sigma0(t){return(t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10)}function sigma1(t){return(t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7)}function gamma0(t){return(t>>>7|t<<25)^(t>>>18|t<<14)^t>>>3}n(Sha256,o),Sha256.prototype.init=function(){return this._a=1779033703,this._b=3144134277,this._c=1013904242,this._d=2773480762,this._e=1359893119,this._f=2600822924,this._g=528734635,this._h=1541459225,this},Sha256.prototype._update=function(t){for(var e,r=this._w,n=0|this._a,o=0|this._b,i=0|this._c,s=0|this._d,u=0|this._e,c=0|this._f,f=0|this._g,l=0|this._h,p=0;p<16;++p)r[p]=t.readInt32BE(4*p);for(;p<64;++p)r[p]=0|(((e=r[p-2])>>>17|e<<15)^(e>>>19|e<<13)^e>>>10)+r[p-7]+gamma0(r[p-15])+r[p-16];for(var h=0;h<64;++h){var d=l+sigma1(u)+ch(u,c,f)+a[h]+r[h]|0,y=sigma0(n)+maj(n,o,i)|0;l=f,f=c,c=u,u=s+d|0,s=i,i=o,o=n,n=d+y|0}this._a=n+this._a|0,this._b=o+this._b|0,this._c=i+this._c|0,this._d=s+this._d|0,this._e=u+this._e|0,this._f=c+this._f|0,this._g=f+this._g|0,this._h=l+this._h|0},Sha256.prototype._hash=function(){var t=i.allocUnsafe(32);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t.writeInt32BE(this._h,28),t},t.exports=Sha256},4128:(t,e,r)=>{var n=r(1800),o=/^\s+/;t.exports=function baseTrim(t){return t?t.slice(0,n(t)+1).replace(o,""):t}},4218:t=>{t.exports=function isKeyable(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},4239:(t,e,r)=>{"use strict";var n=r(7136),o=TypeError;t.exports=function(t){if(n(t))throw new o("Can't call method on "+t);return t}},4247:t=>{t.exports=function setToArray(t){var e=-1,r=Array(t.size);return t.forEach((function(t){r[++e]=t})),r}},4248:t=>{t.exports=function arraySome(t,e){for(var r=-1,n=null==t?0:t.length;++r{"use strict";var n=r(9447),o=r(3648),i=r(8661),a=r(6624),s=r(470),u=TypeError,c=Object.defineProperty,f=Object.getOwnPropertyDescriptor,l="enumerable",p="configurable",h="writable";e.f=n?i?function defineProperty(t,e,r){if(a(t),e=s(e),a(r),"function"==typeof t&&"prototype"===e&&"value"in r&&h in r&&!r[h]){var n=f(t,e);n&&n[h]&&(t[e]=r.value,r={configurable:p in r?r[p]:n[p],enumerable:l in r?r[l]:n[l],writable:!1})}return c(t,e,r)}:c:function defineProperty(t,e,r){if(a(t),e=s(e),a(r),o)try{return c(t,e,r)}catch(t){}if("get"in r||"set"in r)throw new u("Accessors not supported");return"value"in r&&(t[e]=r.value),t}},4335:t=>{t.exports=function overArg(t,e){return function(r){return t(e(r))}}},4372:(t,e,r)=>{"use strict";var n=r(9675),o=r(6556)("TypedArray.prototype.buffer",!0),i=r(5680);t.exports=o||function typedArrayBuffer(t){if(!i(t))throw new n("Not a Typed Array");return t.buffer}},4394:(t,e,r)=>{var n=r(2552),o=r(346);t.exports=function isSymbol(t){return"symbol"==typeof t||o(t)&&"[object Symbol]"==n(t)}},4436:(t,e,r)=>{"use strict";var n=r(7374),o=r(4849),i=r(575),createMethod=function(t){return function(e,r,a){var s=n(e),u=i(s);if(0===u)return!t&&-1;var c,f=o(a,u);if(t&&r!=r){for(;u>f;)if((c=s[f++])!=c)return!0}else for(;u>f;f++)if((t||f in s)&&s[f]===r)return t||f||0;return!t&&-1}};t.exports={includes:createMethod(!0),indexOf:createMethod(!1)}},4459:t=>{"use strict";t.exports=Number.isNaN||function isNaN(t){return t!=t}},4509:(t,e,r)=>{var n=r(2651);t.exports=function mapCacheHas(t){return n(this,t).has(t)}},4528:t=>{t.exports=function arrayPush(t,e){for(var r=-1,n=e.length,o=t.length;++r{t.exports=function basePropertyOf(t){return function(e){return null==t?void 0:t[e]}}},4586:(t,e,r)=>{"use strict";var n=r(6743),o=r(1002),i=r(3144);t.exports=function applyBind(){return i(n,o,arguments)}},4634:t=>{var e={}.toString;t.exports=Array.isArray||function(t){return"[object Array]"==e.call(t)}},4640:t=>{"use strict";var e=String;t.exports=function(t){try{return e(t)}catch(t){return"Object"}}},4647:(t,e,r)=>{var n=r(4552)({À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"});t.exports=n},4664:(t,e,r)=>{var n=r(9770),o=r(3345),i=Object.prototype.propertyIsEnumerable,a=Object.getOwnPropertySymbols,s=a?function(t){return null==t?[]:(t=Object(t),n(a(t),(function(e){return i.call(t,e)})))}:o;t.exports=s},4673:(t,e,r)=>{"use strict";var n=r(1907),o=r(2159),i=r(6285),a=r(9724),s=r(3427),u=r(1505),c=Function,f=n([].concat),l=n([].join),p={};t.exports=u?c.bind:function bind(t){var e=o(this),r=e.prototype,n=s(arguments,1),u=function bound(){var r=f(n,s(arguments));return this instanceof u?function(t,e,r){if(!a(p,e)){for(var n=[],o=0;o{var n=r(2523),o=r(5389),i=r(1489),a=Math.max;t.exports=function findIndex(t,e,r){var s=null==t?0:t.length;if(!s)return-1;var u=null==r?0:i(r);return u<0&&(u=a(s+u,0)),n(t,o(e,3),u)}},4739:(t,e,r)=>{var n=r(6025);t.exports=function listCacheGet(t){var e=this.__data__,r=n(e,t);return r<0?void 0:e[r][1]}},4792:(t,e,r)=>{var n=r(3222),o=r(5808);t.exports=function capitalize(t){return o(n(t).toLowerCase())}},4840:(t,e,r)=>{var n="object"==typeof r.g&&r.g&&r.g.Object===Object&&r.g;t.exports=n},4849:(t,e,r)=>{"use strict";var n=r(5482),o=Math.max,i=Math.min;t.exports=function(t,e){var r=n(t);return r<0?o(r+e,0):i(r,e)}},4851:(t,e,r)=>{"use strict";t.exports=r(5401)},4894:(t,e,r)=>{var n=r(1882),o=r(294);t.exports=function isArrayLike(t){return null!=t&&o(t.length)&&!n(t)}},4901:(t,e,r)=>{var n=r(2552),o=r(294),i=r(346),a={};a["[object Float32Array]"]=a["[object Float64Array]"]=a["[object Int8Array]"]=a["[object Int16Array]"]=a["[object Int32Array]"]=a["[object Uint8Array]"]=a["[object Uint8ClampedArray]"]=a["[object Uint16Array]"]=a["[object Uint32Array]"]=!0,a["[object Arguments]"]=a["[object Array]"]=a["[object ArrayBuffer]"]=a["[object Boolean]"]=a["[object DataView]"]=a["[object Date]"]=a["[object Error]"]=a["[object Function]"]=a["[object Map]"]=a["[object Number]"]=a["[object Object]"]=a["[object RegExp]"]=a["[object Set]"]=a["[object String]"]=a["[object WeakMap]"]=!1,t.exports=function baseIsTypedArray(t){return i(t)&&o(t.length)&&!!a[n(t)]}},4932:t=>{t.exports=function arrayMap(t,e){for(var r=-1,n=null==t?0:t.length,o=Array(n);++r{var n=r(1882),o=r(7296),i=r(3805),a=r(7473),s=/^\[object .+?Constructor\]$/,u=Function.prototype,c=Object.prototype,f=u.toString,l=c.hasOwnProperty,p=RegExp("^"+f.call(l).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function baseIsNative(t){return!(!i(t)||o(t))&&(n(t)?p:s).test(a(t))}},5160:t=>{t.exports=function baseSlice(t,e,r){var n=-1,o=t.length;e<0&&(e=-e>o?0:o+e),(r=r>o?o:r)<0&&(r+=o),o=e>r?0:r-e>>>0,e>>>=0;for(var i=Array(o);++n{"use strict";var r=Symbol.for("react.element"),n=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),i=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),u=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),l=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),h=Symbol.iterator;var d={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},y=Object.assign,_={};function E(t,e,r){this.props=t,this.context=e,this.refs=_,this.updater=r||d}function F(){}function G(t,e,r){this.props=t,this.context=e,this.refs=_,this.updater=r||d}E.prototype.isReactComponent={},E.prototype.setState=function(t,e){if("object"!=typeof t&&"function"!=typeof t&&null!=t)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,t,e,"setState")},E.prototype.forceUpdate=function(t){this.updater.enqueueForceUpdate(this,t,"forceUpdate")},F.prototype=E.prototype;var g=G.prototype=new F;g.constructor=G,y(g,E.prototype),g.isPureReactComponent=!0;var m=Array.isArray,v=Object.prototype.hasOwnProperty,b={current:null},w={key:!0,ref:!0,__self:!0,__source:!0};function M(t,e,n){var o,i={},a=null,s=null;if(null!=e)for(o in void 0!==e.ref&&(s=e.ref),void 0!==e.key&&(a=""+e.key),e)v.call(e,o)&&!w.hasOwnProperty(o)&&(i[o]=e[o]);var u=arguments.length-2;if(1===u)i.children=n;else if(1{t.exports=function eq(t,e){return t===e||t!=t&&e!=e}},5345:t=>{"use strict";t.exports=URIError},5377:(t,e,r)=>{"use strict";var n=r(2861).Buffer,o=r(4634),i=r(4372),a=ArrayBuffer.isView||function isView(t){try{return i(t),!0}catch(t){return!1}},s="undefined"!=typeof Uint8Array,u="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array,c=u&&(n.prototype instanceof Uint8Array||n.TYPED_ARRAY_SUPPORT);t.exports=function toBuffer(t,e){if(t instanceof n)return t;if("string"==typeof t)return n.from(t,e);if(u&&a(t)){if(0===t.byteLength)return n.alloc(0);if(c){var r=n.from(t.buffer,t.byteOffset,t.byteLength);if(r.byteLength===t.byteLength)return r}var i=t instanceof Uint8Array?t:new Uint8Array(t.buffer,t.byteOffset,t.byteLength),f=n.from(i);if(f.length===t.byteLength)return f}if(s&&t instanceof Uint8Array)return n.from(t);var l=o(t);if(l)for(var p=0;p255||~~h!==h)throw new RangeError("Array items must be numbers in the range 0-255.")}if(l||n.isBuffer(t)&&t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t))return n.from(t);throw new TypeError('The "data" argument must be a string, an Array, a Buffer, a Uint8Array, or a DataView.')}},5389:(t,e,r)=>{var n=r(3663),o=r(7978),i=r(3488),a=r(6449),s=r(583);t.exports=function baseIteratee(t){return"function"==typeof t?t:null==t?i:"object"==typeof t?a(t)?o(t[0],t[1]):n(t):s(t)}},5401:(t,e,r)=>{"use strict";var n=r(462);t.exports=n},5434:t=>{var e=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;t.exports=function hasUnicodeWord(t){return e.test(t)}},5481:(t,e,r)=>{var n=r(9325)["__core-js_shared__"];t.exports=n},5482:(t,e,r)=>{"use strict";var n=r(1176);t.exports=function(t){var e=+t;return e!=e||0===e?0:n(e)}},5527:t=>{var e=Object.prototype;t.exports=function isPrototype(t){var r=t&&t.constructor;return t===("function"==typeof r&&r.prototype||e)}},5539:(t,e,r)=>{var n=r(882),o=r(828),i=r(6645),a=RegExp("['’]","g");t.exports=function createCompounder(t){return function(e){return n(i(o(e).replace(a,"")),t,"")}}},5580:(t,e,r)=>{var n=r(6110)(r(9325),"DataView");t.exports=n},5582:(t,e,r)=>{"use strict";var n=r(2046),o=r(5951),i=r(2250),aFunction=function(t){return i(t)?t:void 0};t.exports=function(t,e){return arguments.length<2?aFunction(n[t])||aFunction(o[t]):n[t]&&n[t][e]||o[t]&&o[t][e]}},5594:(t,e,r)=>{"use strict";var n=r(5582),o=r(2250),i=r(8280),a=r(3556),s=Object;t.exports=a?function(t){return"symbol"==typeof t}:function(t){var e=n("Symbol");return o(e)&&i(e.prototype,s(t))}},5606:t=>{var e,r,n=t.exports={};function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(t){if(e===setTimeout)return setTimeout(t,0);if((e===defaultSetTimout||!e)&&setTimeout)return e=setTimeout,setTimeout(t,0);try{return e(t,0)}catch(r){try{return e.call(null,t,0)}catch(r){return e.call(this,t,0)}}}!function(){try{e="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(t){e=defaultSetTimout}try{r="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(t){r=defaultClearTimeout}}();var o,i=[],a=!1,s=-1;function cleanUpNextTick(){a&&o&&(a=!1,o.length?i=o.concat(i):s=-1,i.length&&drainQueue())}function drainQueue(){if(!a){var t=runTimeout(cleanUpNextTick);a=!0;for(var e=i.length;e;){for(o=i,i=[];++s1)for(var r=1;r{"use strict";var n=r(5767);t.exports=function isTypedArray(t){return!!n(t)}},5749:(t,e,r)=>{var n=r(1042);t.exports=function hashSet(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=n&&void 0===e?"__lodash_hash_undefined__":e,this}},5767:(t,e,r)=>{"use strict";var n=r(2682),o=r(9209),i=r(487),a=r(6556),s=r(5795),u=a("Object.prototype.toString"),c=r(9092)(),f="undefined"==typeof globalThis?r.g:globalThis,l=o(),p=a("String.prototype.slice"),h=Object.getPrototypeOf,d=a("Array.prototype.indexOf",!0)||function indexOf(t,e){for(var r=0;r-1?e:"Object"===e&&function tryAllSlices(t){var e=!1;return n(y,(function(r,n){if(!e)try{r(t),e=p(n,1)}catch(t){}})),e}(t)}return s?function tryAllTypedArrays(t){var e=!1;return n(y,(function(r,n){if(!e)try{"$"+r(t)===n&&(e=p(n,1))}catch(t){}})),e}(t):null}},5795:(t,e,r)=>{"use strict";var n=r(6549);if(n)try{n([],"length")}catch(t){n=null}t.exports=n},5807:(t,e,r)=>{"use strict";var n=r(1907),o=n({}.toString),i=n("".slice);t.exports=function(t){return i(o(t),8,-1)}},5808:(t,e,r)=>{var n=r(2507)("toUpperCase");t.exports=n},5816:(t,e,r)=>{"use strict";var n=r(6128);t.exports=function(t,e){return n[t]||(n[t]=e||{})}},5817:t=>{"use strict";t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},5861:(t,e,r)=>{var n=r(5580),o=r(8223),i=r(2804),a=r(6545),s=r(8303),u=r(2552),c=r(7473),f="[object Map]",l="[object Promise]",p="[object Set]",h="[object WeakMap]",d="[object DataView]",y=c(n),_=c(o),g=c(i),m=c(a),v=c(s),b=u;(n&&b(new n(new ArrayBuffer(1)))!=d||o&&b(new o)!=f||i&&b(i.resolve())!=l||a&&b(new a)!=p||s&&b(new s)!=h)&&(b=function(t){var e=u(t),r="[object Object]"==e?t.constructor:void 0,n=r?c(r):"";if(n)switch(n){case y:return d;case _:return f;case g:return l;case m:return p;case v:return h}return e}),t.exports=b},5880:t=>{"use strict";t.exports=Math.pow},5911:(t,e,r)=>{var n=r(8859),o=r(4248),i=r(9219);t.exports=function equalArrays(t,e,r,a,s,u){var c=1&r,f=t.length,l=e.length;if(f!=l&&!(c&&l>f))return!1;var p=u.get(t),h=u.get(e);if(p&&h)return p==e&&h==t;var d=-1,y=!0,_=2&r?new n:void 0;for(u.set(t,e),u.set(e,t);++d{var n=r(695),o=r(8984),i=r(4894);t.exports=function keys(t){return i(t)?n(t):o(t)}},5951:function(t,e,r){"use strict";var check=function(t){return t&&t.Math===Math&&t};t.exports=check("object"==typeof globalThis&&globalThis)||check("object"==typeof window&&window)||check("object"==typeof self&&self)||check("object"==typeof r.g&&r.g)||check("object"==typeof this&&this)||function(){return this}()||Function("return this")()},6009:(t,e,r)=>{t=r.nmd(t);var n=r(4840),o=e&&!e.nodeType&&e,i=o&&t&&!t.nodeType&&t,a=i&&i.exports===o&&n.process,s=function(){try{var t=i&&i.require&&i.require("util").types;return t||a&&a.binding&&a.binding("util")}catch(t){}}();t.exports=s},6024:(t,e,r)=>{"use strict";var n=r(1505),o=Function.prototype,i=o.apply,a=o.call;t.exports="object"==typeof Reflect&&Reflect.apply||(n?a.bind(i):function(){return a.apply(i,arguments)})},6025:(t,e,r)=>{var n=r(5288);t.exports=function assocIndexOf(t,e){for(var r=t.length;r--;)if(n(t[r][0],e))return r;return-1}},6028:(t,e,r)=>{"use strict";var n=r(3930),o=r(6285),i=r(5594),a=r(9367),s=r(581),u=r(6264),c=TypeError,f=u("toPrimitive");t.exports=function(t,e){if(!o(t)||i(t))return t;var r,u=a(t,f);if(u){if(void 0===e&&(e="default"),r=n(u,t,e),!o(r)||i(r))return r;throw new c("Can't convert object to primitive value")}return void 0===e&&(e="number"),s(t,e)}},6110:(t,e,r)=>{var n=r(5083),o=r(392);t.exports=function getNative(t,e){var r=o(t,e);return n(r)?r:void 0}},6128:(t,e,r)=>{"use strict";var n=r(7376),o=r(5951),i=r(2532),a="__core-js_shared__",s=t.exports=o[a]||i(a,{});(s.versions||(s.versions=[])).push({version:"3.40.0",mode:n?"pure":"global",copyright:"© 2014-2025 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.40.0/LICENSE",source:"https://github.com/zloirock/core-js"})},6188:t=>{"use strict";t.exports=Math.max},6264:(t,e,r)=>{"use strict";var n=r(5951),o=r(5816),i=r(9724),a=r(6499),s=r(9846),u=r(3556),c=n.Symbol,f=o("wks"),l=u?c.for||c:c&&c.withoutSetter||a;t.exports=function(t){return i(f,t)||(f[t]=s&&i(c,t)?c[t]:l("Symbol."+t)),f[t]}},6285:(t,e,r)=>{"use strict";var n=r(2250);t.exports=function(t){return"object"==typeof t?null!==t:n(t)}},6449:t=>{var e=Array.isArray;t.exports=e},6499:(t,e,r)=>{"use strict";var n=r(1907),o=0,i=Math.random(),a=n(1..toString);t.exports=function(t){return"Symbol("+(void 0===t?"":t)+")_"+a(++o+i,36)}},6540:(t,e,r)=>{"use strict";t.exports=r(5287)},6545:(t,e,r)=>{var n=r(6110)(r(9325),"Set");t.exports=n},6547:(t,e,r)=>{var n=r(3360),o=r(5288),i=Object.prototype.hasOwnProperty;t.exports=function assignValue(t,e,r){var a=t[e];i.call(t,e)&&o(a,r)&&(void 0!==r||e in t)||n(t,e,r)}},6549:t=>{"use strict";t.exports=Object.getOwnPropertyDescriptor},6556:(t,e,r)=>{"use strict";var n=r(453),o=r(3126),i=o([n("%String.prototype.indexOf%")]);t.exports=function callBoundIntrinsic(t,e){var r=n(t,!!e);return"function"==typeof r&&i(t,".prototype.")>-1?o([r]):r}},6578:t=>{"use strict";t.exports=["Float16Array","Float32Array","Float64Array","Int8Array","Int16Array","Int32Array","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array"]},6624:(t,e,r)=>{"use strict";var n=r(6285),o=String,i=TypeError;t.exports=function(t){if(n(t))return t;throw new i(o(t)+" is not an object")}},6645:(t,e,r)=>{var n=r(1733),o=r(5434),i=r(3222),a=r(2225);t.exports=function words(t,e,r){return t=i(t),void 0===(e=r?void 0:e)?o(t)?a(t):n(t):t.match(e)||[]}},6649:(t,e,r)=>{var n=r(3221)();t.exports=n},6698:t=>{"function"==typeof Object.create?t.exports=function inherits(t,e){e&&(t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}))}:t.exports=function inherits(t,e){if(e){t.super_=e;var TempCtor=function(){};TempCtor.prototype=e.prototype,t.prototype=new TempCtor,t.prototype.constructor=t}}},6710:(t,e,r)=>{"use strict";var n=r(6698),o=r(4107),i=r(8011),a=r(2861).Buffer,s=new Array(64);function Sha224(){this.init(),this._w=s,i.call(this,64,56)}n(Sha224,o),Sha224.prototype.init=function(){return this._a=3238371032,this._b=914150663,this._c=812702999,this._d=4144912697,this._e=4290775857,this._f=1750603025,this._g=1694076839,this._h=3204075428,this},Sha224.prototype._hash=function(){var t=a.allocUnsafe(28);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t},t.exports=Sha224},6721:(t,e,r)=>{var n=r(1042),o=Object.prototype.hasOwnProperty;t.exports=function hashGet(t){var e=this.__data__;if(n){var r=e[t];return"__lodash_hash_undefined__"===r?void 0:r}return o.call(e,t)?e[t]:void 0}},6743:(t,e,r)=>{"use strict";var n=r(9353);t.exports=Function.prototype.bind||n},6794:(t,e,r)=>{"use strict";var n=r(5951).navigator,o=n&&n.userAgent;t.exports=o?String(o):""},6800:(t,e,r)=>{var n=r(5288),o=r(4894),i=r(361),a=r(3805);t.exports=function isIterateeCall(t,e,r){if(!a(r))return!1;var s=typeof e;return!!("number"==s?o(r)&&i(e,r.length):"string"==s&&e in r)&&n(r[e],t)}},6897:(t,e,r)=>{"use strict";var n=r(453),o=r(41),i=r(592)(),a=r(5795),s=r(9675),u=n("%Math.floor%");t.exports=function setFunctionLength(t,e){if("function"!=typeof t)throw new s("`fn` is not a function");if("number"!=typeof e||e<0||e>4294967295||u(e)!==e)throw new s("`length` must be a positive 32-bit integer");var r=arguments.length>2&&!!arguments[2],n=!0,c=!0;if("length"in t&&a){var f=a(t,"length");f&&!f.configurable&&(n=!1),f&&!f.writable&&(c=!1)}return(n||c||!r)&&(i?o(t,"length",e,!0,!0):o(t,"length",e)),t}},6946:(t,e,r)=>{"use strict";var n=r(1907),o=r(8828),i=r(5807),a=Object,s=n("".split);t.exports=o((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"===i(t)?s(t,""):a(t)}:a},7068:(t,e,r)=>{var n=r(7217),o=r(5911),i=r(1986),a=r(689),s=r(5861),u=r(6449),c=r(3656),f=r(7167),l="[object Arguments]",p="[object Array]",h="[object Object]",d=Object.prototype.hasOwnProperty;t.exports=function baseIsEqualDeep(t,e,r,y,_,g){var m=u(t),v=u(e),b=m?p:s(t),w=v?p:s(e),I=(b=b==l?h:b)==h,x=(w=w==l?h:w)==h,B=b==w;if(B&&c(t)){if(!c(e))return!1;m=!0,I=!1}if(B&&!I)return g||(g=new n),m||f(t)?o(t,e,r,y,_,g):i(t,e,b,r,y,_,g);if(!(1&r)){var k=I&&d.call(t,"__wrapped__"),C=x&&d.call(e,"__wrapped__");if(k||C){var j=k?t.value():t,q=C?e.value():e;return g||(g=new n),_(j,q,r,y,g)}}return!!B&&(g||(g=new n),a(t,e,r,y,_,g))}},7119:t=>{"use strict";t.exports="undefined"!=typeof Reflect&&Reflect&&Reflect.apply},7136:t=>{"use strict";t.exports=function(t){return null==t}},7157:(t,e,r)=>{"use strict";var n=r(9447),o=r(1907),i=r(3930),a=r(8828),s=r(2875),u=r(7170),c=r(2574),f=r(9298),l=r(6946),p=Object.assign,h=Object.defineProperty,d=o([].concat);t.exports=!p||a((function(){if(n&&1!==p({b:1},p(h({},"a",{enumerable:!0,get:function(){h(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},e={},r=Symbol("assign detection"),o="abcdefghijklmnopqrst";return t[r]=7,o.split("").forEach((function(t){e[t]=t})),7!==p({},t)[r]||s(p({},e)).join("")!==o}))?function assign(t,e){for(var r=f(t),o=arguments.length,a=1,p=u.f,h=c.f;o>a;)for(var y,_=l(arguments[a++]),g=p?d(s(_),p(_)):s(_),m=g.length,v=0;m>v;)y=g[v++],n&&!i(h,_,y)||(r[y]=_[y]);return r}:p},7167:(t,e,r)=>{var n=r(4901),o=r(7301),i=r(6009),a=i&&i.isTypedArray,s=a?o(a):n;t.exports=s},7170:(t,e)=>{"use strict";e.f=Object.getOwnPropertySymbols},7176:(t,e,r)=>{"use strict";var n,o=r(3126),i=r(5795);try{n=[].__proto__===Array.prototype}catch(t){if(!t||"object"!=typeof t||!("code"in t)||"ERR_PROTO_ACCESS"!==t.code)throw t}var a=!!n&&i&&i(Object.prototype,"__proto__"),s=Object,u=s.getPrototypeOf;t.exports=a&&"function"==typeof a.get?o([a.get]):"function"==typeof u&&function getDunder(t){return u(null==t?t:s(t))}},7197:t=>{t.exports=function matchesStrictComparable(t,e){return function(r){return null!=r&&(r[t]===e&&(void 0!==e||t in Object(r)))}}},7217:(t,e,r)=>{var n=r(79),o=r(1420),i=r(938),a=r(3605),s=r(9817),u=r(945);function Stack(t){var e=this.__data__=new n(t);this.size=e.size}Stack.prototype.clear=o,Stack.prototype.delete=i,Stack.prototype.get=a,Stack.prototype.has=s,Stack.prototype.set=u,t.exports=Stack},7237:t=>{t.exports=function baseProperty(t){return function(e){return null==e?void 0:e[t]}}},7248:(t,e,r)=>{var n=r(6547),o=r(1234);t.exports=function zipObject(t,e){return o(t||[],e||[],n)}},7255:(t,e,r)=>{var n=r(7422);t.exports=function basePropertyDeep(t){return function(e){return n(e,t)}}},7296:(t,e,r)=>{var n,o=r(5481),i=(n=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"";t.exports=function isMasked(t){return!!i&&i in t}},7301:t=>{t.exports=function baseUnary(t){return function(e){return t(e)}}},7309:(t,e,r)=>{var n=r(2006)(r(4713));t.exports=n},7374:(t,e,r)=>{"use strict";var n=r(6946),o=r(4239);t.exports=function(t){return n(o(t))}},7376:t=>{"use strict";t.exports=!0},7400:(t,e,r)=>{var n=r(9374),o=1/0;t.exports=function toFinite(t){return t?(t=n(t))===o||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}},7422:(t,e,r)=>{var n=r(1769),o=r(7797);t.exports=function baseGet(t,e){for(var r=0,i=(e=n(e,t)).length;null!=t&&r{"use strict";var n=r(8828),o=r(2250),i=/#|\.prototype\./,isForced=function(t,e){var r=s[a(t)];return r===c||r!==u&&(o(e)?n(e):!!e)},a=isForced.normalize=function(t){return String(t).replace(i,".").toLowerCase()},s=isForced.data={},u=isForced.NATIVE="N",c=isForced.POLYFILL="P";t.exports=isForced},7473:t=>{var e=Function.prototype.toString;t.exports=function toSource(t){if(null!=t){try{return e.call(t)}catch(t){}try{return t+""}catch(t){}}return""}},7526:(t,e)=>{"use strict";e.byteLength=function byteLength(t){var e=getLens(t),r=e[0],n=e[1];return 3*(r+n)/4-n},e.toByteArray=function toByteArray(t){var e,r,i=getLens(t),a=i[0],s=i[1],u=new o(function _byteLength(t,e,r){return 3*(e+r)/4-r}(0,a,s)),c=0,f=s>0?a-4:a;for(r=0;r>16&255,u[c++]=e>>8&255,u[c++]=255&e;2===s&&(e=n[t.charCodeAt(r)]<<2|n[t.charCodeAt(r+1)]>>4,u[c++]=255&e);1===s&&(e=n[t.charCodeAt(r)]<<10|n[t.charCodeAt(r+1)]<<4|n[t.charCodeAt(r+2)]>>2,u[c++]=e>>8&255,u[c++]=255&e);return u},e.fromByteArray=function fromByteArray(t){for(var e,n=t.length,o=n%3,i=[],a=16383,s=0,u=n-o;su?u:s+a));1===o?(e=t[n-1],i.push(r[e>>2]+r[e<<4&63]+"==")):2===o&&(e=(t[n-2]<<8)+t[n-1],i.push(r[e>>10]+r[e>>4&63]+r[e<<2&63]+"="));return i.join("")};for(var r=[],n=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0;a<64;++a)r[a]=i[a],n[i.charCodeAt(a)]=a;function getLens(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function encodeChunk(t,e,n){for(var o,i,a=[],s=e;s>18&63]+r[i>>12&63]+r[i>>6&63]+r[63&i]);return a.join("")}n["-".charCodeAt(0)]=62,n["_".charCodeAt(0)]=63},7534:(t,e,r)=>{var n=r(2552),o=r(346);t.exports=function baseIsArguments(t){return o(t)&&"[object Arguments]"==n(t)}},7556:(t,e,r)=>{var n=r(1873),o=r(4932),i=r(6449),a=r(4394),s=n?n.prototype:void 0,u=s?s.toString:void 0;t.exports=function baseToString(t){if("string"==typeof t)return t;if(i(t))return o(t,baseToString)+"";if(a(t))return u?u.call(t):"";var e=t+"";return"0"==e&&1/t==-1/0?"-0":e}},7666:(t,e,r)=>{var n=r(4851),o=r(953);function _extends(){var e;return t.exports=_extends=n?o(e=n).call(e):function(t){for(var e=1;e{var n=r(2651);t.exports=function mapCacheDelete(t){var e=n(this,t).delete(t);return this.size-=e?1:0,e}},7797:(t,e,r)=>{var n=r(4394);t.exports=function toKey(t){if("string"==typeof t||n(t))return t;var e=t+"";return"0"==e&&1/t==-1/0?"-0":e}},7816:(t,e,r)=>{"use strict";var n=r(6698),o=r(8011),i=r(2861).Buffer,a=[1518500249,1859775393,-1894007588,-899497514],s=new Array(80);function Sha(){this.init(),this._w=s,o.call(this,64,56)}function rotl30(t){return t<<30|t>>>2}function ft(t,e,r,n){return 0===t?e&r|~e&n:2===t?e&r|e&n|r&n:e^r^n}n(Sha,o),Sha.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},Sha.prototype._update=function(t){for(var e,r=this._w,n=0|this._a,o=0|this._b,i=0|this._c,s=0|this._d,u=0|this._e,c=0;c<16;++c)r[c]=t.readInt32BE(4*c);for(;c<80;++c)r[c]=r[c-3]^r[c-8]^r[c-14]^r[c-16];for(var f=0;f<80;++f){var l=~~(f/20),p=0|((e=n)<<5|e>>>27)+ft(l,o,i,s)+u+r[f]+a[l];u=s,s=i,i=rotl30(o),o=n,n=p}this._a=n+this._a|0,this._b=o+this._b|0,this._c=i+this._c|0,this._d=s+this._d|0,this._e=u+this._e|0},Sha.prototype._hash=function(){var t=i.allocUnsafe(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},t.exports=Sha},7828:(t,e,r)=>{var n=r(9325).Uint8Array;t.exports=n},7978:(t,e,r)=>{var n=r(270),o=r(8156),i=r(631),a=r(8586),s=r(756),u=r(7197),c=r(7797);t.exports=function baseMatchesProperty(t,e){return a(t)&&s(e)?u(c(t),e):function(r){var a=o(r,t);return void 0===a&&a===e?i(r,t):n(e,a,3)}}},8002:t=>{"use strict";t.exports=Math.min},8011:(t,e,r)=>{"use strict";var n=r(2861).Buffer,o=r(5377);function Hash(t,e){this._block=n.alloc(t),this._finalSize=e,this._blockSize=t,this._len=0}Hash.prototype.update=function(t,e){t=o(t,e||"utf8");for(var r=this._block,n=this._blockSize,i=t.length,a=this._len,s=0;s=this._finalSize&&(this._update(this._block),this._block.fill(0));var r=8*this._len;if(r<=4294967295)this._block.writeUInt32BE(r,this._blockSize-4);else{var n=(4294967295&r)>>>0,o=(r-n)/4294967296;this._block.writeUInt32BE(o,this._blockSize-8),this._block.writeUInt32BE(n,this._blockSize-4)}this._update(this._block);var i=this._hash();return t?i.toString(t):i},Hash.prototype._update=function(){throw new Error("_update must be implemented by subclass")},t.exports=Hash},8068:t=>{"use strict";t.exports=SyntaxError},8077:t=>{t.exports=function baseHasIn(t,e){return null!=t&&e in Object(t)}},8096:t=>{t.exports=function baseTimes(t,e){for(var r=-1,n=Array(t);++r{var n=r(7422);t.exports=function get(t,e,r){var o=null==t?void 0:n(t,e);return void 0===o?r:o}},8223:(t,e,r)=>{var n=r(6110)(r(9325),"Map");t.exports=n},8280:(t,e,r)=>{"use strict";var n=r(1907);t.exports=n({}.isPrototypeOf)},8287:(t,e,r)=>{"use strict";const n=r(7526),o=r(251),i="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;e.Buffer=Buffer,e.SlowBuffer=function SlowBuffer(t){+t!=t&&(t=0);return Buffer.alloc(+t)},e.INSPECT_MAX_BYTES=50;const a=2147483647;function createBuffer(t){if(t>a)throw new RangeError('The value "'+t+'" is invalid for option "size"');const e=new Uint8Array(t);return Object.setPrototypeOf(e,Buffer.prototype),e}function Buffer(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return allocUnsafe(t)}return from(t,e,r)}function from(t,e,r){if("string"==typeof t)return function fromString(t,e){"string"==typeof e&&""!==e||(e="utf8");if(!Buffer.isEncoding(e))throw new TypeError("Unknown encoding: "+e);const r=0|byteLength(t,e);let n=createBuffer(r);const o=n.write(t,e);o!==r&&(n=n.slice(0,o));return n}(t,e);if(ArrayBuffer.isView(t))return function fromArrayView(t){if(isInstance(t,Uint8Array)){const e=new Uint8Array(t);return fromArrayBuffer(e.buffer,e.byteOffset,e.byteLength)}return fromArrayLike(t)}(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(isInstance(t,ArrayBuffer)||t&&isInstance(t.buffer,ArrayBuffer))return fromArrayBuffer(t,e,r);if("undefined"!=typeof SharedArrayBuffer&&(isInstance(t,SharedArrayBuffer)||t&&isInstance(t.buffer,SharedArrayBuffer)))return fromArrayBuffer(t,e,r);if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');const n=t.valueOf&&t.valueOf();if(null!=n&&n!==t)return Buffer.from(n,e,r);const o=function fromObject(t){if(Buffer.isBuffer(t)){const e=0|checked(t.length),r=createBuffer(e);return 0===r.length||t.copy(r,0,0,e),r}if(void 0!==t.length)return"number"!=typeof t.length||numberIsNaN(t.length)?createBuffer(0):fromArrayLike(t);if("Buffer"===t.type&&Array.isArray(t.data))return fromArrayLike(t.data)}(t);if(o)return o;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return Buffer.from(t[Symbol.toPrimitive]("string"),e,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}function assertSize(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function allocUnsafe(t){return assertSize(t),createBuffer(t<0?0:0|checked(t))}function fromArrayLike(t){const e=t.length<0?0:0|checked(t.length),r=createBuffer(e);for(let n=0;n=a)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+a.toString(16)+" bytes");return 0|t}function byteLength(t,e){if(Buffer.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||isInstance(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);const r=t.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;let o=!1;for(;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return utf8ToBytes(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return base64ToBytes(t).length;default:if(o)return n?-1:utf8ToBytes(t).length;e=(""+e).toLowerCase(),o=!0}}function slowToString(t,e,r){let n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return hexSlice(this,e,r);case"utf8":case"utf-8":return utf8Slice(this,e,r);case"ascii":return asciiSlice(this,e,r);case"latin1":case"binary":return latin1Slice(this,e,r);case"base64":return base64Slice(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function swap(t,e,r){const n=t[e];t[e]=t[r],t[r]=n}function bidirectionalIndexOf(t,e,r,n,o){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),numberIsNaN(r=+r)&&(r=o?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(o)return-1;r=t.length-1}else if(r<0){if(!o)return-1;r=0}if("string"==typeof e&&(e=Buffer.from(e,n)),Buffer.isBuffer(e))return 0===e.length?-1:arrayIndexOf(t,e,r,n,o);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):arrayIndexOf(t,[e],r,n,o);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(t,e,r,n,o){let i,a=1,s=t.length,u=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;a=2,s/=2,u/=2,r/=2}function read(t,e){return 1===a?t[e]:t.readUInt16BE(e*a)}if(o){let n=-1;for(i=r;is&&(r=s-u),i=r;i>=0;i--){let r=!0;for(let n=0;no&&(n=o):n=o;const i=e.length;let a;for(n>i/2&&(n=i/2),a=0;a>8,o=r%256,i.push(o),i.push(n);return i}(e,t.length-r),t,r,n)}function base64Slice(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function utf8Slice(t,e,r){r=Math.min(t.length,r);const n=[];let o=e;for(;o239?4:e>223?3:e>191?2:1;if(o+a<=r){let r,n,s,u;switch(a){case 1:e<128&&(i=e);break;case 2:r=t[o+1],128==(192&r)&&(u=(31&e)<<6|63&r,u>127&&(i=u));break;case 3:r=t[o+1],n=t[o+2],128==(192&r)&&128==(192&n)&&(u=(15&e)<<12|(63&r)<<6|63&n,u>2047&&(u<55296||u>57343)&&(i=u));break;case 4:r=t[o+1],n=t[o+2],s=t[o+3],128==(192&r)&&128==(192&n)&&128==(192&s)&&(u=(15&e)<<18|(63&r)<<12|(63&n)<<6|63&s,u>65535&&u<1114112&&(i=u))}}null===i?(i=65533,a=1):i>65535&&(i-=65536,n.push(i>>>10&1023|55296),i=56320|1023&i),n.push(i),o+=a}return function decodeCodePointsArray(t){const e=t.length;if(e<=s)return String.fromCharCode.apply(String,t);let r="",n=0;for(;nn.length?(Buffer.isBuffer(e)||(e=Buffer.from(e)),e.copy(n,o)):Uint8Array.prototype.set.call(n,e,o);else{if(!Buffer.isBuffer(e))throw new TypeError('"list" argument must be an Array of Buffers');e.copy(n,o)}o+=e.length}return n},Buffer.byteLength=byteLength,Buffer.prototype._isBuffer=!0,Buffer.prototype.swap16=function swap16(){const t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let e=0;er&&(t+=" ... "),""},i&&(Buffer.prototype[i]=Buffer.prototype.inspect),Buffer.prototype.compare=function compare(t,e,r,n,o){if(isInstance(t,Uint8Array)&&(t=Buffer.from(t,t.offset,t.byteLength)),!Buffer.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===o&&(o=this.length),e<0||r>t.length||n<0||o>this.length)throw new RangeError("out of range index");if(n>=o&&e>=r)return 0;if(n>=o)return-1;if(e>=r)return 1;if(this===t)return 0;let i=(o>>>=0)-(n>>>=0),a=(r>>>=0)-(e>>>=0);const s=Math.min(i,a),u=this.slice(n,o),c=t.slice(e,r);for(let t=0;t>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}const o=this.length-e;if((void 0===r||r>o)&&(r=o),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");let i=!1;for(;;)switch(n){case"hex":return hexWrite(this,t,e,r);case"utf8":case"utf-8":return utf8Write(this,t,e,r);case"ascii":case"latin1":case"binary":return asciiWrite(this,t,e,r);case"base64":return base64Write(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,t,e,r);default:if(i)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),i=!0}},Buffer.prototype.toJSON=function toJSON(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const s=4096;function asciiSlice(t,e,r){let n="";r=Math.min(t.length,r);for(let o=e;on)&&(r=n);let o="";for(let n=e;nr)throw new RangeError("Trying to access beyond buffer length")}function checkInt(t,e,r,n,o,i){if(!Buffer.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>o||et.length)throw new RangeError("Index out of range")}function wrtBigUInt64LE(t,e,r,n,o){checkIntBI(e,n,o,t,r,7);let i=Number(e&BigInt(4294967295));t[r++]=i,i>>=8,t[r++]=i,i>>=8,t[r++]=i,i>>=8,t[r++]=i;let a=Number(e>>BigInt(32)&BigInt(4294967295));return t[r++]=a,a>>=8,t[r++]=a,a>>=8,t[r++]=a,a>>=8,t[r++]=a,r}function wrtBigUInt64BE(t,e,r,n,o){checkIntBI(e,n,o,t,r,7);let i=Number(e&BigInt(4294967295));t[r+7]=i,i>>=8,t[r+6]=i,i>>=8,t[r+5]=i,i>>=8,t[r+4]=i;let a=Number(e>>BigInt(32)&BigInt(4294967295));return t[r+3]=a,a>>=8,t[r+2]=a,a>>=8,t[r+1]=a,a>>=8,t[r]=a,r+8}function checkIEEE754(t,e,r,n,o,i){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function writeFloat(t,e,r,n,i){return e=+e,r>>>=0,i||checkIEEE754(t,0,r,4),o.write(t,e,r,n,23,4),r+4}function writeDouble(t,e,r,n,i){return e=+e,r>>>=0,i||checkIEEE754(t,0,r,8),o.write(t,e,r,n,52,8),r+8}Buffer.prototype.slice=function slice(t,e){const r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e>>=0,e>>>=0,r||checkOffset(t,e,this.length);let n=this[t],o=1,i=0;for(;++i>>=0,e>>>=0,r||checkOffset(t,e,this.length);let n=this[t+--e],o=1;for(;e>0&&(o*=256);)n+=this[t+--e]*o;return n},Buffer.prototype.readUint8=Buffer.prototype.readUInt8=function readUInt8(t,e){return t>>>=0,e||checkOffset(t,1,this.length),this[t]},Buffer.prototype.readUint16LE=Buffer.prototype.readUInt16LE=function readUInt16LE(t,e){return t>>>=0,e||checkOffset(t,2,this.length),this[t]|this[t+1]<<8},Buffer.prototype.readUint16BE=Buffer.prototype.readUInt16BE=function readUInt16BE(t,e){return t>>>=0,e||checkOffset(t,2,this.length),this[t]<<8|this[t+1]},Buffer.prototype.readUint32LE=Buffer.prototype.readUInt32LE=function readUInt32LE(t,e){return t>>>=0,e||checkOffset(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},Buffer.prototype.readUint32BE=Buffer.prototype.readUInt32BE=function readUInt32BE(t,e){return t>>>=0,e||checkOffset(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},Buffer.prototype.readBigUInt64LE=defineBigIntMethod((function readBigUInt64LE(t){validateNumber(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||boundsError(t,this.length-8);const n=e+256*this[++t]+65536*this[++t]+this[++t]*2**24,o=this[++t]+256*this[++t]+65536*this[++t]+r*2**24;return BigInt(n)+(BigInt(o)<>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||boundsError(t,this.length-8);const n=e*2**24+65536*this[++t]+256*this[++t]+this[++t],o=this[++t]*2**24+65536*this[++t]+256*this[++t]+r;return(BigInt(n)<>>=0,e>>>=0,r||checkOffset(t,e,this.length);let n=this[t],o=1,i=0;for(;++i=o&&(n-=Math.pow(2,8*e)),n},Buffer.prototype.readIntBE=function readIntBE(t,e,r){t>>>=0,e>>>=0,r||checkOffset(t,e,this.length);let n=e,o=1,i=this[t+--n];for(;n>0&&(o*=256);)i+=this[t+--n]*o;return o*=128,i>=o&&(i-=Math.pow(2,8*e)),i},Buffer.prototype.readInt8=function readInt8(t,e){return t>>>=0,e||checkOffset(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},Buffer.prototype.readInt16LE=function readInt16LE(t,e){t>>>=0,e||checkOffset(t,2,this.length);const r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},Buffer.prototype.readInt16BE=function readInt16BE(t,e){t>>>=0,e||checkOffset(t,2,this.length);const r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},Buffer.prototype.readInt32LE=function readInt32LE(t,e){return t>>>=0,e||checkOffset(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},Buffer.prototype.readInt32BE=function readInt32BE(t,e){return t>>>=0,e||checkOffset(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},Buffer.prototype.readBigInt64LE=defineBigIntMethod((function readBigInt64LE(t){validateNumber(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||boundsError(t,this.length-8);const n=this[t+4]+256*this[t+5]+65536*this[t+6]+(r<<24);return(BigInt(n)<>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||boundsError(t,this.length-8);const n=(e<<24)+65536*this[++t]+256*this[++t]+this[++t];return(BigInt(n)<>>=0,e||checkOffset(t,4,this.length),o.read(this,t,!0,23,4)},Buffer.prototype.readFloatBE=function readFloatBE(t,e){return t>>>=0,e||checkOffset(t,4,this.length),o.read(this,t,!1,23,4)},Buffer.prototype.readDoubleLE=function readDoubleLE(t,e){return t>>>=0,e||checkOffset(t,8,this.length),o.read(this,t,!0,52,8)},Buffer.prototype.readDoubleBE=function readDoubleBE(t,e){return t>>>=0,e||checkOffset(t,8,this.length),o.read(this,t,!1,52,8)},Buffer.prototype.writeUintLE=Buffer.prototype.writeUIntLE=function writeUIntLE(t,e,r,n){if(t=+t,e>>>=0,r>>>=0,!n){checkInt(this,t,e,r,Math.pow(2,8*r)-1,0)}let o=1,i=0;for(this[e]=255&t;++i>>=0,r>>>=0,!n){checkInt(this,t,e,r,Math.pow(2,8*r)-1,0)}let o=r-1,i=1;for(this[e+o]=255&t;--o>=0&&(i*=256);)this[e+o]=t/i&255;return e+r},Buffer.prototype.writeUint8=Buffer.prototype.writeUInt8=function writeUInt8(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,1,255,0),this[e]=255&t,e+1},Buffer.prototype.writeUint16LE=Buffer.prototype.writeUInt16LE=function writeUInt16LE(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},Buffer.prototype.writeUint16BE=Buffer.prototype.writeUInt16BE=function writeUInt16BE(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},Buffer.prototype.writeUint32LE=Buffer.prototype.writeUInt32LE=function writeUInt32LE(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},Buffer.prototype.writeUint32BE=Buffer.prototype.writeUInt32BE=function writeUInt32BE(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},Buffer.prototype.writeBigUInt64LE=defineBigIntMethod((function writeBigUInt64LE(t,e=0){return wrtBigUInt64LE(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeBigUInt64BE=defineBigIntMethod((function writeBigUInt64BE(t,e=0){return wrtBigUInt64BE(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeIntLE=function writeIntLE(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);checkInt(this,t,e,r,n-1,-n)}let o=0,i=1,a=0;for(this[e]=255&t;++o>>=0,!n){const n=Math.pow(2,8*r-1);checkInt(this,t,e,r,n-1,-n)}let o=r-1,i=1,a=0;for(this[e+o]=255&t;--o>=0&&(i*=256);)t<0&&0===a&&0!==this[e+o+1]&&(a=1),this[e+o]=(t/i|0)-a&255;return e+r},Buffer.prototype.writeInt8=function writeInt8(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},Buffer.prototype.writeInt16LE=function writeInt16LE(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},Buffer.prototype.writeInt16BE=function writeInt16BE(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},Buffer.prototype.writeInt32LE=function writeInt32LE(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},Buffer.prototype.writeInt32BE=function writeInt32BE(t,e,r){return t=+t,e>>>=0,r||checkInt(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},Buffer.prototype.writeBigInt64LE=defineBigIntMethod((function writeBigInt64LE(t,e=0){return wrtBigUInt64LE(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeBigInt64BE=defineBigIntMethod((function writeBigInt64BE(t,e=0){return wrtBigUInt64BE(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeFloatLE=function writeFloatLE(t,e,r){return writeFloat(this,t,e,!0,r)},Buffer.prototype.writeFloatBE=function writeFloatBE(t,e,r){return writeFloat(this,t,e,!1,r)},Buffer.prototype.writeDoubleLE=function writeDoubleLE(t,e,r){return writeDouble(this,t,e,!0,r)},Buffer.prototype.writeDoubleBE=function writeDoubleBE(t,e,r){return writeDouble(this,t,e,!1,r)},Buffer.prototype.copy=function copy(t,e,r,n){if(!Buffer.isBuffer(t))throw new TypeError("argument should be a Buffer");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(o=e;o=n+4;r-=3)e=`_${t.slice(r-3,r)}${e}`;return`${t.slice(0,r)}${e}`}function checkIntBI(t,e,r,n,o,i){if(t>r||t3?0===e||e===BigInt(0)?`>= 0${n} and < 2${n} ** ${8*(i+1)}${n}`:`>= -(2${n} ** ${8*(i+1)-1}${n}) and < 2 ** ${8*(i+1)-1}${n}`:`>= ${e}${n} and <= ${r}${n}`,new u.ERR_OUT_OF_RANGE("value",o,t)}!function checkBounds(t,e,r){validateNumber(e,"offset"),void 0!==t[e]&&void 0!==t[e+r]||boundsError(e,t.length-(r+1))}(n,o,i)}function validateNumber(t,e){if("number"!=typeof t)throw new u.ERR_INVALID_ARG_TYPE(e,"number",t)}function boundsError(t,e,r){if(Math.floor(t)!==t)throw validateNumber(t,r),new u.ERR_OUT_OF_RANGE(r||"offset","an integer",t);if(e<0)throw new u.ERR_BUFFER_OUT_OF_BOUNDS;throw new u.ERR_OUT_OF_RANGE(r||"offset",`>= ${r?1:0} and <= ${e}`,t)}E("ERR_BUFFER_OUT_OF_BOUNDS",(function(t){return t?`${t} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),E("ERR_INVALID_ARG_TYPE",(function(t,e){return`The "${t}" argument must be of type number. Received type ${typeof e}`}),TypeError),E("ERR_OUT_OF_RANGE",(function(t,e,r){let n=`The value of "${t}" is out of range.`,o=r;return Number.isInteger(r)&&Math.abs(r)>2**32?o=addNumericalSeparator(String(r)):"bigint"==typeof r&&(o=String(r),(r>BigInt(2)**BigInt(32)||r<-(BigInt(2)**BigInt(32)))&&(o=addNumericalSeparator(o)),o+="n"),n+=` It must be ${e}. Received ${o}`,n}),RangeError);const c=/[^+/0-9A-Za-z-_]/g;function utf8ToBytes(t,e){let r;e=e||1/0;const n=t.length;let o=null;const i=[];for(let a=0;a55295&&r<57344){if(!o){if(r>56319){(e-=3)>-1&&i.push(239,191,189);continue}if(a+1===n){(e-=3)>-1&&i.push(239,191,189);continue}o=r;continue}if(r<56320){(e-=3)>-1&&i.push(239,191,189),o=r;continue}r=65536+(o-55296<<10|r-56320)}else o&&(e-=3)>-1&&i.push(239,191,189);if(o=null,r<128){if((e-=1)<0)break;i.push(r)}else if(r<2048){if((e-=2)<0)break;i.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;i.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;i.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return i}function base64ToBytes(t){return n.toByteArray(function base64clean(t){if((t=(t=t.split("=")[0]).trim().replace(c,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function blitBuffer(t,e,r,n){let o;for(o=0;o=e.length||o>=t.length);++o)e[o+r]=t[o];return o}function isInstance(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function numberIsNaN(t){return t!=t}const f=function(){const t="0123456789abcdef",e=new Array(256);for(let r=0;r<16;++r){const n=16*r;for(let o=0;o<16;++o)e[n+o]=t[r]+t[o]}return e}();function defineBigIntMethod(t){return"undefined"==typeof BigInt?BufferBigIntNotDefined:t}function BufferBigIntNotDefined(){throw new Error("BigInt not supported")}},8303:(t,e,r)=>{var n=r(6110)(r(9325),"WeakMap");t.exports=n},8311:(t,e,r)=>{"use strict";var n=r(2361),o=r(2159),i=r(1505),a=n(n.bind);t.exports=function(t,e){return o(t),void 0===e?t:i?a(t,e):function(){return t.apply(e,arguments)}}},8329:(t,e,r)=>{var n=r(4894);t.exports=function createBaseEach(t,e){return function(r,o){if(null==r)return r;if(!n(r))return t(r,o);for(var i=r.length,a=e?i:-1,s=Object(r);(e?a--:++a{"use strict";t.exports={}},8586:(t,e,r)=>{var n=r(6449),o=r(4394),i=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;t.exports=function isKey(t,e){if(n(t))return!1;var r=typeof t;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=t&&!o(t))||(a.test(t)||!i.test(t)||null!=e&&t in Object(e))}},8648:t=>{"use strict";t.exports="undefined"!=typeof Reflect&&Reflect.getPrototypeOf||null},8655:(t,e,r)=>{var n=r(6025);t.exports=function listCacheHas(t){return n(this.__data__,t)>-1}},8661:(t,e,r)=>{"use strict";var n=r(9447),o=r(8828);t.exports=n&&o((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},8754:(t,e,r)=>{var n=r(5160);t.exports=function castSlice(t,e,r){var o=t.length;return r=void 0===r?o:r,!e&&r>=o?t:n(t,e,r)}},8828:t=>{"use strict";t.exports=function(t){try{return!!t()}catch(t){return!0}}},8859:(t,e,r)=>{var n=r(3661),o=r(1380),i=r(1459);function SetCache(t){var e=-1,r=null==t?0:t.length;for(this.__data__=new n;++e{"use strict";t.exports=Math.floor},8984:(t,e,r)=>{var n=r(5527),o=r(3650),i=Object.prototype.hasOwnProperty;t.exports=function baseKeys(t){if(!n(t))return o(t);var e=[];for(var r in Object(t))i.call(t,r)&&"constructor"!=r&&e.push(r);return e}},9092:(t,e,r)=>{"use strict";var n=r(1333);t.exports=function hasToStringTagShams(){return n()&&!!Symbol.toStringTag}},9209:(t,e,r)=>{"use strict";var n=r(6578),o="undefined"==typeof globalThis?r.g:globalThis;t.exports=function availableTypedArrays(){for(var t=[],e=0;e{t.exports=function cacheHas(t,e){return t.has(e)}},9290:t=>{"use strict";t.exports=RangeError},9298:(t,e,r)=>{"use strict";var n=r(4239),o=Object;t.exports=function(t){return o(n(t))}},9307:(t,e,r)=>{"use strict";var n=r(1091),o=r(4673);n({target:"Function",proto:!0,forced:Function.bind!==o},{bind:o})},9325:(t,e,r)=>{var n=r(4840),o="object"==typeof self&&self&&self.Object===Object&&self,i=n||o||Function("return this")();t.exports=i},9326:(t,e,r)=>{var n=r(1769),o=r(2428),i=r(6449),a=r(361),s=r(294),u=r(7797);t.exports=function hasPath(t,e,r){for(var c=-1,f=(e=n(e,t)).length,l=!1;++c{var e=Object.prototype.toString;t.exports=function objectToString(t){return e.call(t)}},9353:t=>{"use strict";var e=Object.prototype.toString,r=Math.max,n=function concatty(t,e){for(var r=[],n=0;n{"use strict";var n=r(2159),o=r(7136);t.exports=function(t,e){var r=t[e];return o(r)?void 0:n(r)}},9374:(t,e,r)=>{var n=r(4128),o=r(3805),i=r(4394),a=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,u=/^0o[0-7]+$/i,c=parseInt;t.exports=function toNumber(t){if("number"==typeof t)return t;if(i(t))return NaN;if(o(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=o(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=n(t);var r=s.test(t);return r||u.test(t)?c(t.slice(2),r?2:8):a.test(t)?NaN:+t}},9383:t=>{"use strict";t.exports=Error},9404:function(t){t.exports=function(){"use strict";var t=Array.prototype.slice;function createClass(t,e){e&&(t.prototype=Object.create(e.prototype)),t.prototype.constructor=t}function Iterable(t){return isIterable(t)?t:Seq(t)}function KeyedIterable(t){return isKeyed(t)?t:KeyedSeq(t)}function IndexedIterable(t){return isIndexed(t)?t:IndexedSeq(t)}function SetIterable(t){return isIterable(t)&&!isAssociative(t)?t:SetSeq(t)}function isIterable(t){return!(!t||!t[e])}function isKeyed(t){return!(!t||!t[r])}function isIndexed(t){return!(!t||!t[n])}function isAssociative(t){return isKeyed(t)||isIndexed(t)}function isOrdered(t){return!(!t||!t[o])}createClass(KeyedIterable,Iterable),createClass(IndexedIterable,Iterable),createClass(SetIterable,Iterable),Iterable.isIterable=isIterable,Iterable.isKeyed=isKeyed,Iterable.isIndexed=isIndexed,Iterable.isAssociative=isAssociative,Iterable.isOrdered=isOrdered,Iterable.Keyed=KeyedIterable,Iterable.Indexed=IndexedIterable,Iterable.Set=SetIterable;var e="@@__IMMUTABLE_ITERABLE__@@",r="@@__IMMUTABLE_KEYED__@@",n="@@__IMMUTABLE_INDEXED__@@",o="@@__IMMUTABLE_ORDERED__@@",i="delete",a=5,s=1<>>0;if(""+r!==e||4294967295===r)return NaN;e=r}return e<0?ensureSize(t)+e:e}function returnTrue(){return!0}function wholeSlice(t,e,r){return(0===t||void 0!==r&&t<=-r)&&(void 0===e||void 0!==r&&e>=r)}function resolveBegin(t,e){return resolveIndex(t,e,0)}function resolveEnd(t,e){return resolveIndex(t,e,e)}function resolveIndex(t,e,r){return void 0===t?r:t<0?Math.max(0,e+t):void 0===e?t:Math.min(e,t)}var p=0,h=1,d=2,y="function"==typeof Symbol&&Symbol.iterator,_="@@iterator",g=y||_;function Iterator(t){this.next=t}function iteratorValue(t,e,r,n){var o=0===t?e:1===t?r:[e,r];return n?n.value=o:n={value:o,done:!1},n}function iteratorDone(){return{value:void 0,done:!0}}function hasIterator(t){return!!getIteratorFn(t)}function isIterator(t){return t&&"function"==typeof t.next}function getIterator(t){var e=getIteratorFn(t);return e&&e.call(t)}function getIteratorFn(t){var e=t&&(y&&t[y]||t[_]);if("function"==typeof e)return e}function isArrayLike(t){return t&&"number"==typeof t.length}function Seq(t){return null==t?emptySequence():isIterable(t)?t.toSeq():seqFromValue(t)}function KeyedSeq(t){return null==t?emptySequence().toKeyedSeq():isIterable(t)?isKeyed(t)?t.toSeq():t.fromEntrySeq():keyedSeqFromValue(t)}function IndexedSeq(t){return null==t?emptySequence():isIterable(t)?isKeyed(t)?t.entrySeq():t.toIndexedSeq():indexedSeqFromValue(t)}function SetSeq(t){return(null==t?emptySequence():isIterable(t)?isKeyed(t)?t.entrySeq():t:indexedSeqFromValue(t)).toSetSeq()}Iterator.prototype.toString=function(){return"[Iterator]"},Iterator.KEYS=p,Iterator.VALUES=h,Iterator.ENTRIES=d,Iterator.prototype.inspect=Iterator.prototype.toSource=function(){return this.toString()},Iterator.prototype[g]=function(){return this},createClass(Seq,Iterable),Seq.of=function(){return Seq(arguments)},Seq.prototype.toSeq=function(){return this},Seq.prototype.toString=function(){return this.__toString("Seq {","}")},Seq.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},Seq.prototype.__iterate=function(t,e){return seqIterate(this,t,e,!0)},Seq.prototype.__iterator=function(t,e){return seqIterator(this,t,e,!0)},createClass(KeyedSeq,Seq),KeyedSeq.prototype.toKeyedSeq=function(){return this},createClass(IndexedSeq,Seq),IndexedSeq.of=function(){return IndexedSeq(arguments)},IndexedSeq.prototype.toIndexedSeq=function(){return this},IndexedSeq.prototype.toString=function(){return this.__toString("Seq [","]")},IndexedSeq.prototype.__iterate=function(t,e){return seqIterate(this,t,e,!1)},IndexedSeq.prototype.__iterator=function(t,e){return seqIterator(this,t,e,!1)},createClass(SetSeq,Seq),SetSeq.of=function(){return SetSeq(arguments)},SetSeq.prototype.toSetSeq=function(){return this},Seq.isSeq=isSeq,Seq.Keyed=KeyedSeq,Seq.Set=SetSeq,Seq.Indexed=IndexedSeq;var m,v,b,w="@@__IMMUTABLE_SEQ__@@";function ArraySeq(t){this._array=t,this.size=t.length}function ObjectSeq(t){var e=Object.keys(t);this._object=t,this._keys=e,this.size=e.length}function IterableSeq(t){this._iterable=t,this.size=t.length||t.size}function IteratorSeq(t){this._iterator=t,this._iteratorCache=[]}function isSeq(t){return!(!t||!t[w])}function emptySequence(){return m||(m=new ArraySeq([]))}function keyedSeqFromValue(t){var e=Array.isArray(t)?new ArraySeq(t).fromEntrySeq():isIterator(t)?new IteratorSeq(t).fromEntrySeq():hasIterator(t)?new IterableSeq(t).fromEntrySeq():"object"==typeof t?new ObjectSeq(t):void 0;if(!e)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+t);return e}function indexedSeqFromValue(t){var e=maybeIndexedSeqFromValue(t);if(!e)throw new TypeError("Expected Array or iterable object of values: "+t);return e}function seqFromValue(t){var e=maybeIndexedSeqFromValue(t)||"object"==typeof t&&new ObjectSeq(t);if(!e)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+t);return e}function maybeIndexedSeqFromValue(t){return isArrayLike(t)?new ArraySeq(t):isIterator(t)?new IteratorSeq(t):hasIterator(t)?new IterableSeq(t):void 0}function seqIterate(t,e,r,n){var o=t._cache;if(o){for(var i=o.length-1,a=0;a<=i;a++){var s=o[r?i-a:a];if(!1===e(s[1],n?s[0]:a,t))return a+1}return a}return t.__iterateUncached(e,r)}function seqIterator(t,e,r,n){var o=t._cache;if(o){var i=o.length-1,a=0;return new Iterator((function(){var t=o[r?i-a:a];return a++>i?iteratorDone():iteratorValue(e,n?t[0]:a-1,t[1])}))}return t.__iteratorUncached(e,r)}function fromJS(t,e){return e?fromJSWith(e,t,"",{"":t}):fromJSDefault(t)}function fromJSWith(t,e,r,n){return Array.isArray(e)?t.call(n,r,IndexedSeq(e).map((function(r,n){return fromJSWith(t,r,n,e)}))):isPlainObj(e)?t.call(n,r,KeyedSeq(e).map((function(r,n){return fromJSWith(t,r,n,e)}))):e}function fromJSDefault(t){return Array.isArray(t)?IndexedSeq(t).map(fromJSDefault).toList():isPlainObj(t)?KeyedSeq(t).map(fromJSDefault).toMap():t}function isPlainObj(t){return t&&(t.constructor===Object||void 0===t.constructor)}function is(t,e){if(t===e||t!=t&&e!=e)return!0;if(!t||!e)return!1;if("function"==typeof t.valueOf&&"function"==typeof e.valueOf){if((t=t.valueOf())===(e=e.valueOf())||t!=t&&e!=e)return!0;if(!t||!e)return!1}return!("function"!=typeof t.equals||"function"!=typeof e.equals||!t.equals(e))}function deepEqual(t,e){if(t===e)return!0;if(!isIterable(e)||void 0!==t.size&&void 0!==e.size&&t.size!==e.size||void 0!==t.__hash&&void 0!==e.__hash&&t.__hash!==e.__hash||isKeyed(t)!==isKeyed(e)||isIndexed(t)!==isIndexed(e)||isOrdered(t)!==isOrdered(e))return!1;if(0===t.size&&0===e.size)return!0;var r=!isAssociative(t);if(isOrdered(t)){var n=t.entries();return e.every((function(t,e){var o=n.next().value;return o&&is(o[1],t)&&(r||is(o[0],e))}))&&n.next().done}var o=!1;if(void 0===t.size)if(void 0===e.size)"function"==typeof t.cacheResult&&t.cacheResult();else{o=!0;var i=t;t=e,e=i}var a=!0,s=e.__iterate((function(e,n){if(r?!t.has(e):o?!is(e,t.get(n,c)):!is(t.get(n,c),e))return a=!1,!1}));return a&&t.size===s}function Repeat(t,e){if(!(this instanceof Repeat))return new Repeat(t,e);if(this._value=t,this.size=void 0===e?1/0:Math.max(0,e),0===this.size){if(v)return v;v=this}}function invariant(t,e){if(!t)throw new Error(e)}function Range(t,e,r){if(!(this instanceof Range))return new Range(t,e,r);if(invariant(0!==r,"Cannot step a Range by 0"),t=t||0,void 0===e&&(e=1/0),r=void 0===r?1:Math.abs(r),en?iteratorDone():iteratorValue(t,o,r[e?n-o++:o++])}))},createClass(ObjectSeq,KeyedSeq),ObjectSeq.prototype.get=function(t,e){return void 0===e||this.has(t)?this._object[t]:e},ObjectSeq.prototype.has=function(t){return this._object.hasOwnProperty(t)},ObjectSeq.prototype.__iterate=function(t,e){for(var r=this._object,n=this._keys,o=n.length-1,i=0;i<=o;i++){var a=n[e?o-i:i];if(!1===t(r[a],a,this))return i+1}return i},ObjectSeq.prototype.__iterator=function(t,e){var r=this._object,n=this._keys,o=n.length-1,i=0;return new Iterator((function(){var a=n[e?o-i:i];return i++>o?iteratorDone():iteratorValue(t,a,r[a])}))},ObjectSeq.prototype[o]=!0,createClass(IterableSeq,IndexedSeq),IterableSeq.prototype.__iterateUncached=function(t,e){if(e)return this.cacheResult().__iterate(t,e);var r=getIterator(this._iterable),n=0;if(isIterator(r))for(var o;!(o=r.next()).done&&!1!==t(o.value,n++,this););return n},IterableSeq.prototype.__iteratorUncached=function(t,e){if(e)return this.cacheResult().__iterator(t,e);var r=getIterator(this._iterable);if(!isIterator(r))return new Iterator(iteratorDone);var n=0;return new Iterator((function(){var e=r.next();return e.done?e:iteratorValue(t,n++,e.value)}))},createClass(IteratorSeq,IndexedSeq),IteratorSeq.prototype.__iterateUncached=function(t,e){if(e)return this.cacheResult().__iterate(t,e);for(var r,n=this._iterator,o=this._iteratorCache,i=0;i=n.length){var e=r.next();if(e.done)return e;n[o]=e.value}return iteratorValue(t,o,n[o++])}))},createClass(Repeat,IndexedSeq),Repeat.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},Repeat.prototype.get=function(t,e){return this.has(t)?this._value:e},Repeat.prototype.includes=function(t){return is(this._value,t)},Repeat.prototype.slice=function(t,e){var r=this.size;return wholeSlice(t,e,r)?this:new Repeat(this._value,resolveEnd(e,r)-resolveBegin(t,r))},Repeat.prototype.reverse=function(){return this},Repeat.prototype.indexOf=function(t){return is(this._value,t)?0:-1},Repeat.prototype.lastIndexOf=function(t){return is(this._value,t)?this.size:-1},Repeat.prototype.__iterate=function(t,e){for(var r=0;r=0&&e=0&&rr?iteratorDone():iteratorValue(t,i++,a)}))},Range.prototype.equals=function(t){return t instanceof Range?this._start===t._start&&this._end===t._end&&this._step===t._step:deepEqual(this,t)},createClass(Collection,Iterable),createClass(KeyedCollection,Collection),createClass(IndexedCollection,Collection),createClass(SetCollection,Collection),Collection.Keyed=KeyedCollection,Collection.Indexed=IndexedCollection,Collection.Set=SetCollection;var I="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function imul(t,e){var r=65535&(t|=0),n=65535&(e|=0);return r*n+((t>>>16)*n+r*(e>>>16)<<16>>>0)|0};function smi(t){return t>>>1&1073741824|3221225471&t}function hash(t){if(!1===t||null==t)return 0;if("function"==typeof t.valueOf&&(!1===(t=t.valueOf())||null==t))return 0;if(!0===t)return 1;var e=typeof t;if("number"===e){if(t!=t||t===1/0)return 0;var r=0|t;for(r!==t&&(r^=4294967295*t);t>4294967295;)r^=t/=4294967295;return smi(r)}if("string"===e)return t.length>L?cachedHashString(t):hashString(t);if("function"==typeof t.hashCode)return t.hashCode();if("object"===e)return hashJSObj(t);if("function"==typeof t.toString)return hashString(t.toString());throw new Error("Value type "+e+" cannot be hashed.")}function cachedHashString(t){var e=D[t];return void 0===e&&(e=hashString(t),U===P&&(U=0,D={}),U++,D[t]=e),e}function hashString(t){for(var e=0,r=0;r0)switch(t.nodeType){case 1:return t.uniqueID;case 9:return t.documentElement&&t.documentElement.uniqueID}}var k,C="function"==typeof WeakMap;C&&(k=new WeakMap);var j=0,q="__immutablehash__";"function"==typeof Symbol&&(q=Symbol(q));var L=16,P=255,U=0,D={};function assertNotInfinite(t){invariant(t!==1/0,"Cannot perform this action with an infinite size.")}function Map(t){return null==t?emptyMap():isMap(t)&&!isOrdered(t)?t:emptyMap().withMutations((function(e){var r=KeyedIterable(t);assertNotInfinite(r.size),r.forEach((function(t,r){return e.set(r,t)}))}))}function isMap(t){return!(!t||!t[W])}createClass(Map,KeyedCollection),Map.of=function(){var e=t.call(arguments,0);return emptyMap().withMutations((function(t){for(var r=0;r=e.length)throw new Error("Missing value for key: "+e[r]);t.set(e[r],e[r+1])}}))},Map.prototype.toString=function(){return this.__toString("Map {","}")},Map.prototype.get=function(t,e){return this._root?this._root.get(0,void 0,t,e):e},Map.prototype.set=function(t,e){return updateMap(this,t,e)},Map.prototype.setIn=function(t,e){return this.updateIn(t,c,(function(){return e}))},Map.prototype.remove=function(t){return updateMap(this,t,c)},Map.prototype.deleteIn=function(t){return this.updateIn(t,(function(){return c}))},Map.prototype.update=function(t,e,r){return 1===arguments.length?t(this):this.updateIn([t],e,r)},Map.prototype.updateIn=function(t,e,r){r||(r=e,e=void 0);var n=updateInDeepMap(this,forceIterator(t),e,r);return n===c?void 0:n},Map.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):emptyMap()},Map.prototype.merge=function(){return mergeIntoMapWith(this,void 0,arguments)},Map.prototype.mergeWith=function(e){return mergeIntoMapWith(this,e,t.call(arguments,1))},Map.prototype.mergeIn=function(e){var r=t.call(arguments,1);return this.updateIn(e,emptyMap(),(function(t){return"function"==typeof t.merge?t.merge.apply(t,r):r[r.length-1]}))},Map.prototype.mergeDeep=function(){return mergeIntoMapWith(this,deepMerger,arguments)},Map.prototype.mergeDeepWith=function(e){var r=t.call(arguments,1);return mergeIntoMapWith(this,deepMergerWith(e),r)},Map.prototype.mergeDeepIn=function(e){var r=t.call(arguments,1);return this.updateIn(e,emptyMap(),(function(t){return"function"==typeof t.mergeDeep?t.mergeDeep.apply(t,r):r[r.length-1]}))},Map.prototype.sort=function(t){return OrderedMap(sortFactory(this,t))},Map.prototype.sortBy=function(t,e){return OrderedMap(sortFactory(this,e,t))},Map.prototype.withMutations=function(t){var e=this.asMutable();return t(e),e.wasAltered()?e.__ensureOwner(this.__ownerID):this},Map.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new OwnerID)},Map.prototype.asImmutable=function(){return this.__ensureOwner()},Map.prototype.wasAltered=function(){return this.__altered},Map.prototype.__iterator=function(t,e){return new MapIterator(this,t,e)},Map.prototype.__iterate=function(t,e){var r=this,n=0;return this._root&&this._root.iterate((function(e){return n++,t(e[1],e[0],r)}),e),n},Map.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?makeMap(this.size,this._root,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},Map.isMap=isMap;var z,W="@@__IMMUTABLE_MAP__@@",V=Map.prototype;function ArrayMapNode(t,e){this.ownerID=t,this.entries=e}function BitmapIndexedNode(t,e,r){this.ownerID=t,this.bitmap=e,this.nodes=r}function HashArrayMapNode(t,e,r){this.ownerID=t,this.count=e,this.nodes=r}function HashCollisionNode(t,e,r){this.ownerID=t,this.keyHash=e,this.entries=r}function ValueNode(t,e,r){this.ownerID=t,this.keyHash=e,this.entry=r}function MapIterator(t,e,r){this._type=e,this._reverse=r,this._stack=t._root&&mapIteratorFrame(t._root)}function mapIteratorValue(t,e){return iteratorValue(t,e[0],e[1])}function mapIteratorFrame(t,e){return{node:t,index:0,__prev:e}}function makeMap(t,e,r,n){var o=Object.create(V);return o.size=t,o._root=e,o.__ownerID=r,o.__hash=n,o.__altered=!1,o}function emptyMap(){return z||(z=makeMap(0))}function updateMap(t,e,r){var n,o;if(t._root){var i=MakeRef(f),a=MakeRef(l);if(n=updateNode(t._root,t.__ownerID,0,void 0,e,r,i,a),!a.value)return t;o=t.size+(i.value?r===c?-1:1:0)}else{if(r===c)return t;o=1,n=new ArrayMapNode(t.__ownerID,[[e,r]])}return t.__ownerID?(t.size=o,t._root=n,t.__hash=void 0,t.__altered=!0,t):n?makeMap(o,n):emptyMap()}function updateNode(t,e,r,n,o,i,a,s){return t?t.update(e,r,n,o,i,a,s):i===c?t:(SetRef(s),SetRef(a),new ValueNode(e,n,[o,i]))}function isLeafNode(t){return t.constructor===ValueNode||t.constructor===HashCollisionNode}function mergeIntoNode(t,e,r,n,o){if(t.keyHash===n)return new HashCollisionNode(e,n,[t.entry,o]);var i,s=(0===r?t.keyHash:t.keyHash>>>r)&u,c=(0===r?n:n>>>r)&u;return new BitmapIndexedNode(e,1<>>=1)a[u]=1&r?e[i++]:void 0;return a[n]=o,new HashArrayMapNode(t,i+1,a)}function mergeIntoMapWith(t,e,r){for(var n=[],o=0;o>1&1431655765))+(t>>2&858993459))+(t>>4)&252645135,t+=t>>8,127&(t+=t>>16)}function setIn(t,e,r,n){var o=n?t:arrCopy(t);return o[e]=r,o}function spliceIn(t,e,r,n){var o=t.length+1;if(n&&e+1===o)return t[e]=r,t;for(var i=new Array(o),a=0,s=0;s=K)return createNodes(t,u,n,o);var h=t&&t===this.ownerID,d=h?u:arrCopy(u);return p?s?f===l-1?d.pop():d[f]=d.pop():d[f]=[n,o]:d.push([n,o]),h?(this.entries=d,this):new ArrayMapNode(t,d)}},BitmapIndexedNode.prototype.get=function(t,e,r,n){void 0===e&&(e=hash(r));var o=1<<((0===t?e:e>>>t)&u),i=this.bitmap;return i&o?this.nodes[popCount(i&o-1)].get(t+a,e,r,n):n},BitmapIndexedNode.prototype.update=function(t,e,r,n,o,i,s){void 0===r&&(r=hash(n));var f=(0===e?r:r>>>e)&u,l=1<=$)return expandNodes(t,y,p,f,g);if(h&&!g&&2===y.length&&isLeafNode(y[1^d]))return y[1^d];if(h&&g&&1===y.length&&isLeafNode(g))return g;var m=t&&t===this.ownerID,v=h?g?p:p^l:p|l,b=h?g?setIn(y,d,g,m):spliceOut(y,d,m):spliceIn(y,d,g,m);return m?(this.bitmap=v,this.nodes=b,this):new BitmapIndexedNode(t,v,b)},HashArrayMapNode.prototype.get=function(t,e,r,n){void 0===e&&(e=hash(r));var o=(0===t?e:e>>>t)&u,i=this.nodes[o];return i?i.get(t+a,e,r,n):n},HashArrayMapNode.prototype.update=function(t,e,r,n,o,i,s){void 0===r&&(r=hash(n));var f=(0===e?r:r>>>e)&u,l=o===c,p=this.nodes,h=p[f];if(l&&!h)return this;var d=updateNode(h,t,e+a,r,n,o,i,s);if(d===h)return this;var y=this.count;if(h){if(!d&&--y0&&n=0&&t>>e&u;if(n>=this.array.length)return new VNode([],t);var o,i=0===n;if(e>0){var s=this.array[n];if((o=s&&s.removeBefore(t,e-a,r))===s&&i)return this}if(i&&!o)return this;var c=editableVNode(this,t);if(!i)for(var f=0;f>>e&u;if(o>=this.array.length)return this;if(e>0){var i=this.array[o];if((n=i&&i.removeAfter(t,e-a,r))===i&&o===this.array.length-1)return this}var s=editableVNode(this,t);return s.array.splice(o+1),n&&(s.array[o]=n),s};var J,tt,et={};function iterateList(t,e){var r=t._origin,n=t._capacity,o=getTailOffset(n),i=t._tail;return iterateNodeOrLeaf(t._root,t._level,0);function iterateNodeOrLeaf(t,e,r){return 0===e?iterateLeaf(t,r):iterateNode(t,e,r)}function iterateLeaf(t,a){var u=a===o?i&&i.array:t&&t.array,c=a>r?0:r-a,f=n-a;return f>s&&(f=s),function(){if(c===f)return et;var t=e?--f:c++;return u&&u[t]}}function iterateNode(t,o,i){var u,c=t&&t.array,f=i>r?0:r-i>>o,l=1+(n-i>>o);return l>s&&(l=s),function(){for(;;){if(u){var t=u();if(t!==et)return t;u=null}if(f===l)return et;var r=e?--l:f++;u=iterateNodeOrLeaf(c&&c[r],o-a,i+(r<=t.size||e<0)return t.withMutations((function(t){e<0?setListBounds(t,e).set(0,r):setListBounds(t,0,e+1).set(e,r)}));e+=t._origin;var n=t._tail,o=t._root,i=MakeRef(l);return e>=getTailOffset(t._capacity)?n=updateVNode(n,t.__ownerID,0,e,r,i):o=updateVNode(o,t.__ownerID,t._level,e,r,i),i.value?t.__ownerID?(t._root=o,t._tail=n,t.__hash=void 0,t.__altered=!0,t):makeList(t._origin,t._capacity,t._level,o,n):t}function updateVNode(t,e,r,n,o,i){var s,c=n>>>r&u,f=t&&c0){var l=t&&t.array[c],p=updateVNode(l,e,r-a,n,o,i);return p===l?t:((s=editableVNode(t,e)).array[c]=p,s)}return f&&t.array[c]===o?t:(SetRef(i),s=editableVNode(t,e),void 0===o&&c===s.array.length-1?s.array.pop():s.array[c]=o,s)}function editableVNode(t,e){return e&&t&&e===t.ownerID?t:new VNode(t?t.array.slice():[],e)}function listNodeFor(t,e){if(e>=getTailOffset(t._capacity))return t._tail;if(e<1<0;)r=r.array[e>>>n&u],n-=a;return r}}function setListBounds(t,e,r){void 0!==e&&(e|=0),void 0!==r&&(r|=0);var n=t.__ownerID||new OwnerID,o=t._origin,i=t._capacity,s=o+e,c=void 0===r?i:r<0?i+r:o+r;if(s===o&&c===i)return t;if(s>=c)return t.clear();for(var f=t._level,l=t._root,p=0;s+p<0;)l=new VNode(l&&l.array.length?[void 0,l]:[],n),p+=1<<(f+=a);p&&(s+=p,o+=p,c+=p,i+=p);for(var h=getTailOffset(i),d=getTailOffset(c);d>=1<h?new VNode([],n):y;if(y&&d>h&&sa;m-=a){var v=h>>>m&u;g=g.array[v]=editableVNode(g.array[v],n)}g.array[h>>>a&u]=y}if(c=d)s-=d,c-=d,f=a,l=null,_=_&&_.removeBefore(n,0,s);else if(s>o||d>>f&u;if(b!==d>>>f&u)break;b&&(p+=(1<o&&(l=l.removeBefore(n,f,s-p)),l&&do&&(o=s.size),isIterable(a)||(s=s.map((function(t){return fromJS(t)}))),n.push(s)}return o>t.size&&(t=t.setSize(o)),mergeIntoCollectionWith(t,e,n)}function getTailOffset(t){return t>>a<=s&&a.size>=2*i.size?(n=(o=a.filter((function(t,e){return void 0!==t&&u!==e}))).toKeyedSeq().map((function(t){return t[0]})).flip().toMap(),t.__ownerID&&(n.__ownerID=o.__ownerID=t.__ownerID)):(n=i.remove(e),o=u===a.size-1?a.pop():a.set(u,void 0))}else if(f){if(r===a.get(u)[1])return t;n=i,o=a.set(u,[e,r])}else n=i.set(e,a.size),o=a.set(a.size,[e,r]);return t.__ownerID?(t.size=n.size,t._map=n,t._list=o,t.__hash=void 0,t):makeOrderedMap(n,o)}function ToKeyedSequence(t,e){this._iter=t,this._useKeys=e,this.size=t.size}function ToIndexedSequence(t){this._iter=t,this.size=t.size}function ToSetSequence(t){this._iter=t,this.size=t.size}function FromEntriesSequence(t){this._iter=t,this.size=t.size}function flipFactory(t){var e=makeSequence(t);return e._iter=t,e.size=t.size,e.flip=function(){return t},e.reverse=function(){var e=t.reverse.apply(this);return e.flip=function(){return t.reverse()},e},e.has=function(e){return t.includes(e)},e.includes=function(e){return t.has(e)},e.cacheResult=cacheResultThrough,e.__iterateUncached=function(e,r){var n=this;return t.__iterate((function(t,r){return!1!==e(r,t,n)}),r)},e.__iteratorUncached=function(e,r){if(e===d){var n=t.__iterator(e,r);return new Iterator((function(){var t=n.next();if(!t.done){var e=t.value[0];t.value[0]=t.value[1],t.value[1]=e}return t}))}return t.__iterator(e===h?p:h,r)},e}function mapFactory(t,e,r){var n=makeSequence(t);return n.size=t.size,n.has=function(e){return t.has(e)},n.get=function(n,o){var i=t.get(n,c);return i===c?o:e.call(r,i,n,t)},n.__iterateUncached=function(n,o){var i=this;return t.__iterate((function(t,o,a){return!1!==n(e.call(r,t,o,a),o,i)}),o)},n.__iteratorUncached=function(n,o){var i=t.__iterator(d,o);return new Iterator((function(){var o=i.next();if(o.done)return o;var a=o.value,s=a[0];return iteratorValue(n,s,e.call(r,a[1],s,t),o)}))},n}function reverseFactory(t,e){var r=makeSequence(t);return r._iter=t,r.size=t.size,r.reverse=function(){return t},t.flip&&(r.flip=function(){var e=flipFactory(t);return e.reverse=function(){return t.flip()},e}),r.get=function(r,n){return t.get(e?r:-1-r,n)},r.has=function(r){return t.has(e?r:-1-r)},r.includes=function(e){return t.includes(e)},r.cacheResult=cacheResultThrough,r.__iterate=function(e,r){var n=this;return t.__iterate((function(t,r){return e(t,r,n)}),!r)},r.__iterator=function(e,r){return t.__iterator(e,!r)},r}function filterFactory(t,e,r,n){var o=makeSequence(t);return n&&(o.has=function(n){var o=t.get(n,c);return o!==c&&!!e.call(r,o,n,t)},o.get=function(n,o){var i=t.get(n,c);return i!==c&&e.call(r,i,n,t)?i:o}),o.__iterateUncached=function(o,i){var a=this,s=0;return t.__iterate((function(t,i,u){if(e.call(r,t,i,u))return s++,o(t,n?i:s-1,a)}),i),s},o.__iteratorUncached=function(o,i){var a=t.__iterator(d,i),s=0;return new Iterator((function(){for(;;){var i=a.next();if(i.done)return i;var u=i.value,c=u[0],f=u[1];if(e.call(r,f,c,t))return iteratorValue(o,n?c:s++,f,i)}}))},o}function countByFactory(t,e,r){var n=Map().asMutable();return t.__iterate((function(o,i){n.update(e.call(r,o,i,t),0,(function(t){return t+1}))})),n.asImmutable()}function groupByFactory(t,e,r){var n=isKeyed(t),o=(isOrdered(t)?OrderedMap():Map()).asMutable();t.__iterate((function(i,a){o.update(e.call(r,i,a,t),(function(t){return(t=t||[]).push(n?[a,i]:i),t}))}));var i=iterableClass(t);return o.map((function(e){return reify(t,i(e))}))}function sliceFactory(t,e,r,n){var o=t.size;if(void 0!==e&&(e|=0),void 0!==r&&(r===1/0?r=o:r|=0),wholeSlice(e,r,o))return t;var i=resolveBegin(e,o),a=resolveEnd(r,o);if(i!=i||a!=a)return sliceFactory(t.toSeq().cacheResult(),e,r,n);var s,u=a-i;u==u&&(s=u<0?0:u);var c=makeSequence(t);return c.size=0===s?s:t.size&&s||void 0,!n&&isSeq(t)&&s>=0&&(c.get=function(e,r){return(e=wrapIndex(this,e))>=0&&es)return iteratorDone();var t=o.next();return n||e===h?t:iteratorValue(e,u-1,e===p?void 0:t.value[1],t)}))},c}function takeWhileFactory(t,e,r){var n=makeSequence(t);return n.__iterateUncached=function(n,o){var i=this;if(o)return this.cacheResult().__iterate(n,o);var a=0;return t.__iterate((function(t,o,s){return e.call(r,t,o,s)&&++a&&n(t,o,i)})),a},n.__iteratorUncached=function(n,o){var i=this;if(o)return this.cacheResult().__iterator(n,o);var a=t.__iterator(d,o),s=!0;return new Iterator((function(){if(!s)return iteratorDone();var t=a.next();if(t.done)return t;var o=t.value,u=o[0],c=o[1];return e.call(r,c,u,i)?n===d?t:iteratorValue(n,u,c,t):(s=!1,iteratorDone())}))},n}function skipWhileFactory(t,e,r,n){var o=makeSequence(t);return o.__iterateUncached=function(o,i){var a=this;if(i)return this.cacheResult().__iterate(o,i);var s=!0,u=0;return t.__iterate((function(t,i,c){if(!s||!(s=e.call(r,t,i,c)))return u++,o(t,n?i:u-1,a)})),u},o.__iteratorUncached=function(o,i){var a=this;if(i)return this.cacheResult().__iterator(o,i);var s=t.__iterator(d,i),u=!0,c=0;return new Iterator((function(){var t,i,f;do{if((t=s.next()).done)return n||o===h?t:iteratorValue(o,c++,o===p?void 0:t.value[1],t);var l=t.value;i=l[0],f=l[1],u&&(u=e.call(r,f,i,a))}while(u);return o===d?t:iteratorValue(o,i,f,t)}))},o}function concatFactory(t,e){var r=isKeyed(t),n=[t].concat(e).map((function(t){return isIterable(t)?r&&(t=KeyedIterable(t)):t=r?keyedSeqFromValue(t):indexedSeqFromValue(Array.isArray(t)?t:[t]),t})).filter((function(t){return 0!==t.size}));if(0===n.length)return t;if(1===n.length){var o=n[0];if(o===t||r&&isKeyed(o)||isIndexed(t)&&isIndexed(o))return o}var i=new ArraySeq(n);return r?i=i.toKeyedSeq():isIndexed(t)||(i=i.toSetSeq()),(i=i.flatten(!0)).size=n.reduce((function(t,e){if(void 0!==t){var r=e.size;if(void 0!==r)return t+r}}),0),i}function flattenFactory(t,e,r){var n=makeSequence(t);return n.__iterateUncached=function(n,o){var i=0,a=!1;function flatDeep(t,s){var u=this;t.__iterate((function(t,o){return(!e||s0}function zipWithFactory(t,e,r){var n=makeSequence(t);return n.size=new ArraySeq(r).map((function(t){return t.size})).min(),n.__iterate=function(t,e){for(var r,n=this.__iterator(h,e),o=0;!(r=n.next()).done&&!1!==t(r.value,o++,this););return o},n.__iteratorUncached=function(t,n){var o=r.map((function(t){return t=Iterable(t),getIterator(n?t.reverse():t)})),i=0,a=!1;return new Iterator((function(){var r;return a||(r=o.map((function(t){return t.next()})),a=r.some((function(t){return t.done}))),a?iteratorDone():iteratorValue(t,i++,e.apply(null,r.map((function(t){return t.value}))))}))},n}function reify(t,e){return isSeq(t)?e:t.constructor(e)}function validateEntry(t){if(t!==Object(t))throw new TypeError("Expected [K, V] tuple: "+t)}function resolveSize(t){return assertNotInfinite(t.size),ensureSize(t)}function iterableClass(t){return isKeyed(t)?KeyedIterable:isIndexed(t)?IndexedIterable:SetIterable}function makeSequence(t){return Object.create((isKeyed(t)?KeyedSeq:isIndexed(t)?IndexedSeq:SetSeq).prototype)}function cacheResultThrough(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):Seq.prototype.cacheResult.call(this)}function defaultComparator(t,e){return t>e?1:t=0;r--)e={value:arguments[r],next:e};return this.__ownerID?(this.size=t,this._head=e,this.__hash=void 0,this.__altered=!0,this):makeStack(t,e)},Stack.prototype.pushAll=function(t){if(0===(t=IndexedIterable(t)).size)return this;assertNotInfinite(t.size);var e=this.size,r=this._head;return t.reverse().forEach((function(t){e++,r={value:t,next:r}})),this.__ownerID?(this.size=e,this._head=r,this.__hash=void 0,this.__altered=!0,this):makeStack(e,r)},Stack.prototype.pop=function(){return this.slice(1)},Stack.prototype.unshift=function(){return this.push.apply(this,arguments)},Stack.prototype.unshiftAll=function(t){return this.pushAll(t)},Stack.prototype.shift=function(){return this.pop.apply(this,arguments)},Stack.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):emptyStack()},Stack.prototype.slice=function(t,e){if(wholeSlice(t,e,this.size))return this;var r=resolveBegin(t,this.size);if(resolveEnd(e,this.size)!==this.size)return IndexedCollection.prototype.slice.call(this,t,e);for(var n=this.size-r,o=this._head;r--;)o=o.next;return this.__ownerID?(this.size=n,this._head=o,this.__hash=void 0,this.__altered=!0,this):makeStack(n,o)},Stack.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?makeStack(this.size,this._head,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},Stack.prototype.__iterate=function(t,e){if(e)return this.reverse().__iterate(t);for(var r=0,n=this._head;n&&!1!==t(n.value,r++,this);)n=n.next;return r},Stack.prototype.__iterator=function(t,e){if(e)return this.reverse().__iterator(t);var r=0,n=this._head;return new Iterator((function(){if(n){var e=n.value;return n=n.next,iteratorValue(t,r++,e)}return iteratorDone()}))},Stack.isStack=isStack;var ut,ct="@@__IMMUTABLE_STACK__@@",lt=Stack.prototype;function makeStack(t,e,r,n){var o=Object.create(lt);return o.size=t,o._head=e,o.__ownerID=r,o.__hash=n,o.__altered=!1,o}function emptyStack(){return ut||(ut=makeStack(0))}function mixin(t,e){var keyCopier=function(r){t.prototype[r]=e[r]};return Object.keys(e).forEach(keyCopier),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(e).forEach(keyCopier),t}lt[ct]=!0,lt.withMutations=V.withMutations,lt.asMutable=V.asMutable,lt.asImmutable=V.asImmutable,lt.wasAltered=V.wasAltered,Iterable.Iterator=Iterator,mixin(Iterable,{toArray:function(){assertNotInfinite(this.size);var t=new Array(this.size||0);return this.valueSeq().__iterate((function(e,r){t[r]=e})),t},toIndexedSeq:function(){return new ToIndexedSequence(this)},toJS:function(){return this.toSeq().map((function(t){return t&&"function"==typeof t.toJS?t.toJS():t})).__toJS()},toJSON:function(){return this.toSeq().map((function(t){return t&&"function"==typeof t.toJSON?t.toJSON():t})).__toJS()},toKeyedSeq:function(){return new ToKeyedSequence(this,!0)},toMap:function(){return Map(this.toKeyedSeq())},toObject:function(){assertNotInfinite(this.size);var t={};return this.__iterate((function(e,r){t[r]=e})),t},toOrderedMap:function(){return OrderedMap(this.toKeyedSeq())},toOrderedSet:function(){return OrderedSet(isKeyed(this)?this.valueSeq():this)},toSet:function(){return Set(isKeyed(this)?this.valueSeq():this)},toSetSeq:function(){return new ToSetSequence(this)},toSeq:function(){return isIndexed(this)?this.toIndexedSeq():isKeyed(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Stack(isKeyed(this)?this.valueSeq():this)},toList:function(){return List(isKeyed(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(t,e){return 0===this.size?t+e:t+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+e},concat:function(){return reify(this,concatFactory(this,t.call(arguments,0)))},includes:function(t){return this.some((function(e){return is(e,t)}))},entries:function(){return this.__iterator(d)},every:function(t,e){assertNotInfinite(this.size);var r=!0;return this.__iterate((function(n,o,i){if(!t.call(e,n,o,i))return r=!1,!1})),r},filter:function(t,e){return reify(this,filterFactory(this,t,e,!0))},find:function(t,e,r){var n=this.findEntry(t,e);return n?n[1]:r},forEach:function(t,e){return assertNotInfinite(this.size),this.__iterate(e?t.bind(e):t)},join:function(t){assertNotInfinite(this.size),t=void 0!==t?""+t:",";var e="",r=!0;return this.__iterate((function(n){r?r=!1:e+=t,e+=null!=n?n.toString():""})),e},keys:function(){return this.__iterator(p)},map:function(t,e){return reify(this,mapFactory(this,t,e))},reduce:function(t,e,r){var n,o;return assertNotInfinite(this.size),arguments.length<2?o=!0:n=e,this.__iterate((function(e,i,a){o?(o=!1,n=e):n=t.call(r,n,e,i,a)})),n},reduceRight:function(t,e,r){var n=this.toKeyedSeq().reverse();return n.reduce.apply(n,arguments)},reverse:function(){return reify(this,reverseFactory(this,!0))},slice:function(t,e){return reify(this,sliceFactory(this,t,e,!0))},some:function(t,e){return!this.every(not(t),e)},sort:function(t){return reify(this,sortFactory(this,t))},values:function(){return this.__iterator(h)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(t,e){return ensureSize(t?this.toSeq().filter(t,e):this)},countBy:function(t,e){return countByFactory(this,t,e)},equals:function(t){return deepEqual(this,t)},entrySeq:function(){var t=this;if(t._cache)return new ArraySeq(t._cache);var e=t.toSeq().map(entryMapper).toIndexedSeq();return e.fromEntrySeq=function(){return t.toSeq()},e},filterNot:function(t,e){return this.filter(not(t),e)},findEntry:function(t,e,r){var n=r;return this.__iterate((function(r,o,i){if(t.call(e,r,o,i))return n=[o,r],!1})),n},findKey:function(t,e){var r=this.findEntry(t,e);return r&&r[0]},findLast:function(t,e,r){return this.toKeyedSeq().reverse().find(t,e,r)},findLastEntry:function(t,e,r){return this.toKeyedSeq().reverse().findEntry(t,e,r)},findLastKey:function(t,e){return this.toKeyedSeq().reverse().findKey(t,e)},first:function(){return this.find(returnTrue)},flatMap:function(t,e){return reify(this,flatMapFactory(this,t,e))},flatten:function(t){return reify(this,flattenFactory(this,t,!0))},fromEntrySeq:function(){return new FromEntriesSequence(this)},get:function(t,e){return this.find((function(e,r){return is(r,t)}),void 0,e)},getIn:function(t,e){for(var r,n=this,o=forceIterator(t);!(r=o.next()).done;){var i=r.value;if((n=n&&n.get?n.get(i,c):c)===c)return e}return n},groupBy:function(t,e){return groupByFactory(this,t,e)},has:function(t){return this.get(t,c)!==c},hasIn:function(t){return this.getIn(t,c)!==c},isSubset:function(t){return t="function"==typeof t.includes?t:Iterable(t),this.every((function(e){return t.includes(e)}))},isSuperset:function(t){return(t="function"==typeof t.isSubset?t:Iterable(t)).isSubset(this)},keyOf:function(t){return this.findKey((function(e){return is(e,t)}))},keySeq:function(){return this.toSeq().map(keyMapper).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(t){return this.toKeyedSeq().reverse().keyOf(t)},max:function(t){return maxFactory(this,t)},maxBy:function(t,e){return maxFactory(this,e,t)},min:function(t){return maxFactory(this,t?neg(t):defaultNegComparator)},minBy:function(t,e){return maxFactory(this,e?neg(e):defaultNegComparator,t)},rest:function(){return this.slice(1)},skip:function(t){return this.slice(Math.max(0,t))},skipLast:function(t){return reify(this,this.toSeq().reverse().skip(t).reverse())},skipWhile:function(t,e){return reify(this,skipWhileFactory(this,t,e,!0))},skipUntil:function(t,e){return this.skipWhile(not(t),e)},sortBy:function(t,e){return reify(this,sortFactory(this,e,t))},take:function(t){return this.slice(0,Math.max(0,t))},takeLast:function(t){return reify(this,this.toSeq().reverse().take(t).reverse())},takeWhile:function(t,e){return reify(this,takeWhileFactory(this,t,e))},takeUntil:function(t,e){return this.takeWhile(not(t),e)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=hashIterable(this))}});var pt=Iterable.prototype;pt[e]=!0,pt[g]=pt.values,pt.__toJS=pt.toArray,pt.__toStringMapper=quoteString,pt.inspect=pt.toSource=function(){return this.toString()},pt.chain=pt.flatMap,pt.contains=pt.includes,mixin(KeyedIterable,{flip:function(){return reify(this,flipFactory(this))},mapEntries:function(t,e){var r=this,n=0;return reify(this,this.toSeq().map((function(o,i){return t.call(e,[i,o],n++,r)})).fromEntrySeq())},mapKeys:function(t,e){var r=this;return reify(this,this.toSeq().flip().map((function(n,o){return t.call(e,n,o,r)})).flip())}});var ht=KeyedIterable.prototype;function keyMapper(t,e){return e}function entryMapper(t,e){return[e,t]}function not(t){return function(){return!t.apply(this,arguments)}}function neg(t){return function(){return-t.apply(this,arguments)}}function quoteString(t){return"string"==typeof t?JSON.stringify(t):String(t)}function defaultZipper(){return arrCopy(arguments)}function defaultNegComparator(t,e){return te?-1:0}function hashIterable(t){if(t.size===1/0)return 0;var e=isOrdered(t),r=isKeyed(t),n=e?1:0;return murmurHashOfSize(t.__iterate(r?e?function(t,e){n=31*n+hashMerge(hash(t),hash(e))|0}:function(t,e){n=n+hashMerge(hash(t),hash(e))|0}:e?function(t){n=31*n+hash(t)|0}:function(t){n=n+hash(t)|0}),n)}function murmurHashOfSize(t,e){return e=I(e,3432918353),e=I(e<<15|e>>>-15,461845907),e=I(e<<13|e>>>-13,5),e=I((e=e+3864292196^t)^e>>>16,2246822507),e=smi((e=I(e^e>>>13,3266489909))^e>>>16)}function hashMerge(t,e){return t^e+2654435769+(t<<6)+(t>>2)}return ht[r]=!0,ht[g]=pt.entries,ht.__toJS=pt.toObject,ht.__toStringMapper=function(t,e){return JSON.stringify(e)+": "+quoteString(t)},mixin(IndexedIterable,{toKeyedSeq:function(){return new ToKeyedSequence(this,!1)},filter:function(t,e){return reify(this,filterFactory(this,t,e,!1))},findIndex:function(t,e){var r=this.findEntry(t,e);return r?r[0]:-1},indexOf:function(t){var e=this.keyOf(t);return void 0===e?-1:e},lastIndexOf:function(t){var e=this.lastKeyOf(t);return void 0===e?-1:e},reverse:function(){return reify(this,reverseFactory(this,!1))},slice:function(t,e){return reify(this,sliceFactory(this,t,e,!1))},splice:function(t,e){var r=arguments.length;if(e=Math.max(0|e,0),0===r||2===r&&!e)return this;t=resolveBegin(t,t<0?this.count():this.size);var n=this.slice(0,t);return reify(this,1===r?n:n.concat(arrCopy(arguments,2),this.slice(t+e)))},findLastIndex:function(t,e){var r=this.findLastEntry(t,e);return r?r[0]:-1},first:function(){return this.get(0)},flatten:function(t){return reify(this,flattenFactory(this,t,!1))},get:function(t,e){return(t=wrapIndex(this,t))<0||this.size===1/0||void 0!==this.size&&t>this.size?e:this.find((function(e,r){return r===t}),void 0,e)},has:function(t){return(t=wrapIndex(this,t))>=0&&(void 0!==this.size?this.size===1/0||t{"use strict";var n=r(8828);t.exports=!n((function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]}))},9538:t=>{"use strict";t.exports=ReferenceError},9552:(t,e,r)=>{"use strict";var n=r(5951),o=r(6285),i=n.document,a=o(i)&&o(i.createElement);t.exports=function(t){return a?i.createElement(t):{}}},9600:t=>{"use strict";var e,r,n=Function.prototype.toString,o="object"==typeof Reflect&&null!==Reflect&&Reflect.apply;if("function"==typeof o&&"function"==typeof Object.defineProperty)try{e=Object.defineProperty({},"length",{get:function(){throw r}}),r={},o((function(){throw 42}),null,e)}catch(t){t!==r&&(o=null)}else o=null;var i=/^\s*class\b/,a=function isES6ClassFunction(t){try{var e=n.call(t);return i.test(e)}catch(t){return!1}},s=function tryFunctionToStr(t){try{return!a(t)&&(n.call(t),!0)}catch(t){return!1}},u=Object.prototype.toString,c="function"==typeof Symbol&&!!Symbol.toStringTag,f=!(0 in[,]),l=function isDocumentDotAll(){return!1};if("object"==typeof document){var p=document.all;u.call(p)===u.call(document.all)&&(l=function isDocumentDotAll(t){if((f||!t)&&(void 0===t||"object"==typeof t))try{var e=u.call(t);return("[object HTMLAllCollection]"===e||"[object HTML document.all class]"===e||"[object HTMLCollection]"===e||"[object Object]"===e)&&null==t("")}catch(t){}return!1})}t.exports=o?function isCallable(t){if(l(t))return!0;if(!t)return!1;if("function"!=typeof t&&"object"!=typeof t)return!1;try{o(t,null,e)}catch(t){if(t!==r)return!1}return!a(t)&&s(t)}:function isCallable(t){if(l(t))return!0;if(!t)return!1;if("function"!=typeof t&&"object"!=typeof t)return!1;if(c)return s(t);if(a(t))return!1;var e=u.call(t);return!("[object Function]"!==e&&"[object GeneratorFunction]"!==e&&!/^\[object HTML/.test(e))&&s(t)}},9612:t=>{"use strict";t.exports=Object},9675:t=>{"use strict";t.exports=TypeError},9698:t=>{var e=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");t.exports=function hasUnicode(t){return e.test(t)}},9709:(t,e,r)=>{"use strict";var n=r(3034);t.exports=n},9724:(t,e,r)=>{"use strict";var n=r(1907),o=r(9298),i=n({}.hasOwnProperty);t.exports=Object.hasOwn||function hasOwn(t,e){return i(o(t),e)}},9748:(t,e,r)=>{"use strict";r(1340);var n=r(2046);t.exports=n.Object.assign},9770:t=>{t.exports=function arrayFilter(t,e){for(var r=-1,n=null==t?0:t.length,o=0,i=[];++r{t.exports=function stackHas(t){return this.__data__.has(t)}},9846:(t,e,r)=>{"use strict";var n=r(798),o=r(8828),i=r(5951).String;t.exports=!!Object.getOwnPropertySymbols&&!o((function(){var t=Symbol("symbol detection");return!i(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&n&&n<41}))},9935:t=>{t.exports=function stubFalse(){return!1}},9957:(t,e,r)=>{"use strict";var n=Function.prototype.call,o=Object.prototype.hasOwnProperty,i=r(6743);t.exports=i.call(n,o)}},e={};function __webpack_require__(r){var n=e[r];if(void 0!==n)return n.exports;var o=e[r]={id:r,loaded:!1,exports:{}};return t[r].call(o.exports,o,o.exports,__webpack_require__),o.loaded=!0,o.exports}__webpack_require__.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return __webpack_require__.d(e,{a:e}),e},__webpack_require__.d=(t,e)=>{for(var r in e)__webpack_require__.o(e,r)&&!__webpack_require__.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),__webpack_require__.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),__webpack_require__.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},__webpack_require__.nmd=t=>(t.paths=[],t.children||(t.children=[]),t);var r={};return(()=>{"use strict";__webpack_require__.d(r,{default:()=>ce});var t={};__webpack_require__.r(t),__webpack_require__.d(t,{TOGGLE_CONFIGS:()=>ee,UPDATE_CONFIGS:()=>te,downloadConfig:()=>downloadConfig,getConfigByUrl:()=>getConfigByUrl,loaded:()=>loaded,toggle:()=>toggle,update:()=>update});var e={};__webpack_require__.r(e),__webpack_require__.d(e,{get:()=>get});var n=__webpack_require__(6540);class StandaloneLayout extends n.Component{render(){const{getComponent:t}=this.props,e=t("Container"),r=t("Row"),o=t("Col"),i=t("Topbar",!0),a=t("BaseLayout",!0),s=t("onlineValidatorBadge",!0);return n.createElement(e,{className:"swagger-ui"},i?n.createElement(i,null):null,n.createElement(a,null),n.createElement(r,null,n.createElement(o,null,n.createElement(s,null))))}}const o=StandaloneLayout,stadalone_layout=()=>({components:{StandaloneLayout:o}});var i=__webpack_require__(9404),a=__webpack_require__.n(i);__webpack_require__(4058),__webpack_require__(5808),__webpack_require__(104),__webpack_require__(7309),__webpack_require__(2426),__webpack_require__(5288),__webpack_require__(1882),__webpack_require__(2205),__webpack_require__(3209),__webpack_require__(2802);const s=function makeWindow(){var t={location:{},history:{},open:()=>{},close:()=>{},File:function(){},FormData:function(){}};if("undefined"==typeof window)return t;try{t=window;for(var e of["File","Blob","FormData"])e in window&&(t[e]=window[e])}catch(t){console.error(t)}return t}();a().Set.of("type","format","items","default","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","maxItems","minItems","uniqueItems","enum","multipleOf");__webpack_require__(8287).Buffer;const parseSearch=()=>{const t=new URLSearchParams(s.location.search);return Object.fromEntries(t)};class TopBar extends n.Component{constructor(t,e){super(t,e),this.state={url:t.specSelectors.url(),selectedIndex:0}}UNSAFE_componentWillReceiveProps(t){this.setState({url:t.specSelectors.url()})}onUrlChange=t=>{let{target:{value:e}}=t;this.setState({url:e})};flushAuthData(){const{persistAuthorization:t}=this.props.getConfigs();t||this.props.authActions.restoreAuthorization({authorized:{}})}loadSpec=t=>{this.flushAuthData(),this.props.specActions.updateUrl(t),this.props.specActions.download(t)};onUrlSelect=t=>{let e=t.target.value||t.target.href;this.loadSpec(e),this.setSelectedUrl(e),t.preventDefault()};downloadUrl=t=>{this.loadSpec(this.state.url),t.preventDefault()};setSearch=t=>{let e=parseSearch();e["urls.primaryName"]=t.name;const r=`${window.location.protocol}//${window.location.host}${window.location.pathname}`;window&&window.history&&window.history.pushState&&window.history.replaceState(null,"",`${r}?${(t=>{const e=new URLSearchParams(Object.entries(t));return String(e)})(e)}`)};setSelectedUrl=t=>{const e=this.props.getConfigs().urls||[];e&&e.length&&t&&e.forEach(((e,r)=>{e.url===t&&(this.setState({selectedIndex:r}),this.setSearch(e))}))};componentDidMount(){const t=this.props.getConfigs(),e=t.urls||[];if(e&&e.length){var r=this.state.selectedIndex;let n=parseSearch()["urls.primaryName"]||t.urls.primaryName;n&&e.forEach(((t,e)=>{t.name===n&&(this.setState({selectedIndex:e}),r=e)})),this.loadSpec(e[r].url)}}onFilterChange=t=>{let{target:{value:e}}=t;this.props.layoutActions.updateFilter(e)};render(){let{getComponent:t,specSelectors:e,getConfigs:r}=this.props;const o=t("Button"),i=t("Link"),a=t("Logo"),s=t("DarkModeToggle");let u="loading"===e.loadingStatus();const c=["download-url-input"];"failed"===e.loadingStatus()&&c.push("failed"),u&&c.push("loading");const{urls:f}=r();let l=[],p=null;if(f){let t=[];f.forEach(((e,r)=>{t.push(n.createElement("option",{key:r,value:e.url},e.name))})),l.push(n.createElement("label",{className:"select-label",htmlFor:"select"},n.createElement("span",null,"Select a definition"),n.createElement("select",{id:"select",disabled:u,onChange:this.onUrlSelect,value:f[this.state.selectedIndex].url},t)))}else p=this.downloadUrl,l.push(n.createElement("input",{className:c.join(" "),type:"text",onChange:this.onUrlChange,value:this.state.url,disabled:u,id:"download-url-input"})),l.push(n.createElement(o,{className:"download-url-button",onClick:this.downloadUrl},"Explore"));return n.createElement("div",{className:"topbar"},n.createElement("div",{className:"wrapper"},n.createElement("div",{className:"topbar-wrapper"},n.createElement(i,null,n.createElement(a,null)),n.createElement("form",{className:"download-url-wrapper",onSubmit:p},l.map(((t,e)=>(0,n.cloneElement)(t,{key:e})))),n.createElement(s,null))))}}const u=TopBar;var c,f,l,p,h,d,y,_,g,m,v,b,w,I,x,B,k,C,j,q,L,P,U,D,z,W,V,K,$,H,Y,Z;function _extends(){return _extends=Object.assign?Object.assign.bind():function(t){for(var e=1;en.createElement("svg",_extends({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 407 116"},t),c||(c=n.createElement("defs",null,n.createElement("clipPath",{id:"logo_small_svg__clip-SW_TM-logo-on-dark"},n.createElement("path",{d:"M0 0h407v116H0z"})),n.createElement("style",null,".logo_small_svg__cls-2{fill:#fff}.logo_small_svg__cls-3{fill:#85ea2d}"))),n.createElement("g",{id:"logo_small_svg__SW_TM-logo-on-dark",style:{clipPath:"url(#logo_small_svg__clip-SW_TM-logo-on-dark)"}},n.createElement("g",{id:"logo_small_svg__SW_In-Product",transform:"translate(-.301)"},f||(f=n.createElement("path",{id:"logo_small_svg__Path_2936",d:"M359.15 70.674h-.7v-3.682h-1.26v-.6h3.219v.6h-1.259Z",className:"logo_small_svg__cls-2","data-name":"Path 2936"})),l||(l=n.createElement("path",{id:"logo_small_svg__Path_2937",d:"m363.217 70.674-1.242-3.574h-.023q.05.8.05 1.494v2.083h-.636v-4.286h.987l1.19 3.407h.017l1.225-3.407h.99v4.283h-.675v-2.118a30 30 0 0 1 .044-1.453h-.023l-1.286 3.571Z",className:"logo_small_svg__cls-2","data-name":"Path 2937"})),p||(p=n.createElement("path",{id:"logo_small_svg__Path_2938",d:"M50.328 97.669a47.642 47.642 0 1 1 47.643-47.642 47.64 47.64 0 0 1-47.643 47.642",className:"logo_small_svg__cls-3","data-name":"Path 2938"})),h||(h=n.createElement("path",{id:"logo_small_svg__Path_2939",d:"M50.328 4.769A45.258 45.258 0 1 1 5.07 50.027 45.26 45.26 0 0 1 50.328 4.769m0-4.769a50.027 50.027 0 1 0 50.027 50.027A50.027 50.027 0 0 0 50.328 0",className:"logo_small_svg__cls-3","data-name":"Path 2939"})),n.createElement("path",{id:"logo_small_svg__Path_2940",d:"M31.8 33.854c-.154 1.712.058 3.482-.057 5.213a43 43 0 0 1-.693 5.156 9.53 9.53 0 0 1-4.1 5.829c4.079 2.654 4.54 6.771 4.81 10.946.135 2.25.077 4.52.308 6.752.173 1.731.846 2.174 2.636 2.231.73.02 1.48 0 2.327 0v5.349c-5.29.9-9.657-.6-10.734-5.079a31 31 0 0 1-.654-5c-.117-1.789.076-3.578-.058-5.367-.386-4.906-1.02-6.56-5.713-6.791v-6.1a9 9 0 0 1 1.028-.173c2.577-.135 3.674-.924 4.231-3.463a29 29 0 0 0 .481-4.329 82 82 0 0 1 .6-8.406c.673-3.982 3.136-5.906 7.234-6.137 1.154-.057 2.327 0 3.655 0v5.464c-.558.038-1.039.115-1.539.115-3.336-.115-3.51 1.02-3.762 3.79m6.406 12.658h-.077a3.515 3.515 0 1 0-.346 7.021h.231a3.46 3.46 0 0 0 3.655-3.251v-.192a3.523 3.523 0 0 0-3.461-3.578Zm12.062 0a3.373 3.373 0 0 0-3.482 3.251 2 2 0 0 0 .02.327 3.3 3.3 0 0 0 3.578 3.443 3.263 3.263 0 0 0 3.443-3.558 3.308 3.308 0 0 0-3.557-3.463Zm12.351 0a3.59 3.59 0 0 0-3.655 3.482 3.53 3.53 0 0 0 3.536 3.539h.039c1.769.309 3.559-1.4 3.674-3.462a3.57 3.57 0 0 0-3.6-3.559Zm16.948.288c-2.232-.1-3.348-.846-3.9-2.962a21.5 21.5 0 0 1-.635-4.136c-.154-2.578-.135-5.175-.308-7.753-.4-6.117-4.828-8.252-11.254-7.195v5.31c1.019 0 1.808 0 2.6.019 1.366.019 2.4.539 2.539 2.059.135 1.385.135 2.789.27 4.193.269 2.79.422 5.618.9 8.369a8.72 8.72 0 0 0 3.921 5.348c-3.4 2.289-4.406 5.559-4.578 9.234-.1 2.52-.154 5.059-.289 7.6-.115 2.308-.923 3.058-3.251 3.116-.654.019-1.289.077-2.019.115v5.445c1.365 0 2.616.077 3.866 0 3.886-.231 6.233-2.117 7-5.887A49 49 0 0 0 75 63.4c.135-1.923.116-3.866.308-5.771.289-2.982 1.655-4.213 4.636-4.4a4 4 0 0 0 .828-.192v-6.1c-.5-.058-.843-.115-1.208-.135Z","data-name":"Path 2940",style:{fill:"#173647"}}),d||(d=n.createElement("path",{id:"logo_small_svg__Path_2941",d:"M152.273 58.122a11.23 11.23 0 0 1-4.384 9.424q-4.383 3.382-11.9 3.382-8.14 0-12.524-2.1V63.7a33 33 0 0 0 6.137 1.879 32.3 32.3 0 0 0 6.575.689q5.322 0 8.015-2.02a6.63 6.63 0 0 0 2.692-5.62 7.2 7.2 0 0 0-.954-3.9 8.9 8.9 0 0 0-3.194-2.8 44.6 44.6 0 0 0-6.81-2.911q-6.387-2.286-9.126-5.417a11.96 11.96 0 0 1-2.74-8.172A10.16 10.16 0 0 1 128.039 27q3.977-3.131 10.52-3.131a31 31 0 0 1 12.555 2.5L149.455 31a28.4 28.4 0 0 0-11.021-2.38 10.67 10.67 0 0 0-6.606 1.816 5.98 5.98 0 0 0-2.38 5.041 7.7 7.7 0 0 0 .877 3.9 8.24 8.24 0 0 0 2.959 2.786 36.7 36.7 0 0 0 6.371 2.8q7.2 2.566 9.91 5.51a10.84 10.84 0 0 1 2.708 7.649",className:"logo_small_svg__cls-2","data-name":"Path 2941"})),y||(y=n.createElement("path",{id:"logo_small_svg__Path_2942",d:"M185.288 70.3 179 50.17q-.594-1.848-2.222-8.391h-.251q-1.252 5.479-2.192 8.453L167.849 70.3h-6.011l-9.361-34.315h5.447q3.318 12.931 5.057 19.693a80 80 0 0 1 1.988 9.111h.25q.345-1.785 1.112-4.618t1.33-4.493l6.294-19.693h5.635l6.137 19.693a66 66 0 0 1 2.379 9.048h.251a33 33 0 0 1 .673-3.475q.548-2.347 6.528-25.266h5.385L191.456 70.3Z",className:"logo_small_svg__cls-2","data-name":"Path 2942"})),_||(_=n.createElement("path",{id:"logo_small_svg__Path_2943",d:"m225.115 70.3-1.033-4.885h-.25a14.45 14.45 0 0 1-5.119 4.368 15.6 15.6 0 0 1-6.372 1.143q-5.1 0-8-2.63t-2.9-7.483q0-10.4 16.626-10.9l5.823-.188V47.6q0-4.038-1.738-5.964t-5.552-1.923a22.6 22.6 0 0 0-9.706 2.63l-1.6-3.977a24.4 24.4 0 0 1 5.557-2.16 24 24 0 0 1 6.058-.783q6.136 0 9.1 2.724t2.959 8.735V70.3Zm-11.741-3.663a10.55 10.55 0 0 0 7.626-2.66 9.85 9.85 0 0 0 2.771-7.451v-3.1l-5.2.219q-6.2.219-8.939 1.926a5.8 5.8 0 0 0-2.74 5.306 5.35 5.35 0 0 0 1.707 4.29 7.08 7.08 0 0 0 4.775 1.472Z",className:"logo_small_svg__cls-2","data-name":"Path 2943"})),g||(g=n.createElement("path",{id:"logo_small_svg__Path_2944",d:"M264.6 35.987v3.287l-6.356.752a11.16 11.16 0 0 1 2.255 6.856 10.15 10.15 0 0 1-3.444 8.047q-3.444 3-9.456 3a15.7 15.7 0 0 1-2.88-.25Q241.4 59.438 241.4 62.1a2.24 2.24 0 0 0 1.159 2.082 8.46 8.46 0 0 0 3.976.673h6.074q5.573 0 8.563 2.348a8.16 8.16 0 0 1 2.99 6.825 9.74 9.74 0 0 1-4.571 8.688q-4.572 2.989-13.338 2.99-6.732 0-10.379-2.5a8.09 8.09 0 0 1-3.647-7.076 7.95 7.95 0 0 1 2-5.417 10.2 10.2 0 0 1 5.636-3.1 5.43 5.43 0 0 1-2.207-1.847 4.9 4.9 0 0 1-.893-2.912 5.53 5.53 0 0 1 1-3.288 10.5 10.5 0 0 1 3.162-2.723 9.28 9.28 0 0 1-4.336-3.726 10.95 10.95 0 0 1-1.675-6.012q0-5.634 3.382-8.688t9.58-3.052a17.4 17.4 0 0 1 4.853.626Zm-27.367 40.075a4.66 4.66 0 0 0 2.348 4.227 12.97 12.97 0 0 0 6.732 1.44q6.543 0 9.69-1.956a5.99 5.99 0 0 0 3.147-5.307q0-2.787-1.723-3.867t-6.481-1.08h-6.23a8.2 8.2 0 0 0-5.51 1.69 6.04 6.04 0 0 0-1.973 4.853m2.818-29.086a6.98 6.98 0 0 0 2.035 5.448 8.12 8.12 0 0 0 5.667 1.847q7.608 0 7.608-7.389 0-7.733-7.7-7.733a7.63 7.63 0 0 0-5.635 1.972q-1.976 1.973-1.975 5.855",className:"logo_small_svg__cls-2","data-name":"Path 2944"})),m||(m=n.createElement("path",{id:"logo_small_svg__Path_2945",d:"M299.136 35.987v3.287l-6.356.752a11.17 11.17 0 0 1 2.254 6.856 10.15 10.15 0 0 1-3.444 8.047q-3.444 3-9.455 3a15.7 15.7 0 0 1-2.88-.25q-3.32 1.754-3.319 4.415a2.24 2.24 0 0 0 1.158 2.082 8.46 8.46 0 0 0 3.976.673h6.074q5.574 0 8.563 2.348a8.16 8.16 0 0 1 2.99 6.825 9.74 9.74 0 0 1-4.571 8.688q-4.57 2.989-13.337 2.99-6.732 0-10.379-2.5a8.09 8.09 0 0 1-3.648-7.076 7.95 7.95 0 0 1 2-5.417 10.2 10.2 0 0 1 5.636-3.1 5.43 5.43 0 0 1-2.208-1.847 4.9 4.9 0 0 1-.892-2.912 5.53 5.53 0 0 1 1-3.288 10.5 10.5 0 0 1 3.162-2.723 9.27 9.27 0 0 1-4.336-3.726 10.95 10.95 0 0 1-1.675-6.012q0-5.634 3.381-8.688t9.581-3.052a17.4 17.4 0 0 1 4.853.626Zm-27.364 40.075a4.66 4.66 0 0 0 2.348 4.227 12.97 12.97 0 0 0 6.731 1.44q6.544 0 9.691-1.956a5.99 5.99 0 0 0 3.146-5.307q0-2.787-1.722-3.867t-6.481-1.08h-6.23a8.2 8.2 0 0 0-5.511 1.69 6.04 6.04 0 0 0-1.972 4.853m2.818-29.086a6.98 6.98 0 0 0 2.035 5.448 8.12 8.12 0 0 0 5.667 1.847q7.607 0 7.608-7.389 0-7.733-7.7-7.733a7.63 7.63 0 0 0-5.635 1.972q-1.975 1.973-1.975 5.855",className:"logo_small_svg__cls-2","data-name":"Path 2945"})),v||(v=n.createElement("path",{id:"logo_small_svg__Path_2946",d:"M316.778 70.928q-7.608 0-12.007-4.634t-4.4-12.868q0-8.3 4.086-13.181a13.57 13.57 0 0 1 10.974-4.884 12.94 12.94 0 0 1 10.207 4.239q3.762 4.247 3.762 11.2v3.287h-23.643q.156 6.044 3.053 9.174t8.156 3.131a27.6 27.6 0 0 0 10.958-2.317v4.634a27.5 27.5 0 0 1-5.213 1.706 29.3 29.3 0 0 1-5.933.513m-1.409-31.215a8.49 8.49 0 0 0-6.591 2.692 12.4 12.4 0 0 0-2.9 7.452h17.94q0-4.916-2.191-7.53a7.71 7.71 0 0 0-6.258-2.614",className:"logo_small_svg__cls-2","data-name":"Path 2946"})),b||(b=n.createElement("path",{id:"logo_small_svg__Path_2947",d:"M350.9 35.361a20.4 20.4 0 0 1 4.1.375l-.721 4.822a17.7 17.7 0 0 0-3.757-.47 9.14 9.14 0 0 0-7.122 3.382 12.33 12.33 0 0 0-2.959 8.422V70.3h-5.2V35.987h4.29l.6 6.356h.25a15.1 15.1 0 0 1 4.6-5.166 10.36 10.36 0 0 1 5.919-1.816",className:"logo_small_svg__cls-2","data-name":"Path 2947"})),w||(w=n.createElement("path",{id:"logo_small_svg__Path_2948",d:"M255.857 96.638s-3.43-.391-4.85-.391c-2.058 0-3.111.735-3.111 2.18 0 1.568.882 1.935 3.748 2.719 3.527.98 4.8 1.911 4.8 4.777 0 3.675-2.3 5.267-5.61 5.267a36 36 0 0 1-5.487-.662l.27-2.18s3.306.441 5.046.441c2.082 0 3.037-.931 3.037-2.7 0-1.421-.759-1.91-3.331-2.523-3.626-.93-5.193-2.033-5.193-4.948 0-3.381 2.229-4.776 5.585-4.776a37 37 0 0 1 5.315.587Z",className:"logo_small_svg__cls-2","data-name":"Path 2948"})),I||(I=n.createElement("path",{id:"logo_small_svg__Path_2949",d:"M262.967 94.14h4.733l3.748 13.106L275.2 94.14h4.752v16.78H277.2v-14.5h-.145l-4.191 13.816h-2.842l-4.191-13.816h-.145v14.5h-2.719Z",className:"logo_small_svg__cls-2","data-name":"Path 2949"})),x||(x=n.createElement("path",{id:"logo_small_svg__Path_2950",d:"M322.057 94.14H334.3v2.425h-4.728v14.355h-2.743V96.565h-4.777Z",className:"logo_small_svg__cls-2","data-name":"Path 2950"})),B||(B=n.createElement("path",{id:"logo_small_svg__Path_2951",d:"M346.137 94.14c3.332 0 5.12 1.249 5.12 4.361 0 2.033-.637 3.037-1.984 3.772 1.445.563 2.4 1.592 2.4 3.9 0 3.43-2.081 4.752-5.339 4.752h-6.566V94.14Zm-3.65 2.352v4.8h3.6c1.666 0 2.4-.832 2.4-2.474 0-1.617-.833-2.327-2.5-2.327Zm0 7.1v4.973h3.7c1.689 0 2.694-.539 2.694-2.548 0-1.911-1.421-2.425-2.744-2.425Z",className:"logo_small_svg__cls-2","data-name":"Path 2951"})),k||(k=n.createElement("path",{id:"logo_small_svg__Path_2952",d:"M358.414 94.14H369v2.377h-7.864v4.751h6.394v2.332h-6.394v4.924H369v2.4h-10.586Z",className:"logo_small_svg__cls-2","data-name":"Path 2952"})),C||(C=n.createElement("path",{id:"logo_small_svg__Path_2953",d:"M378.747 94.14h5.414l4.164 16.78h-2.744l-1.239-4.92h-5.777l-1.239 4.923h-2.719Zm.361 9.456h4.708l-1.737-7.178h-1.225Z",className:"logo_small_svg__cls-2","data-name":"Path 2953"})),j||(j=n.createElement("path",{id:"logo_small_svg__Path_2954",d:"M397.1 105.947v4.973h-2.719V94.14h6.37c3.7 0 5.683 2.12 5.683 5.843 0 2.376-.956 4.519-2.744 5.352l2.769 5.585h-2.989l-2.426-4.973Zm3.651-9.455H397.1v7.1h3.7c2.057 0 2.841-1.85 2.841-3.589 0-1.9-.934-3.511-2.894-3.511Z",className:"logo_small_svg__cls-2","data-name":"Path 2954"})),q||(q=n.createElement("path",{id:"logo_small_svg__Path_2955",d:"M290.013 94.14h5.413l4.164 16.78h-2.743l-1.239-4.92h-5.777l-1.239 4.923h-2.719Zm.361 9.456h4.707l-1.737-7.178h-1.225Z",className:"logo_small_svg__cls-2","data-name":"Path 2955"})),L||(L=n.createElement("path",{id:"logo_small_svg__Path_2956",d:"M308.362 105.947v4.973h-2.719V94.14h6.369c3.7 0 5.683 2.12 5.683 5.843 0 2.376-.955 4.519-2.743 5.352l2.768 5.585h-2.989l-2.425-4.973Zm3.65-9.455h-3.65v7.1h3.7c2.058 0 2.841-1.85 2.841-3.589-.003-1.903-.931-3.511-2.891-3.511",className:"logo_small_svg__cls-2","data-name":"Path 2956"})),P||(P=n.createElement("path",{id:"logo_small_svg__Path_2957",d:"M130.606 107.643a3.02 3.02 0 0 1-1.18 2.537 5.1 5.1 0 0 1-3.2.91 8 8 0 0 1-3.371-.564v-1.383a9 9 0 0 0 1.652.506 8.7 8.7 0 0 0 1.77.186 3.57 3.57 0 0 0 2.157-.544 1.78 1.78 0 0 0 .725-1.512 1.95 1.95 0 0 0-.257-1.05 2.4 2.4 0 0 0-.86-.754 12 12 0 0 0-1.833-.784 5.84 5.84 0 0 1-2.456-1.458 3.2 3.2 0 0 1-.738-2.2 2.74 2.74 0 0 1 1.071-2.267 4.44 4.44 0 0 1 2.831-.843 8.3 8.3 0 0 1 3.38.675l-.447 1.247a7.6 7.6 0 0 0-2.966-.641 2.88 2.88 0 0 0-1.779.489 1.61 1.61 0 0 0-.64 1.357 2.1 2.1 0 0 0 .236 1.049 2.2 2.2 0 0 0 .8.75 10 10 0 0 0 1.715.754 6.8 6.8 0 0 1 2.667 1.483 2.92 2.92 0 0 1 .723 2.057",className:"logo_small_svg__cls-2","data-name":"Path 2957"})),U||(U=n.createElement("path",{id:"logo_small_svg__Path_2958",d:"M134.447 101.686v5.991a2.4 2.4 0 0 0 .515 1.686 2.1 2.1 0 0 0 1.609.556 2.63 2.63 0 0 0 2.12-.792 4 4 0 0 0 .67-2.587v-4.854h1.4v9.236H139.6l-.2-1.239h-.075a2.8 2.8 0 0 1-1.193 1.045 4 4 0 0 1-1.74.362 3.53 3.53 0 0 1-2.524-.8 3.4 3.4 0 0 1-.839-2.562v-6.042Z",className:"logo_small_svg__cls-2","data-name":"Path 2958"})),D||(D=n.createElement("path",{id:"logo_small_svg__Path_2959",d:"M148.206 111.09a4 4 0 0 1-1.647-.333 3.1 3.1 0 0 1-1.252-1.023h-.1a12 12 0 0 1 .1 1.533v3.8h-1.4v-13.381h1.137l.194 1.264h.067a3.26 3.26 0 0 1 1.256-1.1 3.8 3.8 0 0 1 1.643-.337 3.41 3.41 0 0 1 2.836 1.256 6.68 6.68 0 0 1-.017 7.057 3.42 3.42 0 0 1-2.817 1.264m-.2-8.385a2.48 2.48 0 0 0-2.048.784 4.04 4.04 0 0 0-.649 2.494v.312a4.63 4.63 0 0 0 .649 2.785 2.47 2.47 0 0 0 2.082.839 2.16 2.16 0 0 0 1.875-.969 4.6 4.6 0 0 0 .678-2.671 4.43 4.43 0 0 0-.678-2.651 2.23 2.23 0 0 0-1.915-.923Z",className:"logo_small_svg__cls-2","data-name":"Path 2959"})),z||(z=n.createElement("path",{id:"logo_small_svg__Path_2960",d:"M159.039 111.09a4 4 0 0 1-1.647-.333 3.1 3.1 0 0 1-1.252-1.023h-.1a12 12 0 0 1 .1 1.533v3.8h-1.4v-13.381h1.137l.194 1.264h.067a3.26 3.26 0 0 1 1.256-1.1 3.8 3.8 0 0 1 1.643-.337 3.41 3.41 0 0 1 2.836 1.256 6.68 6.68 0 0 1-.017 7.057 3.42 3.42 0 0 1-2.817 1.264m-.2-8.385a2.48 2.48 0 0 0-2.048.784 4.04 4.04 0 0 0-.649 2.494v.312a4.63 4.63 0 0 0 .649 2.785 2.47 2.47 0 0 0 2.082.839 2.16 2.16 0 0 0 1.875-.969 4.6 4.6 0 0 0 .678-2.671 4.43 4.43 0 0 0-.678-2.651 2.23 2.23 0 0 0-1.911-.923Z",className:"logo_small_svg__cls-2","data-name":"Path 2960"})),W||(W=n.createElement("path",{id:"logo_small_svg__Path_2961",d:"M173.612 106.3a5.1 5.1 0 0 1-1.137 3.527 4 4 0 0 1-3.143 1.268 4.17 4.17 0 0 1-2.2-.581 3.84 3.84 0 0 1-1.483-1.669 5.8 5.8 0 0 1-.522-2.545 5.1 5.1 0 0 1 1.129-3.518 4 4 0 0 1 3.135-1.26 3.9 3.9 0 0 1 3.08 1.29 5.07 5.07 0 0 1 1.141 3.488m-7.036 0a4.4 4.4 0 0 0 .708 2.7 2.81 2.81 0 0 0 4.167 0 4.37 4.37 0 0 0 .712-2.7 4.3 4.3 0 0 0-.712-2.675 2.5 2.5 0 0 0-2.1-.915 2.46 2.46 0 0 0-2.072.9 4.33 4.33 0 0 0-.7 2.69Z",className:"logo_small_svg__cls-2","data-name":"Path 2961"})),V||(V=n.createElement("path",{id:"logo_small_svg__Path_2962",d:"M180.525 101.517a5.5 5.5 0 0 1 1.1.1l-.194 1.3a4.8 4.8 0 0 0-1.011-.127 2.46 2.46 0 0 0-1.917.911 3.32 3.32 0 0 0-.8 2.267v4.955h-1.4v-9.236h1.154l.16 1.71h.068a4.05 4.05 0 0 1 1.238-1.39 2.8 2.8 0 0 1 1.6-.49Z",className:"logo_small_svg__cls-2","data-name":"Path 2962"})),K||(K=n.createElement("path",{id:"logo_small_svg__Path_2963",d:"M187.363 109.936a4.5 4.5 0 0 0 .716-.055 4 4 0 0 0 .548-.114v1.07a2.5 2.5 0 0 1-.67.181 5 5 0 0 1-.8.072q-2.68 0-2.68-2.823v-5.494h-1.323v-.673l1.323-.582.59-1.972h.809v2.141h2.68v1.087h-2.68v5.435a1.87 1.87 0 0 0 .4 1.281 1.38 1.38 0 0 0 1.087.446",className:"logo_small_svg__cls-2","data-name":"Path 2963"})),$||($=n.createElement("path",{id:"logo_small_svg__Path_2964",d:"M194.538 111.09a4.24 4.24 0 0 1-3.231-1.247 4.82 4.82 0 0 1-1.184-3.463 5.36 5.36 0 0 1 1.1-3.548 3.65 3.65 0 0 1 2.954-1.315 3.48 3.48 0 0 1 2.747 1.142 4.38 4.38 0 0 1 1.011 3.013v.885h-6.362a3.66 3.66 0 0 0 .822 2.469 2.84 2.84 0 0 0 2.2.843 7.4 7.4 0 0 0 2.949-.624v1.247a7.4 7.4 0 0 1-1.4.459 8 8 0 0 1-1.6.139Zm-.379-8.4a2.29 2.29 0 0 0-1.774.725 3.34 3.34 0 0 0-.779 2.006h4.828a3.07 3.07 0 0 0-.59-2.027 2.08 2.08 0 0 0-1.685-.706Z",className:"logo_small_svg__cls-2","data-name":"Path 2964"})),H||(H=n.createElement("path",{id:"logo_small_svg__Path_2965",d:"M206.951 109.683h-.076a3.29 3.29 0 0 1-2.9 1.407 3.43 3.43 0 0 1-2.819-1.239 5.45 5.45 0 0 1-1.006-3.522 5.54 5.54 0 0 1 1.011-3.548 3.4 3.4 0 0 1 2.814-1.264 3.36 3.36 0 0 1 2.883 1.365h.109l-.059-.665-.034-.649v-3.759h1.4v13.113h-1.138Zm-2.8.236a2.55 2.55 0 0 0 2.078-.779 3.95 3.95 0 0 0 .644-2.516v-.3a4.64 4.64 0 0 0-.653-2.8 2.48 2.48 0 0 0-2.086-.839 2.14 2.14 0 0 0-1.883.957 4.76 4.76 0 0 0-.653 2.7 4.55 4.55 0 0 0 .649 2.671 2.2 2.2 0 0 0 1.906.906Z",className:"logo_small_svg__cls-2","data-name":"Path 2965"})),Y||(Y=n.createElement("path",{id:"logo_small_svg__Path_2966",d:"M220.712 101.534a3.44 3.44 0 0 1 2.827 1.243 6.65 6.65 0 0 1-.009 7.053 3.42 3.42 0 0 1-2.818 1.26 4 4 0 0 1-1.648-.333 3.1 3.1 0 0 1-1.251-1.023h-.1l-.295 1.188h-1V97.809h1.4V101q0 1.069-.068 1.921h.068a3.32 3.32 0 0 1 2.894-1.387m-.2 1.171a2.44 2.44 0 0 0-2.064.822 6.34 6.34 0 0 0 .017 5.553 2.46 2.46 0 0 0 2.081.839 2.16 2.16 0 0 0 1.922-.94 4.83 4.83 0 0 0 .632-2.7 4.64 4.64 0 0 0-.632-2.689 2.24 2.24 0 0 0-1.959-.885Z",className:"logo_small_svg__cls-2","data-name":"Path 2966"})),Z||(Z=n.createElement("path",{id:"logo_small_svg__Path_2967",d:"M225.758 101.686h1.5l2.023 5.267a20 20 0 0 1 .826 2.6h.067q.109-.431.459-1.471t2.288-6.4h1.5l-3.969 10.518a5.25 5.25 0 0 1-1.378 2.212 2.93 2.93 0 0 1-1.934.653 5.7 5.7 0 0 1-1.264-.143V113.8a5 5 0 0 0 1.037.1 2.136 2.136 0 0 0 2.056-1.618l.514-1.314Z",className:"logo_small_svg__cls-2","data-name":"Path 2967"}))))),components_Logo=()=>n.createElement(logo_small,{height:"40"});var J;function lightbulb_extends(){return lightbulb_extends=Object.assign?Object.assign.bind():function(t){for(var e=1;en.createElement("svg",lightbulb_extends({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},t),J||(J=n.createElement("path",{d:"M12 2a7 7 0 0 0-7 7c0 2.38 1.19 4.47 3 5.74V17a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1v-2.26c1.81-1.27 3-3.36 3-5.74a7 7 0 0 0-7-7M9 21a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1v-1H9z"})));var tt;function lightbulb_off_extends(){return lightbulb_off_extends=Object.assign?Object.assign.bind():function(t){for(var e=1;en.createElement("svg",lightbulb_off_extends({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},t),tt||(tt=n.createElement("path",{d:"M12 2C9.76 2 7.78 3.05 6.5 4.68l9.81 9.82C17.94 13.21 19 11.24 19 9a7 7 0 0 0-7-7M3.28 4 2 5.27 5.04 8.3C5 8.53 5 8.76 5 9c0 2.38 1.19 4.47 3 5.74V17a1 1 0 0 0 1 1h5.73l4 4L20 20.72zM9 20v1a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1v-1z"})));class DarkModeToggle extends n.Component{constructor(t){super(t),this.state={isDarkMode:!1},this.toggleIsDarkMode=this.toggleIsDarkMode.bind(this)}componentDidMount(){window.matchMedia("(prefers-color-scheme: dark)").matches&&(document.documentElement.classList.add("dark-mode"),this.setState({isDarkMode:!0}))}toggleIsDarkMode(){document.documentElement.classList.toggle("dark-mode"),this.setState((t=>({isDarkMode:!t.isDarkMode})))}render(){const{isDarkMode:t}=this.state;return n.createElement("div",{className:"dark-mode-toggle"},n.createElement("button",{onClick:this.toggleIsDarkMode},t?n.createElement(lightbulb,{height:"24"}):n.createElement(lightbulb_off,{height:"24"})))}}const et=DarkModeToggle,top_bar=()=>({components:{Topbar:u,Logo:components_Logo,DarkModeToggle:et}});function isNothing(t){return null==t}var rt={isNothing,isObject:function js_yaml_isObject(t){return"object"==typeof t&&null!==t},toArray:function toArray(t){return Array.isArray(t)?t:isNothing(t)?[]:[t]},repeat:function repeat(t,e){var r,n="";for(r=0;rs&&(e=n-s+(i=" ... ").length),r-n>s&&(r=n+s-(a=" ...").length),{str:i+t.slice(e,r).replace(/\t/g,"→")+a,pos:n-e+i.length}}function padStart(t,e){return rt.repeat(" ",e-t.length)+t}var ot=function makeSnippet(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),"number"!=typeof e.indent&&(e.indent=1),"number"!=typeof e.linesBefore&&(e.linesBefore=3),"number"!=typeof e.linesAfter&&(e.linesAfter=2);for(var r,n=/\r?\n|\r|\0/g,o=[0],i=[],a=-1;r=n.exec(t.buffer);)i.push(r.index),o.push(r.index+r[0].length),t.position<=r.index&&a<0&&(a=o.length-2);a<0&&(a=o.length-1);var s,u,c="",f=Math.min(t.line+e.linesAfter,i.length).toString().length,l=e.maxLength-(e.indent+f+3);for(s=1;s<=e.linesBefore&&!(a-s<0);s++)u=getLine(t.buffer,o[a-s],i[a-s],t.position-(o[a]-o[a-s]),l),c=rt.repeat(" ",e.indent)+padStart((t.line-s+1).toString(),f)+" | "+u.str+"\n"+c;for(u=getLine(t.buffer,o[a],i[a],t.position,l),c+=rt.repeat(" ",e.indent)+padStart((t.line+1).toString(),f)+" | "+u.str+"\n",c+=rt.repeat("-",e.indent+f+3+u.pos)+"^\n",s=1;s<=e.linesAfter&&!(a+s>=i.length);s++)u=getLine(t.buffer,o[a+s],i[a+s],t.position-(o[a]-o[a+s]),l),c+=rt.repeat(" ",e.indent)+padStart((t.line+s+1).toString(),f)+" | "+u.str+"\n";return c.replace(/\n$/,"")},it=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],at=["scalar","sequence","mapping"];var st=function Type$1(t,e){if(e=e||{},Object.keys(e).forEach((function(e){if(-1===it.indexOf(e))throw new nt('Unknown option "'+e+'" is met in definition of "'+t+'" YAML type.')})),this.options=e,this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.representName=e.representName||null,this.defaultStyle=e.defaultStyle||null,this.multi=e.multi||!1,this.styleAliases=function compileStyleAliases(t){var e={};return null!==t&&Object.keys(t).forEach((function(r){t[r].forEach((function(t){e[String(t)]=r}))})),e}(e.styleAliases||null),-1===at.indexOf(this.kind))throw new nt('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')};function compileList(t,e){var r=[];return t[e].forEach((function(t){var e=r.length;r.forEach((function(r,n){r.tag===t.tag&&r.kind===t.kind&&r.multi===t.multi&&(e=n)})),r[e]=t})),r}function Schema$1(t){return this.extend(t)}Schema$1.prototype.extend=function extend(t){var e=[],r=[];if(t instanceof st)r.push(t);else if(Array.isArray(t))r=r.concat(t);else{if(!t||!Array.isArray(t.implicit)&&!Array.isArray(t.explicit))throw new nt("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");t.implicit&&(e=e.concat(t.implicit)),t.explicit&&(r=r.concat(t.explicit))}e.forEach((function(t){if(!(t instanceof st))throw new nt("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(t.loadKind&&"scalar"!==t.loadKind)throw new nt("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(t.multi)throw new nt("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")})),r.forEach((function(t){if(!(t instanceof st))throw new nt("Specified list of YAML types (or a single Type object) contains a non-Type object.")}));var n=Object.create(Schema$1.prototype);return n.implicit=(this.implicit||[]).concat(e),n.explicit=(this.explicit||[]).concat(r),n.compiledImplicit=compileList(n,"implicit"),n.compiledExplicit=compileList(n,"explicit"),n.compiledTypeMap=function compileMap(){var t,e,r={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function collectType(t){t.multi?(r.multi[t.kind].push(t),r.multi.fallback.push(t)):r[t.kind][t.tag]=r.fallback[t.tag]=t}for(t=0,e=arguments.length;t=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0o"+t.toString(8):"-0o"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),gt=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var mt=/^[-+]?[0-9]+e/;var vt=new st("tag:yaml.org,2002:float",{kind:"scalar",resolve:function resolveYamlFloat(t){return null!==t&&!(!gt.test(t)||"_"===t[t.length-1])},construct:function constructYamlFloat(t){var e,r;return r="-"===(e=t.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(e[0])>=0&&(e=e.slice(1)),".inf"===e?1===r?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===e?NaN:r*parseFloat(e,10)},predicate:function isFloat(t){return"[object Number]"===Object.prototype.toString.call(t)&&(t%1!=0||rt.isNegativeZero(t))},represent:function representYamlFloat(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(rt.isNegativeZero(t))return"-0.0";return r=t.toString(10),mt.test(r)?r.replace("e",".e"):r},defaultStyle:"lowercase"}),bt=ht.extend({implicit:[dt,yt,_t,vt]}),St=bt,wt=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),It=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");var xt=new st("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function resolveYamlTimestamp(t){return null!==t&&(null!==wt.exec(t)||null!==It.exec(t))},construct:function constructYamlTimestamp(t){var e,r,n,o,i,a,s,u,c=0,f=null;if(null===(e=wt.exec(t))&&(e=It.exec(t)),null===e)throw new Error("Date resolve error");if(r=+e[1],n=+e[2]-1,o=+e[3],!e[4])return new Date(Date.UTC(r,n,o));if(i=+e[4],a=+e[5],s=+e[6],e[7]){for(c=e[7].slice(0,3);c.length<3;)c+="0";c=+c}return e[9]&&(f=6e4*(60*+e[10]+ +(e[11]||0)),"-"===e[9]&&(f=-f)),u=new Date(Date.UTC(r,n,o,i,a,s,c)),f&&u.setTime(u.getTime()-f),u},instanceOf:Date,represent:function representYamlTimestamp(t){return t.toISOString()}});var Et=new st("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function resolveYamlMerge(t){return"<<"===t||null===t}}),At="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";var Ot=new st("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function resolveYamlBinary(t){if(null===t)return!1;var e,r,n=0,o=t.length,i=At;for(r=0;r64)){if(e<0)return!1;n+=6}return n%8==0},construct:function constructYamlBinary(t){var e,r,n=t.replace(/[\r\n=]/g,""),o=n.length,i=At,a=0,s=[];for(e=0;e>16&255),s.push(a>>8&255),s.push(255&a)),a=a<<6|i.indexOf(n.charAt(e));return 0===(r=o%4*6)?(s.push(a>>16&255),s.push(a>>8&255),s.push(255&a)):18===r?(s.push(a>>10&255),s.push(a>>2&255)):12===r&&s.push(a>>4&255),new Uint8Array(s)},predicate:function isBinary(t){return"[object Uint8Array]"===Object.prototype.toString.call(t)},represent:function representYamlBinary(t){var e,r,n="",o=0,i=t.length,a=At;for(e=0;e>18&63],n+=a[o>>12&63],n+=a[o>>6&63],n+=a[63&o]),o=(o<<8)+t[e];return 0===(r=i%3)?(n+=a[o>>18&63],n+=a[o>>12&63],n+=a[o>>6&63],n+=a[63&o]):2===r?(n+=a[o>>10&63],n+=a[o>>4&63],n+=a[o<<2&63],n+=a[64]):1===r&&(n+=a[o>>2&63],n+=a[o<<4&63],n+=a[64],n+=a[64]),n}}),Bt=Object.prototype.hasOwnProperty,kt=Object.prototype.toString;var Mt=new st("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function resolveYamlOmap(t){if(null===t)return!0;var e,r,n,o,i,a=[],s=t;for(e=0,r=s.length;e>10),56320+(t-65536&1023))}function setProperty(t,e,r){"__proto__"===e?Object.defineProperty(t,e,{configurable:!0,enumerable:!0,writable:!0,value:r}):t[e]=r}for(var zt=new Array(256),Wt=new Array(256),Vt=0;Vt<256;Vt++)zt[Vt]=simpleEscapeSequence(Vt)?1:0,Wt[Vt]=simpleEscapeSequence(Vt);function State$1(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||Nt,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function generateError(t,e){var r={name:t.filename,buffer:t.input.slice(0,-1),position:t.position,line:t.line,column:t.position-t.lineStart};return r.snippet=ot(r),new nt(e,r)}function throwError(t,e){throw generateError(t,e)}function throwWarning(t,e){t.onWarning&&t.onWarning.call(null,generateError(t,e))}var Kt={YAML:function handleYamlDirective(t,e,r){var n,o,i;null!==t.version&&throwError(t,"duplication of %YAML directive"),1!==r.length&&throwError(t,"YAML directive accepts exactly one argument"),null===(n=/^([0-9]+)\.([0-9]+)$/.exec(r[0]))&&throwError(t,"ill-formed argument of the YAML directive"),o=parseInt(n[1],10),i=parseInt(n[2],10),1!==o&&throwError(t,"unacceptable YAML version of the document"),t.version=r[0],t.checkLineBreaks=i<2,1!==i&&2!==i&&throwWarning(t,"unsupported YAML version of the document")},TAG:function handleTagDirective(t,e,r){var n,o;2!==r.length&&throwError(t,"TAG directive accepts exactly two arguments"),n=r[0],o=r[1],Ut.test(n)||throwError(t,"ill-formed tag handle (first argument) of the TAG directive"),Tt.call(t.tagMap,n)&&throwError(t,'there is a previously declared suffix for "'+n+'" tag handle'),Dt.test(o)||throwError(t,"ill-formed tag prefix (second argument) of the TAG directive");try{o=decodeURIComponent(o)}catch(e){throwError(t,"tag prefix is malformed: "+o)}t.tagMap[n]=o}};function captureSegment(t,e,r,n){var o,i,a,s;if(e1&&(t.result+=rt.repeat("\n",e-1))}function readBlockSequence(t,e){var r,n,o=t.tag,i=t.anchor,a=[],s=!1;if(-1!==t.firstTabInLine)return!1;for(null!==t.anchor&&(t.anchorMap[t.anchor]=a),n=t.input.charCodeAt(t.position);0!==n&&(-1!==t.firstTabInLine&&(t.position=t.firstTabInLine,throwError(t,"tab characters must not be used in indentation")),45===n)&&is_WS_OR_EOL(t.input.charCodeAt(t.position+1));)if(s=!0,t.position++,skipSeparationSpace(t,!0,-1)&&t.lineIndent<=e)a.push(null),n=t.input.charCodeAt(t.position);else if(r=t.line,composeNode(t,e,3,!1,!0),a.push(t.result),skipSeparationSpace(t,!0,-1),n=t.input.charCodeAt(t.position),(t.line===r||t.lineIndent>e)&&0!==n)throwError(t,"bad indentation of a sequence entry");else if(t.lineIndente?d=1:t.lineIndent===e?d=0:t.lineIndente?d=1:t.lineIndent===e?d=0:t.lineIndente)&&(g&&(a=t.line,s=t.lineStart,u=t.position),composeNode(t,e,4,!0,o)&&(g?y=t.result:_=t.result),g||(storeMappingPair(t,p,h,d,y,_,a,s,u),d=y=_=null),skipSeparationSpace(t,!0,-1),c=t.input.charCodeAt(t.position)),(t.line===i||t.lineIndent>e)&&0!==c)throwError(t,"bad indentation of a mapping entry");else if(t.lineIndent=0))break;0===o?throwError(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):c?throwError(t,"repeat of an indentation width identifier"):(f=e+o-1,c=!0)}if(is_WHITE_SPACE(i)){do{i=t.input.charCodeAt(++t.position)}while(is_WHITE_SPACE(i));if(35===i)do{i=t.input.charCodeAt(++t.position)}while(!is_EOL(i)&&0!==i)}for(;0!==i;){for(readLineBreak(t),t.lineIndent=0,i=t.input.charCodeAt(t.position);(!c||t.lineIndentf&&(f=t.lineIndent),is_EOL(i))l++;else{if(t.lineIndent0){for(o=a,i=0;o>0;o--)(a=fromHexCode(s=t.input.charCodeAt(++t.position)))>=0?i=(i<<4)+a:throwError(t,"expected hexadecimal character");t.result+=charFromCodepoint(i),t.position++}else throwError(t,"unknown escape sequence");r=n=t.position}else is_EOL(s)?(captureSegment(t,r,n,!0),writeFoldedLines(t,skipSeparationSpace(t,!1,e)),r=n=t.position):t.position===t.lineStart&&testDocumentSeparator(t)?throwError(t,"unexpected end of the document within a double quoted scalar"):(t.position++,n=t.position)}throwError(t,"unexpected end of the stream within a double quoted scalar")}(t,p)?_=!0:!function readAlias(t){var e,r,n;if(42!==(n=t.input.charCodeAt(t.position)))return!1;for(n=t.input.charCodeAt(++t.position),e=t.position;0!==n&&!is_WS_OR_EOL(n)&&!is_FLOW_INDICATOR(n);)n=t.input.charCodeAt(++t.position);return t.position===e&&throwError(t,"name of an alias node must contain at least one character"),r=t.input.slice(e,t.position),Tt.call(t.anchorMap,r)||throwError(t,'unidentified alias "'+r+'"'),t.result=t.anchorMap[r],skipSeparationSpace(t,!0,-1),!0}(t)?function readPlainScalar(t,e,r){var n,o,i,a,s,u,c,f,l=t.kind,p=t.result;if(is_WS_OR_EOL(f=t.input.charCodeAt(t.position))||is_FLOW_INDICATOR(f)||35===f||38===f||42===f||33===f||124===f||62===f||39===f||34===f||37===f||64===f||96===f)return!1;if((63===f||45===f)&&(is_WS_OR_EOL(n=t.input.charCodeAt(t.position+1))||r&&is_FLOW_INDICATOR(n)))return!1;for(t.kind="scalar",t.result="",o=i=t.position,a=!1;0!==f;){if(58===f){if(is_WS_OR_EOL(n=t.input.charCodeAt(t.position+1))||r&&is_FLOW_INDICATOR(n))break}else if(35===f){if(is_WS_OR_EOL(t.input.charCodeAt(t.position-1)))break}else{if(t.position===t.lineStart&&testDocumentSeparator(t)||r&&is_FLOW_INDICATOR(f))break;if(is_EOL(f)){if(s=t.line,u=t.lineStart,c=t.lineIndent,skipSeparationSpace(t,!1,-1),t.lineIndent>=e){a=!0,f=t.input.charCodeAt(t.position);continue}t.position=i,t.line=s,t.lineStart=u,t.lineIndent=c;break}}a&&(captureSegment(t,o,i,!1),writeFoldedLines(t,t.line-s),o=i=t.position,a=!1),is_WHITE_SPACE(f)||(i=t.position+1),f=t.input.charCodeAt(++t.position)}return captureSegment(t,o,i,!1),!!t.result||(t.kind=l,t.result=p,!1)}(t,p,1===r)&&(_=!0,null===t.tag&&(t.tag="?")):(_=!0,null===t.tag&&null===t.anchor||throwError(t,"alias node should not have any properties")),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):0===d&&(_=s&&readBlockSequence(t,h))),null===t.tag)null!==t.anchor&&(t.anchorMap[t.anchor]=t.result);else if("?"===t.tag){for(null!==t.result&&"scalar"!==t.kind&&throwError(t,'unacceptable node kind for ! tag; it should be "scalar", not "'+t.kind+'"'),u=0,c=t.implicitTypes.length;u"),null!==t.result&&l.kind!==t.kind&&throwError(t,"unacceptable node kind for !<"+t.tag+'> tag; it should be "'+l.kind+'", not "'+t.kind+'"'),l.resolve(t.result,t.tag)?(t.result=l.construct(t.result,t.tag),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):throwError(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")}return null!==t.listener&&t.listener("close",t),null!==t.tag||null!==t.anchor||_}function readDocument(t){var e,r,n,o,i=t.position,a=!1;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap=Object.create(null),t.anchorMap=Object.create(null);0!==(o=t.input.charCodeAt(t.position))&&(skipSeparationSpace(t,!0,-1),o=t.input.charCodeAt(t.position),!(t.lineIndent>0||37!==o));){for(a=!0,o=t.input.charCodeAt(++t.position),e=t.position;0!==o&&!is_WS_OR_EOL(o);)o=t.input.charCodeAt(++t.position);for(n=[],(r=t.input.slice(e,t.position)).length<1&&throwError(t,"directive name must not be less than one character in length");0!==o;){for(;is_WHITE_SPACE(o);)o=t.input.charCodeAt(++t.position);if(35===o){do{o=t.input.charCodeAt(++t.position)}while(0!==o&&!is_EOL(o));break}if(is_EOL(o))break;for(e=t.position;0!==o&&!is_WS_OR_EOL(o);)o=t.input.charCodeAt(++t.position);n.push(t.input.slice(e,t.position))}0!==o&&readLineBreak(t),Tt.call(Kt,r)?Kt[r](t,r,n):throwWarning(t,'unknown document directive "'+r+'"')}skipSeparationSpace(t,!0,-1),0===t.lineIndent&&45===t.input.charCodeAt(t.position)&&45===t.input.charCodeAt(t.position+1)&&45===t.input.charCodeAt(t.position+2)?(t.position+=3,skipSeparationSpace(t,!0,-1)):a&&throwError(t,"directives end mark is expected"),composeNode(t,t.lineIndent-1,4,!1,!0),skipSeparationSpace(t,!0,-1),t.checkLineBreaks&&Rt.test(t.input.slice(i,t.position))&&throwWarning(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&testDocumentSeparator(t)?46===t.input.charCodeAt(t.position)&&(t.position+=3,skipSeparationSpace(t,!0,-1)):t.position=55296&&n<=56319&&e+1=56320&&r<=57343?1024*(n-55296)+r-56320+65536:n}function needIndentIndicator(t){return/^\n* /.test(t)}function chooseScalarStyle(t,e,r,n,o,i,a,s){var u,c=0,f=null,l=!1,p=!1,h=-1!==n,d=-1,y=function isPlainSafeFirst(t){return isPrintable(t)&&t!==Gt&&!isWhitespace(t)&&45!==t&&63!==t&&58!==t&&44!==t&&91!==t&&93!==t&&123!==t&&125!==t&&35!==t&&38!==t&&42!==t&&33!==t&&124!==t&&61!==t&&62!==t&&39!==t&&34!==t&&37!==t&&64!==t&&96!==t}(codePointAt(t,0))&&function isPlainSafeLast(t){return!isWhitespace(t)&&58!==t}(codePointAt(t,t.length-1));if(e||a)for(u=0;u=65536?u+=2:u++){if(!isPrintable(c=codePointAt(t,u)))return 5;y=y&&isPlainSafe(c,f,s),f=c}else{for(u=0;u=65536?u+=2:u++){if(10===(c=codePointAt(t,u)))l=!0,h&&(p=p||u-d-1>n&&" "!==t[d+1],d=u);else if(!isPrintable(c))return 5;y=y&&isPlainSafe(c,f,s),f=c}p=p||h&&u-d-1>n&&" "!==t[d+1]}return l||p?r>9&&needIndentIndicator(t)?5:a?2===i?5:2:p?4:3:!y||a||o(t)?2===i?5:2:1}function writeScalar(t,e,r,n,o){t.dump=function(){if(0===e.length)return 2===t.quotingType?'""':"''";if(!t.noCompatMode&&(-1!==Jt.indexOf(e)||Qt.test(e)))return 2===t.quotingType?'"'+e+'"':"'"+e+"'";var i=t.indent*Math.max(1,r),a=-1===t.lineWidth?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-i),s=n||t.flowLevel>-1&&r>=t.flowLevel;switch(chooseScalarStyle(e,s,t.indent,a,(function testAmbiguity(e){return function testImplicitResolving(t,e){var r,n;for(r=0,n=t.implicitTypes.length;r"+blockHeader(e,t.indent)+dropEndingNewline(indentString(function foldString(t,e){var r,n,o=/(\n+)([^\n]*)/g,i=(s=t.indexOf("\n"),s=-1!==s?s:t.length,o.lastIndex=s,foldLine(t.slice(0,s),e)),a="\n"===t[0]||" "===t[0];var s;for(;n=o.exec(t);){var u=n[1],c=n[2];r=" "===c[0],i+=u+(a||r||""===c?"":"\n")+foldLine(c,e),a=r}return i}(e,a),i));case 5:return'"'+function escapeString(t){for(var e,r="",n=0,o=0;o=65536?o+=2:o++)n=codePointAt(t,o),!(e=Zt[n])&&isPrintable(n)?(r+=t[o],n>=65536&&(r+=t[o+1])):r+=e||encodeHex(n);return r}(e)+'"';default:throw new nt("impossible error: invalid scalar style")}}()}function blockHeader(t,e){var r=needIndentIndicator(t)?String(e):"",n="\n"===t[t.length-1];return r+(n&&("\n"===t[t.length-2]||"\n"===t)?"+":n?"":"-")+"\n"}function dropEndingNewline(t){return"\n"===t[t.length-1]?t.slice(0,-1):t}function foldLine(t,e){if(""===t||" "===t[0])return t;for(var r,n,o=/ [^ ]/g,i=0,a=0,s=0,u="";r=o.exec(t);)(s=r.index)-i>e&&(n=a>i?a:s,u+="\n"+t.slice(i,n),i=n+1),a=s;return u+="\n",t.length-i>e&&a>i?u+=t.slice(i,a)+"\n"+t.slice(a+1):u+=t.slice(i),u.slice(1)}function writeBlockSequence(t,e,r,n){var o,i,a,s="",u=t.tag;for(o=0,i=r.length;o tag resolver accepts not "'+u+'" style');n=s.represent[u](e,u)}t.dump=n}return!0}return!1}function writeNode(t,e,r,n,o,i,a){t.tag=null,t.dump=r,detectType(t,r,!1)||detectType(t,r,!0);var s,u=Ht.call(t.dump),c=n;n&&(n=t.flowLevel<0||t.flowLevel>e);var f,l,p="[object Object]"===u||"[object Array]"===u;if(p&&(l=-1!==(f=t.duplicates.indexOf(r))),(null!==t.tag&&"?"!==t.tag||l||2!==t.indent&&e>0)&&(o=!1),l&&t.usedDuplicates[f])t.dump="*ref_"+f;else{if(p&&l&&!t.usedDuplicates[f]&&(t.usedDuplicates[f]=!0),"[object Object]"===u)n&&0!==Object.keys(t.dump).length?(!function writeBlockMapping(t,e,r,n){var o,i,a,s,u,c,f="",l=t.tag,p=Object.keys(r);if(!0===t.sortKeys)p.sort();else if("function"==typeof t.sortKeys)p.sort(t.sortKeys);else if(t.sortKeys)throw new nt("sortKeys must be a boolean or a function");for(o=0,i=p.length;o1024)&&(t.dump&&10===t.dump.charCodeAt(0)?c+="?":c+="? "),c+=t.dump,u&&(c+=generateNextLine(t,e)),writeNode(t,e+1,s,!0,u)&&(t.dump&&10===t.dump.charCodeAt(0)?c+=":":c+=": ",f+=c+=t.dump));t.tag=l,t.dump=f||"{}"}(t,e,t.dump,o),l&&(t.dump="&ref_"+f+t.dump)):(!function writeFlowMapping(t,e,r){var n,o,i,a,s,u="",c=t.tag,f=Object.keys(r);for(n=0,o=f.length;n1024&&(s+="? "),s+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),writeNode(t,e,a,!1,!1)&&(u+=s+=t.dump));t.tag=c,t.dump="{"+u+"}"}(t,e,t.dump),l&&(t.dump="&ref_"+f+" "+t.dump));else if("[object Array]"===u)n&&0!==t.dump.length?(t.noArrayIndent&&!a&&e>0?writeBlockSequence(t,e-1,t.dump,o):writeBlockSequence(t,e,t.dump,o),l&&(t.dump="&ref_"+f+t.dump)):(!function writeFlowSequence(t,e,r){var n,o,i,a="",s=t.tag;for(n=0,o=r.length;n",t.dump=s+" "+t.dump)}return!0}function getDuplicateReferences(t,e){var r,n,o=[],i=[];for(inspectNode(t,o,i),r=0,n=i.length;r()=>{},downloadConfig=t=>e=>{const{fn:{fetch:r}}=e;return r(t)},getConfigByUrl=(t,e)=>r=>{const{specActions:n,configsActions:o}=r;if(t)return o.downloadConfig(t).then(next,next);function next(o){o instanceof Error||o.status>=400?(n.updateLoadingStatus("failedConfig"),n.updateLoadingStatus("failedConfig"),n.updateUrl(""),console.error(o.statusText+" "+t.url),e(null)):e(((t,e)=>{try{return Xt.load(t)}catch(t){return e&&e.errActions.newThrownErr(new Error(t)),{}}})(o.text,r))}},get=(t,e)=>t.getIn(Array.isArray(e)?e:[e]),re={[te]:(t,e)=>t.merge((0,i.fromJS)(e.payload)),[ee]:(t,e)=>{const r=e.payload,n=t.get(r);return t.set(r,!n)}};var ne=__webpack_require__(7248),oe=__webpack_require__.n(ne),ie=__webpack_require__(7666),ae=__webpack_require__.n(ie);const se=console.error,withErrorBoundary=t=>e=>{const{getComponent:r,fn:o}=t(),i=r("ErrorBoundary"),a=o.getDisplayName(e);class WithErrorBoundary extends n.Component{render(){return n.createElement(i,{targetName:a,getComponent:r,fn:o},n.createElement(e,ae()({},this.props,this.context)))}}var s;return WithErrorBoundary.displayName=`WithErrorBoundary(${a})`,(s=e).prototype&&s.prototype.isReactComponent&&(WithErrorBoundary.prototype.mapStateToProps=e.prototype.mapStateToProps),WithErrorBoundary},fallback=({name:t})=>n.createElement("div",{className:"fallback"},"😱 ",n.createElement("i",null,"Could not render ","t"===t?"this component":t,", see the console."));class ErrorBoundary extends n.Component{static defaultProps={targetName:"this component",getComponent:()=>fallback,fn:{componentDidCatch:se},children:null};static getDerivedStateFromError(t){return{hasError:!0,error:t}}constructor(...t){super(...t),this.state={hasError:!1,error:null}}componentDidCatch(t,e){this.props.fn.componentDidCatch(t,e)}render(){const{getComponent:t,targetName:e,children:r}=this.props;if(this.state.hasError){const r=t("Fallback");return n.createElement(r,{name:e})}return r}}const ue=ErrorBoundary,ce=[top_bar,function configsPlugin(){return{statePlugins:{configs:{reducers:re,actions:t,selectors:e}}}},stadalone_layout,(({componentList:t=[],fullOverride:e=!1}={})=>({getSystem:r})=>{const n=e?t:["App","BaseLayout","VersionPragmaFilter","InfoContainer","ServersContainer","SchemesContainer","AuthorizeBtnContainer","FilterContainer","Operations","OperationContainer","parameters","responses","OperationServers","Models","ModelWrapper",...t],o=oe()(n,Array(n.length).fill(((t,{fn:e})=>e.withErrorBoundary(t))));return{fn:{componentDidCatch:se,withErrorBoundary:withErrorBoundary(r)},components:{ErrorBoundary:ue,Fallback:fallback},wrapComponents:o}})({fullOverride:!0,componentList:["Topbar","StandaloneLayout","onlineValidatorBadge"]})]})(),r=r.default})())); \ No newline at end of file diff --git a/openapi/swagger-ui/swagger-ui.css b/openapi/swagger-ui/swagger-ui.css index c288710a..d8dacd41 100644 --- a/openapi/swagger-ui/swagger-ui.css +++ b/openapi/swagger-ui/swagger-ui.css @@ -1,3 +1,3 @@ -.swagger-ui{color:#3b4151;font-family:sans-serif/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */}.swagger-ui html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}.swagger-ui body{margin:0}.swagger-ui article,.swagger-ui aside,.swagger-ui footer,.swagger-ui header,.swagger-ui nav,.swagger-ui section{display:block}.swagger-ui h1{font-size:2em;margin:.67em 0}.swagger-ui figcaption,.swagger-ui figure,.swagger-ui main{display:block}.swagger-ui figure{margin:1em 40px}.swagger-ui hr{box-sizing:content-box;height:0;overflow:visible}.swagger-ui pre{font-family:monospace,monospace;font-size:1em}.swagger-ui a{background-color:transparent;-webkit-text-decoration-skip:objects}.swagger-ui abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.swagger-ui b,.swagger-ui strong{font-weight:inherit;font-weight:bolder}.swagger-ui code,.swagger-ui kbd,.swagger-ui samp{font-family:monospace,monospace;font-size:1em}.swagger-ui dfn{font-style:italic}.swagger-ui mark{background-color:#ff0;color:#000}.swagger-ui small{font-size:80%}.swagger-ui sub,.swagger-ui sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.swagger-ui sub{bottom:-.25em}.swagger-ui sup{top:-.5em}.swagger-ui audio,.swagger-ui video{display:inline-block}.swagger-ui audio:not([controls]){display:none;height:0}.swagger-ui img{border-style:none}.swagger-ui svg:not(:root){overflow:hidden}.swagger-ui button,.swagger-ui input,.swagger-ui optgroup,.swagger-ui select,.swagger-ui textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}.swagger-ui button,.swagger-ui input{overflow:visible}.swagger-ui button,.swagger-ui select{text-transform:none}.swagger-ui [type=reset],.swagger-ui [type=submit],.swagger-ui button,.swagger-ui html [type=button]{-webkit-appearance:button}.swagger-ui [type=button]::-moz-focus-inner,.swagger-ui [type=reset]::-moz-focus-inner,.swagger-ui [type=submit]::-moz-focus-inner,.swagger-ui button::-moz-focus-inner{border-style:none;padding:0}.swagger-ui [type=button]:-moz-focusring,.swagger-ui [type=reset]:-moz-focusring,.swagger-ui [type=submit]:-moz-focusring,.swagger-ui button:-moz-focusring{outline:1px dotted ButtonText}.swagger-ui fieldset{padding:.35em .75em .625em}.swagger-ui legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}.swagger-ui progress{display:inline-block;vertical-align:baseline}.swagger-ui textarea{overflow:auto}.swagger-ui [type=checkbox],.swagger-ui [type=radio]{box-sizing:border-box;padding:0}.swagger-ui [type=number]::-webkit-inner-spin-button,.swagger-ui [type=number]::-webkit-outer-spin-button{height:auto}.swagger-ui [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.swagger-ui [type=search]::-webkit-search-cancel-button,.swagger-ui [type=search]::-webkit-search-decoration{-webkit-appearance:none}.swagger-ui ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.swagger-ui details,.swagger-ui menu{display:block}.swagger-ui summary{display:list-item}.swagger-ui canvas{display:inline-block}.swagger-ui [hidden],.swagger-ui template{display:none}.swagger-ui .debug *{outline:1px solid gold}.swagger-ui .debug-white *{outline:1px solid #fff}.swagger-ui .debug-black *{outline:1px solid #000}.swagger-ui .debug-grid{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) repeat 0 0}.swagger-ui .debug-grid-16{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) repeat 0 0}.swagger-ui .debug-grid-8-solid{background:#fff url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) repeat 0 0}.swagger-ui .debug-grid-16-solid{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) repeat 0 0}.swagger-ui .border-box,.swagger-ui a,.swagger-ui article,.swagger-ui body,.swagger-ui code,.swagger-ui dd,.swagger-ui div,.swagger-ui dl,.swagger-ui dt,.swagger-ui fieldset,.swagger-ui footer,.swagger-ui form,.swagger-ui h1,.swagger-ui h2,.swagger-ui h3,.swagger-ui h4,.swagger-ui h5,.swagger-ui h6,.swagger-ui header,.swagger-ui html,.swagger-ui input[type=email],.swagger-ui input[type=number],.swagger-ui input[type=password],.swagger-ui input[type=tel],.swagger-ui input[type=text],.swagger-ui input[type=url],.swagger-ui legend,.swagger-ui li,.swagger-ui main,.swagger-ui ol,.swagger-ui p,.swagger-ui pre,.swagger-ui section,.swagger-ui table,.swagger-ui td,.swagger-ui textarea,.swagger-ui th,.swagger-ui tr,.swagger-ui ul{box-sizing:border-box}.swagger-ui .aspect-ratio{height:0;position:relative}.swagger-ui .aspect-ratio--16x9{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1{padding-bottom:100%}.swagger-ui .aspect-ratio--object{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}@media screen and (min-width:30em){.swagger-ui .aspect-ratio-ns{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-ns{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-ns{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-ns{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-ns{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-ns{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-ns{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-ns{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-ns{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-ns{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-ns{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-ns{padding-bottom:100%}.swagger-ui .aspect-ratio--object-ns{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .aspect-ratio-m{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-m{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-m{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-m{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-m{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-m{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-m{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-m{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-m{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-m{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-m{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-m{padding-bottom:100%}.swagger-ui .aspect-ratio--object-m{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}@media screen and (min-width:60em){.swagger-ui .aspect-ratio-l{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-l{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-l{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-l{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-l{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-l{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-l{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-l{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-l{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-l{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-l{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-l{padding-bottom:100%}.swagger-ui .aspect-ratio--object-l{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}.swagger-ui img{max-width:100%}.swagger-ui .cover{background-size:cover!important}.swagger-ui .contain{background-size:contain!important}@media screen and (min-width:30em){.swagger-ui .cover-ns{background-size:cover!important}.swagger-ui .contain-ns{background-size:contain!important}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .cover-m{background-size:cover!important}.swagger-ui .contain-m{background-size:contain!important}}@media screen and (min-width:60em){.swagger-ui .cover-l{background-size:cover!important}.swagger-ui .contain-l{background-size:contain!important}}.swagger-ui .bg-center{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left{background-position:0;background-repeat:no-repeat}@media screen and (min-width:30em){.swagger-ui .bg-center-ns{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-ns{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-ns{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-ns{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-ns{background-position:0;background-repeat:no-repeat}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .bg-center-m{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-m{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-m{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-m{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-m{background-position:0;background-repeat:no-repeat}}@media screen and (min-width:60em){.swagger-ui .bg-center-l{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-l{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-l{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-l{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-l{background-position:0;background-repeat:no-repeat}}.swagger-ui .outline{outline:1px solid}.swagger-ui .outline-transparent{outline:1px solid transparent}.swagger-ui .outline-0{outline:0}@media screen and (min-width:30em){.swagger-ui .outline-ns{outline:1px solid}.swagger-ui .outline-transparent-ns{outline:1px solid transparent}.swagger-ui .outline-0-ns{outline:0}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .outline-m{outline:1px solid}.swagger-ui .outline-transparent-m{outline:1px solid transparent}.swagger-ui .outline-0-m{outline:0}}@media screen and (min-width:60em){.swagger-ui .outline-l{outline:1px solid}.swagger-ui .outline-transparent-l{outline:1px solid transparent}.swagger-ui .outline-0-l{outline:0}}.swagger-ui .ba{border-style:solid;border-width:1px}.swagger-ui .bt{border-top-style:solid;border-top-width:1px}.swagger-ui .br{border-right-style:solid;border-right-width:1px}.swagger-ui .bb{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl{border-left-style:solid;border-left-width:1px}.swagger-ui .bn{border-style:none;border-width:0}@media screen and (min-width:30em){.swagger-ui .ba-ns{border-style:solid;border-width:1px}.swagger-ui .bt-ns{border-top-style:solid;border-top-width:1px}.swagger-ui .br-ns{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-ns{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-ns{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-ns{border-style:none;border-width:0}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .ba-m{border-style:solid;border-width:1px}.swagger-ui .bt-m{border-top-style:solid;border-top-width:1px}.swagger-ui .br-m{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-m{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-m{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-m{border-style:none;border-width:0}}@media screen and (min-width:60em){.swagger-ui .ba-l{border-style:solid;border-width:1px}.swagger-ui .bt-l{border-top-style:solid;border-top-width:1px}.swagger-ui .br-l{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-l{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-l{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-l{border-style:none;border-width:0}}.swagger-ui .b--black{border-color:#000}.swagger-ui .b--near-black{border-color:#111}.swagger-ui .b--dark-gray{border-color:#333}.swagger-ui .b--mid-gray{border-color:#555}.swagger-ui .b--gray{border-color:#777}.swagger-ui .b--silver{border-color:#999}.swagger-ui .b--light-silver{border-color:#aaa}.swagger-ui .b--moon-gray{border-color:#ccc}.swagger-ui .b--light-gray{border-color:#eee}.swagger-ui .b--near-white{border-color:#f4f4f4}.swagger-ui .b--white{border-color:#fff}.swagger-ui .b--white-90{border-color:hsla(0,0%,100%,.9)}.swagger-ui .b--white-80{border-color:hsla(0,0%,100%,.8)}.swagger-ui .b--white-70{border-color:hsla(0,0%,100%,.7)}.swagger-ui .b--white-60{border-color:hsla(0,0%,100%,.6)}.swagger-ui .b--white-50{border-color:hsla(0,0%,100%,.5)}.swagger-ui .b--white-40{border-color:hsla(0,0%,100%,.4)}.swagger-ui .b--white-30{border-color:hsla(0,0%,100%,.3)}.swagger-ui .b--white-20{border-color:hsla(0,0%,100%,.2)}.swagger-ui .b--white-10{border-color:hsla(0,0%,100%,.1)}.swagger-ui .b--white-05{border-color:hsla(0,0%,100%,.05)}.swagger-ui .b--white-025{border-color:hsla(0,0%,100%,.025)}.swagger-ui .b--white-0125{border-color:hsla(0,0%,100%,.013)}.swagger-ui .b--black-90{border-color:rgba(0,0,0,.9)}.swagger-ui .b--black-80{border-color:rgba(0,0,0,.8)}.swagger-ui .b--black-70{border-color:rgba(0,0,0,.7)}.swagger-ui .b--black-60{border-color:rgba(0,0,0,.6)}.swagger-ui .b--black-50{border-color:rgba(0,0,0,.5)}.swagger-ui .b--black-40{border-color:rgba(0,0,0,.4)}.swagger-ui .b--black-30{border-color:rgba(0,0,0,.3)}.swagger-ui .b--black-20{border-color:rgba(0,0,0,.2)}.swagger-ui .b--black-10{border-color:rgba(0,0,0,.1)}.swagger-ui .b--black-05{border-color:rgba(0,0,0,.05)}.swagger-ui .b--black-025{border-color:rgba(0,0,0,.025)}.swagger-ui .b--black-0125{border-color:rgba(0,0,0,.013)}.swagger-ui .b--dark-red{border-color:#e7040f}.swagger-ui .b--red{border-color:#ff4136}.swagger-ui .b--light-red{border-color:#ff725c}.swagger-ui .b--orange{border-color:#ff6300}.swagger-ui .b--gold{border-color:#ffb700}.swagger-ui .b--yellow{border-color:gold}.swagger-ui .b--light-yellow{border-color:#fbf1a9}.swagger-ui .b--purple{border-color:#5e2ca5}.swagger-ui .b--light-purple{border-color:#a463f2}.swagger-ui .b--dark-pink{border-color:#d5008f}.swagger-ui .b--hot-pink{border-color:#ff41b4}.swagger-ui .b--pink{border-color:#ff80cc}.swagger-ui .b--light-pink{border-color:#ffa3d7}.swagger-ui .b--dark-green{border-color:#137752}.swagger-ui .b--green{border-color:#19a974}.swagger-ui .b--light-green{border-color:#9eebcf}.swagger-ui .b--navy{border-color:#001b44}.swagger-ui .b--dark-blue{border-color:#00449e}.swagger-ui .b--blue{border-color:#357edd}.swagger-ui .b--light-blue{border-color:#96ccff}.swagger-ui .b--lightest-blue{border-color:#cdecff}.swagger-ui .b--washed-blue{border-color:#f6fffe}.swagger-ui .b--washed-green{border-color:#e8fdf5}.swagger-ui .b--washed-yellow{border-color:#fffceb}.swagger-ui .b--washed-red{border-color:#ffdfdf}.swagger-ui .b--transparent{border-color:transparent}.swagger-ui .b--inherit{border-color:inherit}.swagger-ui .br0{border-radius:0}.swagger-ui .br1{border-radius:.125rem}.swagger-ui .br2{border-radius:.25rem}.swagger-ui .br3{border-radius:.5rem}.swagger-ui .br4{border-radius:1rem}.swagger-ui .br-100{border-radius:100%}.swagger-ui .br-pill{border-radius:9999px}.swagger-ui .br--bottom{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left{border-bottom-right-radius:0;border-top-right-radius:0}@media screen and (min-width:30em){.swagger-ui .br0-ns{border-radius:0}.swagger-ui .br1-ns{border-radius:.125rem}.swagger-ui .br2-ns{border-radius:.25rem}.swagger-ui .br3-ns{border-radius:.5rem}.swagger-ui .br4-ns{border-radius:1rem}.swagger-ui .br-100-ns{border-radius:100%}.swagger-ui .br-pill-ns{border-radius:9999px}.swagger-ui .br--bottom-ns{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-ns{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-ns{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-ns{border-bottom-right-radius:0;border-top-right-radius:0}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .br0-m{border-radius:0}.swagger-ui .br1-m{border-radius:.125rem}.swagger-ui .br2-m{border-radius:.25rem}.swagger-ui .br3-m{border-radius:.5rem}.swagger-ui .br4-m{border-radius:1rem}.swagger-ui .br-100-m{border-radius:100%}.swagger-ui .br-pill-m{border-radius:9999px}.swagger-ui .br--bottom-m{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-m{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-m{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-m{border-bottom-right-radius:0;border-top-right-radius:0}}@media screen and (min-width:60em){.swagger-ui .br0-l{border-radius:0}.swagger-ui .br1-l{border-radius:.125rem}.swagger-ui .br2-l{border-radius:.25rem}.swagger-ui .br3-l{border-radius:.5rem}.swagger-ui .br4-l{border-radius:1rem}.swagger-ui .br-100-l{border-radius:100%}.swagger-ui .br-pill-l{border-radius:9999px}.swagger-ui .br--bottom-l{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-l{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-l{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-l{border-bottom-right-radius:0;border-top-right-radius:0}}.swagger-ui .b--dotted{border-style:dotted}.swagger-ui .b--dashed{border-style:dashed}.swagger-ui .b--solid{border-style:solid}.swagger-ui .b--none{border-style:none}@media screen and (min-width:30em){.swagger-ui .b--dotted-ns{border-style:dotted}.swagger-ui .b--dashed-ns{border-style:dashed}.swagger-ui .b--solid-ns{border-style:solid}.swagger-ui .b--none-ns{border-style:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .b--dotted-m{border-style:dotted}.swagger-ui .b--dashed-m{border-style:dashed}.swagger-ui .b--solid-m{border-style:solid}.swagger-ui .b--none-m{border-style:none}}@media screen and (min-width:60em){.swagger-ui .b--dotted-l{border-style:dotted}.swagger-ui .b--dashed-l{border-style:dashed}.swagger-ui .b--solid-l{border-style:solid}.swagger-ui .b--none-l{border-style:none}}.swagger-ui .bw0{border-width:0}.swagger-ui .bw1{border-width:.125rem}.swagger-ui .bw2{border-width:.25rem}.swagger-ui .bw3{border-width:.5rem}.swagger-ui .bw4{border-width:1rem}.swagger-ui .bw5{border-width:2rem}.swagger-ui .bt-0{border-top-width:0}.swagger-ui .br-0{border-right-width:0}.swagger-ui .bb-0{border-bottom-width:0}.swagger-ui .bl-0{border-left-width:0}@media screen and (min-width:30em){.swagger-ui .bw0-ns{border-width:0}.swagger-ui .bw1-ns{border-width:.125rem}.swagger-ui .bw2-ns{border-width:.25rem}.swagger-ui .bw3-ns{border-width:.5rem}.swagger-ui .bw4-ns{border-width:1rem}.swagger-ui .bw5-ns{border-width:2rem}.swagger-ui .bt-0-ns{border-top-width:0}.swagger-ui .br-0-ns{border-right-width:0}.swagger-ui .bb-0-ns{border-bottom-width:0}.swagger-ui .bl-0-ns{border-left-width:0}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .bw0-m{border-width:0}.swagger-ui .bw1-m{border-width:.125rem}.swagger-ui .bw2-m{border-width:.25rem}.swagger-ui .bw3-m{border-width:.5rem}.swagger-ui .bw4-m{border-width:1rem}.swagger-ui .bw5-m{border-width:2rem}.swagger-ui .bt-0-m{border-top-width:0}.swagger-ui .br-0-m{border-right-width:0}.swagger-ui .bb-0-m{border-bottom-width:0}.swagger-ui .bl-0-m{border-left-width:0}}@media screen and (min-width:60em){.swagger-ui .bw0-l{border-width:0}.swagger-ui .bw1-l{border-width:.125rem}.swagger-ui .bw2-l{border-width:.25rem}.swagger-ui .bw3-l{border-width:.5rem}.swagger-ui .bw4-l{border-width:1rem}.swagger-ui .bw5-l{border-width:2rem}.swagger-ui .bt-0-l{border-top-width:0}.swagger-ui .br-0-l{border-right-width:0}.swagger-ui .bb-0-l{border-bottom-width:0}.swagger-ui .bl-0-l{border-left-width:0}}.swagger-ui .shadow-1{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}@media screen and (min-width:30em){.swagger-ui .shadow-1-ns{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-ns{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-ns{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-ns{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-ns{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .shadow-1-m{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-m{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-m{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-m{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-m{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:60em){.swagger-ui .shadow-1-l{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-l{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-l{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-l{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-l{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}.swagger-ui .pre{overflow-x:auto;overflow-y:hidden;overflow:scroll}.swagger-ui .top-0{top:0}.swagger-ui .right-0{right:0}.swagger-ui .bottom-0{bottom:0}.swagger-ui .left-0{left:0}.swagger-ui .top-1{top:1rem}.swagger-ui .right-1{right:1rem}.swagger-ui .bottom-1{bottom:1rem}.swagger-ui .left-1{left:1rem}.swagger-ui .top-2{top:2rem}.swagger-ui .right-2{right:2rem}.swagger-ui .bottom-2{bottom:2rem}.swagger-ui .left-2{left:2rem}.swagger-ui .top--1{top:-1rem}.swagger-ui .right--1{right:-1rem}.swagger-ui .bottom--1{bottom:-1rem}.swagger-ui .left--1{left:-1rem}.swagger-ui .top--2{top:-2rem}.swagger-ui .right--2{right:-2rem}.swagger-ui .bottom--2{bottom:-2rem}.swagger-ui .left--2{left:-2rem}.swagger-ui .absolute--fill{bottom:0;left:0;right:0;top:0}@media screen and (min-width:30em){.swagger-ui .top-0-ns{top:0}.swagger-ui .left-0-ns{left:0}.swagger-ui .right-0-ns{right:0}.swagger-ui .bottom-0-ns{bottom:0}.swagger-ui .top-1-ns{top:1rem}.swagger-ui .left-1-ns{left:1rem}.swagger-ui .right-1-ns{right:1rem}.swagger-ui .bottom-1-ns{bottom:1rem}.swagger-ui .top-2-ns{top:2rem}.swagger-ui .left-2-ns{left:2rem}.swagger-ui .right-2-ns{right:2rem}.swagger-ui .bottom-2-ns{bottom:2rem}.swagger-ui .top--1-ns{top:-1rem}.swagger-ui .right--1-ns{right:-1rem}.swagger-ui .bottom--1-ns{bottom:-1rem}.swagger-ui .left--1-ns{left:-1rem}.swagger-ui .top--2-ns{top:-2rem}.swagger-ui .right--2-ns{right:-2rem}.swagger-ui .bottom--2-ns{bottom:-2rem}.swagger-ui .left--2-ns{left:-2rem}.swagger-ui .absolute--fill-ns{bottom:0;left:0;right:0;top:0}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .top-0-m{top:0}.swagger-ui .left-0-m{left:0}.swagger-ui .right-0-m{right:0}.swagger-ui .bottom-0-m{bottom:0}.swagger-ui .top-1-m{top:1rem}.swagger-ui .left-1-m{left:1rem}.swagger-ui .right-1-m{right:1rem}.swagger-ui .bottom-1-m{bottom:1rem}.swagger-ui .top-2-m{top:2rem}.swagger-ui .left-2-m{left:2rem}.swagger-ui .right-2-m{right:2rem}.swagger-ui .bottom-2-m{bottom:2rem}.swagger-ui .top--1-m{top:-1rem}.swagger-ui .right--1-m{right:-1rem}.swagger-ui .bottom--1-m{bottom:-1rem}.swagger-ui .left--1-m{left:-1rem}.swagger-ui .top--2-m{top:-2rem}.swagger-ui .right--2-m{right:-2rem}.swagger-ui .bottom--2-m{bottom:-2rem}.swagger-ui .left--2-m{left:-2rem}.swagger-ui .absolute--fill-m{bottom:0;left:0;right:0;top:0}}@media screen and (min-width:60em){.swagger-ui .top-0-l{top:0}.swagger-ui .left-0-l{left:0}.swagger-ui .right-0-l{right:0}.swagger-ui .bottom-0-l{bottom:0}.swagger-ui .top-1-l{top:1rem}.swagger-ui .left-1-l{left:1rem}.swagger-ui .right-1-l{right:1rem}.swagger-ui .bottom-1-l{bottom:1rem}.swagger-ui .top-2-l{top:2rem}.swagger-ui .left-2-l{left:2rem}.swagger-ui .right-2-l{right:2rem}.swagger-ui .bottom-2-l{bottom:2rem}.swagger-ui .top--1-l{top:-1rem}.swagger-ui .right--1-l{right:-1rem}.swagger-ui .bottom--1-l{bottom:-1rem}.swagger-ui .left--1-l{left:-1rem}.swagger-ui .top--2-l{top:-2rem}.swagger-ui .right--2-l{right:-2rem}.swagger-ui .bottom--2-l{bottom:-2rem}.swagger-ui .left--2-l{left:-2rem}.swagger-ui .absolute--fill-l{bottom:0;left:0;right:0;top:0}}.swagger-ui .cf:after,.swagger-ui .cf:before{content:" ";display:table}.swagger-ui .cf:after{clear:both}.swagger-ui .cf{zoom:1}.swagger-ui .cl{clear:left}.swagger-ui .cr{clear:right}.swagger-ui .cb{clear:both}.swagger-ui .cn{clear:none}@media screen and (min-width:30em){.swagger-ui .cl-ns{clear:left}.swagger-ui .cr-ns{clear:right}.swagger-ui .cb-ns{clear:both}.swagger-ui .cn-ns{clear:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .cl-m{clear:left}.swagger-ui .cr-m{clear:right}.swagger-ui .cb-m{clear:both}.swagger-ui .cn-m{clear:none}}@media screen and (min-width:60em){.swagger-ui .cl-l{clear:left}.swagger-ui .cr-l{clear:right}.swagger-ui .cb-l{clear:both}.swagger-ui .cn-l{clear:none}}.swagger-ui .flex{display:flex}.swagger-ui .inline-flex{display:inline-flex}.swagger-ui .flex-auto{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none{flex:none}.swagger-ui .flex-column{flex-direction:column}.swagger-ui .flex-row{flex-direction:row}.swagger-ui .flex-wrap{flex-wrap:wrap}.swagger-ui .flex-nowrap{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse{flex-direction:column-reverse}.swagger-ui .flex-row-reverse{flex-direction:row-reverse}.swagger-ui .items-start{align-items:flex-start}.swagger-ui .items-end{align-items:flex-end}.swagger-ui .items-center{align-items:center}.swagger-ui .items-baseline{align-items:baseline}.swagger-ui .items-stretch{align-items:stretch}.swagger-ui .self-start{align-self:flex-start}.swagger-ui .self-end{align-self:flex-end}.swagger-ui .self-center{align-self:center}.swagger-ui .self-baseline{align-self:baseline}.swagger-ui .self-stretch{align-self:stretch}.swagger-ui .justify-start{justify-content:flex-start}.swagger-ui .justify-end{justify-content:flex-end}.swagger-ui .justify-center{justify-content:center}.swagger-ui .justify-between{justify-content:space-between}.swagger-ui .justify-around{justify-content:space-around}.swagger-ui .content-start{align-content:flex-start}.swagger-ui .content-end{align-content:flex-end}.swagger-ui .content-center{align-content:center}.swagger-ui .content-between{align-content:space-between}.swagger-ui .content-around{align-content:space-around}.swagger-ui .content-stretch{align-content:stretch}.swagger-ui .order-0{order:0}.swagger-ui .order-1{order:1}.swagger-ui .order-2{order:2}.swagger-ui .order-3{order:3}.swagger-ui .order-4{order:4}.swagger-ui .order-5{order:5}.swagger-ui .order-6{order:6}.swagger-ui .order-7{order:7}.swagger-ui .order-8{order:8}.swagger-ui .order-last{order:99999}.swagger-ui .flex-grow-0{flex-grow:0}.swagger-ui .flex-grow-1{flex-grow:1}.swagger-ui .flex-shrink-0{flex-shrink:0}.swagger-ui .flex-shrink-1{flex-shrink:1}@media screen and (min-width:30em){.swagger-ui .flex-ns{display:flex}.swagger-ui .inline-flex-ns{display:inline-flex}.swagger-ui .flex-auto-ns{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-ns{flex:none}.swagger-ui .flex-column-ns{flex-direction:column}.swagger-ui .flex-row-ns{flex-direction:row}.swagger-ui .flex-wrap-ns{flex-wrap:wrap}.swagger-ui .flex-nowrap-ns{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-ns{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-ns{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-ns{flex-direction:row-reverse}.swagger-ui .items-start-ns{align-items:flex-start}.swagger-ui .items-end-ns{align-items:flex-end}.swagger-ui .items-center-ns{align-items:center}.swagger-ui .items-baseline-ns{align-items:baseline}.swagger-ui .items-stretch-ns{align-items:stretch}.swagger-ui .self-start-ns{align-self:flex-start}.swagger-ui .self-end-ns{align-self:flex-end}.swagger-ui .self-center-ns{align-self:center}.swagger-ui .self-baseline-ns{align-self:baseline}.swagger-ui .self-stretch-ns{align-self:stretch}.swagger-ui .justify-start-ns{justify-content:flex-start}.swagger-ui .justify-end-ns{justify-content:flex-end}.swagger-ui .justify-center-ns{justify-content:center}.swagger-ui .justify-between-ns{justify-content:space-between}.swagger-ui .justify-around-ns{justify-content:space-around}.swagger-ui .content-start-ns{align-content:flex-start}.swagger-ui .content-end-ns{align-content:flex-end}.swagger-ui .content-center-ns{align-content:center}.swagger-ui .content-between-ns{align-content:space-between}.swagger-ui .content-around-ns{align-content:space-around}.swagger-ui .content-stretch-ns{align-content:stretch}.swagger-ui .order-0-ns{order:0}.swagger-ui .order-1-ns{order:1}.swagger-ui .order-2-ns{order:2}.swagger-ui .order-3-ns{order:3}.swagger-ui .order-4-ns{order:4}.swagger-ui .order-5-ns{order:5}.swagger-ui .order-6-ns{order:6}.swagger-ui .order-7-ns{order:7}.swagger-ui .order-8-ns{order:8}.swagger-ui .order-last-ns{order:99999}.swagger-ui .flex-grow-0-ns{flex-grow:0}.swagger-ui .flex-grow-1-ns{flex-grow:1}.swagger-ui .flex-shrink-0-ns{flex-shrink:0}.swagger-ui .flex-shrink-1-ns{flex-shrink:1}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .flex-m{display:flex}.swagger-ui .inline-flex-m{display:inline-flex}.swagger-ui .flex-auto-m{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-m{flex:none}.swagger-ui .flex-column-m{flex-direction:column}.swagger-ui .flex-row-m{flex-direction:row}.swagger-ui .flex-wrap-m{flex-wrap:wrap}.swagger-ui .flex-nowrap-m{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-m{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-m{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-m{flex-direction:row-reverse}.swagger-ui .items-start-m{align-items:flex-start}.swagger-ui .items-end-m{align-items:flex-end}.swagger-ui .items-center-m{align-items:center}.swagger-ui .items-baseline-m{align-items:baseline}.swagger-ui .items-stretch-m{align-items:stretch}.swagger-ui .self-start-m{align-self:flex-start}.swagger-ui .self-end-m{align-self:flex-end}.swagger-ui .self-center-m{align-self:center}.swagger-ui .self-baseline-m{align-self:baseline}.swagger-ui .self-stretch-m{align-self:stretch}.swagger-ui .justify-start-m{justify-content:flex-start}.swagger-ui .justify-end-m{justify-content:flex-end}.swagger-ui .justify-center-m{justify-content:center}.swagger-ui .justify-between-m{justify-content:space-between}.swagger-ui .justify-around-m{justify-content:space-around}.swagger-ui .content-start-m{align-content:flex-start}.swagger-ui .content-end-m{align-content:flex-end}.swagger-ui .content-center-m{align-content:center}.swagger-ui .content-between-m{align-content:space-between}.swagger-ui .content-around-m{align-content:space-around}.swagger-ui .content-stretch-m{align-content:stretch}.swagger-ui .order-0-m{order:0}.swagger-ui .order-1-m{order:1}.swagger-ui .order-2-m{order:2}.swagger-ui .order-3-m{order:3}.swagger-ui .order-4-m{order:4}.swagger-ui .order-5-m{order:5}.swagger-ui .order-6-m{order:6}.swagger-ui .order-7-m{order:7}.swagger-ui .order-8-m{order:8}.swagger-ui .order-last-m{order:99999}.swagger-ui .flex-grow-0-m{flex-grow:0}.swagger-ui .flex-grow-1-m{flex-grow:1}.swagger-ui .flex-shrink-0-m{flex-shrink:0}.swagger-ui .flex-shrink-1-m{flex-shrink:1}}@media screen and (min-width:60em){.swagger-ui .flex-l{display:flex}.swagger-ui .inline-flex-l{display:inline-flex}.swagger-ui .flex-auto-l{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-l{flex:none}.swagger-ui .flex-column-l{flex-direction:column}.swagger-ui .flex-row-l{flex-direction:row}.swagger-ui .flex-wrap-l{flex-wrap:wrap}.swagger-ui .flex-nowrap-l{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-l{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-l{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-l{flex-direction:row-reverse}.swagger-ui .items-start-l{align-items:flex-start}.swagger-ui .items-end-l{align-items:flex-end}.swagger-ui .items-center-l{align-items:center}.swagger-ui .items-baseline-l{align-items:baseline}.swagger-ui .items-stretch-l{align-items:stretch}.swagger-ui .self-start-l{align-self:flex-start}.swagger-ui .self-end-l{align-self:flex-end}.swagger-ui .self-center-l{align-self:center}.swagger-ui .self-baseline-l{align-self:baseline}.swagger-ui .self-stretch-l{align-self:stretch}.swagger-ui .justify-start-l{justify-content:flex-start}.swagger-ui .justify-end-l{justify-content:flex-end}.swagger-ui .justify-center-l{justify-content:center}.swagger-ui .justify-between-l{justify-content:space-between}.swagger-ui .justify-around-l{justify-content:space-around}.swagger-ui .content-start-l{align-content:flex-start}.swagger-ui .content-end-l{align-content:flex-end}.swagger-ui .content-center-l{align-content:center}.swagger-ui .content-between-l{align-content:space-between}.swagger-ui .content-around-l{align-content:space-around}.swagger-ui .content-stretch-l{align-content:stretch}.swagger-ui .order-0-l{order:0}.swagger-ui .order-1-l{order:1}.swagger-ui .order-2-l{order:2}.swagger-ui .order-3-l{order:3}.swagger-ui .order-4-l{order:4}.swagger-ui .order-5-l{order:5}.swagger-ui .order-6-l{order:6}.swagger-ui .order-7-l{order:7}.swagger-ui .order-8-l{order:8}.swagger-ui .order-last-l{order:99999}.swagger-ui .flex-grow-0-l{flex-grow:0}.swagger-ui .flex-grow-1-l{flex-grow:1}.swagger-ui .flex-shrink-0-l{flex-shrink:0}.swagger-ui .flex-shrink-1-l{flex-shrink:1}}.swagger-ui .dn{display:none}.swagger-ui .di{display:inline}.swagger-ui .db{display:block}.swagger-ui .dib{display:inline-block}.swagger-ui .dit{display:inline-table}.swagger-ui .dt{display:table}.swagger-ui .dtc{display:table-cell}.swagger-ui .dt-row{display:table-row}.swagger-ui .dt-row-group{display:table-row-group}.swagger-ui .dt-column{display:table-column}.swagger-ui .dt-column-group{display:table-column-group}.swagger-ui .dt--fixed{table-layout:fixed;width:100%}@media screen and (min-width:30em){.swagger-ui .dn-ns{display:none}.swagger-ui .di-ns{display:inline}.swagger-ui .db-ns{display:block}.swagger-ui .dib-ns{display:inline-block}.swagger-ui .dit-ns{display:inline-table}.swagger-ui .dt-ns{display:table}.swagger-ui .dtc-ns{display:table-cell}.swagger-ui .dt-row-ns{display:table-row}.swagger-ui .dt-row-group-ns{display:table-row-group}.swagger-ui .dt-column-ns{display:table-column}.swagger-ui .dt-column-group-ns{display:table-column-group}.swagger-ui .dt--fixed-ns{table-layout:fixed;width:100%}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .dn-m{display:none}.swagger-ui .di-m{display:inline}.swagger-ui .db-m{display:block}.swagger-ui .dib-m{display:inline-block}.swagger-ui .dit-m{display:inline-table}.swagger-ui .dt-m{display:table}.swagger-ui .dtc-m{display:table-cell}.swagger-ui .dt-row-m{display:table-row}.swagger-ui .dt-row-group-m{display:table-row-group}.swagger-ui .dt-column-m{display:table-column}.swagger-ui .dt-column-group-m{display:table-column-group}.swagger-ui .dt--fixed-m{table-layout:fixed;width:100%}}@media screen and (min-width:60em){.swagger-ui .dn-l{display:none}.swagger-ui .di-l{display:inline}.swagger-ui .db-l{display:block}.swagger-ui .dib-l{display:inline-block}.swagger-ui .dit-l{display:inline-table}.swagger-ui .dt-l{display:table}.swagger-ui .dtc-l{display:table-cell}.swagger-ui .dt-row-l{display:table-row}.swagger-ui .dt-row-group-l{display:table-row-group}.swagger-ui .dt-column-l{display:table-column}.swagger-ui .dt-column-group-l{display:table-column-group}.swagger-ui .dt--fixed-l{table-layout:fixed;width:100%}}.swagger-ui .fl{_display:inline;float:left}.swagger-ui .fr{_display:inline;float:right}.swagger-ui .fn{float:none}@media screen and (min-width:30em){.swagger-ui .fl-ns{_display:inline;float:left}.swagger-ui .fr-ns{_display:inline;float:right}.swagger-ui .fn-ns{float:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .fl-m{_display:inline;float:left}.swagger-ui .fr-m{_display:inline;float:right}.swagger-ui .fn-m{float:none}}@media screen and (min-width:60em){.swagger-ui .fl-l{_display:inline;float:left}.swagger-ui .fr-l{_display:inline;float:right}.swagger-ui .fn-l{float:none}}.swagger-ui .sans-serif{font-family:-apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica,helvetica neue,ubuntu,roboto,noto,segoe ui,arial,sans-serif}.swagger-ui .serif{font-family:georgia,serif}.swagger-ui .system-sans-serif{font-family:sans-serif}.swagger-ui .system-serif{font-family:serif}.swagger-ui .code,.swagger-ui code{font-family:Consolas,monaco,monospace}.swagger-ui .courier{font-family:Courier Next,courier,monospace}.swagger-ui .helvetica{font-family:helvetica neue,helvetica,sans-serif}.swagger-ui .avenir{font-family:avenir next,avenir,sans-serif}.swagger-ui .athelas{font-family:athelas,georgia,serif}.swagger-ui .georgia{font-family:georgia,serif}.swagger-ui .times{font-family:times,serif}.swagger-ui .bodoni{font-family:Bodoni MT,serif}.swagger-ui .calisto{font-family:Calisto MT,serif}.swagger-ui .garamond{font-family:garamond,serif}.swagger-ui .baskerville{font-family:baskerville,serif}.swagger-ui .i{font-style:italic}.swagger-ui .fs-normal{font-style:normal}@media screen and (min-width:30em){.swagger-ui .i-ns{font-style:italic}.swagger-ui .fs-normal-ns{font-style:normal}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .i-m{font-style:italic}.swagger-ui .fs-normal-m{font-style:normal}}@media screen and (min-width:60em){.swagger-ui .i-l{font-style:italic}.swagger-ui .fs-normal-l{font-style:normal}}.swagger-ui .normal{font-weight:400}.swagger-ui .b{font-weight:700}.swagger-ui .fw1{font-weight:100}.swagger-ui .fw2{font-weight:200}.swagger-ui .fw3{font-weight:300}.swagger-ui .fw4{font-weight:400}.swagger-ui .fw5{font-weight:500}.swagger-ui .fw6{font-weight:600}.swagger-ui .fw7{font-weight:700}.swagger-ui .fw8{font-weight:800}.swagger-ui .fw9{font-weight:900}@media screen and (min-width:30em){.swagger-ui .normal-ns{font-weight:400}.swagger-ui .b-ns{font-weight:700}.swagger-ui .fw1-ns{font-weight:100}.swagger-ui .fw2-ns{font-weight:200}.swagger-ui .fw3-ns{font-weight:300}.swagger-ui .fw4-ns{font-weight:400}.swagger-ui .fw5-ns{font-weight:500}.swagger-ui .fw6-ns{font-weight:600}.swagger-ui .fw7-ns{font-weight:700}.swagger-ui .fw8-ns{font-weight:800}.swagger-ui .fw9-ns{font-weight:900}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .normal-m{font-weight:400}.swagger-ui .b-m{font-weight:700}.swagger-ui .fw1-m{font-weight:100}.swagger-ui .fw2-m{font-weight:200}.swagger-ui .fw3-m{font-weight:300}.swagger-ui .fw4-m{font-weight:400}.swagger-ui .fw5-m{font-weight:500}.swagger-ui .fw6-m{font-weight:600}.swagger-ui .fw7-m{font-weight:700}.swagger-ui .fw8-m{font-weight:800}.swagger-ui .fw9-m{font-weight:900}}@media screen and (min-width:60em){.swagger-ui .normal-l{font-weight:400}.swagger-ui .b-l{font-weight:700}.swagger-ui .fw1-l{font-weight:100}.swagger-ui .fw2-l{font-weight:200}.swagger-ui .fw3-l{font-weight:300}.swagger-ui .fw4-l{font-weight:400}.swagger-ui .fw5-l{font-weight:500}.swagger-ui .fw6-l{font-weight:600}.swagger-ui .fw7-l{font-weight:700}.swagger-ui .fw8-l{font-weight:800}.swagger-ui .fw9-l{font-weight:900}}.swagger-ui .input-reset{-webkit-appearance:none;-moz-appearance:none}.swagger-ui .button-reset::-moz-focus-inner,.swagger-ui .input-reset::-moz-focus-inner{border:0;padding:0}.swagger-ui .h1{height:1rem}.swagger-ui .h2{height:2rem}.swagger-ui .h3{height:4rem}.swagger-ui .h4{height:8rem}.swagger-ui .h5{height:16rem}.swagger-ui .h-25{height:25%}.swagger-ui .h-50{height:50%}.swagger-ui .h-75{height:75%}.swagger-ui .h-100{height:100%}.swagger-ui .min-h-100{min-height:100%}.swagger-ui .vh-25{height:25vh}.swagger-ui .vh-50{height:50vh}.swagger-ui .vh-75{height:75vh}.swagger-ui .vh-100{height:100vh}.swagger-ui .min-vh-100{min-height:100vh}.swagger-ui .h-auto{height:auto}.swagger-ui .h-inherit{height:inherit}@media screen and (min-width:30em){.swagger-ui .h1-ns{height:1rem}.swagger-ui .h2-ns{height:2rem}.swagger-ui .h3-ns{height:4rem}.swagger-ui .h4-ns{height:8rem}.swagger-ui .h5-ns{height:16rem}.swagger-ui .h-25-ns{height:25%}.swagger-ui .h-50-ns{height:50%}.swagger-ui .h-75-ns{height:75%}.swagger-ui .h-100-ns{height:100%}.swagger-ui .min-h-100-ns{min-height:100%}.swagger-ui .vh-25-ns{height:25vh}.swagger-ui .vh-50-ns{height:50vh}.swagger-ui .vh-75-ns{height:75vh}.swagger-ui .vh-100-ns{height:100vh}.swagger-ui .min-vh-100-ns{min-height:100vh}.swagger-ui .h-auto-ns{height:auto}.swagger-ui .h-inherit-ns{height:inherit}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .h1-m{height:1rem}.swagger-ui .h2-m{height:2rem}.swagger-ui .h3-m{height:4rem}.swagger-ui .h4-m{height:8rem}.swagger-ui .h5-m{height:16rem}.swagger-ui .h-25-m{height:25%}.swagger-ui .h-50-m{height:50%}.swagger-ui .h-75-m{height:75%}.swagger-ui .h-100-m{height:100%}.swagger-ui .min-h-100-m{min-height:100%}.swagger-ui .vh-25-m{height:25vh}.swagger-ui .vh-50-m{height:50vh}.swagger-ui .vh-75-m{height:75vh}.swagger-ui .vh-100-m{height:100vh}.swagger-ui .min-vh-100-m{min-height:100vh}.swagger-ui .h-auto-m{height:auto}.swagger-ui .h-inherit-m{height:inherit}}@media screen and (min-width:60em){.swagger-ui .h1-l{height:1rem}.swagger-ui .h2-l{height:2rem}.swagger-ui .h3-l{height:4rem}.swagger-ui .h4-l{height:8rem}.swagger-ui .h5-l{height:16rem}.swagger-ui .h-25-l{height:25%}.swagger-ui .h-50-l{height:50%}.swagger-ui .h-75-l{height:75%}.swagger-ui .h-100-l{height:100%}.swagger-ui .min-h-100-l{min-height:100%}.swagger-ui .vh-25-l{height:25vh}.swagger-ui .vh-50-l{height:50vh}.swagger-ui .vh-75-l{height:75vh}.swagger-ui .vh-100-l{height:100vh}.swagger-ui .min-vh-100-l{min-height:100vh}.swagger-ui .h-auto-l{height:auto}.swagger-ui .h-inherit-l{height:inherit}}.swagger-ui .tracked{letter-spacing:.1em}.swagger-ui .tracked-tight{letter-spacing:-.05em}.swagger-ui .tracked-mega{letter-spacing:.25em}@media screen and (min-width:30em){.swagger-ui .tracked-ns{letter-spacing:.1em}.swagger-ui .tracked-tight-ns{letter-spacing:-.05em}.swagger-ui .tracked-mega-ns{letter-spacing:.25em}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .tracked-m{letter-spacing:.1em}.swagger-ui .tracked-tight-m{letter-spacing:-.05em}.swagger-ui .tracked-mega-m{letter-spacing:.25em}}@media screen and (min-width:60em){.swagger-ui .tracked-l{letter-spacing:.1em}.swagger-ui .tracked-tight-l{letter-spacing:-.05em}.swagger-ui .tracked-mega-l{letter-spacing:.25em}}.swagger-ui .lh-solid{line-height:1}.swagger-ui .lh-title{line-height:1.25}.swagger-ui .lh-copy{line-height:1.5}@media screen and (min-width:30em){.swagger-ui .lh-solid-ns{line-height:1}.swagger-ui .lh-title-ns{line-height:1.25}.swagger-ui .lh-copy-ns{line-height:1.5}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .lh-solid-m{line-height:1}.swagger-ui .lh-title-m{line-height:1.25}.swagger-ui .lh-copy-m{line-height:1.5}}@media screen and (min-width:60em){.swagger-ui .lh-solid-l{line-height:1}.swagger-ui .lh-title-l{line-height:1.25}.swagger-ui .lh-copy-l{line-height:1.5}}.swagger-ui .link{-webkit-text-decoration:none;text-decoration:none}.swagger-ui .link,.swagger-ui .link:active,.swagger-ui .link:focus,.swagger-ui .link:hover,.swagger-ui .link:link,.swagger-ui .link:visited{transition:color .15s ease-in}.swagger-ui .link:focus{outline:1px dotted currentColor}.swagger-ui .list{list-style-type:none}.swagger-ui .mw-100{max-width:100%}.swagger-ui .mw1{max-width:1rem}.swagger-ui .mw2{max-width:2rem}.swagger-ui .mw3{max-width:4rem}.swagger-ui .mw4{max-width:8rem}.swagger-ui .mw5{max-width:16rem}.swagger-ui .mw6{max-width:32rem}.swagger-ui .mw7{max-width:48rem}.swagger-ui .mw8{max-width:64rem}.swagger-ui .mw9{max-width:96rem}.swagger-ui .mw-none{max-width:none}@media screen and (min-width:30em){.swagger-ui .mw-100-ns{max-width:100%}.swagger-ui .mw1-ns{max-width:1rem}.swagger-ui .mw2-ns{max-width:2rem}.swagger-ui .mw3-ns{max-width:4rem}.swagger-ui .mw4-ns{max-width:8rem}.swagger-ui .mw5-ns{max-width:16rem}.swagger-ui .mw6-ns{max-width:32rem}.swagger-ui .mw7-ns{max-width:48rem}.swagger-ui .mw8-ns{max-width:64rem}.swagger-ui .mw9-ns{max-width:96rem}.swagger-ui .mw-none-ns{max-width:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .mw-100-m{max-width:100%}.swagger-ui .mw1-m{max-width:1rem}.swagger-ui .mw2-m{max-width:2rem}.swagger-ui .mw3-m{max-width:4rem}.swagger-ui .mw4-m{max-width:8rem}.swagger-ui .mw5-m{max-width:16rem}.swagger-ui .mw6-m{max-width:32rem}.swagger-ui .mw7-m{max-width:48rem}.swagger-ui .mw8-m{max-width:64rem}.swagger-ui .mw9-m{max-width:96rem}.swagger-ui .mw-none-m{max-width:none}}@media screen and (min-width:60em){.swagger-ui .mw-100-l{max-width:100%}.swagger-ui .mw1-l{max-width:1rem}.swagger-ui .mw2-l{max-width:2rem}.swagger-ui .mw3-l{max-width:4rem}.swagger-ui .mw4-l{max-width:8rem}.swagger-ui .mw5-l{max-width:16rem}.swagger-ui .mw6-l{max-width:32rem}.swagger-ui .mw7-l{max-width:48rem}.swagger-ui .mw8-l{max-width:64rem}.swagger-ui .mw9-l{max-width:96rem}.swagger-ui .mw-none-l{max-width:none}}.swagger-ui .w1{width:1rem}.swagger-ui .w2{width:2rem}.swagger-ui .w3{width:4rem}.swagger-ui .w4{width:8rem}.swagger-ui .w5{width:16rem}.swagger-ui .w-10{width:10%}.swagger-ui .w-20{width:20%}.swagger-ui .w-25{width:25%}.swagger-ui .w-30{width:30%}.swagger-ui .w-33{width:33%}.swagger-ui .w-34{width:34%}.swagger-ui .w-40{width:40%}.swagger-ui .w-50{width:50%}.swagger-ui .w-60{width:60%}.swagger-ui .w-70{width:70%}.swagger-ui .w-75{width:75%}.swagger-ui .w-80{width:80%}.swagger-ui .w-90{width:90%}.swagger-ui .w-100{width:100%}.swagger-ui .w-third{width:33.3333333333%}.swagger-ui .w-two-thirds{width:66.6666666667%}.swagger-ui .w-auto{width:auto}@media screen and (min-width:30em){.swagger-ui .w1-ns{width:1rem}.swagger-ui .w2-ns{width:2rem}.swagger-ui .w3-ns{width:4rem}.swagger-ui .w4-ns{width:8rem}.swagger-ui .w5-ns{width:16rem}.swagger-ui .w-10-ns{width:10%}.swagger-ui .w-20-ns{width:20%}.swagger-ui .w-25-ns{width:25%}.swagger-ui .w-30-ns{width:30%}.swagger-ui .w-33-ns{width:33%}.swagger-ui .w-34-ns{width:34%}.swagger-ui .w-40-ns{width:40%}.swagger-ui .w-50-ns{width:50%}.swagger-ui .w-60-ns{width:60%}.swagger-ui .w-70-ns{width:70%}.swagger-ui .w-75-ns{width:75%}.swagger-ui .w-80-ns{width:80%}.swagger-ui .w-90-ns{width:90%}.swagger-ui .w-100-ns{width:100%}.swagger-ui .w-third-ns{width:33.3333333333%}.swagger-ui .w-two-thirds-ns{width:66.6666666667%}.swagger-ui .w-auto-ns{width:auto}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .w1-m{width:1rem}.swagger-ui .w2-m{width:2rem}.swagger-ui .w3-m{width:4rem}.swagger-ui .w4-m{width:8rem}.swagger-ui .w5-m{width:16rem}.swagger-ui .w-10-m{width:10%}.swagger-ui .w-20-m{width:20%}.swagger-ui .w-25-m{width:25%}.swagger-ui .w-30-m{width:30%}.swagger-ui .w-33-m{width:33%}.swagger-ui .w-34-m{width:34%}.swagger-ui .w-40-m{width:40%}.swagger-ui .w-50-m{width:50%}.swagger-ui .w-60-m{width:60%}.swagger-ui .w-70-m{width:70%}.swagger-ui .w-75-m{width:75%}.swagger-ui .w-80-m{width:80%}.swagger-ui .w-90-m{width:90%}.swagger-ui .w-100-m{width:100%}.swagger-ui .w-third-m{width:33.3333333333%}.swagger-ui .w-two-thirds-m{width:66.6666666667%}.swagger-ui .w-auto-m{width:auto}}@media screen and (min-width:60em){.swagger-ui .w1-l{width:1rem}.swagger-ui .w2-l{width:2rem}.swagger-ui .w3-l{width:4rem}.swagger-ui .w4-l{width:8rem}.swagger-ui .w5-l{width:16rem}.swagger-ui .w-10-l{width:10%}.swagger-ui .w-20-l{width:20%}.swagger-ui .w-25-l{width:25%}.swagger-ui .w-30-l{width:30%}.swagger-ui .w-33-l{width:33%}.swagger-ui .w-34-l{width:34%}.swagger-ui .w-40-l{width:40%}.swagger-ui .w-50-l{width:50%}.swagger-ui .w-60-l{width:60%}.swagger-ui .w-70-l{width:70%}.swagger-ui .w-75-l{width:75%}.swagger-ui .w-80-l{width:80%}.swagger-ui .w-90-l{width:90%}.swagger-ui .w-100-l{width:100%}.swagger-ui .w-third-l{width:33.3333333333%}.swagger-ui .w-two-thirds-l{width:66.6666666667%}.swagger-ui .w-auto-l{width:auto}}.swagger-ui .overflow-visible{overflow:visible}.swagger-ui .overflow-hidden{overflow:hidden}.swagger-ui .overflow-scroll{overflow:scroll}.swagger-ui .overflow-auto{overflow:auto}.swagger-ui .overflow-x-visible{overflow-x:visible}.swagger-ui .overflow-x-hidden{overflow-x:hidden}.swagger-ui .overflow-x-scroll{overflow-x:scroll}.swagger-ui .overflow-x-auto{overflow-x:auto}.swagger-ui .overflow-y-visible{overflow-y:visible}.swagger-ui .overflow-y-hidden{overflow-y:hidden}.swagger-ui .overflow-y-scroll{overflow-y:scroll}.swagger-ui .overflow-y-auto{overflow-y:auto}@media screen and (min-width:30em){.swagger-ui .overflow-visible-ns{overflow:visible}.swagger-ui .overflow-hidden-ns{overflow:hidden}.swagger-ui .overflow-scroll-ns{overflow:scroll}.swagger-ui .overflow-auto-ns{overflow:auto}.swagger-ui .overflow-x-visible-ns{overflow-x:visible}.swagger-ui .overflow-x-hidden-ns{overflow-x:hidden}.swagger-ui .overflow-x-scroll-ns{overflow-x:scroll}.swagger-ui .overflow-x-auto-ns{overflow-x:auto}.swagger-ui .overflow-y-visible-ns{overflow-y:visible}.swagger-ui .overflow-y-hidden-ns{overflow-y:hidden}.swagger-ui .overflow-y-scroll-ns{overflow-y:scroll}.swagger-ui .overflow-y-auto-ns{overflow-y:auto}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .overflow-visible-m{overflow:visible}.swagger-ui .overflow-hidden-m{overflow:hidden}.swagger-ui .overflow-scroll-m{overflow:scroll}.swagger-ui .overflow-auto-m{overflow:auto}.swagger-ui .overflow-x-visible-m{overflow-x:visible}.swagger-ui .overflow-x-hidden-m{overflow-x:hidden}.swagger-ui .overflow-x-scroll-m{overflow-x:scroll}.swagger-ui .overflow-x-auto-m{overflow-x:auto}.swagger-ui .overflow-y-visible-m{overflow-y:visible}.swagger-ui .overflow-y-hidden-m{overflow-y:hidden}.swagger-ui .overflow-y-scroll-m{overflow-y:scroll}.swagger-ui .overflow-y-auto-m{overflow-y:auto}}@media screen and (min-width:60em){.swagger-ui .overflow-visible-l{overflow:visible}.swagger-ui .overflow-hidden-l{overflow:hidden}.swagger-ui .overflow-scroll-l{overflow:scroll}.swagger-ui .overflow-auto-l{overflow:auto}.swagger-ui .overflow-x-visible-l{overflow-x:visible}.swagger-ui .overflow-x-hidden-l{overflow-x:hidden}.swagger-ui .overflow-x-scroll-l{overflow-x:scroll}.swagger-ui .overflow-x-auto-l{overflow-x:auto}.swagger-ui .overflow-y-visible-l{overflow-y:visible}.swagger-ui .overflow-y-hidden-l{overflow-y:hidden}.swagger-ui .overflow-y-scroll-l{overflow-y:scroll}.swagger-ui .overflow-y-auto-l{overflow-y:auto}}.swagger-ui .static{position:static}.swagger-ui .relative{position:relative}.swagger-ui .absolute{position:absolute}.swagger-ui .fixed{position:fixed}@media screen and (min-width:30em){.swagger-ui .static-ns{position:static}.swagger-ui .relative-ns{position:relative}.swagger-ui .absolute-ns{position:absolute}.swagger-ui .fixed-ns{position:fixed}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .static-m{position:static}.swagger-ui .relative-m{position:relative}.swagger-ui .absolute-m{position:absolute}.swagger-ui .fixed-m{position:fixed}}@media screen and (min-width:60em){.swagger-ui .static-l{position:static}.swagger-ui .relative-l{position:relative}.swagger-ui .absolute-l{position:absolute}.swagger-ui .fixed-l{position:fixed}}.swagger-ui .o-100{opacity:1}.swagger-ui .o-90{opacity:.9}.swagger-ui .o-80{opacity:.8}.swagger-ui .o-70{opacity:.7}.swagger-ui .o-60{opacity:.6}.swagger-ui .o-50{opacity:.5}.swagger-ui .o-40{opacity:.4}.swagger-ui .o-30{opacity:.3}.swagger-ui .o-20{opacity:.2}.swagger-ui .o-10{opacity:.1}.swagger-ui .o-05{opacity:.05}.swagger-ui .o-025{opacity:.025}.swagger-ui .o-0{opacity:0}.swagger-ui .rotate-45{transform:rotate(45deg)}.swagger-ui .rotate-90{transform:rotate(90deg)}.swagger-ui .rotate-135{transform:rotate(135deg)}.swagger-ui .rotate-180{transform:rotate(180deg)}.swagger-ui .rotate-225{transform:rotate(225deg)}.swagger-ui .rotate-270{transform:rotate(270deg)}.swagger-ui .rotate-315{transform:rotate(315deg)}@media screen and (min-width:30em){.swagger-ui .rotate-45-ns{transform:rotate(45deg)}.swagger-ui .rotate-90-ns{transform:rotate(90deg)}.swagger-ui .rotate-135-ns{transform:rotate(135deg)}.swagger-ui .rotate-180-ns{transform:rotate(180deg)}.swagger-ui .rotate-225-ns{transform:rotate(225deg)}.swagger-ui .rotate-270-ns{transform:rotate(270deg)}.swagger-ui .rotate-315-ns{transform:rotate(315deg)}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .rotate-45-m{transform:rotate(45deg)}.swagger-ui .rotate-90-m{transform:rotate(90deg)}.swagger-ui .rotate-135-m{transform:rotate(135deg)}.swagger-ui .rotate-180-m{transform:rotate(180deg)}.swagger-ui .rotate-225-m{transform:rotate(225deg)}.swagger-ui .rotate-270-m{transform:rotate(270deg)}.swagger-ui .rotate-315-m{transform:rotate(315deg)}}@media screen and (min-width:60em){.swagger-ui .rotate-45-l{transform:rotate(45deg)}.swagger-ui .rotate-90-l{transform:rotate(90deg)}.swagger-ui .rotate-135-l{transform:rotate(135deg)}.swagger-ui .rotate-180-l{transform:rotate(180deg)}.swagger-ui .rotate-225-l{transform:rotate(225deg)}.swagger-ui .rotate-270-l{transform:rotate(270deg)}.swagger-ui .rotate-315-l{transform:rotate(315deg)}}.swagger-ui .black-90{color:rgba(0,0,0,.9)}.swagger-ui .black-80{color:rgba(0,0,0,.8)}.swagger-ui .black-70{color:rgba(0,0,0,.7)}.swagger-ui .black-60{color:rgba(0,0,0,.6)}.swagger-ui .black-50{color:rgba(0,0,0,.5)}.swagger-ui .black-40{color:rgba(0,0,0,.4)}.swagger-ui .black-30{color:rgba(0,0,0,.3)}.swagger-ui .black-20{color:rgba(0,0,0,.2)}.swagger-ui .black-10{color:rgba(0,0,0,.1)}.swagger-ui .black-05{color:rgba(0,0,0,.05)}.swagger-ui .white-90{color:hsla(0,0%,100%,.9)}.swagger-ui .white-80{color:hsla(0,0%,100%,.8)}.swagger-ui .white-70{color:hsla(0,0%,100%,.7)}.swagger-ui .white-60{color:hsla(0,0%,100%,.6)}.swagger-ui .white-50{color:hsla(0,0%,100%,.5)}.swagger-ui .white-40{color:hsla(0,0%,100%,.4)}.swagger-ui .white-30{color:hsla(0,0%,100%,.3)}.swagger-ui .white-20{color:hsla(0,0%,100%,.2)}.swagger-ui .white-10{color:hsla(0,0%,100%,.1)}.swagger-ui .black{color:#000}.swagger-ui .near-black{color:#111}.swagger-ui .dark-gray{color:#333}.swagger-ui .mid-gray{color:#555}.swagger-ui .gray{color:#777}.swagger-ui .silver{color:#999}.swagger-ui .light-silver{color:#aaa}.swagger-ui .moon-gray{color:#ccc}.swagger-ui .light-gray{color:#eee}.swagger-ui .near-white{color:#f4f4f4}.swagger-ui .white{color:#fff}.swagger-ui .dark-red{color:#e7040f}.swagger-ui .red{color:#ff4136}.swagger-ui .light-red{color:#ff725c}.swagger-ui .orange{color:#ff6300}.swagger-ui .gold{color:#ffb700}.swagger-ui .yellow{color:gold}.swagger-ui .light-yellow{color:#fbf1a9}.swagger-ui .purple{color:#5e2ca5}.swagger-ui .light-purple{color:#a463f2}.swagger-ui .dark-pink{color:#d5008f}.swagger-ui .hot-pink{color:#ff41b4}.swagger-ui .pink{color:#ff80cc}.swagger-ui .light-pink{color:#ffa3d7}.swagger-ui .dark-green{color:#137752}.swagger-ui .green{color:#19a974}.swagger-ui .light-green{color:#9eebcf}.swagger-ui .navy{color:#001b44}.swagger-ui .dark-blue{color:#00449e}.swagger-ui .blue{color:#357edd}.swagger-ui .light-blue{color:#96ccff}.swagger-ui .lightest-blue{color:#cdecff}.swagger-ui .washed-blue{color:#f6fffe}.swagger-ui .washed-green{color:#e8fdf5}.swagger-ui .washed-yellow{color:#fffceb}.swagger-ui .washed-red{color:#ffdfdf}.swagger-ui .color-inherit{color:inherit}.swagger-ui .bg-black-90{background-color:rgba(0,0,0,.9)}.swagger-ui .bg-black-80{background-color:rgba(0,0,0,.8)}.swagger-ui .bg-black-70{background-color:rgba(0,0,0,.7)}.swagger-ui .bg-black-60{background-color:rgba(0,0,0,.6)}.swagger-ui .bg-black-50{background-color:rgba(0,0,0,.5)}.swagger-ui .bg-black-40{background-color:rgba(0,0,0,.4)}.swagger-ui .bg-black-30{background-color:rgba(0,0,0,.3)}.swagger-ui .bg-black-20{background-color:rgba(0,0,0,.2)}.swagger-ui .bg-black-10{background-color:rgba(0,0,0,.1)}.swagger-ui .bg-black-05{background-color:rgba(0,0,0,.05)}.swagger-ui .bg-white-90{background-color:hsla(0,0%,100%,.9)}.swagger-ui .bg-white-80{background-color:hsla(0,0%,100%,.8)}.swagger-ui .bg-white-70{background-color:hsla(0,0%,100%,.7)}.swagger-ui .bg-white-60{background-color:hsla(0,0%,100%,.6)}.swagger-ui .bg-white-50{background-color:hsla(0,0%,100%,.5)}.swagger-ui .bg-white-40{background-color:hsla(0,0%,100%,.4)}.swagger-ui .bg-white-30{background-color:hsla(0,0%,100%,.3)}.swagger-ui .bg-white-20{background-color:hsla(0,0%,100%,.2)}.swagger-ui .bg-white-10{background-color:hsla(0,0%,100%,.1)}.swagger-ui .bg-black{background-color:#000}.swagger-ui .bg-near-black{background-color:#111}.swagger-ui .bg-dark-gray{background-color:#333}.swagger-ui .bg-mid-gray{background-color:#555}.swagger-ui .bg-gray{background-color:#777}.swagger-ui .bg-silver{background-color:#999}.swagger-ui .bg-light-silver{background-color:#aaa}.swagger-ui .bg-moon-gray{background-color:#ccc}.swagger-ui .bg-light-gray{background-color:#eee}.swagger-ui .bg-near-white{background-color:#f4f4f4}.swagger-ui .bg-white{background-color:#fff}.swagger-ui .bg-transparent{background-color:transparent}.swagger-ui .bg-dark-red{background-color:#e7040f}.swagger-ui .bg-red{background-color:#ff4136}.swagger-ui .bg-light-red{background-color:#ff725c}.swagger-ui .bg-orange{background-color:#ff6300}.swagger-ui .bg-gold{background-color:#ffb700}.swagger-ui .bg-yellow{background-color:gold}.swagger-ui .bg-light-yellow{background-color:#fbf1a9}.swagger-ui .bg-purple{background-color:#5e2ca5}.swagger-ui .bg-light-purple{background-color:#a463f2}.swagger-ui .bg-dark-pink{background-color:#d5008f}.swagger-ui .bg-hot-pink{background-color:#ff41b4}.swagger-ui .bg-pink{background-color:#ff80cc}.swagger-ui .bg-light-pink{background-color:#ffa3d7}.swagger-ui .bg-dark-green{background-color:#137752}.swagger-ui .bg-green{background-color:#19a974}.swagger-ui .bg-light-green{background-color:#9eebcf}.swagger-ui .bg-navy{background-color:#001b44}.swagger-ui .bg-dark-blue{background-color:#00449e}.swagger-ui .bg-blue{background-color:#357edd}.swagger-ui .bg-light-blue{background-color:#96ccff}.swagger-ui .bg-lightest-blue{background-color:#cdecff}.swagger-ui .bg-washed-blue{background-color:#f6fffe}.swagger-ui .bg-washed-green{background-color:#e8fdf5}.swagger-ui .bg-washed-yellow{background-color:#fffceb}.swagger-ui .bg-washed-red{background-color:#ffdfdf}.swagger-ui .bg-inherit{background-color:inherit}.swagger-ui .hover-black:focus,.swagger-ui .hover-black:hover{color:#000}.swagger-ui .hover-near-black:focus,.swagger-ui .hover-near-black:hover{color:#111}.swagger-ui .hover-dark-gray:focus,.swagger-ui .hover-dark-gray:hover{color:#333}.swagger-ui .hover-mid-gray:focus,.swagger-ui .hover-mid-gray:hover{color:#555}.swagger-ui .hover-gray:focus,.swagger-ui .hover-gray:hover{color:#777}.swagger-ui .hover-silver:focus,.swagger-ui .hover-silver:hover{color:#999}.swagger-ui .hover-light-silver:focus,.swagger-ui .hover-light-silver:hover{color:#aaa}.swagger-ui .hover-moon-gray:focus,.swagger-ui .hover-moon-gray:hover{color:#ccc}.swagger-ui .hover-light-gray:focus,.swagger-ui .hover-light-gray:hover{color:#eee}.swagger-ui .hover-near-white:focus,.swagger-ui .hover-near-white:hover{color:#f4f4f4}.swagger-ui .hover-white:focus,.swagger-ui .hover-white:hover{color:#fff}.swagger-ui .hover-black-90:focus,.swagger-ui .hover-black-90:hover{color:rgba(0,0,0,.9)}.swagger-ui .hover-black-80:focus,.swagger-ui .hover-black-80:hover{color:rgba(0,0,0,.8)}.swagger-ui .hover-black-70:focus,.swagger-ui .hover-black-70:hover{color:rgba(0,0,0,.7)}.swagger-ui .hover-black-60:focus,.swagger-ui .hover-black-60:hover{color:rgba(0,0,0,.6)}.swagger-ui .hover-black-50:focus,.swagger-ui .hover-black-50:hover{color:rgba(0,0,0,.5)}.swagger-ui .hover-black-40:focus,.swagger-ui .hover-black-40:hover{color:rgba(0,0,0,.4)}.swagger-ui .hover-black-30:focus,.swagger-ui .hover-black-30:hover{color:rgba(0,0,0,.3)}.swagger-ui .hover-black-20:focus,.swagger-ui .hover-black-20:hover{color:rgba(0,0,0,.2)}.swagger-ui .hover-black-10:focus,.swagger-ui .hover-black-10:hover{color:rgba(0,0,0,.1)}.swagger-ui .hover-white-90:focus,.swagger-ui .hover-white-90:hover{color:hsla(0,0%,100%,.9)}.swagger-ui .hover-white-80:focus,.swagger-ui .hover-white-80:hover{color:hsla(0,0%,100%,.8)}.swagger-ui .hover-white-70:focus,.swagger-ui .hover-white-70:hover{color:hsla(0,0%,100%,.7)}.swagger-ui .hover-white-60:focus,.swagger-ui .hover-white-60:hover{color:hsla(0,0%,100%,.6)}.swagger-ui .hover-white-50:focus,.swagger-ui .hover-white-50:hover{color:hsla(0,0%,100%,.5)}.swagger-ui .hover-white-40:focus,.swagger-ui .hover-white-40:hover{color:hsla(0,0%,100%,.4)}.swagger-ui .hover-white-30:focus,.swagger-ui .hover-white-30:hover{color:hsla(0,0%,100%,.3)}.swagger-ui .hover-white-20:focus,.swagger-ui .hover-white-20:hover{color:hsla(0,0%,100%,.2)}.swagger-ui .hover-white-10:focus,.swagger-ui .hover-white-10:hover{color:hsla(0,0%,100%,.1)}.swagger-ui .hover-inherit:focus,.swagger-ui .hover-inherit:hover{color:inherit}.swagger-ui .hover-bg-black:focus,.swagger-ui .hover-bg-black:hover{background-color:#000}.swagger-ui .hover-bg-near-black:focus,.swagger-ui .hover-bg-near-black:hover{background-color:#111}.swagger-ui .hover-bg-dark-gray:focus,.swagger-ui .hover-bg-dark-gray:hover{background-color:#333}.swagger-ui .hover-bg-mid-gray:focus,.swagger-ui .hover-bg-mid-gray:hover{background-color:#555}.swagger-ui .hover-bg-gray:focus,.swagger-ui .hover-bg-gray:hover{background-color:#777}.swagger-ui .hover-bg-silver:focus,.swagger-ui .hover-bg-silver:hover{background-color:#999}.swagger-ui .hover-bg-light-silver:focus,.swagger-ui .hover-bg-light-silver:hover{background-color:#aaa}.swagger-ui .hover-bg-moon-gray:focus,.swagger-ui .hover-bg-moon-gray:hover{background-color:#ccc}.swagger-ui .hover-bg-light-gray:focus,.swagger-ui .hover-bg-light-gray:hover{background-color:#eee}.swagger-ui .hover-bg-near-white:focus,.swagger-ui .hover-bg-near-white:hover{background-color:#f4f4f4}.swagger-ui .hover-bg-white:focus,.swagger-ui .hover-bg-white:hover{background-color:#fff}.swagger-ui .hover-bg-transparent:focus,.swagger-ui .hover-bg-transparent:hover{background-color:transparent}.swagger-ui .hover-bg-black-90:focus,.swagger-ui .hover-bg-black-90:hover{background-color:rgba(0,0,0,.9)}.swagger-ui .hover-bg-black-80:focus,.swagger-ui .hover-bg-black-80:hover{background-color:rgba(0,0,0,.8)}.swagger-ui .hover-bg-black-70:focus,.swagger-ui .hover-bg-black-70:hover{background-color:rgba(0,0,0,.7)}.swagger-ui .hover-bg-black-60:focus,.swagger-ui .hover-bg-black-60:hover{background-color:rgba(0,0,0,.6)}.swagger-ui .hover-bg-black-50:focus,.swagger-ui .hover-bg-black-50:hover{background-color:rgba(0,0,0,.5)}.swagger-ui .hover-bg-black-40:focus,.swagger-ui .hover-bg-black-40:hover{background-color:rgba(0,0,0,.4)}.swagger-ui .hover-bg-black-30:focus,.swagger-ui .hover-bg-black-30:hover{background-color:rgba(0,0,0,.3)}.swagger-ui .hover-bg-black-20:focus,.swagger-ui .hover-bg-black-20:hover{background-color:rgba(0,0,0,.2)}.swagger-ui .hover-bg-black-10:focus,.swagger-ui .hover-bg-black-10:hover{background-color:rgba(0,0,0,.1)}.swagger-ui .hover-bg-white-90:focus,.swagger-ui .hover-bg-white-90:hover{background-color:hsla(0,0%,100%,.9)}.swagger-ui .hover-bg-white-80:focus,.swagger-ui .hover-bg-white-80:hover{background-color:hsla(0,0%,100%,.8)}.swagger-ui .hover-bg-white-70:focus,.swagger-ui .hover-bg-white-70:hover{background-color:hsla(0,0%,100%,.7)}.swagger-ui .hover-bg-white-60:focus,.swagger-ui .hover-bg-white-60:hover{background-color:hsla(0,0%,100%,.6)}.swagger-ui .hover-bg-white-50:focus,.swagger-ui .hover-bg-white-50:hover{background-color:hsla(0,0%,100%,.5)}.swagger-ui .hover-bg-white-40:focus,.swagger-ui .hover-bg-white-40:hover{background-color:hsla(0,0%,100%,.4)}.swagger-ui .hover-bg-white-30:focus,.swagger-ui .hover-bg-white-30:hover{background-color:hsla(0,0%,100%,.3)}.swagger-ui .hover-bg-white-20:focus,.swagger-ui .hover-bg-white-20:hover{background-color:hsla(0,0%,100%,.2)}.swagger-ui .hover-bg-white-10:focus,.swagger-ui .hover-bg-white-10:hover{background-color:hsla(0,0%,100%,.1)}.swagger-ui .hover-dark-red:focus,.swagger-ui .hover-dark-red:hover{color:#e7040f}.swagger-ui .hover-red:focus,.swagger-ui .hover-red:hover{color:#ff4136}.swagger-ui .hover-light-red:focus,.swagger-ui .hover-light-red:hover{color:#ff725c}.swagger-ui .hover-orange:focus,.swagger-ui .hover-orange:hover{color:#ff6300}.swagger-ui .hover-gold:focus,.swagger-ui .hover-gold:hover{color:#ffb700}.swagger-ui .hover-yellow:focus,.swagger-ui .hover-yellow:hover{color:gold}.swagger-ui .hover-light-yellow:focus,.swagger-ui .hover-light-yellow:hover{color:#fbf1a9}.swagger-ui .hover-purple:focus,.swagger-ui .hover-purple:hover{color:#5e2ca5}.swagger-ui .hover-light-purple:focus,.swagger-ui .hover-light-purple:hover{color:#a463f2}.swagger-ui .hover-dark-pink:focus,.swagger-ui .hover-dark-pink:hover{color:#d5008f}.swagger-ui .hover-hot-pink:focus,.swagger-ui .hover-hot-pink:hover{color:#ff41b4}.swagger-ui .hover-pink:focus,.swagger-ui .hover-pink:hover{color:#ff80cc}.swagger-ui .hover-light-pink:focus,.swagger-ui .hover-light-pink:hover{color:#ffa3d7}.swagger-ui .hover-dark-green:focus,.swagger-ui .hover-dark-green:hover{color:#137752}.swagger-ui .hover-green:focus,.swagger-ui .hover-green:hover{color:#19a974}.swagger-ui .hover-light-green:focus,.swagger-ui .hover-light-green:hover{color:#9eebcf}.swagger-ui .hover-navy:focus,.swagger-ui .hover-navy:hover{color:#001b44}.swagger-ui .hover-dark-blue:focus,.swagger-ui .hover-dark-blue:hover{color:#00449e}.swagger-ui .hover-blue:focus,.swagger-ui .hover-blue:hover{color:#357edd}.swagger-ui .hover-light-blue:focus,.swagger-ui .hover-light-blue:hover{color:#96ccff}.swagger-ui .hover-lightest-blue:focus,.swagger-ui .hover-lightest-blue:hover{color:#cdecff}.swagger-ui .hover-washed-blue:focus,.swagger-ui .hover-washed-blue:hover{color:#f6fffe}.swagger-ui .hover-washed-green:focus,.swagger-ui .hover-washed-green:hover{color:#e8fdf5}.swagger-ui .hover-washed-yellow:focus,.swagger-ui .hover-washed-yellow:hover{color:#fffceb}.swagger-ui .hover-washed-red:focus,.swagger-ui .hover-washed-red:hover{color:#ffdfdf}.swagger-ui .hover-bg-dark-red:focus,.swagger-ui .hover-bg-dark-red:hover{background-color:#e7040f}.swagger-ui .hover-bg-red:focus,.swagger-ui .hover-bg-red:hover{background-color:#ff4136}.swagger-ui .hover-bg-light-red:focus,.swagger-ui .hover-bg-light-red:hover{background-color:#ff725c}.swagger-ui .hover-bg-orange:focus,.swagger-ui .hover-bg-orange:hover{background-color:#ff6300}.swagger-ui .hover-bg-gold:focus,.swagger-ui .hover-bg-gold:hover{background-color:#ffb700}.swagger-ui .hover-bg-yellow:focus,.swagger-ui .hover-bg-yellow:hover{background-color:gold}.swagger-ui .hover-bg-light-yellow:focus,.swagger-ui .hover-bg-light-yellow:hover{background-color:#fbf1a9}.swagger-ui .hover-bg-purple:focus,.swagger-ui .hover-bg-purple:hover{background-color:#5e2ca5}.swagger-ui .hover-bg-light-purple:focus,.swagger-ui .hover-bg-light-purple:hover{background-color:#a463f2}.swagger-ui .hover-bg-dark-pink:focus,.swagger-ui .hover-bg-dark-pink:hover{background-color:#d5008f}.swagger-ui .hover-bg-hot-pink:focus,.swagger-ui .hover-bg-hot-pink:hover{background-color:#ff41b4}.swagger-ui .hover-bg-pink:focus,.swagger-ui .hover-bg-pink:hover{background-color:#ff80cc}.swagger-ui .hover-bg-light-pink:focus,.swagger-ui .hover-bg-light-pink:hover{background-color:#ffa3d7}.swagger-ui .hover-bg-dark-green:focus,.swagger-ui .hover-bg-dark-green:hover{background-color:#137752}.swagger-ui .hover-bg-green:focus,.swagger-ui .hover-bg-green:hover{background-color:#19a974}.swagger-ui .hover-bg-light-green:focus,.swagger-ui .hover-bg-light-green:hover{background-color:#9eebcf}.swagger-ui .hover-bg-navy:focus,.swagger-ui .hover-bg-navy:hover{background-color:#001b44}.swagger-ui .hover-bg-dark-blue:focus,.swagger-ui .hover-bg-dark-blue:hover{background-color:#00449e}.swagger-ui .hover-bg-blue:focus,.swagger-ui .hover-bg-blue:hover{background-color:#357edd}.swagger-ui .hover-bg-light-blue:focus,.swagger-ui .hover-bg-light-blue:hover{background-color:#96ccff}.swagger-ui .hover-bg-lightest-blue:focus,.swagger-ui .hover-bg-lightest-blue:hover{background-color:#cdecff}.swagger-ui .hover-bg-washed-blue:focus,.swagger-ui .hover-bg-washed-blue:hover{background-color:#f6fffe}.swagger-ui .hover-bg-washed-green:focus,.swagger-ui .hover-bg-washed-green:hover{background-color:#e8fdf5}.swagger-ui .hover-bg-washed-yellow:focus,.swagger-ui .hover-bg-washed-yellow:hover{background-color:#fffceb}.swagger-ui .hover-bg-washed-red:focus,.swagger-ui .hover-bg-washed-red:hover{background-color:#ffdfdf}.swagger-ui .hover-bg-inherit:focus,.swagger-ui .hover-bg-inherit:hover{background-color:inherit}.swagger-ui .pa0{padding:0}.swagger-ui .pa1{padding:.25rem}.swagger-ui .pa2{padding:.5rem}.swagger-ui .pa3{padding:1rem}.swagger-ui .pa4{padding:2rem}.swagger-ui .pa5{padding:4rem}.swagger-ui .pa6{padding:8rem}.swagger-ui .pa7{padding:16rem}.swagger-ui .pl0{padding-left:0}.swagger-ui .pl1{padding-left:.25rem}.swagger-ui .pl2{padding-left:.5rem}.swagger-ui .pl3{padding-left:1rem}.swagger-ui .pl4{padding-left:2rem}.swagger-ui .pl5{padding-left:4rem}.swagger-ui .pl6{padding-left:8rem}.swagger-ui .pl7{padding-left:16rem}.swagger-ui .pr0{padding-right:0}.swagger-ui .pr1{padding-right:.25rem}.swagger-ui .pr2{padding-right:.5rem}.swagger-ui .pr3{padding-right:1rem}.swagger-ui .pr4{padding-right:2rem}.swagger-ui .pr5{padding-right:4rem}.swagger-ui .pr6{padding-right:8rem}.swagger-ui .pr7{padding-right:16rem}.swagger-ui .pb0{padding-bottom:0}.swagger-ui .pb1{padding-bottom:.25rem}.swagger-ui .pb2{padding-bottom:.5rem}.swagger-ui .pb3{padding-bottom:1rem}.swagger-ui .pb4{padding-bottom:2rem}.swagger-ui .pb5{padding-bottom:4rem}.swagger-ui .pb6{padding-bottom:8rem}.swagger-ui .pb7{padding-bottom:16rem}.swagger-ui .pt0{padding-top:0}.swagger-ui .pt1{padding-top:.25rem}.swagger-ui .pt2{padding-top:.5rem}.swagger-ui .pt3{padding-top:1rem}.swagger-ui .pt4{padding-top:2rem}.swagger-ui .pt5{padding-top:4rem}.swagger-ui .pt6{padding-top:8rem}.swagger-ui .pt7{padding-top:16rem}.swagger-ui .pv0{padding-bottom:0;padding-top:0}.swagger-ui .pv1{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0{padding-left:0;padding-right:0}.swagger-ui .ph1{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0{margin:0}.swagger-ui .ma1{margin:.25rem}.swagger-ui .ma2{margin:.5rem}.swagger-ui .ma3{margin:1rem}.swagger-ui .ma4{margin:2rem}.swagger-ui .ma5{margin:4rem}.swagger-ui .ma6{margin:8rem}.swagger-ui .ma7{margin:16rem}.swagger-ui .ml0{margin-left:0}.swagger-ui .ml1{margin-left:.25rem}.swagger-ui .ml2{margin-left:.5rem}.swagger-ui .ml3{margin-left:1rem}.swagger-ui .ml4{margin-left:2rem}.swagger-ui .ml5{margin-left:4rem}.swagger-ui .ml6{margin-left:8rem}.swagger-ui .ml7{margin-left:16rem}.swagger-ui .mr0{margin-right:0}.swagger-ui .mr1{margin-right:.25rem}.swagger-ui .mr2{margin-right:.5rem}.swagger-ui .mr3{margin-right:1rem}.swagger-ui .mr4{margin-right:2rem}.swagger-ui .mr5{margin-right:4rem}.swagger-ui .mr6{margin-right:8rem}.swagger-ui .mr7{margin-right:16rem}.swagger-ui .mb0{margin-bottom:0}.swagger-ui .mb1{margin-bottom:.25rem}.swagger-ui .mb2{margin-bottom:.5rem}.swagger-ui .mb3{margin-bottom:1rem}.swagger-ui .mb4{margin-bottom:2rem}.swagger-ui .mb5{margin-bottom:4rem}.swagger-ui .mb6{margin-bottom:8rem}.swagger-ui .mb7{margin-bottom:16rem}.swagger-ui .mt0{margin-top:0}.swagger-ui .mt1{margin-top:.25rem}.swagger-ui .mt2{margin-top:.5rem}.swagger-ui .mt3{margin-top:1rem}.swagger-ui .mt4{margin-top:2rem}.swagger-ui .mt5{margin-top:4rem}.swagger-ui .mt6{margin-top:8rem}.swagger-ui .mt7{margin-top:16rem}.swagger-ui .mv0{margin-bottom:0;margin-top:0}.swagger-ui .mv1{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0{margin-left:0;margin-right:0}.swagger-ui .mh1{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7{margin-left:16rem;margin-right:16rem}@media screen and (min-width:30em){.swagger-ui .pa0-ns{padding:0}.swagger-ui .pa1-ns{padding:.25rem}.swagger-ui .pa2-ns{padding:.5rem}.swagger-ui .pa3-ns{padding:1rem}.swagger-ui .pa4-ns{padding:2rem}.swagger-ui .pa5-ns{padding:4rem}.swagger-ui .pa6-ns{padding:8rem}.swagger-ui .pa7-ns{padding:16rem}.swagger-ui .pl0-ns{padding-left:0}.swagger-ui .pl1-ns{padding-left:.25rem}.swagger-ui .pl2-ns{padding-left:.5rem}.swagger-ui .pl3-ns{padding-left:1rem}.swagger-ui .pl4-ns{padding-left:2rem}.swagger-ui .pl5-ns{padding-left:4rem}.swagger-ui .pl6-ns{padding-left:8rem}.swagger-ui .pl7-ns{padding-left:16rem}.swagger-ui .pr0-ns{padding-right:0}.swagger-ui .pr1-ns{padding-right:.25rem}.swagger-ui .pr2-ns{padding-right:.5rem}.swagger-ui .pr3-ns{padding-right:1rem}.swagger-ui .pr4-ns{padding-right:2rem}.swagger-ui .pr5-ns{padding-right:4rem}.swagger-ui .pr6-ns{padding-right:8rem}.swagger-ui .pr7-ns{padding-right:16rem}.swagger-ui .pb0-ns{padding-bottom:0}.swagger-ui .pb1-ns{padding-bottom:.25rem}.swagger-ui .pb2-ns{padding-bottom:.5rem}.swagger-ui .pb3-ns{padding-bottom:1rem}.swagger-ui .pb4-ns{padding-bottom:2rem}.swagger-ui .pb5-ns{padding-bottom:4rem}.swagger-ui .pb6-ns{padding-bottom:8rem}.swagger-ui .pb7-ns{padding-bottom:16rem}.swagger-ui .pt0-ns{padding-top:0}.swagger-ui .pt1-ns{padding-top:.25rem}.swagger-ui .pt2-ns{padding-top:.5rem}.swagger-ui .pt3-ns{padding-top:1rem}.swagger-ui .pt4-ns{padding-top:2rem}.swagger-ui .pt5-ns{padding-top:4rem}.swagger-ui .pt6-ns{padding-top:8rem}.swagger-ui .pt7-ns{padding-top:16rem}.swagger-ui .pv0-ns{padding-bottom:0;padding-top:0}.swagger-ui .pv1-ns{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-ns{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-ns{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-ns{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-ns{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-ns{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-ns{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-ns{padding-left:0;padding-right:0}.swagger-ui .ph1-ns{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-ns{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-ns{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-ns{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-ns{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-ns{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-ns{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-ns{margin:0}.swagger-ui .ma1-ns{margin:.25rem}.swagger-ui .ma2-ns{margin:.5rem}.swagger-ui .ma3-ns{margin:1rem}.swagger-ui .ma4-ns{margin:2rem}.swagger-ui .ma5-ns{margin:4rem}.swagger-ui .ma6-ns{margin:8rem}.swagger-ui .ma7-ns{margin:16rem}.swagger-ui .ml0-ns{margin-left:0}.swagger-ui .ml1-ns{margin-left:.25rem}.swagger-ui .ml2-ns{margin-left:.5rem}.swagger-ui .ml3-ns{margin-left:1rem}.swagger-ui .ml4-ns{margin-left:2rem}.swagger-ui .ml5-ns{margin-left:4rem}.swagger-ui .ml6-ns{margin-left:8rem}.swagger-ui .ml7-ns{margin-left:16rem}.swagger-ui .mr0-ns{margin-right:0}.swagger-ui .mr1-ns{margin-right:.25rem}.swagger-ui .mr2-ns{margin-right:.5rem}.swagger-ui .mr3-ns{margin-right:1rem}.swagger-ui .mr4-ns{margin-right:2rem}.swagger-ui .mr5-ns{margin-right:4rem}.swagger-ui .mr6-ns{margin-right:8rem}.swagger-ui .mr7-ns{margin-right:16rem}.swagger-ui .mb0-ns{margin-bottom:0}.swagger-ui .mb1-ns{margin-bottom:.25rem}.swagger-ui .mb2-ns{margin-bottom:.5rem}.swagger-ui .mb3-ns{margin-bottom:1rem}.swagger-ui .mb4-ns{margin-bottom:2rem}.swagger-ui .mb5-ns{margin-bottom:4rem}.swagger-ui .mb6-ns{margin-bottom:8rem}.swagger-ui .mb7-ns{margin-bottom:16rem}.swagger-ui .mt0-ns{margin-top:0}.swagger-ui .mt1-ns{margin-top:.25rem}.swagger-ui .mt2-ns{margin-top:.5rem}.swagger-ui .mt3-ns{margin-top:1rem}.swagger-ui .mt4-ns{margin-top:2rem}.swagger-ui .mt5-ns{margin-top:4rem}.swagger-ui .mt6-ns{margin-top:8rem}.swagger-ui .mt7-ns{margin-top:16rem}.swagger-ui .mv0-ns{margin-bottom:0;margin-top:0}.swagger-ui .mv1-ns{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-ns{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-ns{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-ns{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-ns{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-ns{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-ns{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-ns{margin-left:0;margin-right:0}.swagger-ui .mh1-ns{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-ns{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-ns{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-ns{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-ns{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-ns{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-ns{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .pa0-m{padding:0}.swagger-ui .pa1-m{padding:.25rem}.swagger-ui .pa2-m{padding:.5rem}.swagger-ui .pa3-m{padding:1rem}.swagger-ui .pa4-m{padding:2rem}.swagger-ui .pa5-m{padding:4rem}.swagger-ui .pa6-m{padding:8rem}.swagger-ui .pa7-m{padding:16rem}.swagger-ui .pl0-m{padding-left:0}.swagger-ui .pl1-m{padding-left:.25rem}.swagger-ui .pl2-m{padding-left:.5rem}.swagger-ui .pl3-m{padding-left:1rem}.swagger-ui .pl4-m{padding-left:2rem}.swagger-ui .pl5-m{padding-left:4rem}.swagger-ui .pl6-m{padding-left:8rem}.swagger-ui .pl7-m{padding-left:16rem}.swagger-ui .pr0-m{padding-right:0}.swagger-ui .pr1-m{padding-right:.25rem}.swagger-ui .pr2-m{padding-right:.5rem}.swagger-ui .pr3-m{padding-right:1rem}.swagger-ui .pr4-m{padding-right:2rem}.swagger-ui .pr5-m{padding-right:4rem}.swagger-ui .pr6-m{padding-right:8rem}.swagger-ui .pr7-m{padding-right:16rem}.swagger-ui .pb0-m{padding-bottom:0}.swagger-ui .pb1-m{padding-bottom:.25rem}.swagger-ui .pb2-m{padding-bottom:.5rem}.swagger-ui .pb3-m{padding-bottom:1rem}.swagger-ui .pb4-m{padding-bottom:2rem}.swagger-ui .pb5-m{padding-bottom:4rem}.swagger-ui .pb6-m{padding-bottom:8rem}.swagger-ui .pb7-m{padding-bottom:16rem}.swagger-ui .pt0-m{padding-top:0}.swagger-ui .pt1-m{padding-top:.25rem}.swagger-ui .pt2-m{padding-top:.5rem}.swagger-ui .pt3-m{padding-top:1rem}.swagger-ui .pt4-m{padding-top:2rem}.swagger-ui .pt5-m{padding-top:4rem}.swagger-ui .pt6-m{padding-top:8rem}.swagger-ui .pt7-m{padding-top:16rem}.swagger-ui .pv0-m{padding-bottom:0;padding-top:0}.swagger-ui .pv1-m{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-m{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-m{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-m{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-m{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-m{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-m{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-m{padding-left:0;padding-right:0}.swagger-ui .ph1-m{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-m{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-m{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-m{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-m{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-m{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-m{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-m{margin:0}.swagger-ui .ma1-m{margin:.25rem}.swagger-ui .ma2-m{margin:.5rem}.swagger-ui .ma3-m{margin:1rem}.swagger-ui .ma4-m{margin:2rem}.swagger-ui .ma5-m{margin:4rem}.swagger-ui .ma6-m{margin:8rem}.swagger-ui .ma7-m{margin:16rem}.swagger-ui .ml0-m{margin-left:0}.swagger-ui .ml1-m{margin-left:.25rem}.swagger-ui .ml2-m{margin-left:.5rem}.swagger-ui .ml3-m{margin-left:1rem}.swagger-ui .ml4-m{margin-left:2rem}.swagger-ui .ml5-m{margin-left:4rem}.swagger-ui .ml6-m{margin-left:8rem}.swagger-ui .ml7-m{margin-left:16rem}.swagger-ui .mr0-m{margin-right:0}.swagger-ui .mr1-m{margin-right:.25rem}.swagger-ui .mr2-m{margin-right:.5rem}.swagger-ui .mr3-m{margin-right:1rem}.swagger-ui .mr4-m{margin-right:2rem}.swagger-ui .mr5-m{margin-right:4rem}.swagger-ui .mr6-m{margin-right:8rem}.swagger-ui .mr7-m{margin-right:16rem}.swagger-ui .mb0-m{margin-bottom:0}.swagger-ui .mb1-m{margin-bottom:.25rem}.swagger-ui .mb2-m{margin-bottom:.5rem}.swagger-ui .mb3-m{margin-bottom:1rem}.swagger-ui .mb4-m{margin-bottom:2rem}.swagger-ui .mb5-m{margin-bottom:4rem}.swagger-ui .mb6-m{margin-bottom:8rem}.swagger-ui .mb7-m{margin-bottom:16rem}.swagger-ui .mt0-m{margin-top:0}.swagger-ui .mt1-m{margin-top:.25rem}.swagger-ui .mt2-m{margin-top:.5rem}.swagger-ui .mt3-m{margin-top:1rem}.swagger-ui .mt4-m{margin-top:2rem}.swagger-ui .mt5-m{margin-top:4rem}.swagger-ui .mt6-m{margin-top:8rem}.swagger-ui .mt7-m{margin-top:16rem}.swagger-ui .mv0-m{margin-bottom:0;margin-top:0}.swagger-ui .mv1-m{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-m{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-m{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-m{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-m{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-m{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-m{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-m{margin-left:0;margin-right:0}.swagger-ui .mh1-m{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-m{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-m{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-m{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-m{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-m{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-m{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:60em){.swagger-ui .pa0-l{padding:0}.swagger-ui .pa1-l{padding:.25rem}.swagger-ui .pa2-l{padding:.5rem}.swagger-ui .pa3-l{padding:1rem}.swagger-ui .pa4-l{padding:2rem}.swagger-ui .pa5-l{padding:4rem}.swagger-ui .pa6-l{padding:8rem}.swagger-ui .pa7-l{padding:16rem}.swagger-ui .pl0-l{padding-left:0}.swagger-ui .pl1-l{padding-left:.25rem}.swagger-ui .pl2-l{padding-left:.5rem}.swagger-ui .pl3-l{padding-left:1rem}.swagger-ui .pl4-l{padding-left:2rem}.swagger-ui .pl5-l{padding-left:4rem}.swagger-ui .pl6-l{padding-left:8rem}.swagger-ui .pl7-l{padding-left:16rem}.swagger-ui .pr0-l{padding-right:0}.swagger-ui .pr1-l{padding-right:.25rem}.swagger-ui .pr2-l{padding-right:.5rem}.swagger-ui .pr3-l{padding-right:1rem}.swagger-ui .pr4-l{padding-right:2rem}.swagger-ui .pr5-l{padding-right:4rem}.swagger-ui .pr6-l{padding-right:8rem}.swagger-ui .pr7-l{padding-right:16rem}.swagger-ui .pb0-l{padding-bottom:0}.swagger-ui .pb1-l{padding-bottom:.25rem}.swagger-ui .pb2-l{padding-bottom:.5rem}.swagger-ui .pb3-l{padding-bottom:1rem}.swagger-ui .pb4-l{padding-bottom:2rem}.swagger-ui .pb5-l{padding-bottom:4rem}.swagger-ui .pb6-l{padding-bottom:8rem}.swagger-ui .pb7-l{padding-bottom:16rem}.swagger-ui .pt0-l{padding-top:0}.swagger-ui .pt1-l{padding-top:.25rem}.swagger-ui .pt2-l{padding-top:.5rem}.swagger-ui .pt3-l{padding-top:1rem}.swagger-ui .pt4-l{padding-top:2rem}.swagger-ui .pt5-l{padding-top:4rem}.swagger-ui .pt6-l{padding-top:8rem}.swagger-ui .pt7-l{padding-top:16rem}.swagger-ui .pv0-l{padding-bottom:0;padding-top:0}.swagger-ui .pv1-l{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-l{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-l{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-l{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-l{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-l{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-l{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-l{padding-left:0;padding-right:0}.swagger-ui .ph1-l{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-l{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-l{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-l{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-l{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-l{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-l{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-l{margin:0}.swagger-ui .ma1-l{margin:.25rem}.swagger-ui .ma2-l{margin:.5rem}.swagger-ui .ma3-l{margin:1rem}.swagger-ui .ma4-l{margin:2rem}.swagger-ui .ma5-l{margin:4rem}.swagger-ui .ma6-l{margin:8rem}.swagger-ui .ma7-l{margin:16rem}.swagger-ui .ml0-l{margin-left:0}.swagger-ui .ml1-l{margin-left:.25rem}.swagger-ui .ml2-l{margin-left:.5rem}.swagger-ui .ml3-l{margin-left:1rem}.swagger-ui .ml4-l{margin-left:2rem}.swagger-ui .ml5-l{margin-left:4rem}.swagger-ui .ml6-l{margin-left:8rem}.swagger-ui .ml7-l{margin-left:16rem}.swagger-ui .mr0-l{margin-right:0}.swagger-ui .mr1-l{margin-right:.25rem}.swagger-ui .mr2-l{margin-right:.5rem}.swagger-ui .mr3-l{margin-right:1rem}.swagger-ui .mr4-l{margin-right:2rem}.swagger-ui .mr5-l{margin-right:4rem}.swagger-ui .mr6-l{margin-right:8rem}.swagger-ui .mr7-l{margin-right:16rem}.swagger-ui .mb0-l{margin-bottom:0}.swagger-ui .mb1-l{margin-bottom:.25rem}.swagger-ui .mb2-l{margin-bottom:.5rem}.swagger-ui .mb3-l{margin-bottom:1rem}.swagger-ui .mb4-l{margin-bottom:2rem}.swagger-ui .mb5-l{margin-bottom:4rem}.swagger-ui .mb6-l{margin-bottom:8rem}.swagger-ui .mb7-l{margin-bottom:16rem}.swagger-ui .mt0-l{margin-top:0}.swagger-ui .mt1-l{margin-top:.25rem}.swagger-ui .mt2-l{margin-top:.5rem}.swagger-ui .mt3-l{margin-top:1rem}.swagger-ui .mt4-l{margin-top:2rem}.swagger-ui .mt5-l{margin-top:4rem}.swagger-ui .mt6-l{margin-top:8rem}.swagger-ui .mt7-l{margin-top:16rem}.swagger-ui .mv0-l{margin-bottom:0;margin-top:0}.swagger-ui .mv1-l{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-l{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-l{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-l{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-l{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-l{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-l{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-l{margin-left:0;margin-right:0}.swagger-ui .mh1-l{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-l{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-l{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-l{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-l{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-l{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-l{margin-left:16rem;margin-right:16rem}}.swagger-ui .na1{margin:-.25rem}.swagger-ui .na2{margin:-.5rem}.swagger-ui .na3{margin:-1rem}.swagger-ui .na4{margin:-2rem}.swagger-ui .na5{margin:-4rem}.swagger-ui .na6{margin:-8rem}.swagger-ui .na7{margin:-16rem}.swagger-ui .nl1{margin-left:-.25rem}.swagger-ui .nl2{margin-left:-.5rem}.swagger-ui .nl3{margin-left:-1rem}.swagger-ui .nl4{margin-left:-2rem}.swagger-ui .nl5{margin-left:-4rem}.swagger-ui .nl6{margin-left:-8rem}.swagger-ui .nl7{margin-left:-16rem}.swagger-ui .nr1{margin-right:-.25rem}.swagger-ui .nr2{margin-right:-.5rem}.swagger-ui .nr3{margin-right:-1rem}.swagger-ui .nr4{margin-right:-2rem}.swagger-ui .nr5{margin-right:-4rem}.swagger-ui .nr6{margin-right:-8rem}.swagger-ui .nr7{margin-right:-16rem}.swagger-ui .nb1{margin-bottom:-.25rem}.swagger-ui .nb2{margin-bottom:-.5rem}.swagger-ui .nb3{margin-bottom:-1rem}.swagger-ui .nb4{margin-bottom:-2rem}.swagger-ui .nb5{margin-bottom:-4rem}.swagger-ui .nb6{margin-bottom:-8rem}.swagger-ui .nb7{margin-bottom:-16rem}.swagger-ui .nt1{margin-top:-.25rem}.swagger-ui .nt2{margin-top:-.5rem}.swagger-ui .nt3{margin-top:-1rem}.swagger-ui .nt4{margin-top:-2rem}.swagger-ui .nt5{margin-top:-4rem}.swagger-ui .nt6{margin-top:-8rem}.swagger-ui .nt7{margin-top:-16rem}@media screen and (min-width:30em){.swagger-ui .na1-ns{margin:-.25rem}.swagger-ui .na2-ns{margin:-.5rem}.swagger-ui .na3-ns{margin:-1rem}.swagger-ui .na4-ns{margin:-2rem}.swagger-ui .na5-ns{margin:-4rem}.swagger-ui .na6-ns{margin:-8rem}.swagger-ui .na7-ns{margin:-16rem}.swagger-ui .nl1-ns{margin-left:-.25rem}.swagger-ui .nl2-ns{margin-left:-.5rem}.swagger-ui .nl3-ns{margin-left:-1rem}.swagger-ui .nl4-ns{margin-left:-2rem}.swagger-ui .nl5-ns{margin-left:-4rem}.swagger-ui .nl6-ns{margin-left:-8rem}.swagger-ui .nl7-ns{margin-left:-16rem}.swagger-ui .nr1-ns{margin-right:-.25rem}.swagger-ui .nr2-ns{margin-right:-.5rem}.swagger-ui .nr3-ns{margin-right:-1rem}.swagger-ui .nr4-ns{margin-right:-2rem}.swagger-ui .nr5-ns{margin-right:-4rem}.swagger-ui .nr6-ns{margin-right:-8rem}.swagger-ui .nr7-ns{margin-right:-16rem}.swagger-ui .nb1-ns{margin-bottom:-.25rem}.swagger-ui .nb2-ns{margin-bottom:-.5rem}.swagger-ui .nb3-ns{margin-bottom:-1rem}.swagger-ui .nb4-ns{margin-bottom:-2rem}.swagger-ui .nb5-ns{margin-bottom:-4rem}.swagger-ui .nb6-ns{margin-bottom:-8rem}.swagger-ui .nb7-ns{margin-bottom:-16rem}.swagger-ui .nt1-ns{margin-top:-.25rem}.swagger-ui .nt2-ns{margin-top:-.5rem}.swagger-ui .nt3-ns{margin-top:-1rem}.swagger-ui .nt4-ns{margin-top:-2rem}.swagger-ui .nt5-ns{margin-top:-4rem}.swagger-ui .nt6-ns{margin-top:-8rem}.swagger-ui .nt7-ns{margin-top:-16rem}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .na1-m{margin:-.25rem}.swagger-ui .na2-m{margin:-.5rem}.swagger-ui .na3-m{margin:-1rem}.swagger-ui .na4-m{margin:-2rem}.swagger-ui .na5-m{margin:-4rem}.swagger-ui .na6-m{margin:-8rem}.swagger-ui .na7-m{margin:-16rem}.swagger-ui .nl1-m{margin-left:-.25rem}.swagger-ui .nl2-m{margin-left:-.5rem}.swagger-ui .nl3-m{margin-left:-1rem}.swagger-ui .nl4-m{margin-left:-2rem}.swagger-ui .nl5-m{margin-left:-4rem}.swagger-ui .nl6-m{margin-left:-8rem}.swagger-ui .nl7-m{margin-left:-16rem}.swagger-ui .nr1-m{margin-right:-.25rem}.swagger-ui .nr2-m{margin-right:-.5rem}.swagger-ui .nr3-m{margin-right:-1rem}.swagger-ui .nr4-m{margin-right:-2rem}.swagger-ui .nr5-m{margin-right:-4rem}.swagger-ui .nr6-m{margin-right:-8rem}.swagger-ui .nr7-m{margin-right:-16rem}.swagger-ui .nb1-m{margin-bottom:-.25rem}.swagger-ui .nb2-m{margin-bottom:-.5rem}.swagger-ui .nb3-m{margin-bottom:-1rem}.swagger-ui .nb4-m{margin-bottom:-2rem}.swagger-ui .nb5-m{margin-bottom:-4rem}.swagger-ui .nb6-m{margin-bottom:-8rem}.swagger-ui .nb7-m{margin-bottom:-16rem}.swagger-ui .nt1-m{margin-top:-.25rem}.swagger-ui .nt2-m{margin-top:-.5rem}.swagger-ui .nt3-m{margin-top:-1rem}.swagger-ui .nt4-m{margin-top:-2rem}.swagger-ui .nt5-m{margin-top:-4rem}.swagger-ui .nt6-m{margin-top:-8rem}.swagger-ui .nt7-m{margin-top:-16rem}}@media screen and (min-width:60em){.swagger-ui .na1-l{margin:-.25rem}.swagger-ui .na2-l{margin:-.5rem}.swagger-ui .na3-l{margin:-1rem}.swagger-ui .na4-l{margin:-2rem}.swagger-ui .na5-l{margin:-4rem}.swagger-ui .na6-l{margin:-8rem}.swagger-ui .na7-l{margin:-16rem}.swagger-ui .nl1-l{margin-left:-.25rem}.swagger-ui .nl2-l{margin-left:-.5rem}.swagger-ui .nl3-l{margin-left:-1rem}.swagger-ui .nl4-l{margin-left:-2rem}.swagger-ui .nl5-l{margin-left:-4rem}.swagger-ui .nl6-l{margin-left:-8rem}.swagger-ui .nl7-l{margin-left:-16rem}.swagger-ui .nr1-l{margin-right:-.25rem}.swagger-ui .nr2-l{margin-right:-.5rem}.swagger-ui .nr3-l{margin-right:-1rem}.swagger-ui .nr4-l{margin-right:-2rem}.swagger-ui .nr5-l{margin-right:-4rem}.swagger-ui .nr6-l{margin-right:-8rem}.swagger-ui .nr7-l{margin-right:-16rem}.swagger-ui .nb1-l{margin-bottom:-.25rem}.swagger-ui .nb2-l{margin-bottom:-.5rem}.swagger-ui .nb3-l{margin-bottom:-1rem}.swagger-ui .nb4-l{margin-bottom:-2rem}.swagger-ui .nb5-l{margin-bottom:-4rem}.swagger-ui .nb6-l{margin-bottom:-8rem}.swagger-ui .nb7-l{margin-bottom:-16rem}.swagger-ui .nt1-l{margin-top:-.25rem}.swagger-ui .nt2-l{margin-top:-.5rem}.swagger-ui .nt3-l{margin-top:-1rem}.swagger-ui .nt4-l{margin-top:-2rem}.swagger-ui .nt5-l{margin-top:-4rem}.swagger-ui .nt6-l{margin-top:-8rem}.swagger-ui .nt7-l{margin-top:-16rem}}.swagger-ui .collapse{border-collapse:collapse;border-spacing:0}.swagger-ui .striped--light-silver:nth-child(odd){background-color:#aaa}.swagger-ui .striped--moon-gray:nth-child(odd){background-color:#ccc}.swagger-ui .striped--light-gray:nth-child(odd){background-color:#eee}.swagger-ui .striped--near-white:nth-child(odd){background-color:#f4f4f4}.swagger-ui .stripe-light:nth-child(odd){background-color:hsla(0,0%,100%,.1)}.swagger-ui .stripe-dark:nth-child(odd){background-color:rgba(0,0,0,.1)}.swagger-ui .strike{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .underline{-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .no-underline{-webkit-text-decoration:none;text-decoration:none}@media screen and (min-width:30em){.swagger-ui .strike-ns{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .underline-ns{-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .no-underline-ns{-webkit-text-decoration:none;text-decoration:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .strike-m{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .underline-m{-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .no-underline-m{-webkit-text-decoration:none;text-decoration:none}}@media screen and (min-width:60em){.swagger-ui .strike-l{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .underline-l{-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .no-underline-l{-webkit-text-decoration:none;text-decoration:none}}.swagger-ui .tl{text-align:left}.swagger-ui .tr{text-align:right}.swagger-ui .tc{text-align:center}.swagger-ui .tj{text-align:justify}@media screen and (min-width:30em){.swagger-ui .tl-ns{text-align:left}.swagger-ui .tr-ns{text-align:right}.swagger-ui .tc-ns{text-align:center}.swagger-ui .tj-ns{text-align:justify}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .tl-m{text-align:left}.swagger-ui .tr-m{text-align:right}.swagger-ui .tc-m{text-align:center}.swagger-ui .tj-m{text-align:justify}}@media screen and (min-width:60em){.swagger-ui .tl-l{text-align:left}.swagger-ui .tr-l{text-align:right}.swagger-ui .tc-l{text-align:center}.swagger-ui .tj-l{text-align:justify}}.swagger-ui .ttc{text-transform:capitalize}.swagger-ui .ttl{text-transform:lowercase}.swagger-ui .ttu{text-transform:uppercase}.swagger-ui .ttn{text-transform:none}@media screen and (min-width:30em){.swagger-ui .ttc-ns{text-transform:capitalize}.swagger-ui .ttl-ns{text-transform:lowercase}.swagger-ui .ttu-ns{text-transform:uppercase}.swagger-ui .ttn-ns{text-transform:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .ttc-m{text-transform:capitalize}.swagger-ui .ttl-m{text-transform:lowercase}.swagger-ui .ttu-m{text-transform:uppercase}.swagger-ui .ttn-m{text-transform:none}}@media screen and (min-width:60em){.swagger-ui .ttc-l{text-transform:capitalize}.swagger-ui .ttl-l{text-transform:lowercase}.swagger-ui .ttu-l{text-transform:uppercase}.swagger-ui .ttn-l{text-transform:none}}.swagger-ui .f-6,.swagger-ui .f-headline{font-size:6rem}.swagger-ui .f-5,.swagger-ui .f-subheadline{font-size:5rem}.swagger-ui .f1{font-size:3rem}.swagger-ui .f2{font-size:2.25rem}.swagger-ui .f3{font-size:1.5rem}.swagger-ui .f4{font-size:1.25rem}.swagger-ui .f5{font-size:1rem}.swagger-ui .f6{font-size:.875rem}.swagger-ui .f7{font-size:.75rem}@media screen and (min-width:30em){.swagger-ui .f-6-ns,.swagger-ui .f-headline-ns{font-size:6rem}.swagger-ui .f-5-ns,.swagger-ui .f-subheadline-ns{font-size:5rem}.swagger-ui .f1-ns{font-size:3rem}.swagger-ui .f2-ns{font-size:2.25rem}.swagger-ui .f3-ns{font-size:1.5rem}.swagger-ui .f4-ns{font-size:1.25rem}.swagger-ui .f5-ns{font-size:1rem}.swagger-ui .f6-ns{font-size:.875rem}.swagger-ui .f7-ns{font-size:.75rem}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .f-6-m,.swagger-ui .f-headline-m{font-size:6rem}.swagger-ui .f-5-m,.swagger-ui .f-subheadline-m{font-size:5rem}.swagger-ui .f1-m{font-size:3rem}.swagger-ui .f2-m{font-size:2.25rem}.swagger-ui .f3-m{font-size:1.5rem}.swagger-ui .f4-m{font-size:1.25rem}.swagger-ui .f5-m{font-size:1rem}.swagger-ui .f6-m{font-size:.875rem}.swagger-ui .f7-m{font-size:.75rem}}@media screen and (min-width:60em){.swagger-ui .f-6-l,.swagger-ui .f-headline-l{font-size:6rem}.swagger-ui .f-5-l,.swagger-ui .f-subheadline-l{font-size:5rem}.swagger-ui .f1-l{font-size:3rem}.swagger-ui .f2-l{font-size:2.25rem}.swagger-ui .f3-l{font-size:1.5rem}.swagger-ui .f4-l{font-size:1.25rem}.swagger-ui .f5-l{font-size:1rem}.swagger-ui .f6-l{font-size:.875rem}.swagger-ui .f7-l{font-size:.75rem}}.swagger-ui .measure{max-width:30em}.swagger-ui .measure-wide{max-width:34em}.swagger-ui .measure-narrow{max-width:20em}.swagger-ui .indent{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media screen and (min-width:30em){.swagger-ui .measure-ns{max-width:30em}.swagger-ui .measure-wide-ns{max-width:34em}.swagger-ui .measure-narrow-ns{max-width:20em}.swagger-ui .indent-ns{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-ns{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-ns{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .measure-m{max-width:30em}.swagger-ui .measure-wide-m{max-width:34em}.swagger-ui .measure-narrow-m{max-width:20em}.swagger-ui .indent-m{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-m{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-m{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media screen and (min-width:60em){.swagger-ui .measure-l{max-width:30em}.swagger-ui .measure-wide-l{max-width:34em}.swagger-ui .measure-narrow-l{max-width:20em}.swagger-ui .indent-l{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-l{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-l{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}.swagger-ui .overflow-container{overflow-y:scroll}.swagger-ui .center{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto{margin-right:auto}.swagger-ui .ml-auto{margin-left:auto}@media screen and (min-width:30em){.swagger-ui .center-ns{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-ns{margin-right:auto}.swagger-ui .ml-auto-ns{margin-left:auto}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .center-m{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-m{margin-right:auto}.swagger-ui .ml-auto-m{margin-left:auto}}@media screen and (min-width:60em){.swagger-ui .center-l{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-l{margin-right:auto}.swagger-ui .ml-auto-l{margin-left:auto}}.swagger-ui .clip{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}@media screen and (min-width:30em){.swagger-ui .clip-ns{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .clip-m{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}@media screen and (min-width:60em){.swagger-ui .clip-l{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}.swagger-ui .ws-normal{white-space:normal}.swagger-ui .nowrap{white-space:nowrap}.swagger-ui .pre{white-space:pre}@media screen and (min-width:30em){.swagger-ui .ws-normal-ns{white-space:normal}.swagger-ui .nowrap-ns{white-space:nowrap}.swagger-ui .pre-ns{white-space:pre}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .ws-normal-m{white-space:normal}.swagger-ui .nowrap-m{white-space:nowrap}.swagger-ui .pre-m{white-space:pre}}@media screen and (min-width:60em){.swagger-ui .ws-normal-l{white-space:normal}.swagger-ui .nowrap-l{white-space:nowrap}.swagger-ui .pre-l{white-space:pre}}.swagger-ui .v-base{vertical-align:baseline}.swagger-ui .v-mid{vertical-align:middle}.swagger-ui .v-top{vertical-align:top}.swagger-ui .v-btm{vertical-align:bottom}@media screen and (min-width:30em){.swagger-ui .v-base-ns{vertical-align:baseline}.swagger-ui .v-mid-ns{vertical-align:middle}.swagger-ui .v-top-ns{vertical-align:top}.swagger-ui .v-btm-ns{vertical-align:bottom}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .v-base-m{vertical-align:baseline}.swagger-ui .v-mid-m{vertical-align:middle}.swagger-ui .v-top-m{vertical-align:top}.swagger-ui .v-btm-m{vertical-align:bottom}}@media screen and (min-width:60em){.swagger-ui .v-base-l{vertical-align:baseline}.swagger-ui .v-mid-l{vertical-align:middle}.swagger-ui .v-top-l{vertical-align:top}.swagger-ui .v-btm-l{vertical-align:bottom}}.swagger-ui .dim{opacity:1;transition:opacity .15s ease-in}.swagger-ui .dim:focus,.swagger-ui .dim:hover{opacity:.5;transition:opacity .15s ease-in}.swagger-ui .dim:active{opacity:.8;transition:opacity .15s ease-out}.swagger-ui .glow{transition:opacity .15s ease-in}.swagger-ui .glow:focus,.swagger-ui .glow:hover{opacity:1;transition:opacity .15s ease-in}.swagger-ui .hide-child .child{opacity:0;transition:opacity .15s ease-in}.swagger-ui .hide-child:active .child,.swagger-ui .hide-child:focus .child,.swagger-ui .hide-child:hover .child{opacity:1;transition:opacity .15s ease-in}.swagger-ui .underline-hover:focus,.swagger-ui .underline-hover:hover{-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .grow{-moz-osx-font-smoothing:grayscale;backface-visibility:hidden;transform:translateZ(0);transition:transform .25s ease-out}.swagger-ui .grow:focus,.swagger-ui .grow:hover{transform:scale(1.05)}.swagger-ui .grow:active{transform:scale(.9)}.swagger-ui .grow-large{-moz-osx-font-smoothing:grayscale;backface-visibility:hidden;transform:translateZ(0);transition:transform .25s ease-in-out}.swagger-ui .grow-large:focus,.swagger-ui .grow-large:hover{transform:scale(1.2)}.swagger-ui .grow-large:active{transform:scale(.95)}.swagger-ui .pointer:hover{cursor:pointer}.swagger-ui .shadow-hover{cursor:pointer;position:relative;transition:all .5s cubic-bezier(.165,.84,.44,1)}.swagger-ui .shadow-hover:after{border-radius:inherit;box-shadow:0 0 16px 2px rgba(0,0,0,.2);content:"";height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .5s cubic-bezier(.165,.84,.44,1);width:100%;z-index:-1}.swagger-ui .shadow-hover:focus:after,.swagger-ui .shadow-hover:hover:after{opacity:1}.swagger-ui .bg-animate,.swagger-ui .bg-animate:focus,.swagger-ui .bg-animate:hover{transition:background-color .15s ease-in-out}.swagger-ui .z-0{z-index:0}.swagger-ui .z-1{z-index:1}.swagger-ui .z-2{z-index:2}.swagger-ui .z-3{z-index:3}.swagger-ui .z-4{z-index:4}.swagger-ui .z-5{z-index:5}.swagger-ui .z-999{z-index:999}.swagger-ui .z-9999{z-index:9999}.swagger-ui .z-max{z-index:2147483647}.swagger-ui .z-inherit{z-index:inherit}.swagger-ui .z-initial,.swagger-ui .z-unset{z-index:auto}.swagger-ui .nested-copy-line-height ol,.swagger-ui .nested-copy-line-height p,.swagger-ui .nested-copy-line-height ul{line-height:1.5}.swagger-ui .nested-headline-line-height h1,.swagger-ui .nested-headline-line-height h2,.swagger-ui .nested-headline-line-height h3,.swagger-ui .nested-headline-line-height h4,.swagger-ui .nested-headline-line-height h5,.swagger-ui .nested-headline-line-height h6{line-height:1.25}.swagger-ui .nested-list-reset ol,.swagger-ui .nested-list-reset ul{list-style-type:none;margin-left:0;padding-left:0}.swagger-ui .nested-copy-indent p+p{margin-bottom:0;margin-top:0;text-indent:.1em}.swagger-ui .nested-copy-seperator p+p{margin-top:1.5em}.swagger-ui .nested-img img{display:block;max-width:100%;width:100%}.swagger-ui .nested-links a{color:#357edd;transition:color .15s ease-in}.swagger-ui .nested-links a:focus,.swagger-ui .nested-links a:hover{color:#96ccff;transition:color .15s ease-in}.swagger-ui .wrapper{box-sizing:border-box;margin:0 auto;max-width:1460px;padding:0 20px;width:100%}.swagger-ui .opblock-tag-section{display:flex;flex-direction:column}.swagger-ui .try-out.btn-group{display:flex;flex:.1 2 auto;padding:0}.swagger-ui .try-out__btn{margin-left:1.25rem}.swagger-ui .opblock-tag{align-items:center;border-bottom:1px solid rgba(59,65,81,.3);cursor:pointer;display:flex;padding:10px 20px 10px 10px;transition:all .2s}.swagger-ui .opblock-tag:hover{background:rgba(0,0,0,.02)}.swagger-ui .opblock-tag{color:#3b4151;font-family:sans-serif;font-size:24px;margin:0 0 5px}.swagger-ui .opblock-tag.no-desc span{flex:1}.swagger-ui .opblock-tag svg{transition:all .4s}.swagger-ui .opblock-tag small{color:#3b4151;flex:2;font-family:sans-serif;font-size:14px;font-weight:400;padding:0 10px}.swagger-ui .opblock-tag>div{flex:1 1 150px;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(max-width:640px){.swagger-ui .opblock-tag small,.swagger-ui .opblock-tag>div{flex:1}}.swagger-ui .opblock-tag .info__externaldocs{text-align:right}.swagger-ui .parameter__type{color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;padding:5px 0}.swagger-ui .parameter-controls{margin-top:.75em}.swagger-ui .examples__title{display:block;font-size:1.1em;font-weight:700;margin-bottom:.75em}.swagger-ui .examples__section{margin-top:1.5em}.swagger-ui .examples__section-header{font-size:.9rem;font-weight:700;margin-bottom:.5rem}.swagger-ui .examples-select{display:inline-block;margin-bottom:.75em}.swagger-ui .examples-select .examples-select-element{width:100%}.swagger-ui .examples-select__section-label{font-size:.9rem;font-weight:700;margin-right:.5rem}.swagger-ui .example__section{margin-top:1.5em}.swagger-ui .example__section-header{font-size:.9rem;font-weight:700;margin-bottom:.5rem}.swagger-ui .view-line-link{cursor:pointer;margin:0 5px;position:relative;top:3px;transition:all .5s;width:20px}.swagger-ui .opblock{border:1px solid #000;border-radius:4px;box-shadow:0 0 3px rgba(0,0,0,.19);margin:0 0 15px}.swagger-ui .opblock .tab-header{display:flex;flex:1}.swagger-ui .opblock .tab-header .tab-item{cursor:pointer;padding:0 40px}.swagger-ui .opblock .tab-header .tab-item:first-of-type{padding:0 40px 0 0}.swagger-ui .opblock .tab-header .tab-item.active h4 span{position:relative}.swagger-ui .opblock .tab-header .tab-item.active h4 span:after{background:gray;bottom:-15px;content:"";height:4px;left:50%;position:absolute;transform:translateX(-50%);width:120%}.swagger-ui .opblock.is-open .opblock-summary{border-bottom:1px solid #000}.swagger-ui .opblock .opblock-section-header{align-items:center;background:hsla(0,0%,100%,.8);box-shadow:0 1px 2px rgba(0,0,0,.1);display:flex;min-height:50px;padding:8px 20px}.swagger-ui .opblock .opblock-section-header>label{align-items:center;color:#3b4151;display:flex;font-family:sans-serif;font-size:12px;font-weight:700;margin:0 0 0 auto}.swagger-ui .opblock .opblock-section-header>label>span{padding:0 10px 0 0}.swagger-ui .opblock .opblock-section-header h4{color:#3b4151;flex:1;font-family:sans-serif;font-size:14px;margin:0}.swagger-ui .opblock .opblock-summary-method{background:#000;border-radius:3px;color:#fff;font-family:sans-serif;font-size:14px;font-weight:700;min-width:80px;padding:6px 0;text-align:center;text-shadow:0 1px 0 rgba(0,0,0,.1)}@media(max-width:768px){.swagger-ui .opblock .opblock-summary-method{font-size:12px}}.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{align-items:center;color:#3b4151;display:flex;font-family:monospace;font-size:16px;font-weight:600;word-break:break-word}@media(max-width:768px){.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:12px}}.swagger-ui .opblock .opblock-summary-path{flex-shrink:1}@media(max-width:640px){.swagger-ui .opblock .opblock-summary-path{max-width:100%}}.swagger-ui .opblock .opblock-summary-path__deprecated{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .opblock .opblock-summary-operation-id{font-size:14px}.swagger-ui .opblock .opblock-summary-description{color:#3b4151;font-family:sans-serif;font-size:13px;word-break:break-word}.swagger-ui .opblock .opblock-summary-path-description-wrapper{align-items:center;display:flex;flex-direction:row;flex-wrap:wrap;gap:0 10px;padding:0 10px;width:100%}@media(max-width:550px){.swagger-ui .opblock .opblock-summary-path-description-wrapper{align-items:flex-start;flex-direction:column}}.swagger-ui .opblock .opblock-summary{align-items:center;cursor:pointer;display:flex;padding:5px}.swagger-ui .opblock .opblock-summary .view-line-link{cursor:pointer;margin:0;position:relative;top:2px;transition:all .5s;width:0}.swagger-ui .opblock .opblock-summary:hover .view-line-link{margin:0 5px;width:18px}.swagger-ui .opblock .opblock-summary:hover .view-line-link.copy-to-clipboard{width:24px}.swagger-ui .opblock.opblock-post{background:rgba(73,204,144,.1);border-color:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary-method{background:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary{border-color:#49cc90}.swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span:after{background:#49cc90}.swagger-ui .opblock.opblock-put{background:rgba(252,161,48,.1);border-color:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary-method{background:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary{border-color:#fca130}.swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span:after{background:#fca130}.swagger-ui .opblock.opblock-delete{background:rgba(249,62,62,.1);border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary{border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span:after{background:#f93e3e}.swagger-ui .opblock.opblock-get{background:rgba(97,175,254,.1);border-color:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary-method{background:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary{border-color:#61affe}.swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span:after{background:#61affe}.swagger-ui .opblock.opblock-patch{background:rgba(80,227,194,.1);border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary{border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span:after{background:#50e3c2}.swagger-ui .opblock.opblock-head{background:rgba(144,18,254,.1);border-color:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary-method{background:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary{border-color:#9012fe}.swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span:after{background:#9012fe}.swagger-ui .opblock.opblock-options{background:rgba(13,90,167,.1);border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary-method{background:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary{border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span:after{background:#0d5aa7}.swagger-ui .opblock.opblock-deprecated{background:hsla(0,0%,92%,.1);border-color:#ebebeb;opacity:.6}.swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#ebebeb}.swagger-ui .opblock.opblock-deprecated .opblock-summary{border-color:#ebebeb}.swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span:after{background:#ebebeb}.swagger-ui .opblock .opblock-schemes{padding:8px 20px}.swagger-ui .opblock .opblock-schemes .schemes-title{padding:0 10px 0 0}.swagger-ui .filter .operation-filter-input{border:2px solid #d8dde7;margin:20px 0;padding:10px;width:100%}.swagger-ui .download-url-wrapper .failed,.swagger-ui .filter .failed{color:red}.swagger-ui .download-url-wrapper .loading,.swagger-ui .filter .loading{color:#aaa}.swagger-ui .model-example{margin-top:1em}.swagger-ui .tab{display:flex;list-style:none;padding:0}.swagger-ui .tab li{color:#3b4151;cursor:pointer;font-family:sans-serif;font-size:12px;min-width:60px;padding:0}.swagger-ui .tab li:first-of-type{padding-left:0;padding-right:12px;position:relative}.swagger-ui .tab li:first-of-type:after{background:rgba(0,0,0,.2);content:"";height:100%;position:absolute;right:6px;top:0;width:1px}.swagger-ui .tab li.active{font-weight:700}.swagger-ui .tab li button.tablinks{background:none;border:0;color:inherit;font-family:inherit;font-weight:inherit;padding:0}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-external-docs-wrapper,.swagger-ui .opblock-title_normal{color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px;padding:15px 20px}.swagger-ui .opblock-description-wrapper h4,.swagger-ui .opblock-external-docs-wrapper h4,.swagger-ui .opblock-title_normal h4{color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px}.swagger-ui .opblock-description-wrapper p,.swagger-ui .opblock-external-docs-wrapper p,.swagger-ui .opblock-title_normal p{color:#3b4151;font-family:sans-serif;font-size:14px;margin:0}.swagger-ui .opblock-external-docs-wrapper h4{padding-left:0}.swagger-ui .execute-wrapper{padding:20px;text-align:right}.swagger-ui .execute-wrapper .btn{padding:8px 40px;width:100%}.swagger-ui .body-param-options{display:flex;flex-direction:column}.swagger-ui .body-param-options .body-param-edit{padding:10px 0}.swagger-ui .body-param-options label{padding:8px 0}.swagger-ui .body-param-options label select{margin:3px 0 0}.swagger-ui .responses-inner{padding:20px}.swagger-ui .responses-inner h4,.swagger-ui .responses-inner h5{color:#3b4151;font-family:sans-serif;font-size:12px;margin:10px 0 5px}.swagger-ui .responses-inner .curl{max-height:400px;min-height:6em;overflow-y:auto}.swagger-ui .response-col_status{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .response-col_status .response-undocumented{color:#909090;font-family:monospace;font-size:11px;font-weight:600}.swagger-ui .response-col_links{color:#3b4151;font-family:sans-serif;font-size:14px;max-width:40em;padding-left:2em}.swagger-ui .response-col_links .response-undocumented{color:#909090;font-family:monospace;font-size:11px;font-weight:600}.swagger-ui .response-col_links .operation-link{margin-bottom:1.5em}.swagger-ui .response-col_links .operation-link .description{margin-bottom:.5em}.swagger-ui .opblock-body .opblock-loading-animation{display:block;margin:3em auto}.swagger-ui .opblock-body pre.microlight{background:#333;border-radius:4px;font-size:12px;-webkit-hyphens:auto;hyphens:auto;margin:0;padding:10px;white-space:pre-wrap;word-break:break-all;word-break:break-word;word-wrap:break-word;color:#fff;font-family:monospace;font-weight:600}.swagger-ui .opblock-body pre.microlight .headerline{display:block}.swagger-ui .highlight-code{position:relative}.swagger-ui .highlight-code>.microlight{max-height:400px;min-height:6em;overflow-y:auto}.swagger-ui .highlight-code>.microlight code{white-space:pre-wrap!important;word-break:break-all}.swagger-ui .curl-command{position:relative}.swagger-ui .download-contents{align-items:center;background:#7d8293;border:none;border-radius:4px;bottom:10px;color:#fff;display:flex;font-family:sans-serif;font-size:14px;font-weight:600;height:30px;justify-content:center;padding:5px;position:absolute;right:10px;text-align:center}.swagger-ui .scheme-container{background:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.15);margin:0 0 20px;padding:30px 0}.swagger-ui .scheme-container .schemes{align-items:flex-end;display:flex;flex-wrap:wrap;gap:10px;justify-content:space-between}.swagger-ui .scheme-container .schemes>.schemes-server-container{display:flex;flex-wrap:wrap;gap:10px}.swagger-ui .scheme-container .schemes>.schemes-server-container>label{color:#3b4151;display:flex;flex-direction:column;font-family:sans-serif;font-size:12px;font-weight:700;margin:-20px 15px 0 0}.swagger-ui .scheme-container .schemes>.schemes-server-container>label select{min-width:130px;text-transform:uppercase}.swagger-ui .scheme-container .schemes:not(:has(.schemes-server-container)){justify-content:flex-end}.swagger-ui .scheme-container .schemes .auth-wrapper{flex:none;justify-content:start}.swagger-ui .scheme-container .schemes .auth-wrapper .authorize{display:flex;flex-wrap:nowrap;margin:0;padding-right:20px}.swagger-ui .loading-container{align-items:center;display:flex;flex-direction:column;justify-content:center;margin-top:1em;min-height:1px;padding:40px 0 60px}.swagger-ui .loading-container .loading{position:relative}.swagger-ui .loading-container .loading:after{color:#3b4151;content:"loading";font-family:sans-serif;font-size:10px;font-weight:700;left:50%;position:absolute;text-transform:uppercase;top:50%;transform:translate(-50%,-50%)}.swagger-ui .loading-container .loading:before{animation:rotation 1s linear infinite,opacity .5s;backface-visibility:hidden;border:2px solid rgba(85,85,85,.1);border-radius:100%;border-top-color:rgba(0,0,0,.6);content:"";display:block;height:60px;left:50%;margin:-30px;opacity:1;position:absolute;top:50%;width:60px}@keyframes rotation{to{transform:rotate(1turn)}}.swagger-ui .response-controls{display:flex;padding-top:1em}.swagger-ui .response-control-media-type{margin-right:1em}.swagger-ui .response-control-media-type--accept-controller select{border-color:green}.swagger-ui .response-control-media-type__accept-message{color:green;font-size:.7em}.swagger-ui .response-control-examples__title,.swagger-ui .response-control-media-type__title{display:block;font-size:.7em;margin-bottom:.2em}@keyframes blinker{50%{opacity:0}}.swagger-ui .hidden{display:none}.swagger-ui .no-margin{border:none;height:auto;margin:0;padding:0}.swagger-ui .float-right{float:right}.swagger-ui .svg-assets{height:0;position:absolute;width:0}.swagger-ui section h3{color:#3b4151;font-family:sans-serif}.swagger-ui a.nostyle{display:inline}.swagger-ui a.nostyle,.swagger-ui a.nostyle:visited{color:inherit;cursor:pointer;text-decoration:inherit}.swagger-ui .fallback{color:#aaa;padding:1em}.swagger-ui .version-pragma{height:100%;padding:5em 0}.swagger-ui .version-pragma__message{display:flex;font-size:1.2em;height:100%;justify-content:center;line-height:1.5em;padding:0 .6em;text-align:center}.swagger-ui .version-pragma__message>div{flex:1;max-width:55ch}.swagger-ui .version-pragma__message code{background-color:#dedede;padding:4px 4px 2px;white-space:pre}.swagger-ui .opblock-link{font-weight:400}.swagger-ui .opblock-link.shown{font-weight:700}.swagger-ui span.token-string{color:#555}.swagger-ui span.token-not-formatted{color:#555;font-weight:700}.swagger-ui .btn{background:transparent;border:2px solid gray;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.1);color:#3b4151;font-family:sans-serif;font-size:14px;font-weight:700;padding:5px 23px;transition:all .3s}.swagger-ui .btn.btn-sm{font-size:12px;padding:4px 23px}.swagger-ui .btn[disabled]{cursor:not-allowed;opacity:.3}.swagger-ui .btn:hover{box-shadow:0 0 5px rgba(0,0,0,.3)}.swagger-ui .btn.cancel{background-color:transparent;border-color:#ff6060;color:#ff6060;font-family:sans-serif}.swagger-ui .btn.authorize{background-color:transparent;border-color:#49cc90;color:#49cc90;display:inline;line-height:1}.swagger-ui .btn.authorize span{float:left;padding:4px 20px 0 0}.swagger-ui .btn.authorize svg{fill:#49cc90}.swagger-ui .btn.execute{background-color:#4990e2;border-color:#4990e2;color:#fff}.swagger-ui .btn-group{display:flex;padding:30px}.swagger-ui .btn-group .btn{flex:1}.swagger-ui .btn-group .btn:first-child{border-radius:4px 0 0 4px}.swagger-ui .btn-group .btn:last-child{border-radius:0 4px 4px 0}.swagger-ui .authorization__btn{background:none;border:none;padding:0 0 0 10px}.swagger-ui .authorization__btn .locked{opacity:1}.swagger-ui .authorization__btn .unlocked{opacity:.4}.swagger-ui .model-box-control,.swagger-ui .models-control,.swagger-ui .opblock-summary-control{all:inherit;border-bottom:0;cursor:pointer;flex:1;padding:0}.swagger-ui .model-box-control:focus,.swagger-ui .models-control:focus,.swagger-ui .opblock-summary-control:focus{outline:auto}.swagger-ui .expand-methods,.swagger-ui .expand-operation{background:none;border:none}.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg{height:20px;width:20px}.swagger-ui .expand-methods{padding:0 10px}.swagger-ui .expand-methods:hover svg{fill:#404040}.swagger-ui .expand-methods svg{transition:all .3s;fill:#707070}.swagger-ui button{cursor:pointer}.swagger-ui button.invalid{animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui .copy-to-clipboard{align-items:center;background:#7d8293;border:none;border-radius:4px;bottom:10px;display:flex;height:30px;justify-content:center;position:absolute;right:100px;width:30px}.swagger-ui .copy-to-clipboard button{background:url("data:image/svg+xml;charset=utf-8,") 50% no-repeat;border:none;flex-grow:1;flex-shrink:1;height:25px}.swagger-ui .copy-to-clipboard:active{background:#5e626f}.swagger-ui .opblock-control-arrow{background:none;border:none;text-align:center}.swagger-ui .curl-command .copy-to-clipboard{bottom:5px;height:20px;right:10px;width:20px}.swagger-ui .curl-command .copy-to-clipboard button{height:18px}.swagger-ui .opblock .opblock-summary .view-line-link.copy-to-clipboard{height:26px;position:static}.swagger-ui select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#f7f7f7 url("data:image/svg+xml;charset=utf-8,") right 10px center no-repeat;background-size:20px;border:2px solid #41444e;border-radius:4px;box-shadow:0 1px 2px 0 rgba(0,0,0,.25);color:#3b4151;font-family:sans-serif;font-size:14px;font-weight:700;padding:5px 40px 5px 10px}.swagger-ui select[multiple]{background:#f7f7f7;margin:5px 0;padding:5px}.swagger-ui select.invalid{animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui .opblock-body select{min-width:230px}@media(max-width:768px){.swagger-ui .opblock-body select{min-width:180px}}@media(max-width:640px){.swagger-ui .opblock-body select{min-width:100%;width:100%}}.swagger-ui label{color:#3b4151;font-family:sans-serif;font-size:12px;font-weight:700;margin:0 0 5px}.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text]{line-height:1}@media(max-width:768px){.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text]{max-width:175px}}.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text],.swagger-ui textarea{background:#fff;border:1px solid #d9d9d9;border-radius:4px;margin:5px 0;min-width:100px;padding:8px 10px}.swagger-ui input[type=email].invalid,.swagger-ui input[type=file].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid,.swagger-ui textarea.invalid{animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui input[disabled],.swagger-ui select[disabled],.swagger-ui textarea[disabled]{background-color:#fafafa;color:#888;cursor:not-allowed}.swagger-ui select[disabled]{border-color:#888}.swagger-ui textarea[disabled]{background-color:#41444e;color:#fff}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}.swagger-ui textarea{background:hsla(0,0%,100%,.8);border:none;border-radius:4px;color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;min-height:280px;outline:none;padding:10px;width:100%}.swagger-ui textarea:focus{border:2px solid #61affe}.swagger-ui textarea.curl{background:#41444e;border-radius:4px;color:#fff;font-family:monospace;font-size:12px;font-weight:600;margin:0;min-height:100px;padding:10px;resize:none}.swagger-ui .checkbox{color:#303030;padding:5px 0 10px;transition:opacity .5s}.swagger-ui .checkbox label{display:flex}.swagger-ui .checkbox p{color:#3b4151;font-family:monospace;font-style:italic;font-weight:400!important;font-weight:600;margin:0!important}.swagger-ui .checkbox input[type=checkbox]{display:none}.swagger-ui .checkbox input[type=checkbox]+label>.item{background:#e8e8e8;border-radius:1px;box-shadow:0 0 0 2px #e8e8e8;cursor:pointer;display:inline-block;flex:none;height:16px;margin:0 8px 0 0;padding:5px;position:relative;top:3px;width:16px}.swagger-ui .checkbox input[type=checkbox]+label>.item:active{transform:scale(.9)}.swagger-ui .checkbox input[type=checkbox]:checked+label>.item{background:#e8e8e8 url("data:image/svg+xml;charset=utf-8,") 50% no-repeat}.swagger-ui .dialog-ux{bottom:0;left:0;position:fixed;right:0;top:0;z-index:9999}.swagger-ui .dialog-ux .backdrop-ux{background:rgba(0,0,0,.8);bottom:0;left:0;position:fixed;right:0;top:0}.swagger-ui .dialog-ux .modal-ux{background:#fff;border:1px solid #ebebeb;border-radius:4px;box-shadow:0 10px 30px 0 rgba(0,0,0,.2);left:50%;max-width:650px;min-width:300px;position:absolute;top:50%;transform:translate(-50%,-50%);width:100%;z-index:9999}.swagger-ui .dialog-ux .modal-ux-content{max-height:540px;overflow-y:auto;padding:20px}.swagger-ui .dialog-ux .modal-ux-content p{color:#41444e;color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px}.swagger-ui .dialog-ux .modal-ux-content h4{color:#3b4151;font-family:sans-serif;font-size:18px;font-weight:600;margin:15px 0 0}.swagger-ui .dialog-ux .modal-ux-header{align-items:center;border-bottom:1px solid #ebebeb;display:flex;padding:12px 0}.swagger-ui .dialog-ux .modal-ux-header .close-modal{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:none;padding:0 10px}.swagger-ui .dialog-ux .modal-ux-header h3{color:#3b4151;flex:1;font-family:sans-serif;font-size:20px;font-weight:600;margin:0;padding:0 20px}.swagger-ui .model{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300;font-weight:600}.swagger-ui .model .deprecated span,.swagger-ui .model .deprecated td{color:#a0a0a0!important}.swagger-ui .model .deprecated>td:first-of-type{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .model-toggle{cursor:pointer;display:inline-block;font-size:10px;margin:auto .3em;position:relative;top:6px;transform:rotate(90deg);transform-origin:50% 50%;transition:transform .15s ease-in}.swagger-ui .model-toggle.collapsed{transform:rotate(0deg)}.swagger-ui .model-toggle:after{background:url("data:image/svg+xml;charset=utf-8,") 50% no-repeat;background-size:100%;content:"";display:block;height:20px;width:20px}.swagger-ui .model-jump-to-path{cursor:pointer;position:relative}.swagger-ui .model-jump-to-path .view-line-link{cursor:pointer;position:absolute;top:-.4em}.swagger-ui .model-title{position:relative}.swagger-ui .model-title:hover .model-hint{visibility:visible}.swagger-ui .model-hint{background:rgba(0,0,0,.7);border-radius:4px;color:#ebebeb;padding:.1em .5em;position:absolute;top:-1.8em;visibility:hidden;white-space:nowrap}.swagger-ui .model p{margin:0 0 1em}.swagger-ui .model .property{color:#999;font-style:italic}.swagger-ui .model .property.primitive{color:#6b6b6b}.swagger-ui .model .external-docs,.swagger-ui table.model tr.description{color:#666;font-weight:400}.swagger-ui table.model tr.description td:first-child,.swagger-ui table.model tr.property-row.required td:first-child{font-weight:700}.swagger-ui table.model tr.property-row td{vertical-align:top}.swagger-ui table.model tr.property-row td:first-child{padding-right:.2em}.swagger-ui table.model tr.property-row .star{color:red}.swagger-ui table.model tr.extension{color:#777}.swagger-ui table.model tr.extension td:last-child{vertical-align:top}.swagger-ui table.model tr.external-docs td:first-child{font-weight:700}.swagger-ui table.model tr .renderedMarkdown p:first-child{margin-top:0}.swagger-ui section.models{border:1px solid rgba(59,65,81,.3);border-radius:4px;margin:30px 0}.swagger-ui section.models .pointer{cursor:pointer}.swagger-ui section.models.is-open{padding:0 0 20px}.swagger-ui section.models.is-open h4{border-bottom:1px solid rgba(59,65,81,.3);margin:0 0 5px}.swagger-ui section.models h4{align-items:center;color:#606060;cursor:pointer;display:flex;font-family:sans-serif;font-size:16px;margin:0;padding:10px 20px 10px 10px;transition:all .2s}.swagger-ui section.models h4 svg{transition:all .4s}.swagger-ui section.models h4 span{flex:1}.swagger-ui section.models h4:hover{background:rgba(0,0,0,.02)}.swagger-ui section.models h5{color:#707070;font-family:sans-serif;font-size:16px;margin:0 0 10px}.swagger-ui section.models .model-jump-to-path{position:relative;top:5px}.swagger-ui section.models .model-container{background:rgba(0,0,0,.05);border-radius:4px;margin:0 20px 15px;position:relative;transition:all .5s}.swagger-ui section.models .model-container:hover{background:rgba(0,0,0,.07)}.swagger-ui section.models .model-container:first-of-type{margin:20px}.swagger-ui section.models .model-container:last-of-type{margin:0 20px}.swagger-ui section.models .model-container .models-jump-to-path{opacity:.65;position:absolute;right:5px;top:8px}.swagger-ui section.models .model-box{background:none}.swagger-ui .model-box{background:rgba(0,0,0,.1);border-radius:4px;display:inline-block;padding:10px}.swagger-ui .model-box .model-jump-to-path{position:relative;top:4px}.swagger-ui .model-box.deprecated{opacity:.5}.swagger-ui .model-title{color:#505050;font-family:sans-serif;font-size:16px}.swagger-ui .model-title img{bottom:0;margin-left:1em;position:relative}.swagger-ui .model-deprecated-warning{color:#f93e3e;font-family:sans-serif;font-size:16px;font-weight:600;margin-right:1em}.swagger-ui span>span.model .brace-close{padding:0 0 0 10px}.swagger-ui .prop-name{display:inline-block;margin-right:1em}.swagger-ui .prop-type{color:#55a}.swagger-ui .prop-enum{display:block}.swagger-ui .prop-format{color:#606060}.swagger-ui .servers>label{color:#3b4151;font-family:sans-serif;font-size:12px;margin:-20px 15px 0 0}.swagger-ui .servers>label select{max-width:100%;min-width:130px;width:100%}.swagger-ui .servers h4.message{padding-bottom:2em}.swagger-ui .servers table tr{width:30em}.swagger-ui .servers table td{display:inline-block;max-width:15em;padding-bottom:10px;padding-top:10px;vertical-align:middle}.swagger-ui .servers table td:first-of-type{padding-right:1em}.swagger-ui .servers table td input{height:100%;width:100%}.swagger-ui .servers .computed-url{margin:2em 0}.swagger-ui .servers .computed-url code{display:inline-block;font-size:16px;margin:0 1em;padding:4px}.swagger-ui .servers-title{font-size:12px;font-weight:700}.swagger-ui .operation-servers h4.message{margin-bottom:2em}.swagger-ui table{border-collapse:collapse;padding:0 10px;width:100%}.swagger-ui table.model tbody tr td{padding:0;vertical-align:top}.swagger-ui table.model tbody tr td:first-of-type{padding:0 0 0 2em;width:174px}.swagger-ui table.headers td{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300;font-weight:600;vertical-align:middle}.swagger-ui table.headers .header-example{color:#999;font-style:italic}.swagger-ui table tbody tr td{padding:10px 0 0;vertical-align:top}.swagger-ui table tbody tr td:first-of-type{min-width:6em;padding:10px 0}.swagger-ui table thead tr td,.swagger-ui table thead tr th{border-bottom:1px solid rgba(59,65,81,.2);color:#3b4151;font-family:sans-serif;font-size:12px;font-weight:700;padding:12px 0;text-align:left}.swagger-ui .parameters-col_description{margin-bottom:2em;width:99%}.swagger-ui .parameters-col_description input{max-width:340px;width:100%}.swagger-ui .parameters-col_description select{border-width:1px}.swagger-ui .parameters-col_description .markdown p,.swagger-ui .parameters-col_description .renderedMarkdown p{margin:0}.swagger-ui .parameter__name{color:#3b4151;font-family:sans-serif;font-size:16px;font-weight:400;margin-right:.75em}.swagger-ui .parameter__name.required{font-weight:700}.swagger-ui .parameter__name.required span{color:red}.swagger-ui .parameter__name.required:after{color:rgba(255,0,0,.6);content:"required";font-size:10px;padding:5px;position:relative;top:-6px}.swagger-ui .parameter__extension,.swagger-ui .parameter__in{color:gray;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .parameter__deprecated{color:red;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .parameter__empty_value_toggle{display:block;font-size:13px;padding-bottom:12px;padding-top:5px}.swagger-ui .parameter__empty_value_toggle input{margin-right:7px;width:auto}.swagger-ui .parameter__empty_value_toggle.disabled{opacity:.7}.swagger-ui .table-container{padding:20px}.swagger-ui .response-col_description{width:99%}.swagger-ui .response-col_description .markdown p,.swagger-ui .response-col_description .renderedMarkdown p{margin:0}.swagger-ui .response-col_links{min-width:6em}.swagger-ui .response__extension{color:gray;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .topbar{background-color:#1b1b1b;padding:10px 0}.swagger-ui .topbar .topbar-wrapper{align-items:center;display:flex;flex-wrap:wrap;gap:10px}@media(max-width:550px){.swagger-ui .topbar .topbar-wrapper{align-items:start;flex-direction:column}}.swagger-ui .topbar a{align-items:center;color:#fff;display:flex;flex:1;font-family:sans-serif;font-size:1.5em;font-weight:700;max-width:300px;-webkit-text-decoration:none;text-decoration:none}.swagger-ui .topbar a span{margin:0;padding:0 10px}.swagger-ui .topbar .download-url-wrapper{display:flex;flex:3;justify-content:flex-end}.swagger-ui .topbar .download-url-wrapper input[type=text]{border:2px solid #62a03f;border-radius:4px 0 0 4px;margin:0;max-width:100%;outline:none;width:100%}.swagger-ui .topbar .download-url-wrapper .select-label{align-items:center;color:#f0f0f0;display:flex;margin:0;max-width:600px;width:100%}.swagger-ui .topbar .download-url-wrapper .select-label span{flex:1;font-size:16px;padding:0 10px 0 0;text-align:right}.swagger-ui .topbar .download-url-wrapper .select-label select{border:2px solid #62a03f;box-shadow:none;flex:2;outline:none;width:100%}.swagger-ui .topbar .download-url-wrapper .download-url-button{background:#62a03f;border:none;border-radius:0 4px 4px 0;color:#fff;font-family:sans-serif;font-size:16px;font-weight:700;padding:4px 30px}@media(max-width:550px){.swagger-ui .topbar .download-url-wrapper{width:100%}}.swagger-ui .info{margin:50px 0}.swagger-ui .info.failed-config{margin-left:auto;margin-right:auto;max-width:880px;text-align:center}.swagger-ui .info hgroup.main{margin:0 0 20px}.swagger-ui .info hgroup.main a{font-size:12px}.swagger-ui .info pre{font-size:14px}.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info table{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .info h1,.swagger-ui .info h2,.swagger-ui .info h3,.swagger-ui .info h4,.swagger-ui .info h5{color:#3b4151;font-family:sans-serif}.swagger-ui .info a{color:#4990e2;font-family:sans-serif;font-size:14px;transition:all .4s}.swagger-ui .info a:hover{color:#1f69c0}.swagger-ui .info>div{margin:0 0 5px}.swagger-ui .info .base-url{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300!important;font-weight:600;margin:0}.swagger-ui .info .title{color:#3b4151;font-family:sans-serif;font-size:36px;margin:0}.swagger-ui .info .title small{background:#7d8492;border-radius:57px;display:inline-block;font-size:10px;margin:0 0 0 5px;padding:2px 4px;position:relative;top:-5px;vertical-align:super}.swagger-ui .info .title small.version-stamp{background-color:#89bf04}.swagger-ui .info .title small pre{color:#fff;font-family:sans-serif;margin:0;padding:0}.swagger-ui .auth-btn-wrapper{display:flex;justify-content:center;padding:10px 0}.swagger-ui .auth-btn-wrapper .btn-done{margin-right:1em}.swagger-ui .auth-wrapper{display:flex;flex:1;justify-content:flex-end}.swagger-ui .auth-wrapper .authorize{margin-left:10px;margin-right:10px;padding-right:20px}.swagger-ui .auth-container{border-bottom:1px solid #ebebeb;margin:0 0 10px;padding:10px 20px}.swagger-ui .auth-container:last-of-type{border:0;margin:0;padding:10px 20px}.swagger-ui .auth-container h4{margin:5px 0 15px!important}.swagger-ui .auth-container .wrapper{margin:0;padding:0}.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text]{min-width:230px}.swagger-ui .auth-container .errors{background-color:#fee;border-radius:4px;color:red;color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;margin:1em;padding:10px}.swagger-ui .auth-container .errors b{margin-right:1em;text-transform:capitalize}.swagger-ui .scopes h2{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .scopes h2 a{color:#4990e2;cursor:pointer;font-size:12px;padding-left:10px;-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .scope-def{padding:0 0 20px}.swagger-ui .errors-wrapper{animation:scaleUp .5s;background:rgba(249,62,62,.1);border:2px solid #f93e3e;border-radius:4px;margin:20px;padding:10px 20px}.swagger-ui .errors-wrapper .error-wrapper{margin:0 0 10px}.swagger-ui .errors-wrapper .errors h4{color:#3b4151;font-family:monospace;font-size:14px;font-weight:600;margin:0}.swagger-ui .errors-wrapper .errors small{color:#606060}.swagger-ui .errors-wrapper .errors .message{white-space:pre-line}.swagger-ui .errors-wrapper .errors .message.thrown{max-width:100%}.swagger-ui .errors-wrapper .errors .error-line{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .errors-wrapper hgroup{align-items:center;display:flex}.swagger-ui .errors-wrapper hgroup h4{color:#3b4151;flex:1;font-family:sans-serif;font-size:20px;margin:0}@keyframes scaleUp{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}.swagger-ui .Resizer.vertical.disabled{display:none}.swagger-ui .markdown p,.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown p,.swagger-ui .renderedMarkdown pre{margin:1em auto;word-break:break-all;word-break:break-word}.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown pre{background:none;color:#000;font-weight:400;padding:0;white-space:pre-wrap}.swagger-ui .markdown code,.swagger-ui .renderedMarkdown code{background:rgba(0,0,0,.05);border-radius:4px;color:#9012fe;font-family:monospace;font-size:14px;font-weight:600;padding:5px 7px}.swagger-ui .markdown pre>code,.swagger-ui .renderedMarkdown pre>code{display:block}.swagger-ui .json-schema-2020-12{background-color:rgba(0,0,0,.05);border-radius:4px;margin:0 20px 15px;padding:12px 0 12px 20px}.swagger-ui .json-schema-2020-12:first-of-type{margin:20px}.swagger-ui .json-schema-2020-12:last-of-type{margin:0 20px}.swagger-ui .json-schema-2020-12--embedded{background-color:inherit;padding-bottom:0;padding-left:inherit;padding-right:inherit;padding-top:0}.swagger-ui .json-schema-2020-12-body{border-left:1px dashed rgba(0,0,0,.1);margin:2px 0}.swagger-ui .json-schema-2020-12-body--collapsed{display:none}.swagger-ui .json-schema-2020-12-accordion{border:none;outline:none;padding-left:0}.swagger-ui .json-schema-2020-12-accordion__children{display:inline-block}.swagger-ui .json-schema-2020-12-accordion__icon{display:inline-block;height:18px;vertical-align:bottom;width:18px}.swagger-ui .json-schema-2020-12-accordion__icon--expanded{transform:rotate(-90deg);transform-origin:50% 50%;transition:transform .15s ease-in}.swagger-ui .json-schema-2020-12-accordion__icon--collapsed{transform:rotate(0deg);transform-origin:50% 50%;transition:transform .15s ease-in}.swagger-ui .json-schema-2020-12-accordion__icon svg{height:20px;width:20px}.swagger-ui .json-schema-2020-12-expand-deep-button{border:none;color:#505050;color:#afaeae;font-family:sans-serif;font-size:12px;padding-right:0}.swagger-ui .json-schema-2020-12-keyword{margin:5px 0}.swagger-ui .json-schema-2020-12-keyword__children{border-left:1px dashed rgba(0,0,0,.1);margin:0 0 0 20px;padding:0}.swagger-ui .json-schema-2020-12-keyword__children--collapsed{display:none}.swagger-ui .json-schema-2020-12-keyword__name{font-size:12px;font-weight:700;margin-left:20px}.swagger-ui .json-schema-2020-12-keyword__name--primary{color:#3b4151;font-style:normal}.swagger-ui .json-schema-2020-12-keyword__name--secondary{color:#6b6b6b;font-style:italic}.swagger-ui .json-schema-2020-12-keyword__value{color:#6b6b6b;font-size:12px;font-style:italic;font-weight:400}.swagger-ui .json-schema-2020-12-keyword__value--primary{color:#3b4151;font-style:normal}.swagger-ui .json-schema-2020-12-keyword__value--secondary{color:#6b6b6b;font-style:italic}.swagger-ui .json-schema-2020-12-keyword__value--const,.swagger-ui .json-schema-2020-12-keyword__value--warning{border:1px dashed #6b6b6b;border-radius:4px;color:#3b4151;color:#6b6b6b;display:inline-block;font-family:monospace;font-style:normal;font-weight:600;line-height:1.5;margin-left:10px;padding:1px 4px}.swagger-ui .json-schema-2020-12-keyword__value--warning{border:1px dashed red;color:red}.swagger-ui .json-schema-2020-12-keyword__name--secondary+.json-schema-2020-12-keyword__value--secondary:before{content:"="}.swagger-ui .json-schema-2020-12__attribute{color:#3b4151;font-family:monospace;font-size:12px;padding-left:10px;text-transform:lowercase}.swagger-ui .json-schema-2020-12__attribute--primary{color:#55a}.swagger-ui .json-schema-2020-12__attribute--muted{color:gray}.swagger-ui .json-schema-2020-12__attribute--warning{color:red}.swagger-ui .json-schema-2020-12-keyword--\$vocabulary ul{border-left:1px dashed rgba(0,0,0,.1);margin:0 0 0 20px}.swagger-ui .json-schema-2020-12-\$vocabulary-uri{margin-left:35px}.swagger-ui .json-schema-2020-12-\$vocabulary-uri--disabled{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .json-schema-2020-12-keyword--description{color:#6b6b6b;font-size:12px;margin-left:20px}.swagger-ui .json-schema-2020-12-keyword--description p{margin:0}.swagger-ui .json-schema-2020-12__title{color:#505050;display:inline-block;font-family:sans-serif;font-size:12px;font-weight:700;line-height:normal}.swagger-ui .json-schema-2020-12__title .json-schema-2020-12-keyword__name{margin:0}.swagger-ui .json-schema-2020-12-property{margin:7px 0}.swagger-ui .json-schema-2020-12-property .json-schema-2020-12__title{color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;vertical-align:middle}.swagger-ui .json-schema-2020-12-keyword--properties>ul{border:none;margin:0;padding:0}.swagger-ui .json-schema-2020-12-property{list-style-type:none}.swagger-ui .json-schema-2020-12-property--required>.json-schema-2020-12:first-of-type>.json-schema-2020-12-head .json-schema-2020-12__title:after{color:red;content:"*";font-weight:700}.swagger-ui .json-schema-2020-12-keyword--patternProperties ul{border:none;margin:0;padding:0}.swagger-ui .json-schema-2020-12-keyword--patternProperties .json-schema-2020-12__title:first-of-type:after,.swagger-ui .json-schema-2020-12-keyword--patternProperties .json-schema-2020-12__title:first-of-type:before{color:#55a;content:"/"}.swagger-ui .json-schema-2020-12-keyword--enum>ul{display:inline-block;margin:0;padding:0}.swagger-ui .json-schema-2020-12-keyword--enum>ul li{display:inline;list-style-type:none}.swagger-ui .json-schema-2020-12__constraint{background-color:#805ad5;border-radius:4px;color:#3b4151;color:#fff;font-family:monospace;font-weight:600;line-height:1.5;margin-left:10px;padding:1px 3px}.swagger-ui .json-schema-2020-12__constraint--string{background-color:#d69e2e;color:#fff}.swagger-ui .json-schema-2020-12-keyword--dependentRequired>ul{display:inline-block;margin:0;padding:0}.swagger-ui .json-schema-2020-12-keyword--dependentRequired>ul li{display:inline;list-style-type:none}.swagger-ui .model-box .json-schema-2020-12:not(.json-schema-2020-12--embedded)>.json-schema-2020-12-head .json-schema-2020-12__title:first-of-type{font-size:16px}.swagger-ui .model-box>.json-schema-2020-12{margin:0}.swagger-ui .model-box .json-schema-2020-12{background-color:transparent;padding:0}.swagger-ui .model-box .json-schema-2020-12-accordion,.swagger-ui .model-box .json-schema-2020-12-expand-deep-button{background-color:transparent}.swagger-ui .models .json-schema-2020-12:not(.json-schema-2020-12--embedded)>.json-schema-2020-12-head .json-schema-2020-12__title:first-of-type{font-size:16px} +.swagger-ui{color:#3b4151;font-family:sans-serif}.swagger-ui html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}.swagger-ui body{margin:0}.swagger-ui article,.swagger-ui aside,.swagger-ui footer,.swagger-ui header,.swagger-ui nav,.swagger-ui section{display:block}.swagger-ui h1{font-size:2em;margin:.67em 0}.swagger-ui figcaption,.swagger-ui figure,.swagger-ui main{display:block}.swagger-ui figure{margin:1em 40px}.swagger-ui hr{box-sizing:content-box;height:0;overflow:visible}.swagger-ui pre{font-family:monospace,monospace;font-size:1em}.swagger-ui a{background-color:transparent;-webkit-text-decoration-skip:objects}.swagger-ui abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.swagger-ui b,.swagger-ui strong{font-weight:inherit;font-weight:bolder}.swagger-ui code,.swagger-ui kbd,.swagger-ui samp{font-family:monospace,monospace;font-size:1em}.swagger-ui dfn{font-style:italic}.swagger-ui mark{background-color:#ff0;color:#000}.swagger-ui small{font-size:80%}.swagger-ui sub,.swagger-ui sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.swagger-ui sub{bottom:-.25em}.swagger-ui sup{top:-.5em}.swagger-ui audio,.swagger-ui video{display:inline-block}.swagger-ui audio:not([controls]){display:none;height:0}.swagger-ui img{border-style:none}.swagger-ui svg:not(:root){overflow:hidden}.swagger-ui button,.swagger-ui input,.swagger-ui optgroup,.swagger-ui select,.swagger-ui textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}.swagger-ui button,.swagger-ui input{overflow:visible}.swagger-ui button,.swagger-ui select{text-transform:none}.swagger-ui [type=reset],.swagger-ui [type=submit],.swagger-ui button,.swagger-ui html [type=button]{-webkit-appearance:button}.swagger-ui [type=button]::-moz-focus-inner,.swagger-ui [type=reset]::-moz-focus-inner,.swagger-ui [type=submit]::-moz-focus-inner,.swagger-ui button::-moz-focus-inner{border-style:none;padding:0}.swagger-ui [type=button]:-moz-focusring,.swagger-ui [type=reset]:-moz-focusring,.swagger-ui [type=submit]:-moz-focusring,.swagger-ui button:-moz-focusring{outline:1px dotted ButtonText}.swagger-ui fieldset{padding:.35em .75em .625em}.swagger-ui legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}.swagger-ui progress{display:inline-block;vertical-align:baseline}.swagger-ui textarea{overflow:auto}.swagger-ui [type=checkbox],.swagger-ui [type=radio]{box-sizing:border-box;padding:0}.swagger-ui [type=number]::-webkit-inner-spin-button,.swagger-ui [type=number]::-webkit-outer-spin-button{height:auto}.swagger-ui [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.swagger-ui [type=search]::-webkit-search-cancel-button,.swagger-ui [type=search]::-webkit-search-decoration{-webkit-appearance:none}.swagger-ui ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.swagger-ui details,.swagger-ui menu{display:block}.swagger-ui summary{display:list-item}.swagger-ui canvas{display:inline-block}.swagger-ui [hidden],.swagger-ui template{display:none}.swagger-ui .debug *{outline:1px solid gold}.swagger-ui .debug-white *{outline:1px solid #fff}.swagger-ui .debug-black *{outline:1px solid #000}.swagger-ui .debug-grid{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) repeat 0 0}.swagger-ui .debug-grid-16{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) repeat 0 0}.swagger-ui .debug-grid-8-solid{background:#fff url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) repeat 0 0}.swagger-ui .debug-grid-16-solid{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) repeat 0 0}.swagger-ui .border-box,.swagger-ui a,.swagger-ui article,.swagger-ui body,.swagger-ui code,.swagger-ui dd,.swagger-ui div,.swagger-ui dl,.swagger-ui dt,.swagger-ui fieldset,.swagger-ui footer,.swagger-ui form,.swagger-ui h1,.swagger-ui h2,.swagger-ui h3,.swagger-ui h4,.swagger-ui h5,.swagger-ui h6,.swagger-ui header,.swagger-ui html,.swagger-ui input[type=email],.swagger-ui input[type=number],.swagger-ui input[type=password],.swagger-ui input[type=tel],.swagger-ui input[type=text],.swagger-ui input[type=url],.swagger-ui legend,.swagger-ui li,.swagger-ui main,.swagger-ui ol,.swagger-ui p,.swagger-ui pre,.swagger-ui section,.swagger-ui table,.swagger-ui td,.swagger-ui textarea,.swagger-ui th,.swagger-ui tr,.swagger-ui ul{box-sizing:border-box}.swagger-ui .aspect-ratio{height:0;position:relative}.swagger-ui .aspect-ratio--16x9{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1{padding-bottom:100%}.swagger-ui .aspect-ratio--object{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}@media screen and (min-width:30em){.swagger-ui .aspect-ratio-ns{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-ns{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-ns{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-ns{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-ns{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-ns{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-ns{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-ns{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-ns{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-ns{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-ns{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-ns{padding-bottom:100%}.swagger-ui .aspect-ratio--object-ns{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .aspect-ratio-m{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-m{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-m{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-m{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-m{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-m{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-m{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-m{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-m{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-m{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-m{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-m{padding-bottom:100%}.swagger-ui .aspect-ratio--object-m{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}@media screen and (min-width:60em){.swagger-ui .aspect-ratio-l{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-l{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-l{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-l{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-l{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-l{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-l{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-l{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-l{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-l{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-l{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-l{padding-bottom:100%}.swagger-ui .aspect-ratio--object-l{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}.swagger-ui img{max-width:100%}.swagger-ui .cover{background-size:cover!important}.swagger-ui .contain{background-size:contain!important}@media screen and (min-width:30em){.swagger-ui .cover-ns{background-size:cover!important}.swagger-ui .contain-ns{background-size:contain!important}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .cover-m{background-size:cover!important}.swagger-ui .contain-m{background-size:contain!important}}@media screen and (min-width:60em){.swagger-ui .cover-l{background-size:cover!important}.swagger-ui .contain-l{background-size:contain!important}}.swagger-ui .bg-center{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left{background-position:0;background-repeat:no-repeat}@media screen and (min-width:30em){.swagger-ui .bg-center-ns{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-ns{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-ns{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-ns{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-ns{background-position:0;background-repeat:no-repeat}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .bg-center-m{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-m{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-m{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-m{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-m{background-position:0;background-repeat:no-repeat}}@media screen and (min-width:60em){.swagger-ui .bg-center-l{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-l{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-l{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-l{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-l{background-position:0;background-repeat:no-repeat}}.swagger-ui .outline{outline:1px solid}.swagger-ui .outline-transparent{outline:1px solid transparent}.swagger-ui .outline-0{outline:0}@media screen and (min-width:30em){.swagger-ui .outline-ns{outline:1px solid}.swagger-ui .outline-transparent-ns{outline:1px solid transparent}.swagger-ui .outline-0-ns{outline:0}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .outline-m{outline:1px solid}.swagger-ui .outline-transparent-m{outline:1px solid transparent}.swagger-ui .outline-0-m{outline:0}}@media screen and (min-width:60em){.swagger-ui .outline-l{outline:1px solid}.swagger-ui .outline-transparent-l{outline:1px solid transparent}.swagger-ui .outline-0-l{outline:0}}.swagger-ui .ba{border-style:solid;border-width:1px}.swagger-ui .bt{border-top-style:solid;border-top-width:1px}.swagger-ui .br{border-right-style:solid;border-right-width:1px}.swagger-ui .bb{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl{border-left-style:solid;border-left-width:1px}.swagger-ui .bn{border-style:none;border-width:0}@media screen and (min-width:30em){.swagger-ui .ba-ns{border-style:solid;border-width:1px}.swagger-ui .bt-ns{border-top-style:solid;border-top-width:1px}.swagger-ui .br-ns{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-ns{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-ns{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-ns{border-style:none;border-width:0}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .ba-m{border-style:solid;border-width:1px}.swagger-ui .bt-m{border-top-style:solid;border-top-width:1px}.swagger-ui .br-m{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-m{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-m{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-m{border-style:none;border-width:0}}@media screen and (min-width:60em){.swagger-ui .ba-l{border-style:solid;border-width:1px}.swagger-ui .bt-l{border-top-style:solid;border-top-width:1px}.swagger-ui .br-l{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-l{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-l{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-l{border-style:none;border-width:0}}.swagger-ui .b--black{border-color:#000}.swagger-ui .b--near-black{border-color:#111}.swagger-ui .b--dark-gray{border-color:#333}.swagger-ui .b--mid-gray{border-color:#555}.swagger-ui .b--gray{border-color:#777}.swagger-ui .b--silver{border-color:#999}.swagger-ui .b--light-silver{border-color:#aaa}.swagger-ui .b--moon-gray{border-color:#ccc}.swagger-ui .b--light-gray{border-color:#eee}.swagger-ui .b--near-white{border-color:#f4f4f4}.swagger-ui .b--white{border-color:#fff}.swagger-ui .b--white-90{border-color:hsla(0,0%,100%,.9)}.swagger-ui .b--white-80{border-color:hsla(0,0%,100%,.8)}.swagger-ui .b--white-70{border-color:hsla(0,0%,100%,.7)}.swagger-ui .b--white-60{border-color:hsla(0,0%,100%,.6)}.swagger-ui .b--white-50{border-color:hsla(0,0%,100%,.5)}.swagger-ui .b--white-40{border-color:hsla(0,0%,100%,.4)}.swagger-ui .b--white-30{border-color:hsla(0,0%,100%,.3)}.swagger-ui .b--white-20{border-color:hsla(0,0%,100%,.2)}.swagger-ui .b--white-10{border-color:hsla(0,0%,100%,.1)}.swagger-ui .b--white-05{border-color:hsla(0,0%,100%,.05)}.swagger-ui .b--white-025{border-color:hsla(0,0%,100%,.025)}.swagger-ui .b--white-0125{border-color:hsla(0,0%,100%,.013)}.swagger-ui .b--black-90{border-color:rgba(0,0,0,.9)}.swagger-ui .b--black-80{border-color:rgba(0,0,0,.8)}.swagger-ui .b--black-70{border-color:rgba(0,0,0,.7)}.swagger-ui .b--black-60{border-color:rgba(0,0,0,.6)}.swagger-ui .b--black-50{border-color:rgba(0,0,0,.5)}.swagger-ui .b--black-40{border-color:rgba(0,0,0,.4)}.swagger-ui .b--black-30{border-color:rgba(0,0,0,.3)}.swagger-ui .b--black-20{border-color:rgba(0,0,0,.2)}.swagger-ui .b--black-10{border-color:rgba(0,0,0,.1)}.swagger-ui .b--black-05{border-color:rgba(0,0,0,.05)}.swagger-ui .b--black-025{border-color:rgba(0,0,0,.025)}.swagger-ui .b--black-0125{border-color:rgba(0,0,0,.013)}.swagger-ui .b--dark-red{border-color:#e7040f}.swagger-ui .b--red{border-color:#ff4136}.swagger-ui .b--light-red{border-color:#ff725c}.swagger-ui .b--orange{border-color:#ff6300}.swagger-ui .b--gold{border-color:#ffb700}.swagger-ui .b--yellow{border-color:gold}.swagger-ui .b--light-yellow{border-color:#fbf1a9}.swagger-ui .b--purple{border-color:#5e2ca5}.swagger-ui .b--light-purple{border-color:#a463f2}.swagger-ui .b--dark-pink{border-color:#d5008f}.swagger-ui .b--hot-pink{border-color:#ff41b4}.swagger-ui .b--pink{border-color:#ff80cc}.swagger-ui .b--light-pink{border-color:#ffa3d7}.swagger-ui .b--dark-green{border-color:#137752}.swagger-ui .b--green{border-color:#19a974}.swagger-ui .b--light-green{border-color:#9eebcf}.swagger-ui .b--navy{border-color:#001b44}.swagger-ui .b--dark-blue{border-color:#00449e}.swagger-ui .b--blue{border-color:#357edd}.swagger-ui .b--light-blue{border-color:#96ccff}.swagger-ui .b--lightest-blue{border-color:#cdecff}.swagger-ui .b--washed-blue{border-color:#f6fffe}.swagger-ui .b--washed-green{border-color:#e8fdf5}.swagger-ui .b--washed-yellow{border-color:#fffceb}.swagger-ui .b--washed-red{border-color:#ffdfdf}.swagger-ui .b--transparent{border-color:transparent}.swagger-ui .b--inherit{border-color:inherit}.swagger-ui .br0{border-radius:0}.swagger-ui .br1{border-radius:.125rem}.swagger-ui .br2{border-radius:.25rem}.swagger-ui .br3{border-radius:.5rem}.swagger-ui .br4{border-radius:1rem}.swagger-ui .br-100{border-radius:100%}.swagger-ui .br-pill{border-radius:9999px}.swagger-ui .br--bottom{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left{border-bottom-right-radius:0;border-top-right-radius:0}@media screen and (min-width:30em){.swagger-ui .br0-ns{border-radius:0}.swagger-ui .br1-ns{border-radius:.125rem}.swagger-ui .br2-ns{border-radius:.25rem}.swagger-ui .br3-ns{border-radius:.5rem}.swagger-ui .br4-ns{border-radius:1rem}.swagger-ui .br-100-ns{border-radius:100%}.swagger-ui .br-pill-ns{border-radius:9999px}.swagger-ui .br--bottom-ns{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-ns{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-ns{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-ns{border-bottom-right-radius:0;border-top-right-radius:0}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .br0-m{border-radius:0}.swagger-ui .br1-m{border-radius:.125rem}.swagger-ui .br2-m{border-radius:.25rem}.swagger-ui .br3-m{border-radius:.5rem}.swagger-ui .br4-m{border-radius:1rem}.swagger-ui .br-100-m{border-radius:100%}.swagger-ui .br-pill-m{border-radius:9999px}.swagger-ui .br--bottom-m{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-m{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-m{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-m{border-bottom-right-radius:0;border-top-right-radius:0}}@media screen and (min-width:60em){.swagger-ui .br0-l{border-radius:0}.swagger-ui .br1-l{border-radius:.125rem}.swagger-ui .br2-l{border-radius:.25rem}.swagger-ui .br3-l{border-radius:.5rem}.swagger-ui .br4-l{border-radius:1rem}.swagger-ui .br-100-l{border-radius:100%}.swagger-ui .br-pill-l{border-radius:9999px}.swagger-ui .br--bottom-l{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-l{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-l{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-l{border-bottom-right-radius:0;border-top-right-radius:0}}.swagger-ui .b--dotted{border-style:dotted}.swagger-ui .b--dashed{border-style:dashed}.swagger-ui .b--solid{border-style:solid}.swagger-ui .b--none{border-style:none}@media screen and (min-width:30em){.swagger-ui .b--dotted-ns{border-style:dotted}.swagger-ui .b--dashed-ns{border-style:dashed}.swagger-ui .b--solid-ns{border-style:solid}.swagger-ui .b--none-ns{border-style:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .b--dotted-m{border-style:dotted}.swagger-ui .b--dashed-m{border-style:dashed}.swagger-ui .b--solid-m{border-style:solid}.swagger-ui .b--none-m{border-style:none}}@media screen and (min-width:60em){.swagger-ui .b--dotted-l{border-style:dotted}.swagger-ui .b--dashed-l{border-style:dashed}.swagger-ui .b--solid-l{border-style:solid}.swagger-ui .b--none-l{border-style:none}}.swagger-ui .bw0{border-width:0}.swagger-ui .bw1{border-width:.125rem}.swagger-ui .bw2{border-width:.25rem}.swagger-ui .bw3{border-width:.5rem}.swagger-ui .bw4{border-width:1rem}.swagger-ui .bw5{border-width:2rem}.swagger-ui .bt-0{border-top-width:0}.swagger-ui .br-0{border-right-width:0}.swagger-ui .bb-0{border-bottom-width:0}.swagger-ui .bl-0{border-left-width:0}@media screen and (min-width:30em){.swagger-ui .bw0-ns{border-width:0}.swagger-ui .bw1-ns{border-width:.125rem}.swagger-ui .bw2-ns{border-width:.25rem}.swagger-ui .bw3-ns{border-width:.5rem}.swagger-ui .bw4-ns{border-width:1rem}.swagger-ui .bw5-ns{border-width:2rem}.swagger-ui .bt-0-ns{border-top-width:0}.swagger-ui .br-0-ns{border-right-width:0}.swagger-ui .bb-0-ns{border-bottom-width:0}.swagger-ui .bl-0-ns{border-left-width:0}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .bw0-m{border-width:0}.swagger-ui .bw1-m{border-width:.125rem}.swagger-ui .bw2-m{border-width:.25rem}.swagger-ui .bw3-m{border-width:.5rem}.swagger-ui .bw4-m{border-width:1rem}.swagger-ui .bw5-m{border-width:2rem}.swagger-ui .bt-0-m{border-top-width:0}.swagger-ui .br-0-m{border-right-width:0}.swagger-ui .bb-0-m{border-bottom-width:0}.swagger-ui .bl-0-m{border-left-width:0}}@media screen and (min-width:60em){.swagger-ui .bw0-l{border-width:0}.swagger-ui .bw1-l{border-width:.125rem}.swagger-ui .bw2-l{border-width:.25rem}.swagger-ui .bw3-l{border-width:.5rem}.swagger-ui .bw4-l{border-width:1rem}.swagger-ui .bw5-l{border-width:2rem}.swagger-ui .bt-0-l{border-top-width:0}.swagger-ui .br-0-l{border-right-width:0}.swagger-ui .bb-0-l{border-bottom-width:0}.swagger-ui .bl-0-l{border-left-width:0}}.swagger-ui .shadow-1{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}@media screen and (min-width:30em){.swagger-ui .shadow-1-ns{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-ns{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-ns{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-ns{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-ns{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .shadow-1-m{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-m{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-m{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-m{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-m{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:60em){.swagger-ui .shadow-1-l{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-l{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-l{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-l{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-l{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}.swagger-ui .pre{overflow-x:auto;overflow-y:hidden;overflow:scroll}.swagger-ui .top-0{top:0}.swagger-ui .right-0{right:0}.swagger-ui .bottom-0{bottom:0}.swagger-ui .left-0{left:0}.swagger-ui .top-1{top:1rem}.swagger-ui .right-1{right:1rem}.swagger-ui .bottom-1{bottom:1rem}.swagger-ui .left-1{left:1rem}.swagger-ui .top-2{top:2rem}.swagger-ui .right-2{right:2rem}.swagger-ui .bottom-2{bottom:2rem}.swagger-ui .left-2{left:2rem}.swagger-ui .top--1{top:-1rem}.swagger-ui .right--1{right:-1rem}.swagger-ui .bottom--1{bottom:-1rem}.swagger-ui .left--1{left:-1rem}.swagger-ui .top--2{top:-2rem}.swagger-ui .right--2{right:-2rem}.swagger-ui .bottom--2{bottom:-2rem}.swagger-ui .left--2{left:-2rem}.swagger-ui .absolute--fill{bottom:0;left:0;right:0;top:0}@media screen and (min-width:30em){.swagger-ui .top-0-ns{top:0}.swagger-ui .left-0-ns{left:0}.swagger-ui .right-0-ns{right:0}.swagger-ui .bottom-0-ns{bottom:0}.swagger-ui .top-1-ns{top:1rem}.swagger-ui .left-1-ns{left:1rem}.swagger-ui .right-1-ns{right:1rem}.swagger-ui .bottom-1-ns{bottom:1rem}.swagger-ui .top-2-ns{top:2rem}.swagger-ui .left-2-ns{left:2rem}.swagger-ui .right-2-ns{right:2rem}.swagger-ui .bottom-2-ns{bottom:2rem}.swagger-ui .top--1-ns{top:-1rem}.swagger-ui .right--1-ns{right:-1rem}.swagger-ui .bottom--1-ns{bottom:-1rem}.swagger-ui .left--1-ns{left:-1rem}.swagger-ui .top--2-ns{top:-2rem}.swagger-ui .right--2-ns{right:-2rem}.swagger-ui .bottom--2-ns{bottom:-2rem}.swagger-ui .left--2-ns{left:-2rem}.swagger-ui .absolute--fill-ns{bottom:0;left:0;right:0;top:0}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .top-0-m{top:0}.swagger-ui .left-0-m{left:0}.swagger-ui .right-0-m{right:0}.swagger-ui .bottom-0-m{bottom:0}.swagger-ui .top-1-m{top:1rem}.swagger-ui .left-1-m{left:1rem}.swagger-ui .right-1-m{right:1rem}.swagger-ui .bottom-1-m{bottom:1rem}.swagger-ui .top-2-m{top:2rem}.swagger-ui .left-2-m{left:2rem}.swagger-ui .right-2-m{right:2rem}.swagger-ui .bottom-2-m{bottom:2rem}.swagger-ui .top--1-m{top:-1rem}.swagger-ui .right--1-m{right:-1rem}.swagger-ui .bottom--1-m{bottom:-1rem}.swagger-ui .left--1-m{left:-1rem}.swagger-ui .top--2-m{top:-2rem}.swagger-ui .right--2-m{right:-2rem}.swagger-ui .bottom--2-m{bottom:-2rem}.swagger-ui .left--2-m{left:-2rem}.swagger-ui .absolute--fill-m{bottom:0;left:0;right:0;top:0}}@media screen and (min-width:60em){.swagger-ui .top-0-l{top:0}.swagger-ui .left-0-l{left:0}.swagger-ui .right-0-l{right:0}.swagger-ui .bottom-0-l{bottom:0}.swagger-ui .top-1-l{top:1rem}.swagger-ui .left-1-l{left:1rem}.swagger-ui .right-1-l{right:1rem}.swagger-ui .bottom-1-l{bottom:1rem}.swagger-ui .top-2-l{top:2rem}.swagger-ui .left-2-l{left:2rem}.swagger-ui .right-2-l{right:2rem}.swagger-ui .bottom-2-l{bottom:2rem}.swagger-ui .top--1-l{top:-1rem}.swagger-ui .right--1-l{right:-1rem}.swagger-ui .bottom--1-l{bottom:-1rem}.swagger-ui .left--1-l{left:-1rem}.swagger-ui .top--2-l{top:-2rem}.swagger-ui .right--2-l{right:-2rem}.swagger-ui .bottom--2-l{bottom:-2rem}.swagger-ui .left--2-l{left:-2rem}.swagger-ui .absolute--fill-l{bottom:0;left:0;right:0;top:0}}.swagger-ui .cf:after,.swagger-ui .cf:before{content:" ";display:table}.swagger-ui .cf:after{clear:both}.swagger-ui .cf{zoom:1}.swagger-ui .cl{clear:left}.swagger-ui .cr{clear:right}.swagger-ui .cb{clear:both}.swagger-ui .cn{clear:none}@media screen and (min-width:30em){.swagger-ui .cl-ns{clear:left}.swagger-ui .cr-ns{clear:right}.swagger-ui .cb-ns{clear:both}.swagger-ui .cn-ns{clear:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .cl-m{clear:left}.swagger-ui .cr-m{clear:right}.swagger-ui .cb-m{clear:both}.swagger-ui .cn-m{clear:none}}@media screen and (min-width:60em){.swagger-ui .cl-l{clear:left}.swagger-ui .cr-l{clear:right}.swagger-ui .cb-l{clear:both}.swagger-ui .cn-l{clear:none}}.swagger-ui .flex{display:flex}.swagger-ui .inline-flex{display:inline-flex}.swagger-ui .flex-auto{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none{flex:none}.swagger-ui .flex-column{flex-direction:column}.swagger-ui .flex-row{flex-direction:row}.swagger-ui .flex-wrap{flex-wrap:wrap}.swagger-ui .flex-nowrap{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse{flex-direction:column-reverse}.swagger-ui .flex-row-reverse{flex-direction:row-reverse}.swagger-ui .items-start{align-items:flex-start}.swagger-ui .items-end{align-items:flex-end}.swagger-ui .items-center{align-items:center}.swagger-ui .items-baseline{align-items:baseline}.swagger-ui .items-stretch{align-items:stretch}.swagger-ui .self-start{align-self:flex-start}.swagger-ui .self-end{align-self:flex-end}.swagger-ui .self-center{align-self:center}.swagger-ui .self-baseline{align-self:baseline}.swagger-ui .self-stretch{align-self:stretch}.swagger-ui .justify-start{justify-content:flex-start}.swagger-ui .justify-end{justify-content:flex-end}.swagger-ui .justify-center{justify-content:center}.swagger-ui .justify-between{justify-content:space-between}.swagger-ui .justify-around{justify-content:space-around}.swagger-ui .content-start{align-content:flex-start}.swagger-ui .content-end{align-content:flex-end}.swagger-ui .content-center{align-content:center}.swagger-ui .content-between{align-content:space-between}.swagger-ui .content-around{align-content:space-around}.swagger-ui .content-stretch{align-content:stretch}.swagger-ui .order-0{order:0}.swagger-ui .order-1{order:1}.swagger-ui .order-2{order:2}.swagger-ui .order-3{order:3}.swagger-ui .order-4{order:4}.swagger-ui .order-5{order:5}.swagger-ui .order-6{order:6}.swagger-ui .order-7{order:7}.swagger-ui .order-8{order:8}.swagger-ui .order-last{order:99999}.swagger-ui .flex-grow-0{flex-grow:0}.swagger-ui .flex-grow-1{flex-grow:1}.swagger-ui .flex-shrink-0{flex-shrink:0}.swagger-ui .flex-shrink-1{flex-shrink:1}@media screen and (min-width:30em){.swagger-ui .flex-ns{display:flex}.swagger-ui .inline-flex-ns{display:inline-flex}.swagger-ui .flex-auto-ns{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-ns{flex:none}.swagger-ui .flex-column-ns{flex-direction:column}.swagger-ui .flex-row-ns{flex-direction:row}.swagger-ui .flex-wrap-ns{flex-wrap:wrap}.swagger-ui .flex-nowrap-ns{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-ns{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-ns{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-ns{flex-direction:row-reverse}.swagger-ui .items-start-ns{align-items:flex-start}.swagger-ui .items-end-ns{align-items:flex-end}.swagger-ui .items-center-ns{align-items:center}.swagger-ui .items-baseline-ns{align-items:baseline}.swagger-ui .items-stretch-ns{align-items:stretch}.swagger-ui .self-start-ns{align-self:flex-start}.swagger-ui .self-end-ns{align-self:flex-end}.swagger-ui .self-center-ns{align-self:center}.swagger-ui .self-baseline-ns{align-self:baseline}.swagger-ui .self-stretch-ns{align-self:stretch}.swagger-ui .justify-start-ns{justify-content:flex-start}.swagger-ui .justify-end-ns{justify-content:flex-end}.swagger-ui .justify-center-ns{justify-content:center}.swagger-ui .justify-between-ns{justify-content:space-between}.swagger-ui .justify-around-ns{justify-content:space-around}.swagger-ui .content-start-ns{align-content:flex-start}.swagger-ui .content-end-ns{align-content:flex-end}.swagger-ui .content-center-ns{align-content:center}.swagger-ui .content-between-ns{align-content:space-between}.swagger-ui .content-around-ns{align-content:space-around}.swagger-ui .content-stretch-ns{align-content:stretch}.swagger-ui .order-0-ns{order:0}.swagger-ui .order-1-ns{order:1}.swagger-ui .order-2-ns{order:2}.swagger-ui .order-3-ns{order:3}.swagger-ui .order-4-ns{order:4}.swagger-ui .order-5-ns{order:5}.swagger-ui .order-6-ns{order:6}.swagger-ui .order-7-ns{order:7}.swagger-ui .order-8-ns{order:8}.swagger-ui .order-last-ns{order:99999}.swagger-ui .flex-grow-0-ns{flex-grow:0}.swagger-ui .flex-grow-1-ns{flex-grow:1}.swagger-ui .flex-shrink-0-ns{flex-shrink:0}.swagger-ui .flex-shrink-1-ns{flex-shrink:1}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .flex-m{display:flex}.swagger-ui .inline-flex-m{display:inline-flex}.swagger-ui .flex-auto-m{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-m{flex:none}.swagger-ui .flex-column-m{flex-direction:column}.swagger-ui .flex-row-m{flex-direction:row}.swagger-ui .flex-wrap-m{flex-wrap:wrap}.swagger-ui .flex-nowrap-m{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-m{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-m{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-m{flex-direction:row-reverse}.swagger-ui .items-start-m{align-items:flex-start}.swagger-ui .items-end-m{align-items:flex-end}.swagger-ui .items-center-m{align-items:center}.swagger-ui .items-baseline-m{align-items:baseline}.swagger-ui .items-stretch-m{align-items:stretch}.swagger-ui .self-start-m{align-self:flex-start}.swagger-ui .self-end-m{align-self:flex-end}.swagger-ui .self-center-m{align-self:center}.swagger-ui .self-baseline-m{align-self:baseline}.swagger-ui .self-stretch-m{align-self:stretch}.swagger-ui .justify-start-m{justify-content:flex-start}.swagger-ui .justify-end-m{justify-content:flex-end}.swagger-ui .justify-center-m{justify-content:center}.swagger-ui .justify-between-m{justify-content:space-between}.swagger-ui .justify-around-m{justify-content:space-around}.swagger-ui .content-start-m{align-content:flex-start}.swagger-ui .content-end-m{align-content:flex-end}.swagger-ui .content-center-m{align-content:center}.swagger-ui .content-between-m{align-content:space-between}.swagger-ui .content-around-m{align-content:space-around}.swagger-ui .content-stretch-m{align-content:stretch}.swagger-ui .order-0-m{order:0}.swagger-ui .order-1-m{order:1}.swagger-ui .order-2-m{order:2}.swagger-ui .order-3-m{order:3}.swagger-ui .order-4-m{order:4}.swagger-ui .order-5-m{order:5}.swagger-ui .order-6-m{order:6}.swagger-ui .order-7-m{order:7}.swagger-ui .order-8-m{order:8}.swagger-ui .order-last-m{order:99999}.swagger-ui .flex-grow-0-m{flex-grow:0}.swagger-ui .flex-grow-1-m{flex-grow:1}.swagger-ui .flex-shrink-0-m{flex-shrink:0}.swagger-ui .flex-shrink-1-m{flex-shrink:1}}@media screen and (min-width:60em){.swagger-ui .flex-l{display:flex}.swagger-ui .inline-flex-l{display:inline-flex}.swagger-ui .flex-auto-l{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-l{flex:none}.swagger-ui .flex-column-l{flex-direction:column}.swagger-ui .flex-row-l{flex-direction:row}.swagger-ui .flex-wrap-l{flex-wrap:wrap}.swagger-ui .flex-nowrap-l{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-l{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-l{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-l{flex-direction:row-reverse}.swagger-ui .items-start-l{align-items:flex-start}.swagger-ui .items-end-l{align-items:flex-end}.swagger-ui .items-center-l{align-items:center}.swagger-ui .items-baseline-l{align-items:baseline}.swagger-ui .items-stretch-l{align-items:stretch}.swagger-ui .self-start-l{align-self:flex-start}.swagger-ui .self-end-l{align-self:flex-end}.swagger-ui .self-center-l{align-self:center}.swagger-ui .self-baseline-l{align-self:baseline}.swagger-ui .self-stretch-l{align-self:stretch}.swagger-ui .justify-start-l{justify-content:flex-start}.swagger-ui .justify-end-l{justify-content:flex-end}.swagger-ui .justify-center-l{justify-content:center}.swagger-ui .justify-between-l{justify-content:space-between}.swagger-ui .justify-around-l{justify-content:space-around}.swagger-ui .content-start-l{align-content:flex-start}.swagger-ui .content-end-l{align-content:flex-end}.swagger-ui .content-center-l{align-content:center}.swagger-ui .content-between-l{align-content:space-between}.swagger-ui .content-around-l{align-content:space-around}.swagger-ui .content-stretch-l{align-content:stretch}.swagger-ui .order-0-l{order:0}.swagger-ui .order-1-l{order:1}.swagger-ui .order-2-l{order:2}.swagger-ui .order-3-l{order:3}.swagger-ui .order-4-l{order:4}.swagger-ui .order-5-l{order:5}.swagger-ui .order-6-l{order:6}.swagger-ui .order-7-l{order:7}.swagger-ui .order-8-l{order:8}.swagger-ui .order-last-l{order:99999}.swagger-ui .flex-grow-0-l{flex-grow:0}.swagger-ui .flex-grow-1-l{flex-grow:1}.swagger-ui .flex-shrink-0-l{flex-shrink:0}.swagger-ui .flex-shrink-1-l{flex-shrink:1}}.swagger-ui .dn{display:none}.swagger-ui .di{display:inline}.swagger-ui .db{display:block}.swagger-ui .dib{display:inline-block}.swagger-ui .dit{display:inline-table}.swagger-ui .dt{display:table}.swagger-ui .dtc{display:table-cell}.swagger-ui .dt-row{display:table-row}.swagger-ui .dt-row-group{display:table-row-group}.swagger-ui .dt-column{display:table-column}.swagger-ui .dt-column-group{display:table-column-group}.swagger-ui .dt--fixed{table-layout:fixed;width:100%}@media screen and (min-width:30em){.swagger-ui .dn-ns{display:none}.swagger-ui .di-ns{display:inline}.swagger-ui .db-ns{display:block}.swagger-ui .dib-ns{display:inline-block}.swagger-ui .dit-ns{display:inline-table}.swagger-ui .dt-ns{display:table}.swagger-ui .dtc-ns{display:table-cell}.swagger-ui .dt-row-ns{display:table-row}.swagger-ui .dt-row-group-ns{display:table-row-group}.swagger-ui .dt-column-ns{display:table-column}.swagger-ui .dt-column-group-ns{display:table-column-group}.swagger-ui .dt--fixed-ns{table-layout:fixed;width:100%}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .dn-m{display:none}.swagger-ui .di-m{display:inline}.swagger-ui .db-m{display:block}.swagger-ui .dib-m{display:inline-block}.swagger-ui .dit-m{display:inline-table}.swagger-ui .dt-m{display:table}.swagger-ui .dtc-m{display:table-cell}.swagger-ui .dt-row-m{display:table-row}.swagger-ui .dt-row-group-m{display:table-row-group}.swagger-ui .dt-column-m{display:table-column}.swagger-ui .dt-column-group-m{display:table-column-group}.swagger-ui .dt--fixed-m{table-layout:fixed;width:100%}}@media screen and (min-width:60em){.swagger-ui .dn-l{display:none}.swagger-ui .di-l{display:inline}.swagger-ui .db-l{display:block}.swagger-ui .dib-l{display:inline-block}.swagger-ui .dit-l{display:inline-table}.swagger-ui .dt-l{display:table}.swagger-ui .dtc-l{display:table-cell}.swagger-ui .dt-row-l{display:table-row}.swagger-ui .dt-row-group-l{display:table-row-group}.swagger-ui .dt-column-l{display:table-column}.swagger-ui .dt-column-group-l{display:table-column-group}.swagger-ui .dt--fixed-l{table-layout:fixed;width:100%}}.swagger-ui .fl{_display:inline;float:left}.swagger-ui .fr{_display:inline;float:right}.swagger-ui .fn{float:none}@media screen and (min-width:30em){.swagger-ui .fl-ns{_display:inline;float:left}.swagger-ui .fr-ns{_display:inline;float:right}.swagger-ui .fn-ns{float:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .fl-m{_display:inline;float:left}.swagger-ui .fr-m{_display:inline;float:right}.swagger-ui .fn-m{float:none}}@media screen and (min-width:60em){.swagger-ui .fl-l{_display:inline;float:left}.swagger-ui .fr-l{_display:inline;float:right}.swagger-ui .fn-l{float:none}}.swagger-ui .sans-serif{font-family:-apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica,helvetica neue,ubuntu,roboto,noto,segoe ui,arial,sans-serif}.swagger-ui .serif{font-family:georgia,serif}.swagger-ui .system-sans-serif{font-family:sans-serif}.swagger-ui .system-serif{font-family:serif}.swagger-ui .code,.swagger-ui code{font-family:Consolas,monaco,monospace}.swagger-ui .courier{font-family:Courier Next,courier,monospace}.swagger-ui .helvetica{font-family:helvetica neue,helvetica,sans-serif}.swagger-ui .avenir{font-family:avenir next,avenir,sans-serif}.swagger-ui .athelas{font-family:athelas,georgia,serif}.swagger-ui .georgia{font-family:georgia,serif}.swagger-ui .times{font-family:times,serif}.swagger-ui .bodoni{font-family:Bodoni MT,serif}.swagger-ui .calisto{font-family:Calisto MT,serif}.swagger-ui .garamond{font-family:garamond,serif}.swagger-ui .baskerville{font-family:baskerville,serif}.swagger-ui .i{font-style:italic}.swagger-ui .fs-normal{font-style:normal}@media screen and (min-width:30em){.swagger-ui .i-ns{font-style:italic}.swagger-ui .fs-normal-ns{font-style:normal}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .i-m{font-style:italic}.swagger-ui .fs-normal-m{font-style:normal}}@media screen and (min-width:60em){.swagger-ui .i-l{font-style:italic}.swagger-ui .fs-normal-l{font-style:normal}}.swagger-ui .normal{font-weight:400}.swagger-ui .b{font-weight:700}.swagger-ui .fw1{font-weight:100}.swagger-ui .fw2{font-weight:200}.swagger-ui .fw3{font-weight:300}.swagger-ui .fw4{font-weight:400}.swagger-ui .fw5{font-weight:500}.swagger-ui .fw6{font-weight:600}.swagger-ui .fw7{font-weight:700}.swagger-ui .fw8{font-weight:800}.swagger-ui .fw9{font-weight:900}@media screen and (min-width:30em){.swagger-ui .normal-ns{font-weight:400}.swagger-ui .b-ns{font-weight:700}.swagger-ui .fw1-ns{font-weight:100}.swagger-ui .fw2-ns{font-weight:200}.swagger-ui .fw3-ns{font-weight:300}.swagger-ui .fw4-ns{font-weight:400}.swagger-ui .fw5-ns{font-weight:500}.swagger-ui .fw6-ns{font-weight:600}.swagger-ui .fw7-ns{font-weight:700}.swagger-ui .fw8-ns{font-weight:800}.swagger-ui .fw9-ns{font-weight:900}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .normal-m{font-weight:400}.swagger-ui .b-m{font-weight:700}.swagger-ui .fw1-m{font-weight:100}.swagger-ui .fw2-m{font-weight:200}.swagger-ui .fw3-m{font-weight:300}.swagger-ui .fw4-m{font-weight:400}.swagger-ui .fw5-m{font-weight:500}.swagger-ui .fw6-m{font-weight:600}.swagger-ui .fw7-m{font-weight:700}.swagger-ui .fw8-m{font-weight:800}.swagger-ui .fw9-m{font-weight:900}}@media screen and (min-width:60em){.swagger-ui .normal-l{font-weight:400}.swagger-ui .b-l{font-weight:700}.swagger-ui .fw1-l{font-weight:100}.swagger-ui .fw2-l{font-weight:200}.swagger-ui .fw3-l{font-weight:300}.swagger-ui .fw4-l{font-weight:400}.swagger-ui .fw5-l{font-weight:500}.swagger-ui .fw6-l{font-weight:600}.swagger-ui .fw7-l{font-weight:700}.swagger-ui .fw8-l{font-weight:800}.swagger-ui .fw9-l{font-weight:900}}.swagger-ui .input-reset{-webkit-appearance:none;-moz-appearance:none}.swagger-ui .button-reset::-moz-focus-inner,.swagger-ui .input-reset::-moz-focus-inner{border:0;padding:0}.swagger-ui .h1{height:1rem}.swagger-ui .h2{height:2rem}.swagger-ui .h3{height:4rem}.swagger-ui .h4{height:8rem}.swagger-ui .h5{height:16rem}.swagger-ui .h-25{height:25%}.swagger-ui .h-50{height:50%}.swagger-ui .h-75{height:75%}.swagger-ui .h-100{height:100%}.swagger-ui .min-h-100{min-height:100%}.swagger-ui .vh-25{height:25vh}.swagger-ui .vh-50{height:50vh}.swagger-ui .vh-75{height:75vh}.swagger-ui .vh-100{height:100vh}.swagger-ui .min-vh-100{min-height:100vh}.swagger-ui .h-auto{height:auto}.swagger-ui .h-inherit{height:inherit}@media screen and (min-width:30em){.swagger-ui .h1-ns{height:1rem}.swagger-ui .h2-ns{height:2rem}.swagger-ui .h3-ns{height:4rem}.swagger-ui .h4-ns{height:8rem}.swagger-ui .h5-ns{height:16rem}.swagger-ui .h-25-ns{height:25%}.swagger-ui .h-50-ns{height:50%}.swagger-ui .h-75-ns{height:75%}.swagger-ui .h-100-ns{height:100%}.swagger-ui .min-h-100-ns{min-height:100%}.swagger-ui .vh-25-ns{height:25vh}.swagger-ui .vh-50-ns{height:50vh}.swagger-ui .vh-75-ns{height:75vh}.swagger-ui .vh-100-ns{height:100vh}.swagger-ui .min-vh-100-ns{min-height:100vh}.swagger-ui .h-auto-ns{height:auto}.swagger-ui .h-inherit-ns{height:inherit}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .h1-m{height:1rem}.swagger-ui .h2-m{height:2rem}.swagger-ui .h3-m{height:4rem}.swagger-ui .h4-m{height:8rem}.swagger-ui .h5-m{height:16rem}.swagger-ui .h-25-m{height:25%}.swagger-ui .h-50-m{height:50%}.swagger-ui .h-75-m{height:75%}.swagger-ui .h-100-m{height:100%}.swagger-ui .min-h-100-m{min-height:100%}.swagger-ui .vh-25-m{height:25vh}.swagger-ui .vh-50-m{height:50vh}.swagger-ui .vh-75-m{height:75vh}.swagger-ui .vh-100-m{height:100vh}.swagger-ui .min-vh-100-m{min-height:100vh}.swagger-ui .h-auto-m{height:auto}.swagger-ui .h-inherit-m{height:inherit}}@media screen and (min-width:60em){.swagger-ui .h1-l{height:1rem}.swagger-ui .h2-l{height:2rem}.swagger-ui .h3-l{height:4rem}.swagger-ui .h4-l{height:8rem}.swagger-ui .h5-l{height:16rem}.swagger-ui .h-25-l{height:25%}.swagger-ui .h-50-l{height:50%}.swagger-ui .h-75-l{height:75%}.swagger-ui .h-100-l{height:100%}.swagger-ui .min-h-100-l{min-height:100%}.swagger-ui .vh-25-l{height:25vh}.swagger-ui .vh-50-l{height:50vh}.swagger-ui .vh-75-l{height:75vh}.swagger-ui .vh-100-l{height:100vh}.swagger-ui .min-vh-100-l{min-height:100vh}.swagger-ui .h-auto-l{height:auto}.swagger-ui .h-inherit-l{height:inherit}}.swagger-ui .tracked{letter-spacing:.1em}.swagger-ui .tracked-tight{letter-spacing:-.05em}.swagger-ui .tracked-mega{letter-spacing:.25em}@media screen and (min-width:30em){.swagger-ui .tracked-ns{letter-spacing:.1em}.swagger-ui .tracked-tight-ns{letter-spacing:-.05em}.swagger-ui .tracked-mega-ns{letter-spacing:.25em}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .tracked-m{letter-spacing:.1em}.swagger-ui .tracked-tight-m{letter-spacing:-.05em}.swagger-ui .tracked-mega-m{letter-spacing:.25em}}@media screen and (min-width:60em){.swagger-ui .tracked-l{letter-spacing:.1em}.swagger-ui .tracked-tight-l{letter-spacing:-.05em}.swagger-ui .tracked-mega-l{letter-spacing:.25em}}.swagger-ui .lh-solid{line-height:1}.swagger-ui .lh-title{line-height:1.25}.swagger-ui .lh-copy{line-height:1.5}@media screen and (min-width:30em){.swagger-ui .lh-solid-ns{line-height:1}.swagger-ui .lh-title-ns{line-height:1.25}.swagger-ui .lh-copy-ns{line-height:1.5}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .lh-solid-m{line-height:1}.swagger-ui .lh-title-m{line-height:1.25}.swagger-ui .lh-copy-m{line-height:1.5}}@media screen and (min-width:60em){.swagger-ui .lh-solid-l{line-height:1}.swagger-ui .lh-title-l{line-height:1.25}.swagger-ui .lh-copy-l{line-height:1.5}}.swagger-ui .link{-webkit-text-decoration:none;text-decoration:none}.swagger-ui .link,.swagger-ui .link:active,.swagger-ui .link:focus,.swagger-ui .link:hover,.swagger-ui .link:link,.swagger-ui .link:visited{transition:color .15s ease-in}.swagger-ui .link:focus{outline:1px dotted currentColor}.swagger-ui .list{list-style-type:none}.swagger-ui .mw-100{max-width:100%}.swagger-ui .mw1{max-width:1rem}.swagger-ui .mw2{max-width:2rem}.swagger-ui .mw3{max-width:4rem}.swagger-ui .mw4{max-width:8rem}.swagger-ui .mw5{max-width:16rem}.swagger-ui .mw6{max-width:32rem}.swagger-ui .mw7{max-width:48rem}.swagger-ui .mw8{max-width:64rem}.swagger-ui .mw9{max-width:96rem}.swagger-ui .mw-none{max-width:none}@media screen and (min-width:30em){.swagger-ui .mw-100-ns{max-width:100%}.swagger-ui .mw1-ns{max-width:1rem}.swagger-ui .mw2-ns{max-width:2rem}.swagger-ui .mw3-ns{max-width:4rem}.swagger-ui .mw4-ns{max-width:8rem}.swagger-ui .mw5-ns{max-width:16rem}.swagger-ui .mw6-ns{max-width:32rem}.swagger-ui .mw7-ns{max-width:48rem}.swagger-ui .mw8-ns{max-width:64rem}.swagger-ui .mw9-ns{max-width:96rem}.swagger-ui .mw-none-ns{max-width:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .mw-100-m{max-width:100%}.swagger-ui .mw1-m{max-width:1rem}.swagger-ui .mw2-m{max-width:2rem}.swagger-ui .mw3-m{max-width:4rem}.swagger-ui .mw4-m{max-width:8rem}.swagger-ui .mw5-m{max-width:16rem}.swagger-ui .mw6-m{max-width:32rem}.swagger-ui .mw7-m{max-width:48rem}.swagger-ui .mw8-m{max-width:64rem}.swagger-ui .mw9-m{max-width:96rem}.swagger-ui .mw-none-m{max-width:none}}@media screen and (min-width:60em){.swagger-ui .mw-100-l{max-width:100%}.swagger-ui .mw1-l{max-width:1rem}.swagger-ui .mw2-l{max-width:2rem}.swagger-ui .mw3-l{max-width:4rem}.swagger-ui .mw4-l{max-width:8rem}.swagger-ui .mw5-l{max-width:16rem}.swagger-ui .mw6-l{max-width:32rem}.swagger-ui .mw7-l{max-width:48rem}.swagger-ui .mw8-l{max-width:64rem}.swagger-ui .mw9-l{max-width:96rem}.swagger-ui .mw-none-l{max-width:none}}.swagger-ui .w1{width:1rem}.swagger-ui .w2{width:2rem}.swagger-ui .w3{width:4rem}.swagger-ui .w4{width:8rem}.swagger-ui .w5{width:16rem}.swagger-ui .w-10{width:10%}.swagger-ui .w-20{width:20%}.swagger-ui .w-25{width:25%}.swagger-ui .w-30{width:30%}.swagger-ui .w-33{width:33%}.swagger-ui .w-34{width:34%}.swagger-ui .w-40{width:40%}.swagger-ui .w-50{width:50%}.swagger-ui .w-60{width:60%}.swagger-ui .w-70{width:70%}.swagger-ui .w-75{width:75%}.swagger-ui .w-80{width:80%}.swagger-ui .w-90{width:90%}.swagger-ui .w-100{width:100%}.swagger-ui .w-third{width:33.3333333333%}.swagger-ui .w-two-thirds{width:66.6666666667%}.swagger-ui .w-auto{width:auto}@media screen and (min-width:30em){.swagger-ui .w1-ns{width:1rem}.swagger-ui .w2-ns{width:2rem}.swagger-ui .w3-ns{width:4rem}.swagger-ui .w4-ns{width:8rem}.swagger-ui .w5-ns{width:16rem}.swagger-ui .w-10-ns{width:10%}.swagger-ui .w-20-ns{width:20%}.swagger-ui .w-25-ns{width:25%}.swagger-ui .w-30-ns{width:30%}.swagger-ui .w-33-ns{width:33%}.swagger-ui .w-34-ns{width:34%}.swagger-ui .w-40-ns{width:40%}.swagger-ui .w-50-ns{width:50%}.swagger-ui .w-60-ns{width:60%}.swagger-ui .w-70-ns{width:70%}.swagger-ui .w-75-ns{width:75%}.swagger-ui .w-80-ns{width:80%}.swagger-ui .w-90-ns{width:90%}.swagger-ui .w-100-ns{width:100%}.swagger-ui .w-third-ns{width:33.3333333333%}.swagger-ui .w-two-thirds-ns{width:66.6666666667%}.swagger-ui .w-auto-ns{width:auto}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .w1-m{width:1rem}.swagger-ui .w2-m{width:2rem}.swagger-ui .w3-m{width:4rem}.swagger-ui .w4-m{width:8rem}.swagger-ui .w5-m{width:16rem}.swagger-ui .w-10-m{width:10%}.swagger-ui .w-20-m{width:20%}.swagger-ui .w-25-m{width:25%}.swagger-ui .w-30-m{width:30%}.swagger-ui .w-33-m{width:33%}.swagger-ui .w-34-m{width:34%}.swagger-ui .w-40-m{width:40%}.swagger-ui .w-50-m{width:50%}.swagger-ui .w-60-m{width:60%}.swagger-ui .w-70-m{width:70%}.swagger-ui .w-75-m{width:75%}.swagger-ui .w-80-m{width:80%}.swagger-ui .w-90-m{width:90%}.swagger-ui .w-100-m{width:100%}.swagger-ui .w-third-m{width:33.3333333333%}.swagger-ui .w-two-thirds-m{width:66.6666666667%}.swagger-ui .w-auto-m{width:auto}}@media screen and (min-width:60em){.swagger-ui .w1-l{width:1rem}.swagger-ui .w2-l{width:2rem}.swagger-ui .w3-l{width:4rem}.swagger-ui .w4-l{width:8rem}.swagger-ui .w5-l{width:16rem}.swagger-ui .w-10-l{width:10%}.swagger-ui .w-20-l{width:20%}.swagger-ui .w-25-l{width:25%}.swagger-ui .w-30-l{width:30%}.swagger-ui .w-33-l{width:33%}.swagger-ui .w-34-l{width:34%}.swagger-ui .w-40-l{width:40%}.swagger-ui .w-50-l{width:50%}.swagger-ui .w-60-l{width:60%}.swagger-ui .w-70-l{width:70%}.swagger-ui .w-75-l{width:75%}.swagger-ui .w-80-l{width:80%}.swagger-ui .w-90-l{width:90%}.swagger-ui .w-100-l{width:100%}.swagger-ui .w-third-l{width:33.3333333333%}.swagger-ui .w-two-thirds-l{width:66.6666666667%}.swagger-ui .w-auto-l{width:auto}}.swagger-ui .overflow-visible{overflow:visible}.swagger-ui .overflow-hidden{overflow:hidden}.swagger-ui .overflow-scroll{overflow:scroll}.swagger-ui .overflow-auto{overflow:auto}.swagger-ui .overflow-x-visible{overflow-x:visible}.swagger-ui .overflow-x-hidden{overflow-x:hidden}.swagger-ui .overflow-x-scroll{overflow-x:scroll}.swagger-ui .overflow-x-auto{overflow-x:auto}.swagger-ui .overflow-y-visible{overflow-y:visible}.swagger-ui .overflow-y-hidden{overflow-y:hidden}.swagger-ui .overflow-y-scroll{overflow-y:scroll}.swagger-ui .overflow-y-auto{overflow-y:auto}@media screen and (min-width:30em){.swagger-ui .overflow-visible-ns{overflow:visible}.swagger-ui .overflow-hidden-ns{overflow:hidden}.swagger-ui .overflow-scroll-ns{overflow:scroll}.swagger-ui .overflow-auto-ns{overflow:auto}.swagger-ui .overflow-x-visible-ns{overflow-x:visible}.swagger-ui .overflow-x-hidden-ns{overflow-x:hidden}.swagger-ui .overflow-x-scroll-ns{overflow-x:scroll}.swagger-ui .overflow-x-auto-ns{overflow-x:auto}.swagger-ui .overflow-y-visible-ns{overflow-y:visible}.swagger-ui .overflow-y-hidden-ns{overflow-y:hidden}.swagger-ui .overflow-y-scroll-ns{overflow-y:scroll}.swagger-ui .overflow-y-auto-ns{overflow-y:auto}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .overflow-visible-m{overflow:visible}.swagger-ui .overflow-hidden-m{overflow:hidden}.swagger-ui .overflow-scroll-m{overflow:scroll}.swagger-ui .overflow-auto-m{overflow:auto}.swagger-ui .overflow-x-visible-m{overflow-x:visible}.swagger-ui .overflow-x-hidden-m{overflow-x:hidden}.swagger-ui .overflow-x-scroll-m{overflow-x:scroll}.swagger-ui .overflow-x-auto-m{overflow-x:auto}.swagger-ui .overflow-y-visible-m{overflow-y:visible}.swagger-ui .overflow-y-hidden-m{overflow-y:hidden}.swagger-ui .overflow-y-scroll-m{overflow-y:scroll}.swagger-ui .overflow-y-auto-m{overflow-y:auto}}@media screen and (min-width:60em){.swagger-ui .overflow-visible-l{overflow:visible}.swagger-ui .overflow-hidden-l{overflow:hidden}.swagger-ui .overflow-scroll-l{overflow:scroll}.swagger-ui .overflow-auto-l{overflow:auto}.swagger-ui .overflow-x-visible-l{overflow-x:visible}.swagger-ui .overflow-x-hidden-l{overflow-x:hidden}.swagger-ui .overflow-x-scroll-l{overflow-x:scroll}.swagger-ui .overflow-x-auto-l{overflow-x:auto}.swagger-ui .overflow-y-visible-l{overflow-y:visible}.swagger-ui .overflow-y-hidden-l{overflow-y:hidden}.swagger-ui .overflow-y-scroll-l{overflow-y:scroll}.swagger-ui .overflow-y-auto-l{overflow-y:auto}}.swagger-ui .static{position:static}.swagger-ui .relative{position:relative}.swagger-ui .absolute{position:absolute}.swagger-ui .fixed{position:fixed}@media screen and (min-width:30em){.swagger-ui .static-ns{position:static}.swagger-ui .relative-ns{position:relative}.swagger-ui .absolute-ns{position:absolute}.swagger-ui .fixed-ns{position:fixed}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .static-m{position:static}.swagger-ui .relative-m{position:relative}.swagger-ui .absolute-m{position:absolute}.swagger-ui .fixed-m{position:fixed}}@media screen and (min-width:60em){.swagger-ui .static-l{position:static}.swagger-ui .relative-l{position:relative}.swagger-ui .absolute-l{position:absolute}.swagger-ui .fixed-l{position:fixed}}.swagger-ui .o-100{opacity:1}.swagger-ui .o-90{opacity:.9}.swagger-ui .o-80{opacity:.8}.swagger-ui .o-70{opacity:.7}.swagger-ui .o-60{opacity:.6}.swagger-ui .o-50{opacity:.5}.swagger-ui .o-40{opacity:.4}.swagger-ui .o-30{opacity:.3}.swagger-ui .o-20{opacity:.2}.swagger-ui .o-10{opacity:.1}.swagger-ui .o-05{opacity:.05}.swagger-ui .o-025{opacity:.025}.swagger-ui .o-0{opacity:0}.swagger-ui .rotate-45{transform:rotate(45deg)}.swagger-ui .rotate-90{transform:rotate(90deg)}.swagger-ui .rotate-135{transform:rotate(135deg)}.swagger-ui .rotate-180{transform:rotate(180deg)}.swagger-ui .rotate-225{transform:rotate(225deg)}.swagger-ui .rotate-270{transform:rotate(270deg)}.swagger-ui .rotate-315{transform:rotate(315deg)}@media screen and (min-width:30em){.swagger-ui .rotate-45-ns{transform:rotate(45deg)}.swagger-ui .rotate-90-ns{transform:rotate(90deg)}.swagger-ui .rotate-135-ns{transform:rotate(135deg)}.swagger-ui .rotate-180-ns{transform:rotate(180deg)}.swagger-ui .rotate-225-ns{transform:rotate(225deg)}.swagger-ui .rotate-270-ns{transform:rotate(270deg)}.swagger-ui .rotate-315-ns{transform:rotate(315deg)}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .rotate-45-m{transform:rotate(45deg)}.swagger-ui .rotate-90-m{transform:rotate(90deg)}.swagger-ui .rotate-135-m{transform:rotate(135deg)}.swagger-ui .rotate-180-m{transform:rotate(180deg)}.swagger-ui .rotate-225-m{transform:rotate(225deg)}.swagger-ui .rotate-270-m{transform:rotate(270deg)}.swagger-ui .rotate-315-m{transform:rotate(315deg)}}@media screen and (min-width:60em){.swagger-ui .rotate-45-l{transform:rotate(45deg)}.swagger-ui .rotate-90-l{transform:rotate(90deg)}.swagger-ui .rotate-135-l{transform:rotate(135deg)}.swagger-ui .rotate-180-l{transform:rotate(180deg)}.swagger-ui .rotate-225-l{transform:rotate(225deg)}.swagger-ui .rotate-270-l{transform:rotate(270deg)}.swagger-ui .rotate-315-l{transform:rotate(315deg)}}.swagger-ui .black-90{color:rgba(0,0,0,.9)}.swagger-ui .black-80{color:rgba(0,0,0,.8)}.swagger-ui .black-70{color:rgba(0,0,0,.7)}.swagger-ui .black-60{color:rgba(0,0,0,.6)}.swagger-ui .black-50{color:rgba(0,0,0,.5)}.swagger-ui .black-40{color:rgba(0,0,0,.4)}.swagger-ui .black-30{color:rgba(0,0,0,.3)}.swagger-ui .black-20{color:rgba(0,0,0,.2)}.swagger-ui .black-10{color:rgba(0,0,0,.1)}.swagger-ui .black-05{color:rgba(0,0,0,.05)}.swagger-ui .white-90{color:hsla(0,0%,100%,.9)}.swagger-ui .white-80{color:hsla(0,0%,100%,.8)}.swagger-ui .white-70{color:hsla(0,0%,100%,.7)}.swagger-ui .white-60{color:hsla(0,0%,100%,.6)}.swagger-ui .white-50{color:hsla(0,0%,100%,.5)}.swagger-ui .white-40{color:hsla(0,0%,100%,.4)}.swagger-ui .white-30{color:hsla(0,0%,100%,.3)}.swagger-ui .white-20{color:hsla(0,0%,100%,.2)}.swagger-ui .white-10{color:hsla(0,0%,100%,.1)}.swagger-ui .black{color:#000}.swagger-ui .near-black{color:#111}.swagger-ui .dark-gray{color:#333}.swagger-ui .mid-gray{color:#555}.swagger-ui .gray{color:#777}.swagger-ui .silver{color:#999}.swagger-ui .light-silver{color:#aaa}.swagger-ui .moon-gray{color:#ccc}.swagger-ui .light-gray{color:#eee}.swagger-ui .near-white{color:#f4f4f4}.swagger-ui .white{color:#fff}.swagger-ui .dark-red{color:#e7040f}.swagger-ui .red{color:#ff4136}.swagger-ui .light-red{color:#ff725c}.swagger-ui .orange{color:#ff6300}.swagger-ui .gold{color:#ffb700}.swagger-ui .yellow{color:gold}.swagger-ui .light-yellow{color:#fbf1a9}.swagger-ui .purple{color:#5e2ca5}.swagger-ui .light-purple{color:#a463f2}.swagger-ui .dark-pink{color:#d5008f}.swagger-ui .hot-pink{color:#ff41b4}.swagger-ui .pink{color:#ff80cc}.swagger-ui .light-pink{color:#ffa3d7}.swagger-ui .dark-green{color:#137752}.swagger-ui .green{color:#19a974}.swagger-ui .light-green{color:#9eebcf}.swagger-ui .navy{color:#001b44}.swagger-ui .dark-blue{color:#00449e}.swagger-ui .blue{color:#357edd}.swagger-ui .light-blue{color:#96ccff}.swagger-ui .lightest-blue{color:#cdecff}.swagger-ui .washed-blue{color:#f6fffe}.swagger-ui .washed-green{color:#e8fdf5}.swagger-ui .washed-yellow{color:#fffceb}.swagger-ui .washed-red{color:#ffdfdf}.swagger-ui .color-inherit{color:inherit}.swagger-ui .bg-black-90{background-color:rgba(0,0,0,.9)}.swagger-ui .bg-black-80{background-color:rgba(0,0,0,.8)}.swagger-ui .bg-black-70{background-color:rgba(0,0,0,.7)}.swagger-ui .bg-black-60{background-color:rgba(0,0,0,.6)}.swagger-ui .bg-black-50{background-color:rgba(0,0,0,.5)}.swagger-ui .bg-black-40{background-color:rgba(0,0,0,.4)}.swagger-ui .bg-black-30{background-color:rgba(0,0,0,.3)}.swagger-ui .bg-black-20{background-color:rgba(0,0,0,.2)}.swagger-ui .bg-black-10{background-color:rgba(0,0,0,.1)}.swagger-ui .bg-black-05{background-color:rgba(0,0,0,.05)}.swagger-ui .bg-white-90{background-color:hsla(0,0%,100%,.9)}.swagger-ui .bg-white-80{background-color:hsla(0,0%,100%,.8)}.swagger-ui .bg-white-70{background-color:hsla(0,0%,100%,.7)}.swagger-ui .bg-white-60{background-color:hsla(0,0%,100%,.6)}.swagger-ui .bg-white-50{background-color:hsla(0,0%,100%,.5)}.swagger-ui .bg-white-40{background-color:hsla(0,0%,100%,.4)}.swagger-ui .bg-white-30{background-color:hsla(0,0%,100%,.3)}.swagger-ui .bg-white-20{background-color:hsla(0,0%,100%,.2)}.swagger-ui .bg-white-10{background-color:hsla(0,0%,100%,.1)}.swagger-ui .bg-black{background-color:#000}.swagger-ui .bg-near-black{background-color:#111}.swagger-ui .bg-dark-gray{background-color:#333}.swagger-ui .bg-mid-gray{background-color:#555}.swagger-ui .bg-gray{background-color:#777}.swagger-ui .bg-silver{background-color:#999}.swagger-ui .bg-light-silver{background-color:#aaa}.swagger-ui .bg-moon-gray{background-color:#ccc}.swagger-ui .bg-light-gray{background-color:#eee}.swagger-ui .bg-near-white{background-color:#f4f4f4}.swagger-ui .bg-white{background-color:#fff}.swagger-ui .bg-transparent{background-color:transparent}.swagger-ui .bg-dark-red{background-color:#e7040f}.swagger-ui .bg-red{background-color:#ff4136}.swagger-ui .bg-light-red{background-color:#ff725c}.swagger-ui .bg-orange{background-color:#ff6300}.swagger-ui .bg-gold{background-color:#ffb700}.swagger-ui .bg-yellow{background-color:gold}.swagger-ui .bg-light-yellow{background-color:#fbf1a9}.swagger-ui .bg-purple{background-color:#5e2ca5}.swagger-ui .bg-light-purple{background-color:#a463f2}.swagger-ui .bg-dark-pink{background-color:#d5008f}.swagger-ui .bg-hot-pink{background-color:#ff41b4}.swagger-ui .bg-pink{background-color:#ff80cc}.swagger-ui .bg-light-pink{background-color:#ffa3d7}.swagger-ui .bg-dark-green{background-color:#137752}.swagger-ui .bg-green{background-color:#19a974}.swagger-ui .bg-light-green{background-color:#9eebcf}.swagger-ui .bg-navy{background-color:#001b44}.swagger-ui .bg-dark-blue{background-color:#00449e}.swagger-ui .bg-blue{background-color:#357edd}.swagger-ui .bg-light-blue{background-color:#96ccff}.swagger-ui .bg-lightest-blue{background-color:#cdecff}.swagger-ui .bg-washed-blue{background-color:#f6fffe}.swagger-ui .bg-washed-green{background-color:#e8fdf5}.swagger-ui .bg-washed-yellow{background-color:#fffceb}.swagger-ui .bg-washed-red{background-color:#ffdfdf}.swagger-ui .bg-inherit{background-color:inherit}.swagger-ui .hover-black:focus,.swagger-ui .hover-black:hover{color:#000}.swagger-ui .hover-near-black:focus,.swagger-ui .hover-near-black:hover{color:#111}.swagger-ui .hover-dark-gray:focus,.swagger-ui .hover-dark-gray:hover{color:#333}.swagger-ui .hover-mid-gray:focus,.swagger-ui .hover-mid-gray:hover{color:#555}.swagger-ui .hover-gray:focus,.swagger-ui .hover-gray:hover{color:#777}.swagger-ui .hover-silver:focus,.swagger-ui .hover-silver:hover{color:#999}.swagger-ui .hover-light-silver:focus,.swagger-ui .hover-light-silver:hover{color:#aaa}.swagger-ui .hover-moon-gray:focus,.swagger-ui .hover-moon-gray:hover{color:#ccc}.swagger-ui .hover-light-gray:focus,.swagger-ui .hover-light-gray:hover{color:#eee}.swagger-ui .hover-near-white:focus,.swagger-ui .hover-near-white:hover{color:#f4f4f4}.swagger-ui .hover-white:focus,.swagger-ui .hover-white:hover{color:#fff}.swagger-ui .hover-black-90:focus,.swagger-ui .hover-black-90:hover{color:rgba(0,0,0,.9)}.swagger-ui .hover-black-80:focus,.swagger-ui .hover-black-80:hover{color:rgba(0,0,0,.8)}.swagger-ui .hover-black-70:focus,.swagger-ui .hover-black-70:hover{color:rgba(0,0,0,.7)}.swagger-ui .hover-black-60:focus,.swagger-ui .hover-black-60:hover{color:rgba(0,0,0,.6)}.swagger-ui .hover-black-50:focus,.swagger-ui .hover-black-50:hover{color:rgba(0,0,0,.5)}.swagger-ui .hover-black-40:focus,.swagger-ui .hover-black-40:hover{color:rgba(0,0,0,.4)}.swagger-ui .hover-black-30:focus,.swagger-ui .hover-black-30:hover{color:rgba(0,0,0,.3)}.swagger-ui .hover-black-20:focus,.swagger-ui .hover-black-20:hover{color:rgba(0,0,0,.2)}.swagger-ui .hover-black-10:focus,.swagger-ui .hover-black-10:hover{color:rgba(0,0,0,.1)}.swagger-ui .hover-white-90:focus,.swagger-ui .hover-white-90:hover{color:hsla(0,0%,100%,.9)}.swagger-ui .hover-white-80:focus,.swagger-ui .hover-white-80:hover{color:hsla(0,0%,100%,.8)}.swagger-ui .hover-white-70:focus,.swagger-ui .hover-white-70:hover{color:hsla(0,0%,100%,.7)}.swagger-ui .hover-white-60:focus,.swagger-ui .hover-white-60:hover{color:hsla(0,0%,100%,.6)}.swagger-ui .hover-white-50:focus,.swagger-ui .hover-white-50:hover{color:hsla(0,0%,100%,.5)}.swagger-ui .hover-white-40:focus,.swagger-ui .hover-white-40:hover{color:hsla(0,0%,100%,.4)}.swagger-ui .hover-white-30:focus,.swagger-ui .hover-white-30:hover{color:hsla(0,0%,100%,.3)}.swagger-ui .hover-white-20:focus,.swagger-ui .hover-white-20:hover{color:hsla(0,0%,100%,.2)}.swagger-ui .hover-white-10:focus,.swagger-ui .hover-white-10:hover{color:hsla(0,0%,100%,.1)}.swagger-ui .hover-inherit:focus,.swagger-ui .hover-inherit:hover{color:inherit}.swagger-ui .hover-bg-black:focus,.swagger-ui .hover-bg-black:hover{background-color:#000}.swagger-ui .hover-bg-near-black:focus,.swagger-ui .hover-bg-near-black:hover{background-color:#111}.swagger-ui .hover-bg-dark-gray:focus,.swagger-ui .hover-bg-dark-gray:hover{background-color:#333}.swagger-ui .hover-bg-mid-gray:focus,.swagger-ui .hover-bg-mid-gray:hover{background-color:#555}.swagger-ui .hover-bg-gray:focus,.swagger-ui .hover-bg-gray:hover{background-color:#777}.swagger-ui .hover-bg-silver:focus,.swagger-ui .hover-bg-silver:hover{background-color:#999}.swagger-ui .hover-bg-light-silver:focus,.swagger-ui .hover-bg-light-silver:hover{background-color:#aaa}.swagger-ui .hover-bg-moon-gray:focus,.swagger-ui .hover-bg-moon-gray:hover{background-color:#ccc}.swagger-ui .hover-bg-light-gray:focus,.swagger-ui .hover-bg-light-gray:hover{background-color:#eee}.swagger-ui .hover-bg-near-white:focus,.swagger-ui .hover-bg-near-white:hover{background-color:#f4f4f4}.swagger-ui .hover-bg-white:focus,.swagger-ui .hover-bg-white:hover{background-color:#fff}.swagger-ui .hover-bg-transparent:focus,.swagger-ui .hover-bg-transparent:hover{background-color:transparent}.swagger-ui .hover-bg-black-90:focus,.swagger-ui .hover-bg-black-90:hover{background-color:rgba(0,0,0,.9)}.swagger-ui .hover-bg-black-80:focus,.swagger-ui .hover-bg-black-80:hover{background-color:rgba(0,0,0,.8)}.swagger-ui .hover-bg-black-70:focus,.swagger-ui .hover-bg-black-70:hover{background-color:rgba(0,0,0,.7)}.swagger-ui .hover-bg-black-60:focus,.swagger-ui .hover-bg-black-60:hover{background-color:rgba(0,0,0,.6)}.swagger-ui .hover-bg-black-50:focus,.swagger-ui .hover-bg-black-50:hover{background-color:rgba(0,0,0,.5)}.swagger-ui .hover-bg-black-40:focus,.swagger-ui .hover-bg-black-40:hover{background-color:rgba(0,0,0,.4)}.swagger-ui .hover-bg-black-30:focus,.swagger-ui .hover-bg-black-30:hover{background-color:rgba(0,0,0,.3)}.swagger-ui .hover-bg-black-20:focus,.swagger-ui .hover-bg-black-20:hover{background-color:rgba(0,0,0,.2)}.swagger-ui .hover-bg-black-10:focus,.swagger-ui .hover-bg-black-10:hover{background-color:rgba(0,0,0,.1)}.swagger-ui .hover-bg-white-90:focus,.swagger-ui .hover-bg-white-90:hover{background-color:hsla(0,0%,100%,.9)}.swagger-ui .hover-bg-white-80:focus,.swagger-ui .hover-bg-white-80:hover{background-color:hsla(0,0%,100%,.8)}.swagger-ui .hover-bg-white-70:focus,.swagger-ui .hover-bg-white-70:hover{background-color:hsla(0,0%,100%,.7)}.swagger-ui .hover-bg-white-60:focus,.swagger-ui .hover-bg-white-60:hover{background-color:hsla(0,0%,100%,.6)}.swagger-ui .hover-bg-white-50:focus,.swagger-ui .hover-bg-white-50:hover{background-color:hsla(0,0%,100%,.5)}.swagger-ui .hover-bg-white-40:focus,.swagger-ui .hover-bg-white-40:hover{background-color:hsla(0,0%,100%,.4)}.swagger-ui .hover-bg-white-30:focus,.swagger-ui .hover-bg-white-30:hover{background-color:hsla(0,0%,100%,.3)}.swagger-ui .hover-bg-white-20:focus,.swagger-ui .hover-bg-white-20:hover{background-color:hsla(0,0%,100%,.2)}.swagger-ui .hover-bg-white-10:focus,.swagger-ui .hover-bg-white-10:hover{background-color:hsla(0,0%,100%,.1)}.swagger-ui .hover-dark-red:focus,.swagger-ui .hover-dark-red:hover{color:#e7040f}.swagger-ui .hover-red:focus,.swagger-ui .hover-red:hover{color:#ff4136}.swagger-ui .hover-light-red:focus,.swagger-ui .hover-light-red:hover{color:#ff725c}.swagger-ui .hover-orange:focus,.swagger-ui .hover-orange:hover{color:#ff6300}.swagger-ui .hover-gold:focus,.swagger-ui .hover-gold:hover{color:#ffb700}.swagger-ui .hover-yellow:focus,.swagger-ui .hover-yellow:hover{color:gold}.swagger-ui .hover-light-yellow:focus,.swagger-ui .hover-light-yellow:hover{color:#fbf1a9}.swagger-ui .hover-purple:focus,.swagger-ui .hover-purple:hover{color:#5e2ca5}.swagger-ui .hover-light-purple:focus,.swagger-ui .hover-light-purple:hover{color:#a463f2}.swagger-ui .hover-dark-pink:focus,.swagger-ui .hover-dark-pink:hover{color:#d5008f}.swagger-ui .hover-hot-pink:focus,.swagger-ui .hover-hot-pink:hover{color:#ff41b4}.swagger-ui .hover-pink:focus,.swagger-ui .hover-pink:hover{color:#ff80cc}.swagger-ui .hover-light-pink:focus,.swagger-ui .hover-light-pink:hover{color:#ffa3d7}.swagger-ui .hover-dark-green:focus,.swagger-ui .hover-dark-green:hover{color:#137752}.swagger-ui .hover-green:focus,.swagger-ui .hover-green:hover{color:#19a974}.swagger-ui .hover-light-green:focus,.swagger-ui .hover-light-green:hover{color:#9eebcf}.swagger-ui .hover-navy:focus,.swagger-ui .hover-navy:hover{color:#001b44}.swagger-ui .hover-dark-blue:focus,.swagger-ui .hover-dark-blue:hover{color:#00449e}.swagger-ui .hover-blue:focus,.swagger-ui .hover-blue:hover{color:#357edd}.swagger-ui .hover-light-blue:focus,.swagger-ui .hover-light-blue:hover{color:#96ccff}.swagger-ui .hover-lightest-blue:focus,.swagger-ui .hover-lightest-blue:hover{color:#cdecff}.swagger-ui .hover-washed-blue:focus,.swagger-ui .hover-washed-blue:hover{color:#f6fffe}.swagger-ui .hover-washed-green:focus,.swagger-ui .hover-washed-green:hover{color:#e8fdf5}.swagger-ui .hover-washed-yellow:focus,.swagger-ui .hover-washed-yellow:hover{color:#fffceb}.swagger-ui .hover-washed-red:focus,.swagger-ui .hover-washed-red:hover{color:#ffdfdf}.swagger-ui .hover-bg-dark-red:focus,.swagger-ui .hover-bg-dark-red:hover{background-color:#e7040f}.swagger-ui .hover-bg-red:focus,.swagger-ui .hover-bg-red:hover{background-color:#ff4136}.swagger-ui .hover-bg-light-red:focus,.swagger-ui .hover-bg-light-red:hover{background-color:#ff725c}.swagger-ui .hover-bg-orange:focus,.swagger-ui .hover-bg-orange:hover{background-color:#ff6300}.swagger-ui .hover-bg-gold:focus,.swagger-ui .hover-bg-gold:hover{background-color:#ffb700}.swagger-ui .hover-bg-yellow:focus,.swagger-ui .hover-bg-yellow:hover{background-color:gold}.swagger-ui .hover-bg-light-yellow:focus,.swagger-ui .hover-bg-light-yellow:hover{background-color:#fbf1a9}.swagger-ui .hover-bg-purple:focus,.swagger-ui .hover-bg-purple:hover{background-color:#5e2ca5}.swagger-ui .hover-bg-light-purple:focus,.swagger-ui .hover-bg-light-purple:hover{background-color:#a463f2}.swagger-ui .hover-bg-dark-pink:focus,.swagger-ui .hover-bg-dark-pink:hover{background-color:#d5008f}.swagger-ui .hover-bg-hot-pink:focus,.swagger-ui .hover-bg-hot-pink:hover{background-color:#ff41b4}.swagger-ui .hover-bg-pink:focus,.swagger-ui .hover-bg-pink:hover{background-color:#ff80cc}.swagger-ui .hover-bg-light-pink:focus,.swagger-ui .hover-bg-light-pink:hover{background-color:#ffa3d7}.swagger-ui .hover-bg-dark-green:focus,.swagger-ui .hover-bg-dark-green:hover{background-color:#137752}.swagger-ui .hover-bg-green:focus,.swagger-ui .hover-bg-green:hover{background-color:#19a974}.swagger-ui .hover-bg-light-green:focus,.swagger-ui .hover-bg-light-green:hover{background-color:#9eebcf}.swagger-ui .hover-bg-navy:focus,.swagger-ui .hover-bg-navy:hover{background-color:#001b44}.swagger-ui .hover-bg-dark-blue:focus,.swagger-ui .hover-bg-dark-blue:hover{background-color:#00449e}.swagger-ui .hover-bg-blue:focus,.swagger-ui .hover-bg-blue:hover{background-color:#357edd}.swagger-ui .hover-bg-light-blue:focus,.swagger-ui .hover-bg-light-blue:hover{background-color:#96ccff}.swagger-ui .hover-bg-lightest-blue:focus,.swagger-ui .hover-bg-lightest-blue:hover{background-color:#cdecff}.swagger-ui .hover-bg-washed-blue:focus,.swagger-ui .hover-bg-washed-blue:hover{background-color:#f6fffe}.swagger-ui .hover-bg-washed-green:focus,.swagger-ui .hover-bg-washed-green:hover{background-color:#e8fdf5}.swagger-ui .hover-bg-washed-yellow:focus,.swagger-ui .hover-bg-washed-yellow:hover{background-color:#fffceb}.swagger-ui .hover-bg-washed-red:focus,.swagger-ui .hover-bg-washed-red:hover{background-color:#ffdfdf}.swagger-ui .hover-bg-inherit:focus,.swagger-ui .hover-bg-inherit:hover{background-color:inherit}.swagger-ui .pa0{padding:0}.swagger-ui .pa1{padding:.25rem}.swagger-ui .pa2{padding:.5rem}.swagger-ui .pa3{padding:1rem}.swagger-ui .pa4{padding:2rem}.swagger-ui .pa5{padding:4rem}.swagger-ui .pa6{padding:8rem}.swagger-ui .pa7{padding:16rem}.swagger-ui .pl0{padding-left:0}.swagger-ui .pl1{padding-left:.25rem}.swagger-ui .pl2{padding-left:.5rem}.swagger-ui .pl3{padding-left:1rem}.swagger-ui .pl4{padding-left:2rem}.swagger-ui .pl5{padding-left:4rem}.swagger-ui .pl6{padding-left:8rem}.swagger-ui .pl7{padding-left:16rem}.swagger-ui .pr0{padding-right:0}.swagger-ui .pr1{padding-right:.25rem}.swagger-ui .pr2{padding-right:.5rem}.swagger-ui .pr3{padding-right:1rem}.swagger-ui .pr4{padding-right:2rem}.swagger-ui .pr5{padding-right:4rem}.swagger-ui .pr6{padding-right:8rem}.swagger-ui .pr7{padding-right:16rem}.swagger-ui .pb0{padding-bottom:0}.swagger-ui .pb1{padding-bottom:.25rem}.swagger-ui .pb2{padding-bottom:.5rem}.swagger-ui .pb3{padding-bottom:1rem}.swagger-ui .pb4{padding-bottom:2rem}.swagger-ui .pb5{padding-bottom:4rem}.swagger-ui .pb6{padding-bottom:8rem}.swagger-ui .pb7{padding-bottom:16rem}.swagger-ui .pt0{padding-top:0}.swagger-ui .pt1{padding-top:.25rem}.swagger-ui .pt2{padding-top:.5rem}.swagger-ui .pt3{padding-top:1rem}.swagger-ui .pt4{padding-top:2rem}.swagger-ui .pt5{padding-top:4rem}.swagger-ui .pt6{padding-top:8rem}.swagger-ui .pt7{padding-top:16rem}.swagger-ui .pv0{padding-bottom:0;padding-top:0}.swagger-ui .pv1{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0{padding-left:0;padding-right:0}.swagger-ui .ph1{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0{margin:0}.swagger-ui .ma1{margin:.25rem}.swagger-ui .ma2{margin:.5rem}.swagger-ui .ma3{margin:1rem}.swagger-ui .ma4{margin:2rem}.swagger-ui .ma5{margin:4rem}.swagger-ui .ma6{margin:8rem}.swagger-ui .ma7{margin:16rem}.swagger-ui .ml0{margin-left:0}.swagger-ui .ml1{margin-left:.25rem}.swagger-ui .ml2{margin-left:.5rem}.swagger-ui .ml3{margin-left:1rem}.swagger-ui .ml4{margin-left:2rem}.swagger-ui .ml5{margin-left:4rem}.swagger-ui .ml6{margin-left:8rem}.swagger-ui .ml7{margin-left:16rem}.swagger-ui .mr0{margin-right:0}.swagger-ui .mr1{margin-right:.25rem}.swagger-ui .mr2{margin-right:.5rem}.swagger-ui .mr3{margin-right:1rem}.swagger-ui .mr4{margin-right:2rem}.swagger-ui .mr5{margin-right:4rem}.swagger-ui .mr6{margin-right:8rem}.swagger-ui .mr7{margin-right:16rem}.swagger-ui .mb0{margin-bottom:0}.swagger-ui .mb1{margin-bottom:.25rem}.swagger-ui .mb2{margin-bottom:.5rem}.swagger-ui .mb3{margin-bottom:1rem}.swagger-ui .mb4{margin-bottom:2rem}.swagger-ui .mb5{margin-bottom:4rem}.swagger-ui .mb6{margin-bottom:8rem}.swagger-ui .mb7{margin-bottom:16rem}.swagger-ui .mt0{margin-top:0}.swagger-ui .mt1{margin-top:.25rem}.swagger-ui .mt2{margin-top:.5rem}.swagger-ui .mt3{margin-top:1rem}.swagger-ui .mt4{margin-top:2rem}.swagger-ui .mt5{margin-top:4rem}.swagger-ui .mt6{margin-top:8rem}.swagger-ui .mt7{margin-top:16rem}.swagger-ui .mv0{margin-bottom:0;margin-top:0}.swagger-ui .mv1{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0{margin-left:0;margin-right:0}.swagger-ui .mh1{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7{margin-left:16rem;margin-right:16rem}@media screen and (min-width:30em){.swagger-ui .pa0-ns{padding:0}.swagger-ui .pa1-ns{padding:.25rem}.swagger-ui .pa2-ns{padding:.5rem}.swagger-ui .pa3-ns{padding:1rem}.swagger-ui .pa4-ns{padding:2rem}.swagger-ui .pa5-ns{padding:4rem}.swagger-ui .pa6-ns{padding:8rem}.swagger-ui .pa7-ns{padding:16rem}.swagger-ui .pl0-ns{padding-left:0}.swagger-ui .pl1-ns{padding-left:.25rem}.swagger-ui .pl2-ns{padding-left:.5rem}.swagger-ui .pl3-ns{padding-left:1rem}.swagger-ui .pl4-ns{padding-left:2rem}.swagger-ui .pl5-ns{padding-left:4rem}.swagger-ui .pl6-ns{padding-left:8rem}.swagger-ui .pl7-ns{padding-left:16rem}.swagger-ui .pr0-ns{padding-right:0}.swagger-ui .pr1-ns{padding-right:.25rem}.swagger-ui .pr2-ns{padding-right:.5rem}.swagger-ui .pr3-ns{padding-right:1rem}.swagger-ui .pr4-ns{padding-right:2rem}.swagger-ui .pr5-ns{padding-right:4rem}.swagger-ui .pr6-ns{padding-right:8rem}.swagger-ui .pr7-ns{padding-right:16rem}.swagger-ui .pb0-ns{padding-bottom:0}.swagger-ui .pb1-ns{padding-bottom:.25rem}.swagger-ui .pb2-ns{padding-bottom:.5rem}.swagger-ui .pb3-ns{padding-bottom:1rem}.swagger-ui .pb4-ns{padding-bottom:2rem}.swagger-ui .pb5-ns{padding-bottom:4rem}.swagger-ui .pb6-ns{padding-bottom:8rem}.swagger-ui .pb7-ns{padding-bottom:16rem}.swagger-ui .pt0-ns{padding-top:0}.swagger-ui .pt1-ns{padding-top:.25rem}.swagger-ui .pt2-ns{padding-top:.5rem}.swagger-ui .pt3-ns{padding-top:1rem}.swagger-ui .pt4-ns{padding-top:2rem}.swagger-ui .pt5-ns{padding-top:4rem}.swagger-ui .pt6-ns{padding-top:8rem}.swagger-ui .pt7-ns{padding-top:16rem}.swagger-ui .pv0-ns{padding-bottom:0;padding-top:0}.swagger-ui .pv1-ns{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-ns{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-ns{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-ns{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-ns{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-ns{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-ns{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-ns{padding-left:0;padding-right:0}.swagger-ui .ph1-ns{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-ns{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-ns{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-ns{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-ns{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-ns{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-ns{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-ns{margin:0}.swagger-ui .ma1-ns{margin:.25rem}.swagger-ui .ma2-ns{margin:.5rem}.swagger-ui .ma3-ns{margin:1rem}.swagger-ui .ma4-ns{margin:2rem}.swagger-ui .ma5-ns{margin:4rem}.swagger-ui .ma6-ns{margin:8rem}.swagger-ui .ma7-ns{margin:16rem}.swagger-ui .ml0-ns{margin-left:0}.swagger-ui .ml1-ns{margin-left:.25rem}.swagger-ui .ml2-ns{margin-left:.5rem}.swagger-ui .ml3-ns{margin-left:1rem}.swagger-ui .ml4-ns{margin-left:2rem}.swagger-ui .ml5-ns{margin-left:4rem}.swagger-ui .ml6-ns{margin-left:8rem}.swagger-ui .ml7-ns{margin-left:16rem}.swagger-ui .mr0-ns{margin-right:0}.swagger-ui .mr1-ns{margin-right:.25rem}.swagger-ui .mr2-ns{margin-right:.5rem}.swagger-ui .mr3-ns{margin-right:1rem}.swagger-ui .mr4-ns{margin-right:2rem}.swagger-ui .mr5-ns{margin-right:4rem}.swagger-ui .mr6-ns{margin-right:8rem}.swagger-ui .mr7-ns{margin-right:16rem}.swagger-ui .mb0-ns{margin-bottom:0}.swagger-ui .mb1-ns{margin-bottom:.25rem}.swagger-ui .mb2-ns{margin-bottom:.5rem}.swagger-ui .mb3-ns{margin-bottom:1rem}.swagger-ui .mb4-ns{margin-bottom:2rem}.swagger-ui .mb5-ns{margin-bottom:4rem}.swagger-ui .mb6-ns{margin-bottom:8rem}.swagger-ui .mb7-ns{margin-bottom:16rem}.swagger-ui .mt0-ns{margin-top:0}.swagger-ui .mt1-ns{margin-top:.25rem}.swagger-ui .mt2-ns{margin-top:.5rem}.swagger-ui .mt3-ns{margin-top:1rem}.swagger-ui .mt4-ns{margin-top:2rem}.swagger-ui .mt5-ns{margin-top:4rem}.swagger-ui .mt6-ns{margin-top:8rem}.swagger-ui .mt7-ns{margin-top:16rem}.swagger-ui .mv0-ns{margin-bottom:0;margin-top:0}.swagger-ui .mv1-ns{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-ns{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-ns{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-ns{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-ns{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-ns{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-ns{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-ns{margin-left:0;margin-right:0}.swagger-ui .mh1-ns{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-ns{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-ns{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-ns{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-ns{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-ns{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-ns{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .pa0-m{padding:0}.swagger-ui .pa1-m{padding:.25rem}.swagger-ui .pa2-m{padding:.5rem}.swagger-ui .pa3-m{padding:1rem}.swagger-ui .pa4-m{padding:2rem}.swagger-ui .pa5-m{padding:4rem}.swagger-ui .pa6-m{padding:8rem}.swagger-ui .pa7-m{padding:16rem}.swagger-ui .pl0-m{padding-left:0}.swagger-ui .pl1-m{padding-left:.25rem}.swagger-ui .pl2-m{padding-left:.5rem}.swagger-ui .pl3-m{padding-left:1rem}.swagger-ui .pl4-m{padding-left:2rem}.swagger-ui .pl5-m{padding-left:4rem}.swagger-ui .pl6-m{padding-left:8rem}.swagger-ui .pl7-m{padding-left:16rem}.swagger-ui .pr0-m{padding-right:0}.swagger-ui .pr1-m{padding-right:.25rem}.swagger-ui .pr2-m{padding-right:.5rem}.swagger-ui .pr3-m{padding-right:1rem}.swagger-ui .pr4-m{padding-right:2rem}.swagger-ui .pr5-m{padding-right:4rem}.swagger-ui .pr6-m{padding-right:8rem}.swagger-ui .pr7-m{padding-right:16rem}.swagger-ui .pb0-m{padding-bottom:0}.swagger-ui .pb1-m{padding-bottom:.25rem}.swagger-ui .pb2-m{padding-bottom:.5rem}.swagger-ui .pb3-m{padding-bottom:1rem}.swagger-ui .pb4-m{padding-bottom:2rem}.swagger-ui .pb5-m{padding-bottom:4rem}.swagger-ui .pb6-m{padding-bottom:8rem}.swagger-ui .pb7-m{padding-bottom:16rem}.swagger-ui .pt0-m{padding-top:0}.swagger-ui .pt1-m{padding-top:.25rem}.swagger-ui .pt2-m{padding-top:.5rem}.swagger-ui .pt3-m{padding-top:1rem}.swagger-ui .pt4-m{padding-top:2rem}.swagger-ui .pt5-m{padding-top:4rem}.swagger-ui .pt6-m{padding-top:8rem}.swagger-ui .pt7-m{padding-top:16rem}.swagger-ui .pv0-m{padding-bottom:0;padding-top:0}.swagger-ui .pv1-m{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-m{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-m{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-m{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-m{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-m{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-m{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-m{padding-left:0;padding-right:0}.swagger-ui .ph1-m{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-m{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-m{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-m{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-m{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-m{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-m{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-m{margin:0}.swagger-ui .ma1-m{margin:.25rem}.swagger-ui .ma2-m{margin:.5rem}.swagger-ui .ma3-m{margin:1rem}.swagger-ui .ma4-m{margin:2rem}.swagger-ui .ma5-m{margin:4rem}.swagger-ui .ma6-m{margin:8rem}.swagger-ui .ma7-m{margin:16rem}.swagger-ui .ml0-m{margin-left:0}.swagger-ui .ml1-m{margin-left:.25rem}.swagger-ui .ml2-m{margin-left:.5rem}.swagger-ui .ml3-m{margin-left:1rem}.swagger-ui .ml4-m{margin-left:2rem}.swagger-ui .ml5-m{margin-left:4rem}.swagger-ui .ml6-m{margin-left:8rem}.swagger-ui .ml7-m{margin-left:16rem}.swagger-ui .mr0-m{margin-right:0}.swagger-ui .mr1-m{margin-right:.25rem}.swagger-ui .mr2-m{margin-right:.5rem}.swagger-ui .mr3-m{margin-right:1rem}.swagger-ui .mr4-m{margin-right:2rem}.swagger-ui .mr5-m{margin-right:4rem}.swagger-ui .mr6-m{margin-right:8rem}.swagger-ui .mr7-m{margin-right:16rem}.swagger-ui .mb0-m{margin-bottom:0}.swagger-ui .mb1-m{margin-bottom:.25rem}.swagger-ui .mb2-m{margin-bottom:.5rem}.swagger-ui .mb3-m{margin-bottom:1rem}.swagger-ui .mb4-m{margin-bottom:2rem}.swagger-ui .mb5-m{margin-bottom:4rem}.swagger-ui .mb6-m{margin-bottom:8rem}.swagger-ui .mb7-m{margin-bottom:16rem}.swagger-ui .mt0-m{margin-top:0}.swagger-ui .mt1-m{margin-top:.25rem}.swagger-ui .mt2-m{margin-top:.5rem}.swagger-ui .mt3-m{margin-top:1rem}.swagger-ui .mt4-m{margin-top:2rem}.swagger-ui .mt5-m{margin-top:4rem}.swagger-ui .mt6-m{margin-top:8rem}.swagger-ui .mt7-m{margin-top:16rem}.swagger-ui .mv0-m{margin-bottom:0;margin-top:0}.swagger-ui .mv1-m{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-m{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-m{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-m{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-m{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-m{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-m{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-m{margin-left:0;margin-right:0}.swagger-ui .mh1-m{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-m{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-m{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-m{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-m{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-m{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-m{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:60em){.swagger-ui .pa0-l{padding:0}.swagger-ui .pa1-l{padding:.25rem}.swagger-ui .pa2-l{padding:.5rem}.swagger-ui .pa3-l{padding:1rem}.swagger-ui .pa4-l{padding:2rem}.swagger-ui .pa5-l{padding:4rem}.swagger-ui .pa6-l{padding:8rem}.swagger-ui .pa7-l{padding:16rem}.swagger-ui .pl0-l{padding-left:0}.swagger-ui .pl1-l{padding-left:.25rem}.swagger-ui .pl2-l{padding-left:.5rem}.swagger-ui .pl3-l{padding-left:1rem}.swagger-ui .pl4-l{padding-left:2rem}.swagger-ui .pl5-l{padding-left:4rem}.swagger-ui .pl6-l{padding-left:8rem}.swagger-ui .pl7-l{padding-left:16rem}.swagger-ui .pr0-l{padding-right:0}.swagger-ui .pr1-l{padding-right:.25rem}.swagger-ui .pr2-l{padding-right:.5rem}.swagger-ui .pr3-l{padding-right:1rem}.swagger-ui .pr4-l{padding-right:2rem}.swagger-ui .pr5-l{padding-right:4rem}.swagger-ui .pr6-l{padding-right:8rem}.swagger-ui .pr7-l{padding-right:16rem}.swagger-ui .pb0-l{padding-bottom:0}.swagger-ui .pb1-l{padding-bottom:.25rem}.swagger-ui .pb2-l{padding-bottom:.5rem}.swagger-ui .pb3-l{padding-bottom:1rem}.swagger-ui .pb4-l{padding-bottom:2rem}.swagger-ui .pb5-l{padding-bottom:4rem}.swagger-ui .pb6-l{padding-bottom:8rem}.swagger-ui .pb7-l{padding-bottom:16rem}.swagger-ui .pt0-l{padding-top:0}.swagger-ui .pt1-l{padding-top:.25rem}.swagger-ui .pt2-l{padding-top:.5rem}.swagger-ui .pt3-l{padding-top:1rem}.swagger-ui .pt4-l{padding-top:2rem}.swagger-ui .pt5-l{padding-top:4rem}.swagger-ui .pt6-l{padding-top:8rem}.swagger-ui .pt7-l{padding-top:16rem}.swagger-ui .pv0-l{padding-bottom:0;padding-top:0}.swagger-ui .pv1-l{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-l{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-l{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-l{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-l{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-l{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-l{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-l{padding-left:0;padding-right:0}.swagger-ui .ph1-l{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-l{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-l{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-l{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-l{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-l{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-l{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-l{margin:0}.swagger-ui .ma1-l{margin:.25rem}.swagger-ui .ma2-l{margin:.5rem}.swagger-ui .ma3-l{margin:1rem}.swagger-ui .ma4-l{margin:2rem}.swagger-ui .ma5-l{margin:4rem}.swagger-ui .ma6-l{margin:8rem}.swagger-ui .ma7-l{margin:16rem}.swagger-ui .ml0-l{margin-left:0}.swagger-ui .ml1-l{margin-left:.25rem}.swagger-ui .ml2-l{margin-left:.5rem}.swagger-ui .ml3-l{margin-left:1rem}.swagger-ui .ml4-l{margin-left:2rem}.swagger-ui .ml5-l{margin-left:4rem}.swagger-ui .ml6-l{margin-left:8rem}.swagger-ui .ml7-l{margin-left:16rem}.swagger-ui .mr0-l{margin-right:0}.swagger-ui .mr1-l{margin-right:.25rem}.swagger-ui .mr2-l{margin-right:.5rem}.swagger-ui .mr3-l{margin-right:1rem}.swagger-ui .mr4-l{margin-right:2rem}.swagger-ui .mr5-l{margin-right:4rem}.swagger-ui .mr6-l{margin-right:8rem}.swagger-ui .mr7-l{margin-right:16rem}.swagger-ui .mb0-l{margin-bottom:0}.swagger-ui .mb1-l{margin-bottom:.25rem}.swagger-ui .mb2-l{margin-bottom:.5rem}.swagger-ui .mb3-l{margin-bottom:1rem}.swagger-ui .mb4-l{margin-bottom:2rem}.swagger-ui .mb5-l{margin-bottom:4rem}.swagger-ui .mb6-l{margin-bottom:8rem}.swagger-ui .mb7-l{margin-bottom:16rem}.swagger-ui .mt0-l{margin-top:0}.swagger-ui .mt1-l{margin-top:.25rem}.swagger-ui .mt2-l{margin-top:.5rem}.swagger-ui .mt3-l{margin-top:1rem}.swagger-ui .mt4-l{margin-top:2rem}.swagger-ui .mt5-l{margin-top:4rem}.swagger-ui .mt6-l{margin-top:8rem}.swagger-ui .mt7-l{margin-top:16rem}.swagger-ui .mv0-l{margin-bottom:0;margin-top:0}.swagger-ui .mv1-l{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-l{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-l{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-l{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-l{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-l{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-l{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-l{margin-left:0;margin-right:0}.swagger-ui .mh1-l{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-l{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-l{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-l{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-l{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-l{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-l{margin-left:16rem;margin-right:16rem}}.swagger-ui .na1{margin:-.25rem}.swagger-ui .na2{margin:-.5rem}.swagger-ui .na3{margin:-1rem}.swagger-ui .na4{margin:-2rem}.swagger-ui .na5{margin:-4rem}.swagger-ui .na6{margin:-8rem}.swagger-ui .na7{margin:-16rem}.swagger-ui .nl1{margin-left:-.25rem}.swagger-ui .nl2{margin-left:-.5rem}.swagger-ui .nl3{margin-left:-1rem}.swagger-ui .nl4{margin-left:-2rem}.swagger-ui .nl5{margin-left:-4rem}.swagger-ui .nl6{margin-left:-8rem}.swagger-ui .nl7{margin-left:-16rem}.swagger-ui .nr1{margin-right:-.25rem}.swagger-ui .nr2{margin-right:-.5rem}.swagger-ui .nr3{margin-right:-1rem}.swagger-ui .nr4{margin-right:-2rem}.swagger-ui .nr5{margin-right:-4rem}.swagger-ui .nr6{margin-right:-8rem}.swagger-ui .nr7{margin-right:-16rem}.swagger-ui .nb1{margin-bottom:-.25rem}.swagger-ui .nb2{margin-bottom:-.5rem}.swagger-ui .nb3{margin-bottom:-1rem}.swagger-ui .nb4{margin-bottom:-2rem}.swagger-ui .nb5{margin-bottom:-4rem}.swagger-ui .nb6{margin-bottom:-8rem}.swagger-ui .nb7{margin-bottom:-16rem}.swagger-ui .nt1{margin-top:-.25rem}.swagger-ui .nt2{margin-top:-.5rem}.swagger-ui .nt3{margin-top:-1rem}.swagger-ui .nt4{margin-top:-2rem}.swagger-ui .nt5{margin-top:-4rem}.swagger-ui .nt6{margin-top:-8rem}.swagger-ui .nt7{margin-top:-16rem}@media screen and (min-width:30em){.swagger-ui .na1-ns{margin:-.25rem}.swagger-ui .na2-ns{margin:-.5rem}.swagger-ui .na3-ns{margin:-1rem}.swagger-ui .na4-ns{margin:-2rem}.swagger-ui .na5-ns{margin:-4rem}.swagger-ui .na6-ns{margin:-8rem}.swagger-ui .na7-ns{margin:-16rem}.swagger-ui .nl1-ns{margin-left:-.25rem}.swagger-ui .nl2-ns{margin-left:-.5rem}.swagger-ui .nl3-ns{margin-left:-1rem}.swagger-ui .nl4-ns{margin-left:-2rem}.swagger-ui .nl5-ns{margin-left:-4rem}.swagger-ui .nl6-ns{margin-left:-8rem}.swagger-ui .nl7-ns{margin-left:-16rem}.swagger-ui .nr1-ns{margin-right:-.25rem}.swagger-ui .nr2-ns{margin-right:-.5rem}.swagger-ui .nr3-ns{margin-right:-1rem}.swagger-ui .nr4-ns{margin-right:-2rem}.swagger-ui .nr5-ns{margin-right:-4rem}.swagger-ui .nr6-ns{margin-right:-8rem}.swagger-ui .nr7-ns{margin-right:-16rem}.swagger-ui .nb1-ns{margin-bottom:-.25rem}.swagger-ui .nb2-ns{margin-bottom:-.5rem}.swagger-ui .nb3-ns{margin-bottom:-1rem}.swagger-ui .nb4-ns{margin-bottom:-2rem}.swagger-ui .nb5-ns{margin-bottom:-4rem}.swagger-ui .nb6-ns{margin-bottom:-8rem}.swagger-ui .nb7-ns{margin-bottom:-16rem}.swagger-ui .nt1-ns{margin-top:-.25rem}.swagger-ui .nt2-ns{margin-top:-.5rem}.swagger-ui .nt3-ns{margin-top:-1rem}.swagger-ui .nt4-ns{margin-top:-2rem}.swagger-ui .nt5-ns{margin-top:-4rem}.swagger-ui .nt6-ns{margin-top:-8rem}.swagger-ui .nt7-ns{margin-top:-16rem}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .na1-m{margin:-.25rem}.swagger-ui .na2-m{margin:-.5rem}.swagger-ui .na3-m{margin:-1rem}.swagger-ui .na4-m{margin:-2rem}.swagger-ui .na5-m{margin:-4rem}.swagger-ui .na6-m{margin:-8rem}.swagger-ui .na7-m{margin:-16rem}.swagger-ui .nl1-m{margin-left:-.25rem}.swagger-ui .nl2-m{margin-left:-.5rem}.swagger-ui .nl3-m{margin-left:-1rem}.swagger-ui .nl4-m{margin-left:-2rem}.swagger-ui .nl5-m{margin-left:-4rem}.swagger-ui .nl6-m{margin-left:-8rem}.swagger-ui .nl7-m{margin-left:-16rem}.swagger-ui .nr1-m{margin-right:-.25rem}.swagger-ui .nr2-m{margin-right:-.5rem}.swagger-ui .nr3-m{margin-right:-1rem}.swagger-ui .nr4-m{margin-right:-2rem}.swagger-ui .nr5-m{margin-right:-4rem}.swagger-ui .nr6-m{margin-right:-8rem}.swagger-ui .nr7-m{margin-right:-16rem}.swagger-ui .nb1-m{margin-bottom:-.25rem}.swagger-ui .nb2-m{margin-bottom:-.5rem}.swagger-ui .nb3-m{margin-bottom:-1rem}.swagger-ui .nb4-m{margin-bottom:-2rem}.swagger-ui .nb5-m{margin-bottom:-4rem}.swagger-ui .nb6-m{margin-bottom:-8rem}.swagger-ui .nb7-m{margin-bottom:-16rem}.swagger-ui .nt1-m{margin-top:-.25rem}.swagger-ui .nt2-m{margin-top:-.5rem}.swagger-ui .nt3-m{margin-top:-1rem}.swagger-ui .nt4-m{margin-top:-2rem}.swagger-ui .nt5-m{margin-top:-4rem}.swagger-ui .nt6-m{margin-top:-8rem}.swagger-ui .nt7-m{margin-top:-16rem}}@media screen and (min-width:60em){.swagger-ui .na1-l{margin:-.25rem}.swagger-ui .na2-l{margin:-.5rem}.swagger-ui .na3-l{margin:-1rem}.swagger-ui .na4-l{margin:-2rem}.swagger-ui .na5-l{margin:-4rem}.swagger-ui .na6-l{margin:-8rem}.swagger-ui .na7-l{margin:-16rem}.swagger-ui .nl1-l{margin-left:-.25rem}.swagger-ui .nl2-l{margin-left:-.5rem}.swagger-ui .nl3-l{margin-left:-1rem}.swagger-ui .nl4-l{margin-left:-2rem}.swagger-ui .nl5-l{margin-left:-4rem}.swagger-ui .nl6-l{margin-left:-8rem}.swagger-ui .nl7-l{margin-left:-16rem}.swagger-ui .nr1-l{margin-right:-.25rem}.swagger-ui .nr2-l{margin-right:-.5rem}.swagger-ui .nr3-l{margin-right:-1rem}.swagger-ui .nr4-l{margin-right:-2rem}.swagger-ui .nr5-l{margin-right:-4rem}.swagger-ui .nr6-l{margin-right:-8rem}.swagger-ui .nr7-l{margin-right:-16rem}.swagger-ui .nb1-l{margin-bottom:-.25rem}.swagger-ui .nb2-l{margin-bottom:-.5rem}.swagger-ui .nb3-l{margin-bottom:-1rem}.swagger-ui .nb4-l{margin-bottom:-2rem}.swagger-ui .nb5-l{margin-bottom:-4rem}.swagger-ui .nb6-l{margin-bottom:-8rem}.swagger-ui .nb7-l{margin-bottom:-16rem}.swagger-ui .nt1-l{margin-top:-.25rem}.swagger-ui .nt2-l{margin-top:-.5rem}.swagger-ui .nt3-l{margin-top:-1rem}.swagger-ui .nt4-l{margin-top:-2rem}.swagger-ui .nt5-l{margin-top:-4rem}.swagger-ui .nt6-l{margin-top:-8rem}.swagger-ui .nt7-l{margin-top:-16rem}}.swagger-ui .collapse{border-collapse:collapse;border-spacing:0}.swagger-ui .striped--light-silver:nth-child(odd){background-color:#aaa}.swagger-ui .striped--moon-gray:nth-child(odd){background-color:#ccc}.swagger-ui .striped--light-gray:nth-child(odd){background-color:#eee}.swagger-ui .striped--near-white:nth-child(odd){background-color:#f4f4f4}.swagger-ui .stripe-light:nth-child(odd){background-color:hsla(0,0%,100%,.1)}.swagger-ui .stripe-dark:nth-child(odd){background-color:rgba(0,0,0,.1)}.swagger-ui .strike{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .underline{-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .no-underline{-webkit-text-decoration:none;text-decoration:none}@media screen and (min-width:30em){.swagger-ui .strike-ns{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .underline-ns{-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .no-underline-ns{-webkit-text-decoration:none;text-decoration:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .strike-m{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .underline-m{-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .no-underline-m{-webkit-text-decoration:none;text-decoration:none}}@media screen and (min-width:60em){.swagger-ui .strike-l{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .underline-l{-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .no-underline-l{-webkit-text-decoration:none;text-decoration:none}}.swagger-ui .tl{text-align:left}.swagger-ui .tr{text-align:right}.swagger-ui .tc{text-align:center}.swagger-ui .tj{text-align:justify}@media screen and (min-width:30em){.swagger-ui .tl-ns{text-align:left}.swagger-ui .tr-ns{text-align:right}.swagger-ui .tc-ns{text-align:center}.swagger-ui .tj-ns{text-align:justify}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .tl-m{text-align:left}.swagger-ui .tr-m{text-align:right}.swagger-ui .tc-m{text-align:center}.swagger-ui .tj-m{text-align:justify}}@media screen and (min-width:60em){.swagger-ui .tl-l{text-align:left}.swagger-ui .tr-l{text-align:right}.swagger-ui .tc-l{text-align:center}.swagger-ui .tj-l{text-align:justify}}.swagger-ui .ttc{text-transform:capitalize}.swagger-ui .ttl{text-transform:lowercase}.swagger-ui .ttu{text-transform:uppercase}.swagger-ui .ttn{text-transform:none}@media screen and (min-width:30em){.swagger-ui .ttc-ns{text-transform:capitalize}.swagger-ui .ttl-ns{text-transform:lowercase}.swagger-ui .ttu-ns{text-transform:uppercase}.swagger-ui .ttn-ns{text-transform:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .ttc-m{text-transform:capitalize}.swagger-ui .ttl-m{text-transform:lowercase}.swagger-ui .ttu-m{text-transform:uppercase}.swagger-ui .ttn-m{text-transform:none}}@media screen and (min-width:60em){.swagger-ui .ttc-l{text-transform:capitalize}.swagger-ui .ttl-l{text-transform:lowercase}.swagger-ui .ttu-l{text-transform:uppercase}.swagger-ui .ttn-l{text-transform:none}}.swagger-ui .f-6,.swagger-ui .f-headline{font-size:6rem}.swagger-ui .f-5,.swagger-ui .f-subheadline{font-size:5rem}.swagger-ui .f1{font-size:3rem}.swagger-ui .f2{font-size:2.25rem}.swagger-ui .f3{font-size:1.5rem}.swagger-ui .f4{font-size:1.25rem}.swagger-ui .f5{font-size:1rem}.swagger-ui .f6{font-size:.875rem}.swagger-ui .f7{font-size:.75rem}@media screen and (min-width:30em){.swagger-ui .f-6-ns,.swagger-ui .f-headline-ns{font-size:6rem}.swagger-ui .f-5-ns,.swagger-ui .f-subheadline-ns{font-size:5rem}.swagger-ui .f1-ns{font-size:3rem}.swagger-ui .f2-ns{font-size:2.25rem}.swagger-ui .f3-ns{font-size:1.5rem}.swagger-ui .f4-ns{font-size:1.25rem}.swagger-ui .f5-ns{font-size:1rem}.swagger-ui .f6-ns{font-size:.875rem}.swagger-ui .f7-ns{font-size:.75rem}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .f-6-m,.swagger-ui .f-headline-m{font-size:6rem}.swagger-ui .f-5-m,.swagger-ui .f-subheadline-m{font-size:5rem}.swagger-ui .f1-m{font-size:3rem}.swagger-ui .f2-m{font-size:2.25rem}.swagger-ui .f3-m{font-size:1.5rem}.swagger-ui .f4-m{font-size:1.25rem}.swagger-ui .f5-m{font-size:1rem}.swagger-ui .f6-m{font-size:.875rem}.swagger-ui .f7-m{font-size:.75rem}}@media screen and (min-width:60em){.swagger-ui .f-6-l,.swagger-ui .f-headline-l{font-size:6rem}.swagger-ui .f-5-l,.swagger-ui .f-subheadline-l{font-size:5rem}.swagger-ui .f1-l{font-size:3rem}.swagger-ui .f2-l{font-size:2.25rem}.swagger-ui .f3-l{font-size:1.5rem}.swagger-ui .f4-l{font-size:1.25rem}.swagger-ui .f5-l{font-size:1rem}.swagger-ui .f6-l{font-size:.875rem}.swagger-ui .f7-l{font-size:.75rem}}.swagger-ui .measure{max-width:30em}.swagger-ui .measure-wide{max-width:34em}.swagger-ui .measure-narrow{max-width:20em}.swagger-ui .indent{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media screen and (min-width:30em){.swagger-ui .measure-ns{max-width:30em}.swagger-ui .measure-wide-ns{max-width:34em}.swagger-ui .measure-narrow-ns{max-width:20em}.swagger-ui .indent-ns{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-ns{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-ns{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .measure-m{max-width:30em}.swagger-ui .measure-wide-m{max-width:34em}.swagger-ui .measure-narrow-m{max-width:20em}.swagger-ui .indent-m{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-m{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-m{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media screen and (min-width:60em){.swagger-ui .measure-l{max-width:30em}.swagger-ui .measure-wide-l{max-width:34em}.swagger-ui .measure-narrow-l{max-width:20em}.swagger-ui .indent-l{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-l{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-l{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}.swagger-ui .overflow-container{overflow-y:scroll}.swagger-ui .center{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto{margin-right:auto}.swagger-ui .ml-auto{margin-left:auto}@media screen and (min-width:30em){.swagger-ui .center-ns{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-ns{margin-right:auto}.swagger-ui .ml-auto-ns{margin-left:auto}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .center-m{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-m{margin-right:auto}.swagger-ui .ml-auto-m{margin-left:auto}}@media screen and (min-width:60em){.swagger-ui .center-l{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-l{margin-right:auto}.swagger-ui .ml-auto-l{margin-left:auto}}.swagger-ui .clip{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}@media screen and (min-width:30em){.swagger-ui .clip-ns{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .clip-m{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}@media screen and (min-width:60em){.swagger-ui .clip-l{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}.swagger-ui .ws-normal{white-space:normal}.swagger-ui .nowrap{white-space:nowrap}.swagger-ui .pre{white-space:pre}@media screen and (min-width:30em){.swagger-ui .ws-normal-ns{white-space:normal}.swagger-ui .nowrap-ns{white-space:nowrap}.swagger-ui .pre-ns{white-space:pre}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .ws-normal-m{white-space:normal}.swagger-ui .nowrap-m{white-space:nowrap}.swagger-ui .pre-m{white-space:pre}}@media screen and (min-width:60em){.swagger-ui .ws-normal-l{white-space:normal}.swagger-ui .nowrap-l{white-space:nowrap}.swagger-ui .pre-l{white-space:pre}}.swagger-ui .v-base{vertical-align:baseline}.swagger-ui .v-mid{vertical-align:middle}.swagger-ui .v-top{vertical-align:top}.swagger-ui .v-btm{vertical-align:bottom}@media screen and (min-width:30em){.swagger-ui .v-base-ns{vertical-align:baseline}.swagger-ui .v-mid-ns{vertical-align:middle}.swagger-ui .v-top-ns{vertical-align:top}.swagger-ui .v-btm-ns{vertical-align:bottom}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .v-base-m{vertical-align:baseline}.swagger-ui .v-mid-m{vertical-align:middle}.swagger-ui .v-top-m{vertical-align:top}.swagger-ui .v-btm-m{vertical-align:bottom}}@media screen and (min-width:60em){.swagger-ui .v-base-l{vertical-align:baseline}.swagger-ui .v-mid-l{vertical-align:middle}.swagger-ui .v-top-l{vertical-align:top}.swagger-ui .v-btm-l{vertical-align:bottom}}.swagger-ui .dim{opacity:1;transition:opacity .15s ease-in}.swagger-ui .dim:focus,.swagger-ui .dim:hover{opacity:.5;transition:opacity .15s ease-in}.swagger-ui .dim:active{opacity:.8;transition:opacity .15s ease-out}.swagger-ui .glow{transition:opacity .15s ease-in}.swagger-ui .glow:focus,.swagger-ui .glow:hover{opacity:1;transition:opacity .15s ease-in}.swagger-ui .hide-child .child{opacity:0;transition:opacity .15s ease-in}.swagger-ui .hide-child:active .child,.swagger-ui .hide-child:focus .child,.swagger-ui .hide-child:hover .child{opacity:1;transition:opacity .15s ease-in}.swagger-ui .underline-hover:focus,.swagger-ui .underline-hover:hover{-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .grow{-moz-osx-font-smoothing:grayscale;backface-visibility:hidden;transform:translateZ(0);transition:transform .25s ease-out}.swagger-ui .grow:focus,.swagger-ui .grow:hover{transform:scale(1.05)}.swagger-ui .grow:active{transform:scale(.9)}.swagger-ui .grow-large{-moz-osx-font-smoothing:grayscale;backface-visibility:hidden;transform:translateZ(0);transition:transform .25s ease-in-out}.swagger-ui .grow-large:focus,.swagger-ui .grow-large:hover{transform:scale(1.2)}.swagger-ui .grow-large:active{transform:scale(.95)}.swagger-ui .pointer:hover{cursor:pointer}.swagger-ui .shadow-hover{cursor:pointer;position:relative;transition:all .5s cubic-bezier(.165,.84,.44,1)}.swagger-ui .shadow-hover:after{border-radius:inherit;box-shadow:0 0 16px 2px rgba(0,0,0,.2);content:"";height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .5s cubic-bezier(.165,.84,.44,1);width:100%;z-index:-1}.swagger-ui .shadow-hover:focus:after,.swagger-ui .shadow-hover:hover:after{opacity:1}.swagger-ui .bg-animate,.swagger-ui .bg-animate:focus,.swagger-ui .bg-animate:hover{transition:background-color .15s ease-in-out}.swagger-ui .z-0{z-index:0}.swagger-ui .z-1{z-index:1}.swagger-ui .z-2{z-index:2}.swagger-ui .z-3{z-index:3}.swagger-ui .z-4{z-index:4}.swagger-ui .z-5{z-index:5}.swagger-ui .z-999{z-index:999}.swagger-ui .z-9999{z-index:9999}.swagger-ui .z-max{z-index:2147483647}.swagger-ui .z-inherit{z-index:inherit}.swagger-ui .z-initial,.swagger-ui .z-unset{z-index:auto}.swagger-ui .nested-copy-line-height ol,.swagger-ui .nested-copy-line-height p,.swagger-ui .nested-copy-line-height ul{line-height:1.5}.swagger-ui .nested-headline-line-height h1,.swagger-ui .nested-headline-line-height h2,.swagger-ui .nested-headline-line-height h3,.swagger-ui .nested-headline-line-height h4,.swagger-ui .nested-headline-line-height h5,.swagger-ui .nested-headline-line-height h6{line-height:1.25}.swagger-ui .nested-list-reset ol,.swagger-ui .nested-list-reset ul{list-style-type:none;margin-left:0;padding-left:0}.swagger-ui .nested-copy-indent p+p{margin-bottom:0;margin-top:0;text-indent:.1em}.swagger-ui .nested-copy-seperator p+p{margin-top:1.5em}.swagger-ui .nested-img img{display:block;max-width:100%;width:100%}.swagger-ui .nested-links a{color:#357edd;transition:color .15s ease-in}.swagger-ui .nested-links a:focus,.swagger-ui .nested-links a:hover{color:#96ccff;transition:color .15s ease-in}.swagger-ui .wrapper{box-sizing:border-box;margin:0 auto;max-width:1460px;padding:0 20px;width:100%}.swagger-ui .opblock-tag-section{display:flex;flex-direction:column}.swagger-ui .try-out.btn-group{display:flex;flex:.1 2 auto;padding:0}.swagger-ui .try-out__btn{margin-left:1.25rem}.swagger-ui .opblock-tag{align-items:center;border-bottom:1px solid rgba(59,65,81,.3);cursor:pointer;display:flex;padding:10px 20px 10px 10px;transition:all .2s}.swagger-ui .opblock-tag:hover{background:rgba(0,0,0,.02)}.swagger-ui .opblock-tag{color:#3b4151;font-family:sans-serif;font-size:24px;margin:0 0 5px}.swagger-ui .opblock-tag.no-desc span{flex:1}.swagger-ui .opblock-tag svg{transition:all .4s}.swagger-ui .opblock-tag small{color:#3b4151;flex:2;font-family:sans-serif;font-size:14px;font-weight:400;padding:0 10px}.swagger-ui .opblock-tag>div{flex:1 1 150px;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(max-width:640px){.swagger-ui .opblock-tag small,.swagger-ui .opblock-tag>div{flex:1}}.swagger-ui .opblock-tag .info__externaldocs{text-align:right}.swagger-ui .parameter__type{color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;padding:5px 0}.swagger-ui .parameter-controls{margin-top:.75em}.swagger-ui .examples__title{display:block;font-size:1.1em;font-weight:700;margin-bottom:.75em}.swagger-ui .examples__section{margin-top:1.5em}.swagger-ui .examples__section-header{font-size:.9rem;font-weight:700;margin-bottom:.5rem}.swagger-ui .examples-select{display:inline-block;margin-bottom:.75em}.swagger-ui .examples-select .examples-select-element{width:100%}.swagger-ui .examples-select__section-label{font-size:.9rem;font-weight:700;margin-right:.5rem}.swagger-ui .example__section{margin-top:1.5em}.swagger-ui .example__section-header{font-size:.9rem;font-weight:700;margin-bottom:.5rem}.swagger-ui .view-line-link{cursor:pointer;margin:0 5px;position:relative;top:3px;transition:all .5s;width:20px}.swagger-ui .opblock{border:1px solid #000;border-radius:4px;box-shadow:0 0 3px rgba(0,0,0,.19);margin:0 0 15px}.swagger-ui .opblock .tab-header{display:flex;flex:1}.swagger-ui .opblock .tab-header .tab-item{cursor:pointer;padding:0 40px}.swagger-ui .opblock .tab-header .tab-item:first-of-type{padding:0 40px 0 0}.swagger-ui .opblock .tab-header .tab-item.active h4 span{position:relative}.swagger-ui .opblock .tab-header .tab-item.active h4 span:after{background:grey;bottom:-15px;content:"";height:4px;left:50%;position:absolute;transform:translateX(-50%);width:120%}.swagger-ui .opblock.is-open .opblock-summary{border-bottom:1px solid #000}.swagger-ui .opblock .opblock-section-header{align-items:center;background:hsla(0,0%,100%,.8);box-shadow:0 1px 2px rgba(0,0,0,.1);display:flex;min-height:50px;padding:8px 20px}.swagger-ui .opblock .opblock-section-header>label{align-items:center;color:#3b4151;display:flex;font-family:sans-serif;font-size:12px;font-weight:700;margin:0 0 0 auto}.swagger-ui .opblock .opblock-section-header>label>span{padding:0 10px 0 0}.swagger-ui .opblock .opblock-section-header h4{color:#3b4151;flex:1;font-family:sans-serif;font-size:14px;margin:0}.swagger-ui .opblock .opblock-summary-method{background:#000;border-radius:3px;color:#fff;font-family:sans-serif;font-size:14px;font-weight:700;min-width:80px;padding:6px 0;text-align:center;text-shadow:0 1px 0 rgba(0,0,0,.1)}@media(max-width:768px){.swagger-ui .opblock .opblock-summary-method{font-size:12px}}.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{align-items:center;color:#3b4151;display:flex;font-family:monospace;font-size:16px;font-weight:600;word-break:break-word}@media(max-width:768px){.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:12px}}.swagger-ui .opblock .opblock-summary-path{flex-shrink:1}@media(max-width:640px){.swagger-ui .opblock .opblock-summary-path{max-width:100%}}.swagger-ui .opblock .opblock-summary-path__deprecated{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .opblock .opblock-summary-operation-id{font-size:14px}.swagger-ui .opblock .opblock-summary-description{color:#3b4151;font-family:sans-serif;font-size:13px;word-break:break-word}.swagger-ui .opblock .opblock-summary-path-description-wrapper{align-items:center;display:flex;flex-direction:row;flex-grow:1;flex-wrap:wrap;gap:0 10px;padding:0 10px}@media(max-width:550px){.swagger-ui .opblock .opblock-summary-path-description-wrapper{align-items:flex-start;flex-direction:column}}.swagger-ui .opblock .opblock-summary{align-items:center;cursor:pointer;display:flex;padding:5px}.swagger-ui .opblock .opblock-summary .view-line-link{cursor:pointer;margin:0;position:relative;top:2px;transition:all .5s;width:0}.swagger-ui .opblock .opblock-summary:hover .view-line-link{margin:0 5px;width:18px}.swagger-ui .opblock .opblock-summary:hover .view-line-link.copy-to-clipboard{width:24px}.swagger-ui .opblock.opblock-post{background:rgba(73,204,144,.1);border-color:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary-method{background:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary{border-color:#49cc90}.swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span:after{background:#49cc90}.swagger-ui .opblock.opblock-put{background:rgba(252,161,48,.1);border-color:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary-method{background:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary{border-color:#fca130}.swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span:after{background:#fca130}.swagger-ui .opblock.opblock-delete{background:rgba(249,62,62,.1);border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary{border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span:after{background:#f93e3e}.swagger-ui .opblock.opblock-get{background:rgba(97,175,254,.1);border-color:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary-method{background:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary{border-color:#61affe}.swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span:after{background:#61affe}.swagger-ui .opblock.opblock-patch{background:rgba(80,227,194,.1);border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary{border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span:after{background:#50e3c2}.swagger-ui .opblock.opblock-head{background:rgba(144,18,254,.1);border-color:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary-method{background:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary{border-color:#9012fe}.swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span:after{background:#9012fe}.swagger-ui .opblock.opblock-options{background:rgba(13,90,167,.1);border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary-method{background:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary{border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span:after{background:#0d5aa7}.swagger-ui .opblock.opblock-deprecated{background:hsla(0,0%,92%,.1);border-color:#ebebeb;opacity:.6}.swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#ebebeb}.swagger-ui .opblock.opblock-deprecated .opblock-summary{border-color:#ebebeb}.swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span:after{background:#ebebeb}.swagger-ui .opblock .opblock-schemes{padding:8px 20px}.swagger-ui .opblock .opblock-schemes .schemes-title{padding:0 10px 0 0}.swagger-ui .filter .operation-filter-input{border:2px solid #d8dde7;margin:20px 0;padding:10px;width:100%}.swagger-ui .download-url-wrapper .failed,.swagger-ui .filter .failed{color:red}.swagger-ui .download-url-wrapper .loading,.swagger-ui .filter .loading{color:#aaa}.swagger-ui .model-example{margin-top:1em}.swagger-ui .model-example .model-container{overflow-x:auto;width:100%}.swagger-ui .model-example .model-container .model-hint:not(.model-hint--embedded){top:-1.15em}.swagger-ui .tab{display:flex;list-style:none;padding:0}.swagger-ui .tab li{color:#3b4151;cursor:pointer;font-family:sans-serif;font-size:12px;min-width:60px;padding:0}.swagger-ui .tab li:first-of-type{padding-left:0;padding-right:12px;position:relative}.swagger-ui .tab li:first-of-type:after{background:rgba(0,0,0,.2);content:"";height:100%;position:absolute;right:6px;top:0;width:1px}.swagger-ui .tab li.active{font-weight:700}.swagger-ui .tab li button.tablinks{background:none;border:0;color:inherit;font-family:inherit;font-weight:inherit;padding:0}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-external-docs-wrapper,.swagger-ui .opblock-title_normal{color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px;padding:15px 20px}.swagger-ui .opblock-description-wrapper h4,.swagger-ui .opblock-external-docs-wrapper h4,.swagger-ui .opblock-title_normal h4{color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px}.swagger-ui .opblock-description-wrapper p,.swagger-ui .opblock-external-docs-wrapper p,.swagger-ui .opblock-title_normal p{color:#3b4151;font-family:sans-serif;font-size:14px;margin:0}.swagger-ui .opblock-external-docs-wrapper h4{padding-left:0}.swagger-ui .execute-wrapper{padding:20px;text-align:right}.swagger-ui .execute-wrapper .btn{padding:8px 40px;width:100%}.swagger-ui .body-param-options{display:flex;flex-direction:column}.swagger-ui .body-param-options .body-param-edit{padding:10px 0}.swagger-ui .body-param-options label{padding:8px 0}.swagger-ui .body-param-options label select{margin:3px 0 0}.swagger-ui .responses-inner{padding:20px}.swagger-ui .responses-inner h4,.swagger-ui .responses-inner h5{color:#3b4151;font-family:sans-serif;font-size:12px;margin:10px 0 5px}.swagger-ui .responses-inner .curl{max-height:400px;min-height:6em;overflow-y:auto}.swagger-ui .response-col_status{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .response-col_status .response-undocumented{color:#909090;font-family:monospace;font-size:11px;font-weight:600}.swagger-ui .response-col_links{color:#3b4151;font-family:sans-serif;font-size:14px;max-width:40em;padding-left:2em}.swagger-ui .response-col_links .response-undocumented{color:#909090;font-family:monospace;font-size:11px;font-weight:600}.swagger-ui .response-col_links .operation-link{margin-bottom:1.5em}.swagger-ui .response-col_links .operation-link .description{margin-bottom:.5em}.swagger-ui .opblock-body .opblock-loading-animation{display:block;margin:3em auto}.swagger-ui .opblock-body pre.microlight{background:#333;border-radius:4px;font-size:12px;hyphens:auto;margin:0;padding:10px;white-space:pre-wrap;word-break:break-all;word-break:break-word;word-wrap:break-word;color:#fff;font-family:monospace;font-weight:600}.swagger-ui .opblock-body pre.microlight .headerline{display:block}.swagger-ui .highlight-code{position:relative}.swagger-ui .highlight-code>.microlight{max-height:400px;min-height:6em;overflow-y:auto}.swagger-ui .highlight-code>.microlight code{white-space:pre-wrap!important;word-break:break-all}.swagger-ui .curl-command{position:relative}.swagger-ui .download-contents{align-items:center;background:#7d8293;border:none;border-radius:4px;bottom:10px;color:#fff;display:flex;font-family:sans-serif;font-size:14px;font-weight:600;height:30px;justify-content:center;padding:5px;position:absolute;right:10px;text-align:center}.swagger-ui .scheme-container{background:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.15);margin:0 0 20px;padding:30px 0}.swagger-ui .scheme-container .schemes{align-items:flex-end;display:flex;flex-wrap:wrap;gap:10px;justify-content:space-between}.swagger-ui .scheme-container .schemes>.schemes-server-container{display:flex;flex-wrap:wrap;gap:10px}.swagger-ui .scheme-container .schemes>.schemes-server-container>label{color:#3b4151;display:flex;flex-direction:column;font-family:sans-serif;font-size:12px;font-weight:700;margin:-20px 15px 0 0}.swagger-ui .scheme-container .schemes>.schemes-server-container>label select{min-width:130px;text-transform:uppercase}.swagger-ui .scheme-container .schemes:not(:has(.schemes-server-container)){justify-content:flex-end}.swagger-ui .scheme-container .schemes .auth-wrapper{flex:none;justify-content:start}.swagger-ui .scheme-container .schemes .auth-wrapper .authorize{display:flex;flex-wrap:nowrap;margin:0;padding-right:20px}.swagger-ui .loading-container{align-items:center;display:flex;flex-direction:column;justify-content:center;margin-top:1em;min-height:1px;padding:40px 0 60px}.swagger-ui .loading-container .loading{position:relative}.swagger-ui .loading-container .loading:after{color:#3b4151;content:"loading";font-family:sans-serif;font-size:10px;font-weight:700;left:50%;position:absolute;text-transform:uppercase;top:50%;transform:translate(-50%,-50%)}.swagger-ui .loading-container .loading:before{animation:rotation 1s linear infinite,opacity .5s;backface-visibility:hidden;border:2px solid rgba(85,85,85,.1);border-radius:100%;border-top-color:rgba(0,0,0,.6);content:"";display:block;height:60px;left:50%;margin:-30px;opacity:1;position:absolute;top:50%;width:60px}@keyframes rotation{to{transform:rotate(1turn)}}.swagger-ui .response-controls{display:flex;padding-top:1em}.swagger-ui .response-control-media-type{margin-right:1em}.swagger-ui .response-control-media-type--accept-controller select{border-color:green}.swagger-ui .response-control-media-type__accept-message{color:green;font-size:.7em}.swagger-ui .response-control-examples__title,.swagger-ui .response-control-media-type__title{display:block;font-size:.7em;margin-bottom:.2em}@keyframes blinker{50%{opacity:0}}.swagger-ui .hidden{display:none}.swagger-ui .no-margin{border:none;height:auto;margin:0;padding:0}.swagger-ui .float-right{float:right}.swagger-ui .svg-assets{height:0;position:absolute;width:0}.swagger-ui section h3{color:#3b4151;font-family:sans-serif}.swagger-ui a.nostyle{display:inline}.swagger-ui a.nostyle,.swagger-ui a.nostyle:visited{color:inherit;cursor:pointer;text-decoration:inherit}.swagger-ui .fallback{color:#aaa;padding:1em}.swagger-ui .version-pragma{height:100%;padding:5em 0}.swagger-ui .version-pragma__message{display:flex;font-size:1.2em;height:100%;justify-content:center;line-height:1.5em;padding:0 .6em;text-align:center}.swagger-ui .version-pragma__message>div{flex:1;max-width:55ch}.swagger-ui .version-pragma__message code{background-color:#dedede;padding:4px 4px 2px;white-space:pre}.swagger-ui .opblock-link{font-weight:400}.swagger-ui .opblock-link.shown{font-weight:700}.swagger-ui span.token-string{color:#555}.swagger-ui span.token-not-formatted{color:#555;font-weight:700}.swagger-ui .btn{background:transparent;border:2px solid grey;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.1);color:#3b4151;font-family:sans-serif;font-size:14px;font-weight:700;padding:5px 23px;transition:all .3s}.swagger-ui .btn.btn-sm{font-size:12px;padding:4px 23px}.swagger-ui .btn[disabled]{cursor:not-allowed;opacity:.3}.swagger-ui .btn:hover{box-shadow:0 0 5px rgba(0,0,0,.3)}.swagger-ui .btn.cancel{background-color:transparent;border-color:#ff6060;color:#ff6060;font-family:sans-serif}.swagger-ui .btn.authorize{background-color:transparent;border-color:#49cc90;color:#49cc90;display:inline;line-height:1}.swagger-ui .btn.authorize span{float:left;padding:4px 20px 0 0}.swagger-ui .btn.authorize svg{fill:#49cc90}.swagger-ui .btn.execute{background-color:#4990e2;border-color:#4990e2;color:#fff}.swagger-ui .btn-group{display:flex;padding:30px}.swagger-ui .btn-group .btn{flex:1}.swagger-ui .btn-group .btn:first-child{border-radius:4px 0 0 4px}.swagger-ui .btn-group .btn:last-child{border-radius:0 4px 4px 0}.swagger-ui .authorization__btn{background:none;border:none;padding:0 0 0 10px}.swagger-ui .authorization__btn .locked{opacity:1}.swagger-ui .authorization__btn .unlocked{opacity:.4}.swagger-ui .model-box-control,.swagger-ui .models-control,.swagger-ui .opblock-summary-control{all:inherit;border-bottom:0;cursor:pointer;flex:1;padding:0}.swagger-ui .model-box-control:focus,.swagger-ui .models-control:focus,.swagger-ui .opblock-summary-control:focus{outline:auto}.swagger-ui .expand-methods,.swagger-ui .expand-operation{background:none;border:none}.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg{height:20px;width:20px}.swagger-ui .expand-methods{padding:0 10px}.swagger-ui .expand-methods:hover svg{fill:#404040}.swagger-ui .expand-methods svg{transition:all .3s;fill:#707070}.swagger-ui button{cursor:pointer}.swagger-ui button.invalid{animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui .copy-to-clipboard{align-items:center;background:#7d8293;border:none;border-radius:4px;bottom:10px;display:flex;height:30px;justify-content:center;position:absolute;right:100px;width:30px}.swagger-ui .copy-to-clipboard button{background:url("data:image/svg+xml;charset=utf-8,") 50% no-repeat;border:none;flex-grow:1;flex-shrink:1;height:25px}.swagger-ui .copy-to-clipboard:active{background:#5e626f}.swagger-ui .opblock-control-arrow{background:none;border:none;text-align:center}.swagger-ui .curl-command .copy-to-clipboard{bottom:5px;height:20px;right:10px;width:20px}.swagger-ui .curl-command .copy-to-clipboard button{height:18px}.swagger-ui .opblock .opblock-summary .view-line-link.copy-to-clipboard{height:26px;position:static}.swagger-ui select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#f7f7f7 url("data:image/svg+xml;charset=utf-8,") right 10px center no-repeat;background-size:20px;border:2px solid #41444e;border-radius:4px;box-shadow:0 1px 2px 0 rgba(0,0,0,.25);color:#3b4151;font-family:sans-serif;font-size:14px;font-weight:700;padding:5px 40px 5px 10px}.swagger-ui select[multiple]{background:#f7f7f7;margin:5px 0;padding:5px}.swagger-ui select.invalid{animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui .opblock-body select{min-width:230px}@media(max-width:768px){.swagger-ui .opblock-body select{min-width:180px}}@media(max-width:640px){.swagger-ui .opblock-body select{min-width:100%;width:100%}}.swagger-ui label{color:#3b4151;font-family:sans-serif;font-size:12px;font-weight:700;margin:0 0 5px}.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text]{line-height:1}@media(max-width:768px){.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text]{max-width:175px}}.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text],.swagger-ui textarea{background:#fff;border:1px solid #d9d9d9;border-radius:4px;margin:5px 0;min-width:100px;padding:8px 10px}.swagger-ui input[type=email].invalid,.swagger-ui input[type=file].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid,.swagger-ui textarea.invalid{animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui input[disabled],.swagger-ui select[disabled],.swagger-ui textarea[disabled]{background-color:#fafafa;color:#888;cursor:not-allowed}.swagger-ui select[disabled]{border-color:#888}.swagger-ui textarea[disabled]{background-color:#41444e;color:#fff}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}.swagger-ui textarea{background:hsla(0,0%,100%,.8);border:none;border-radius:4px;color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;min-height:280px;outline:none;padding:10px;width:100%}.swagger-ui textarea:focus{border:2px solid #61affe}.swagger-ui textarea.curl{background:#41444e;border-radius:4px;color:#fff;font-family:monospace;font-size:12px;font-weight:600;margin:0;min-height:100px;padding:10px;resize:none}.swagger-ui .checkbox{color:#303030;padding:5px 0 10px;transition:opacity .5s}.swagger-ui .checkbox label{display:flex}.swagger-ui .checkbox p{color:#3b4151;font-family:monospace;font-style:italic;font-weight:400!important;font-weight:600;margin:0!important}.swagger-ui .checkbox input[type=checkbox]{display:none}.swagger-ui .checkbox input[type=checkbox]+label>.item{background:#e8e8e8;border-radius:1px;box-shadow:0 0 0 2px #e8e8e8;cursor:pointer;display:inline-block;flex:none;height:16px;margin:0 8px 0 0;padding:5px;position:relative;top:3px;width:16px}.swagger-ui .checkbox input[type=checkbox]+label>.item:active{transform:scale(.9)}.swagger-ui .checkbox input[type=checkbox]:checked+label>.item{background:#e8e8e8 url("data:image/svg+xml;charset=utf-8,") 50% no-repeat}.swagger-ui .dialog-ux{bottom:0;left:0;position:fixed;right:0;top:0;z-index:9999}.swagger-ui .dialog-ux .backdrop-ux{background:rgba(0,0,0,.8);bottom:0;left:0;position:fixed;right:0;top:0}.swagger-ui .dialog-ux .modal-ux{background:#fff;border:1px solid #ebebeb;border-radius:4px;box-shadow:0 10px 30px 0 rgba(0,0,0,.2);left:50%;max-width:650px;min-width:300px;position:absolute;top:50%;transform:translate(-50%,-50%);width:100%;z-index:9999}.swagger-ui .dialog-ux .modal-ux-content{max-height:540px;overflow-y:auto;padding:20px}.swagger-ui .dialog-ux .modal-ux-content p{color:#41444e;color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px}.swagger-ui .dialog-ux .modal-ux-content h4{color:#3b4151;font-family:sans-serif;font-size:18px;font-weight:600;margin:15px 0 0}.swagger-ui .dialog-ux .modal-ux-header{align-items:center;border-bottom:1px solid #ebebeb;display:flex;padding:12px 0}.swagger-ui .dialog-ux .modal-ux-header .close-modal{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:none;padding:0 10px}.swagger-ui .dialog-ux .modal-ux-header h3{color:#3b4151;flex:1;font-family:sans-serif;font-size:20px;font-weight:600;margin:0;padding:0 20px}.swagger-ui .model{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300;font-weight:600}.swagger-ui .model .deprecated span,.swagger-ui .model .deprecated td{color:#a0a0a0!important}.swagger-ui .model .deprecated>td:first-of-type{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .model-toggle{cursor:pointer;display:inline-block;font-size:10px;margin:auto .3em;position:relative;top:6px;transform:rotate(90deg);transform-origin:50% 50%;transition:transform .15s ease-in}.swagger-ui .model-toggle.collapsed{transform:rotate(0deg)}.swagger-ui .model-toggle:after{background:url("data:image/svg+xml;charset=utf-8,") 50% no-repeat;background-size:100%;content:"";display:block;height:20px;width:20px}.swagger-ui .model-jump-to-path{cursor:pointer;position:relative}.swagger-ui .model-jump-to-path .view-line-link{cursor:pointer;position:absolute;top:-.4em}.swagger-ui .model-title{position:relative}.swagger-ui .model-title:hover .model-hint{display:block}.swagger-ui .model-hint{background:rgba(0,0,0,.7);border-radius:4px;color:#ebebeb;display:none;padding:.1em .5em;position:absolute;top:-1.8em;white-space:nowrap}.swagger-ui .model p{margin:0 0 1em}.swagger-ui .model .property{color:#999;font-style:italic}.swagger-ui .model .property.primitive{color:#6b6b6b}.swagger-ui .model .property.primitive.extension{display:block}.swagger-ui .model .property.primitive.extension>td:first-child{padding-left:0;padding-right:0;width:auto}.swagger-ui .model .property.primitive.extension>td:first-child:after{content:": "}.swagger-ui .model .external-docs,.swagger-ui table.model tr.description{color:#666;font-weight:400}.swagger-ui table.model tr.description td:first-child,.swagger-ui table.model tr.property-row.required td:first-child{font-weight:700}.swagger-ui table.model tr.property-row td{vertical-align:top}.swagger-ui table.model tr.property-row td:first-child{padding-right:.2em}.swagger-ui table.model tr.property-row .star{color:red}.swagger-ui table.model tr.extension{color:#777}.swagger-ui table.model tr.extension td:last-child{vertical-align:top}.swagger-ui table.model tr.external-docs td:first-child{font-weight:700}.swagger-ui table.model tr .renderedMarkdown p:first-child{margin-top:0}.swagger-ui section.models{border:1px solid rgba(59,65,81,.3);border-radius:4px;margin:30px 0}.swagger-ui section.models .pointer{cursor:pointer}.swagger-ui section.models.is-open{padding:0 0 20px}.swagger-ui section.models.is-open h4{border-bottom:1px solid rgba(59,65,81,.3);margin:0 0 5px}.swagger-ui section.models h4{align-items:center;color:#606060;cursor:pointer;display:flex;font-family:sans-serif;font-size:16px;margin:0;padding:10px 20px 10px 10px;transition:all .2s}.swagger-ui section.models h4 svg{transition:all .4s}.swagger-ui section.models h4 span{flex:1}.swagger-ui section.models h4:hover{background:rgba(0,0,0,.02)}.swagger-ui section.models h5{color:#707070;font-family:sans-serif;font-size:16px;margin:0 0 10px}.swagger-ui section.models .model-jump-to-path{position:relative;top:5px}.swagger-ui section.models .model-container{background:rgba(0,0,0,.05);border-radius:4px;margin:0 20px 15px;position:relative;transition:all .5s}.swagger-ui section.models .model-container:hover{background:rgba(0,0,0,.07)}.swagger-ui section.models .model-container:first-of-type{margin:20px}.swagger-ui section.models .model-container:last-of-type{margin:0 20px}.swagger-ui section.models .model-container .models-jump-to-path{opacity:.65;position:absolute;right:5px;top:8px}.swagger-ui section.models .model-box{background:none}.swagger-ui section.models .model-box:has(.model-box){overflow-x:auto;width:100%}.swagger-ui .model-box{background:rgba(0,0,0,.1);border-radius:4px;display:inline-block;padding:10px}.swagger-ui .model-box .model-jump-to-path{position:relative;top:4px}.swagger-ui .model-box.deprecated{opacity:.5}.swagger-ui .model-title{color:#505050;font-family:sans-serif;font-size:16px}.swagger-ui .model-title img{bottom:0;margin-left:1em;position:relative}.swagger-ui .model-deprecated-warning{color:#f93e3e;font-family:sans-serif;font-size:16px;font-weight:600;margin-right:1em}.swagger-ui span>span.model .brace-close{padding:0 0 0 10px}.swagger-ui .prop-name{display:inline-block;margin-right:1em}.swagger-ui .prop-type{color:#55a}.swagger-ui .prop-enum{display:block}.swagger-ui .prop-format{color:#606060}.swagger-ui .servers>label{color:#3b4151;font-family:sans-serif;font-size:12px;margin:-20px 15px 0 0}.swagger-ui .servers>label select{max-width:100%;min-width:130px;width:100%}.swagger-ui .servers h4.message{padding-bottom:2em}.swagger-ui .servers table tr{width:30em}.swagger-ui .servers table td{display:inline-block;max-width:15em;padding-bottom:10px;padding-top:10px;vertical-align:middle}.swagger-ui .servers table td:first-of-type{padding-right:1em}.swagger-ui .servers table td input{height:100%;width:100%}.swagger-ui .servers .computed-url{margin:2em 0}.swagger-ui .servers .computed-url code{display:inline-block;font-size:16px;margin:0 1em;padding:4px}.swagger-ui .servers-title{font-size:12px;font-weight:700}.swagger-ui .operation-servers h4.message{margin-bottom:2em}.swagger-ui table{border-collapse:collapse;padding:0 10px;width:100%}.swagger-ui table.model tbody tr td{padding:0 0 0 1em;vertical-align:top}.swagger-ui table.model tbody tr td:first-of-type{padding:0 0 0 2em;width:174px}.swagger-ui table.headers td{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300;font-weight:600;vertical-align:middle}.swagger-ui table.headers .header-example{color:#999;font-style:italic}.swagger-ui table tbody tr td{padding:10px 0 0;vertical-align:top}.swagger-ui table tbody tr td:first-of-type{min-width:6em;padding:10px 0}.swagger-ui table tbody tr td:has(.model-box){max-width:1px}.swagger-ui table thead tr td,.swagger-ui table thead tr th{border-bottom:1px solid rgba(59,65,81,.2);color:#3b4151;font-family:sans-serif;font-size:12px;font-weight:700;padding:12px 0;text-align:left}.swagger-ui .parameters-col_description{margin-bottom:2em;width:99%}.swagger-ui .parameters-col_description input{max-width:340px;width:100%}.swagger-ui .parameters-col_description select{border-width:1px}.swagger-ui .parameters-col_description .markdown:first-child p:first-child,.swagger-ui .parameters-col_description .renderedMarkdown:first-child p:first-child{margin:0}.swagger-ui .parameter__name{color:#3b4151;font-family:sans-serif;font-size:16px;font-weight:400;margin-right:.75em}.swagger-ui .parameter__name.required{font-weight:700}.swagger-ui .parameter__name.required span{color:red}.swagger-ui .parameter__name.required:after{color:rgba(255,0,0,.6);content:"required";font-size:10px;padding:5px;position:relative;top:-6px}.swagger-ui .parameter__extension,.swagger-ui .parameter__in{color:grey;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .parameter__deprecated{color:red;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .parameter__empty_value_toggle{display:block;font-size:13px;padding-bottom:12px;padding-top:5px}.swagger-ui .parameter__empty_value_toggle input{margin-right:7px;width:auto}.swagger-ui .parameter__empty_value_toggle.disabled{opacity:.7}.swagger-ui .table-container{padding:20px}.swagger-ui .response-col_description{width:99%}.swagger-ui .response-col_description .markdown p:first-child,.swagger-ui .response-col_description .renderedMarkdown p:first-child{margin:0}.swagger-ui .response-col_description .markdown p:last-child,.swagger-ui .response-col_description .renderedMarkdown p:last-child{margin-bottom:0}.swagger-ui .response-col_links{min-width:6em}.swagger-ui .response__extension{color:grey;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .topbar{background-color:#1b1b1b;padding:10px 0}.swagger-ui .topbar .topbar-wrapper{align-items:center;display:flex;flex-wrap:wrap;gap:10px}@media(max-width:550px){.swagger-ui .topbar .topbar-wrapper{align-items:start;flex-direction:column}}.swagger-ui .topbar a{align-items:center;color:#fff;display:flex;flex:1;font-family:sans-serif;font-size:1.5em;font-weight:700;max-width:300px;-webkit-text-decoration:none;text-decoration:none}.swagger-ui .topbar a span{margin:0;padding:0 10px}.swagger-ui .topbar .download-url-wrapper{display:flex;flex:3;justify-content:flex-end;margin-left:auto;max-width:600px}.swagger-ui .topbar .download-url-wrapper input[type=text]{border:2px solid #62a03f;border-radius:4px 0 0 4px;margin:0;max-width:100%;outline:none;width:100%}.swagger-ui .topbar .download-url-wrapper .select-label{align-items:center;color:#f0f0f0;display:flex;margin:0;max-width:600px;width:100%}.swagger-ui .topbar .download-url-wrapper .select-label span{flex:1;font-size:16px;padding:0 10px 0 0;text-align:right}.swagger-ui .topbar .download-url-wrapper .select-label select{border:2px solid #62a03f;box-shadow:none;flex:2;outline:none;width:100%}.swagger-ui .topbar .download-url-wrapper .download-url-button{background:#62a03f;border:none;border-radius:0 4px 4px 0;color:#fff;font-family:sans-serif;font-size:16px;font-weight:700;padding:4px 30px}@media(max-width:550px){.swagger-ui .topbar .download-url-wrapper{width:100%}}.swagger-ui .topbar .dark-mode-toggle{cursor:pointer;margin-left:10px;opacity:.8;transition:all .2s}.swagger-ui .topbar .dark-mode-toggle button{background:none;border:none;padding:0}.swagger-ui .topbar .dark-mode-toggle button svg{fill:#e4e6e6}.swagger-ui .topbar .dark-mode-toggle:hover{opacity:1}.swagger-ui .info{margin:50px 0}.swagger-ui .info.failed-config{margin-left:auto;margin-right:auto;max-width:880px;text-align:center}.swagger-ui .info hgroup.main{margin:0 0 20px}.swagger-ui .info hgroup.main a{font-size:12px}.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info pre,.swagger-ui .info table{font-size:14px}.swagger-ui .info h1,.swagger-ui .info h2,.swagger-ui .info h3,.swagger-ui .info h4,.swagger-ui .info h5,.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info table{color:#3b4151;font-family:sans-serif}.swagger-ui .info a{color:#4990e2;font-family:sans-serif;font-size:14px;transition:all .4s}.swagger-ui .info a:hover{color:#1f69c0}.swagger-ui .info>div{margin:0 0 5px}.swagger-ui .info .base-url{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300!important;font-weight:600;margin:0}.swagger-ui .info .title{color:#3b4151;font-family:sans-serif;font-size:36px;margin:0}.swagger-ui .info .title small{background:#7d8492;border-radius:57px;display:inline-block;font-size:10px;margin:0 0 0 5px;padding:2px 4px;position:relative;top:-5px;vertical-align:super}.swagger-ui .info .title small.version-stamp{background-color:#89bf04}.swagger-ui .info .title small pre{color:#fff;font-family:sans-serif;margin:0;padding:0}.swagger-ui .auth-btn-wrapper{display:flex;justify-content:center;padding:10px 0}.swagger-ui .auth-btn-wrapper .btn-done{margin-right:1em}.swagger-ui .auth-wrapper{display:flex;flex:1;justify-content:flex-end}.swagger-ui .auth-wrapper .authorize{margin-left:10px;margin-right:10px;padding-right:20px}.swagger-ui .auth-container{border-bottom:1px solid #ebebeb;margin:0 0 10px;padding:10px 20px}.swagger-ui .auth-container:last-of-type{border:0;margin:0;padding:10px 20px}.swagger-ui .auth-container h4{margin:5px 0 15px!important}.swagger-ui .auth-container .wrapper{margin:0;padding:0}.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text]{min-width:230px}.swagger-ui .auth-container .errors{background-color:#fee;border-radius:4px;color:red;color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;margin:1em;padding:10px}.swagger-ui .auth-container .errors b{margin-right:1em;text-transform:capitalize}.swagger-ui .scopes h2{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .scopes h2 a{color:#4990e2;cursor:pointer;font-size:12px;padding-left:10px;-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .scope-def{padding:0 0 20px}.swagger-ui .errors-wrapper{animation:scaleUp .5s;background:rgba(249,62,62,.1);border:2px solid #f93e3e;border-radius:4px;margin:20px;padding:10px 20px}.swagger-ui .errors-wrapper .error-wrapper{margin:0 0 10px}.swagger-ui .errors-wrapper .errors h4{color:#3b4151;font-family:monospace;font-size:14px;font-weight:600;margin:0}.swagger-ui .errors-wrapper .errors small{color:#606060}.swagger-ui .errors-wrapper .errors .message{white-space:pre-line}.swagger-ui .errors-wrapper .errors .message.thrown{max-width:100%}.swagger-ui .errors-wrapper .errors .error-line{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .errors-wrapper hgroup{align-items:center;display:flex}.swagger-ui .errors-wrapper hgroup h4{color:#3b4151;flex:1;font-family:sans-serif;font-size:20px;margin:0}@keyframes scaleUp{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}.swagger-ui .Resizer.vertical.disabled{display:none}.swagger-ui .markdown p,.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown p,.swagger-ui .renderedMarkdown pre{margin:1em auto;word-break:break-all;word-break:break-word}.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown pre{background:none;color:#000;font-weight:400;padding:0;white-space:pre-wrap}.swagger-ui .markdown code,.swagger-ui .renderedMarkdown code{background:rgba(0,0,0,.05);border-radius:4px;color:#9012fe;font-family:monospace;font-size:14px;font-weight:600;padding:5px 7px}.swagger-ui .markdown pre>code,.swagger-ui .renderedMarkdown pre>code{display:block}.swagger-ui .json-schema-2020-12-keyword--\$vocabulary ul{border-left:1px dashed rgba(0,0,0,.1);margin:0 0 0 20px}.swagger-ui .json-schema-2020-12-\$vocabulary-uri{margin-left:35px}.swagger-ui .json-schema-2020-12-\$vocabulary-uri--disabled{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .json-schema-2020-12-keyword--const .json-schema-2020-12-json-viewer__name,.swagger-ui .json-schema-2020-12-keyword--const .json-schema-2020-12-json-viewer__value{color:#3b4151;font-style:normal}.swagger-ui .json-schema-2020-12__constraint{background-color:#805ad5;border-radius:4px;color:#3b4151;color:#fff;font-family:monospace;font-weight:600;line-height:1.5;margin-left:10px;padding:1px 3px}.swagger-ui .json-schema-2020-12__constraint--string{background-color:#d69e2e;color:#fff}.swagger-ui .json-schema-2020-12-keyword--default .json-schema-2020-12-json-viewer__name,.swagger-ui .json-schema-2020-12-keyword--default .json-schema-2020-12-json-viewer__value{color:#3b4151;font-style:normal}.swagger-ui .json-schema-2020-12-keyword--dependentRequired>ul{display:inline-block;margin:0;padding:0}.swagger-ui .json-schema-2020-12-keyword--dependentRequired>ul li{display:inline;list-style-type:none}.swagger-ui .json-schema-2020-12-keyword--description{color:#6b6b6b;font-size:12px;margin-left:20px}.swagger-ui .json-schema-2020-12-keyword--description p{margin:0}.swagger-ui .json-schema-2020-12-keyword--enum .json-schema-2020-12-json-viewer__name,.swagger-ui .json-schema-2020-12-keyword--enum .json-schema-2020-12-json-viewer__value,.swagger-ui .json-schema-2020-12-keyword--examples .json-schema-2020-12-json-viewer__name,.swagger-ui .json-schema-2020-12-keyword--examples .json-schema-2020-12-json-viewer__value{color:#3b4151;font-style:normal}.swagger-ui .json-schema-2020-12-json-viewer-extension-keyword .json-schema-2020-12-json-viewer__name,.swagger-ui .json-schema-2020-12-json-viewer-extension-keyword .json-schema-2020-12-json-viewer__value{color:#929292;font-style:italic}.swagger-ui .json-schema-2020-12-keyword--patternProperties ul{border:none;margin:0;padding:0}.swagger-ui .json-schema-2020-12-keyword--patternProperties .json-schema-2020-12__title:first-of-type:after,.swagger-ui .json-schema-2020-12-keyword--patternProperties .json-schema-2020-12__title:first-of-type:before{color:#55a;content:"/"}.swagger-ui .json-schema-2020-12-keyword--properties>ul{border:none;margin:0;padding:0}.swagger-ui .json-schema-2020-12-property{list-style-type:none}.swagger-ui .json-schema-2020-12-property--required>.json-schema-2020-12:first-of-type>.json-schema-2020-12-head .json-schema-2020-12__title:after{color:red;content:"*";font-weight:700}.swagger-ui .json-schema-2020-12__title{color:#505050;display:inline-block;font-family:sans-serif;font-size:12px;font-weight:700;line-height:normal}.swagger-ui .json-schema-2020-12__title .json-schema-2020-12-keyword__name{margin:0}.swagger-ui .json-schema-2020-12-property{margin:7px 0}.swagger-ui .json-schema-2020-12-property .json-schema-2020-12__title{color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;vertical-align:middle}.swagger-ui .json-schema-2020-12-keyword{margin:5px 0}.swagger-ui .json-schema-2020-12-keyword__children{border-left:1px dashed rgba(0,0,0,.1);margin:0 0 0 20px;padding:0}.swagger-ui .json-schema-2020-12-keyword__children--collapsed{display:none}.swagger-ui .json-schema-2020-12-keyword__name{font-size:12px;font-weight:700;margin-left:20px}.swagger-ui .json-schema-2020-12-keyword__name--primary{color:#3b4151;font-style:normal}.swagger-ui .json-schema-2020-12-keyword__name--secondary{color:#6b6b6b;font-style:italic}.swagger-ui .json-schema-2020-12-keyword__name--extension{color:#929292;font-style:italic}.swagger-ui .json-schema-2020-12-keyword__value{color:#6b6b6b;font-size:12px;font-style:italic;font-weight:400}.swagger-ui .json-schema-2020-12-keyword__value--primary{color:#3b4151;font-style:normal}.swagger-ui .json-schema-2020-12-keyword__value--secondary{color:#6b6b6b;font-style:italic}.swagger-ui .json-schema-2020-12-keyword__value--extension{color:#929292;font-style:italic}.swagger-ui .json-schema-2020-12-keyword__value--warning{border:1px dashed red;border-radius:4px;color:#3b4151;color:red;display:inline-block;font-family:monospace;font-style:normal;font-weight:600;line-height:1.5;margin-left:10px;padding:1px 4px}.swagger-ui .json-schema-2020-12-keyword__name--secondary+.json-schema-2020-12-keyword__value--secondary:before{content:"="}.swagger-ui .json-schema-2020-12__attribute{color:#3b4151;font-family:monospace;font-size:12px;padding-left:10px;text-transform:lowercase}.swagger-ui .json-schema-2020-12__attribute--primary{color:#55a}.swagger-ui .json-schema-2020-12__attribute--muted{color:gray}.swagger-ui .json-schema-2020-12__attribute--warning{color:red}.swagger-ui .json-schema-2020-12-json-viewer{margin:5px 0}.swagger-ui .json-schema-2020-12-json-viewer__children{border-left:1px dashed rgba(0,0,0,.1);margin:0 0 0 20px;padding:0}.swagger-ui .json-schema-2020-12-json-viewer__children--collapsed{display:none}.swagger-ui .json-schema-2020-12-json-viewer__name{font-size:12px;font-weight:700;margin-left:20px}.swagger-ui .json-schema-2020-12-json-viewer__name--primary{color:#3b4151;font-style:normal}.swagger-ui .json-schema-2020-12-json-viewer__name--secondary{color:#6b6b6b;font-style:italic}.swagger-ui .json-schema-2020-12-json-viewer__name--extension{color:#929292;font-style:italic}.swagger-ui .json-schema-2020-12-json-viewer__value{color:#6b6b6b;font-size:12px;font-style:italic;font-weight:400}.swagger-ui .json-schema-2020-12-json-viewer__value--primary{color:#3b4151;font-style:normal}.swagger-ui .json-schema-2020-12-json-viewer__value--secondary{color:#6b6b6b;font-style:italic}.swagger-ui .json-schema-2020-12-json-viewer__value--extension{color:#929292;font-style:italic}.swagger-ui .json-schema-2020-12-json-viewer__value--warning{border:1px dashed red;border-radius:4px;color:#3b4151;color:red;display:inline-block;font-family:monospace;font-style:normal;font-weight:600;line-height:1.5;margin-left:10px;padding:1px 4px}.swagger-ui .json-schema-2020-12-json-viewer__name--secondary+.json-schema-2020-12-json-viewer__value--secondary:before{content:"="}.swagger-ui .json-schema-2020-12{background-color:rgba(0,0,0,.05);border-radius:4px;margin:0 20px 15px;padding:12px 0 12px 20px}.swagger-ui .json-schema-2020-12:first-of-type{margin:20px}.swagger-ui .json-schema-2020-12:last-of-type{margin:0 20px}.swagger-ui .json-schema-2020-12--embedded{background-color:inherit;padding-bottom:0;padding-left:inherit;padding-right:inherit;padding-top:0}.swagger-ui .json-schema-2020-12-body{border-left:1px dashed rgba(0,0,0,.1);margin:2px 0}.swagger-ui .json-schema-2020-12-body--collapsed{display:none}.swagger-ui .json-schema-2020-12-accordion{border:none;outline:none;padding-left:0}.swagger-ui .json-schema-2020-12-accordion__children{display:inline-block}.swagger-ui .json-schema-2020-12-accordion__icon{display:inline-block;height:18px;vertical-align:bottom;width:18px}.swagger-ui .json-schema-2020-12-accordion__icon--expanded{transform:rotate(-90deg);transform-origin:50% 50%;transition:transform .15s ease-in}.swagger-ui .json-schema-2020-12-accordion__icon--collapsed{transform:rotate(0deg);transform-origin:50% 50%;transition:transform .15s ease-in}.swagger-ui .json-schema-2020-12-accordion__icon svg{height:20px;width:20px}.swagger-ui .json-schema-2020-12-expand-deep-button{border:none;color:#505050;color:#afaeae;font-family:sans-serif;font-size:12px;padding-right:0}.swagger-ui .model-box .json-schema-2020-12:not(.json-schema-2020-12--embedded)>.json-schema-2020-12-head .json-schema-2020-12__title:first-of-type{font-size:16px}.swagger-ui .model-box>.json-schema-2020-12{margin:0}.swagger-ui .model-box .json-schema-2020-12{background-color:transparent;padding:0}.swagger-ui .model-box .json-schema-2020-12-accordion,.swagger-ui .model-box .json-schema-2020-12-expand-deep-button{background-color:transparent}.swagger-ui .models .json-schema-2020-12:not(.json-schema-2020-12--embedded)>.json-schema-2020-12-head .json-schema-2020-12__title:first-of-type{font-size:16px}.swagger-ui .models .json-schema-2020-12:not(.json-schema-2020-12--embedded){overflow-x:auto;width:calc(100% - 40px)}html.dark-mode{background:#1c2022}html.dark-mode .swagger-ui{background:#1c2022;color:#e4e6e6}html.dark-mode .swagger-ui .authorization__btn svg,html.dark-mode .swagger-ui .expand-operation svg,html.dark-mode .swagger-ui .opblock-control-arrow svg{fill:#b7bcbf;opacity:1}html.dark-mode .swagger-ui .markdown p,html.dark-mode .swagger-ui .markdown pre,html.dark-mode .swagger-ui .renderedMarkdown p,html.dark-mode .swagger-ui .renderedMarkdown pre,html.dark-mode .swagger-ui section h3,html.dark-mode .swagger-ui table thead tr td,html.dark-mode .swagger-ui table thead tr th{color:#e4e6e6}html.dark-mode .swagger-ui .markdown code,html.dark-mode .swagger-ui .renderedMarkdown code{background:#080a0b;color:#b68ae1}html.dark-mode .swagger-ui input{background:#1c2022;border-color:#b7bcbf;color:#f0f1f1}html.dark-mode .swagger-ui input:focus:not(.download-url-input){border-color:#51a8ff!important;box-shadow:none;outline:none}html.dark-mode .swagger-ui textarea{background:#0d1014;border:1px solid #0d1014;color:#f0f1f1}html.dark-mode .swagger-ui textarea:focus{border-color:#51a8ff}html.dark-mode .swagger-ui textarea[disabled]{background-color:#202225;border-color:#202225;color:#8c969a}html.dark-mode .swagger-ui select{background:#1c2022 url("data:image/svg+xml;charset=utf-8,") right 10px center no-repeat;border-color:#b7bcbf;box-shadow:none;color:#f0f1f1;outline:none}html.dark-mode .swagger-ui select[multiple]{background:#1c2022}html.dark-mode .swagger-ui select:focus{border-color:#51a8ff}html.dark-mode .swagger-ui input::-moz-placeholder, html.dark-mode .swagger-ui textarea::-moz-placeholder{color:#f0f1f1;opacity:.5}html.dark-mode .swagger-ui input::placeholder,html.dark-mode .swagger-ui textarea::placeholder{color:#f0f1f1;opacity:.5}html.dark-mode .swagger-ui input.invalid,html.dark-mode .swagger-ui select.invalid,html.dark-mode .swagger-ui textarea.invalid{background:#1c2022;border-color:#ff5f5f}html.dark-mode .swagger-ui .topbar{background:#2a2e30}html.dark-mode .swagger-ui .topbar .download-url-wrapper .download-url-button{background:#1d632e;color:#e4e6e6}html.dark-mode .swagger-ui .topbar .download-url-wrapper .download-url-input{border-color:#1d632e}html.dark-mode .swagger-ui .topbar .download-url-wrapper .download-url-input.failed{color:#ff5f5f}html.dark-mode .swagger-ui .dialog-ux .modal-ux{background-color:#2a2e30;border:none;color:#e4e6e6}html.dark-mode .swagger-ui .dialog-ux .modal-ux-header{border-color:#545d61}html.dark-mode .swagger-ui .dialog-ux .modal-ux-header .close-modal svg{fill:#e4e6e6}html.dark-mode .swagger-ui .dialog-ux .modal-ux h2,html.dark-mode .swagger-ui .dialog-ux .modal-ux h3,html.dark-mode .swagger-ui .dialog-ux .modal-ux h4,html.dark-mode .swagger-ui .dialog-ux .modal-ux h5,html.dark-mode .swagger-ui .dialog-ux .modal-ux label,html.dark-mode .swagger-ui .dialog-ux .modal-ux p{color:#e4e6e6}html.dark-mode .swagger-ui .dialog-ux .modal-ux .scopes a{color:#51a8ff}html.dark-mode .swagger-ui .dialog-ux .modal-ux .btn.modal-btn{border-color:#3ece90;color:#3ece90}html.dark-mode .swagger-ui .dialog-ux .modal-ux .btn.modal-btn.btn-done{border-color:#e4e6e6;color:#e4e6e6}html.dark-mode .swagger-ui .dialog-ux .modal-ux .auth-container{border-color:#545d61}html.dark-mode .swagger-ui .dialog-ux .modal-ux .checkbox input[type=checkbox]+label>.item{background:#545d61;box-shadow:none;color:#f0f1f1!important}html.dark-mode .swagger-ui .dialog-ux .modal-ux .checkbox input[type=checkbox]:checked+label>.item{background:#545d61 url("data:image/svg+xml;charset=utf-8,") 50% no-repeat}html.dark-mode .swagger-ui .loading-container .loading:before{border-color:#e4e6e6 #545d61 #545d61}html.dark-mode .swagger-ui .loading-container .loading:after{color:#e4e6e6}html.dark-mode .swagger-ui .scheme-container{background:#1c2022;box-shadow:0 1px 2px 0 #545d61}html.dark-mode .swagger-ui .scheme-container .schemes>.schemes-server-container>label{color:#e4e6e6}html.dark-mode .swagger-ui .scheme-container .btn.authorize{border-color:#3ece90;color:#3ece90}html.dark-mode .swagger-ui .scheme-container .btn.authorize svg{fill:#3ece90}html.dark-mode .swagger-ui .info .title,html.dark-mode .swagger-ui .info h1,html.dark-mode .swagger-ui .info h2,html.dark-mode .swagger-ui .info h3,html.dark-mode .swagger-ui .info h4,html.dark-mode .swagger-ui .info h5{color:#d2d6d7}html.dark-mode .swagger-ui .info .base-url,html.dark-mode .swagger-ui .info li,html.dark-mode .swagger-ui .info p,html.dark-mode .swagger-ui .info table{color:#e4e6e6}html.dark-mode .swagger-ui .info a{color:#51a8ff}html.dark-mode .swagger-ui .info .title small{background:#434b4f}html.dark-mode .swagger-ui .info .title small.version-stamp{background:#1d632e}html.dark-mode .swagger-ui .info .errors-wrapper{background:#434b4f;border-color:#ff5f5f}html.dark-mode .swagger-ui .info .errors-wrapper h4,html.dark-mode .swagger-ui .info .errors-wrapper span{color:#e4e6e6}html.dark-mode .swagger-ui .info .errors-wrapper .btn.errors__clear-btn{border-color:#e4e6e6;color:#e4e6e6}html.dark-mode .swagger-ui .copy-to-clipboard,html.dark-mode .swagger-ui .download-contents{background:#545d61;color:#e4e6e6}html.dark-mode .swagger-ui .copy-to-clipboard button,html.dark-mode .swagger-ui .download-contents button{background:url("data:image/svg+xml;charset=utf-8,") 50% no-repeat}html.dark-mode .swagger-ui .opblock-tag{border-bottom-color:#545d61;color:#e4e6e6}html.dark-mode .swagger-ui .opblock-tag small{color:#e4e6e6}html.dark-mode .swagger-ui .opblock-tag a.link{color:#51a8ff}html.dark-mode .swagger-ui .opblock.opblock-post{background:#112929;border-color:#104834}html.dark-mode .swagger-ui .opblock.opblock-post thead tr td,html.dark-mode .swagger-ui .opblock.opblock-post thead tr th{border-color:#104834;opacity:1}html.dark-mode .swagger-ui .opblock.opblock-post .opblock-section-header{background:#14392c;border-bottom:1px solid #104834;border-top:1px solid #104834}html.dark-mode .swagger-ui .opblock.opblock-post .opblock-section-header .tab-header .tab-item .opblock-title span:after{background:#00b572}html.dark-mode .swagger-ui .opblock.opblock-post .opblock-summary{border-bottom:none;border-color:#104834}html.dark-mode .swagger-ui .opblock.opblock-post .opblock-summary-control:focus{outline:none}html.dark-mode .swagger-ui .opblock.opblock-post .opblock-summary-method{background:#00b572;color:#080a0b;text-shadow:none}html.dark-mode .swagger-ui .opblock.opblock-post .opblock-body>.opblock-description-wrapper,html.dark-mode .swagger-ui .opblock.opblock-post .opblock-body>.opblock-title_normal{border-top:1px solid #104834}html.dark-mode .swagger-ui .opblock.opblock-deprecated{background:#272c34;border-color:#495361}html.dark-mode .swagger-ui .opblock.opblock-deprecated thead tr td,html.dark-mode .swagger-ui .opblock.opblock-deprecated thead tr th{border-color:#495361;opacity:1}html.dark-mode .swagger-ui .opblock.opblock-deprecated .opblock-section-header{background:#262e36;border-bottom:1px solid #495361;border-top:1px solid #495361}html.dark-mode .swagger-ui .opblock.opblock-deprecated .opblock-section-header .tab-header .tab-item .opblock-title span:after{background:#6a6a6a}html.dark-mode .swagger-ui .opblock.opblock-deprecated .opblock-summary{border-bottom:none;border-color:#495361}html.dark-mode .swagger-ui .opblock.opblock-deprecated .opblock-summary-control:focus{outline:none}html.dark-mode .swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#6a6a6a;color:#080a0b;text-shadow:none}html.dark-mode .swagger-ui .opblock.opblock-deprecated .opblock-body>.opblock-description-wrapper,html.dark-mode .swagger-ui .opblock.opblock-deprecated .opblock-body>.opblock-title_normal{border-top:1px solid #495361}html.dark-mode .swagger-ui .opblock.opblock-put{background:#27201e;border-color:#523524}html.dark-mode .swagger-ui .opblock.opblock-put thead tr td,html.dark-mode .swagger-ui .opblock.opblock-put thead tr th{border-color:#523524;opacity:1}html.dark-mode .swagger-ui .opblock.opblock-put .opblock-section-header{background:#9a5b3e;border-bottom:1px solid #523524;border-top:1px solid #523524}html.dark-mode .swagger-ui .opblock.opblock-put .opblock-section-header .tab-header .tab-item .opblock-title span:after{background:#ff7d35}html.dark-mode .swagger-ui .opblock.opblock-put .opblock-summary{border-bottom:none;border-color:#523524}html.dark-mode .swagger-ui .opblock.opblock-put .opblock-summary-control:focus{outline:none}html.dark-mode .swagger-ui .opblock.opblock-put .opblock-summary-method{background:#ff7d35;color:#080a0b;text-shadow:none}html.dark-mode .swagger-ui .opblock.opblock-put .opblock-body>.opblock-description-wrapper,html.dark-mode .swagger-ui .opblock.opblock-put .opblock-body>.opblock-title_normal{border-top:1px solid #523524}html.dark-mode .swagger-ui .opblock.opblock-get{background:#182536;border-color:#294262}html.dark-mode .swagger-ui .opblock.opblock-get thead tr td,html.dark-mode .swagger-ui .opblock.opblock-get thead tr th{border-color:#294262;opacity:1}html.dark-mode .swagger-ui .opblock.opblock-get .opblock-section-header{background:#1c3043;border-bottom:1px solid #294262;border-top:1px solid #294262}html.dark-mode .swagger-ui .opblock.opblock-get .opblock-section-header .tab-header .tab-item .opblock-title span:after{background:#55a1ff}html.dark-mode .swagger-ui .opblock.opblock-get .opblock-summary{border-bottom:none;border-color:#294262}html.dark-mode .swagger-ui .opblock.opblock-get .opblock-summary-control:focus{outline:none}html.dark-mode .swagger-ui .opblock.opblock-get .opblock-summary-method{background:#55a1ff;color:#080a0b;text-shadow:none}html.dark-mode .swagger-ui .opblock.opblock-get .opblock-body>.opblock-description-wrapper,html.dark-mode .swagger-ui .opblock.opblock-get .opblock-body>.opblock-title_normal{border-top:1px solid #294262}html.dark-mode .swagger-ui .opblock.opblock-delete{background:#241a20;border-color:#4b2420}html.dark-mode .swagger-ui .opblock.opblock-delete thead tr td,html.dark-mode .swagger-ui .opblock.opblock-delete thead tr th{border-color:#4b2420;opacity:1}html.dark-mode .swagger-ui .opblock.opblock-delete .opblock-section-header{background:#2f2020;border-bottom:1px solid #4b2420;border-top:1px solid #4b2420}html.dark-mode .swagger-ui .opblock.opblock-delete .opblock-section-header .tab-header .tab-item .opblock-title span:after{background:#eb6156}html.dark-mode .swagger-ui .opblock.opblock-delete .opblock-summary{border-bottom:none;border-color:#4b2420}html.dark-mode .swagger-ui .opblock.opblock-delete .opblock-summary-control:focus{outline:none}html.dark-mode .swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#eb6156;color:#080a0b;text-shadow:none}html.dark-mode .swagger-ui .opblock.opblock-delete .opblock-body>.opblock-description-wrapper,html.dark-mode .swagger-ui .opblock.opblock-delete .opblock-body>.opblock-title_normal{border-top:1px solid #4b2420}html.dark-mode .swagger-ui .opblock.opblock-patch{background:#11282f;border-color:#16494b}html.dark-mode .swagger-ui .opblock.opblock-patch thead tr td,html.dark-mode .swagger-ui .opblock.opblock-patch thead tr th{border-color:#16494b;opacity:1}html.dark-mode .swagger-ui .opblock.opblock-patch .opblock-section-header{background:#113239;border-bottom:1px solid #16494b;border-top:1px solid #16494b}html.dark-mode .swagger-ui .opblock.opblock-patch .opblock-section-header .tab-header .tab-item .opblock-title span:after{background:#03b7bf}html.dark-mode .swagger-ui .opblock.opblock-patch .opblock-summary{border-bottom:none;border-color:#16494b}html.dark-mode .swagger-ui .opblock.opblock-patch .opblock-summary-control:focus{outline:none}html.dark-mode .swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#03b7bf;color:#080a0b;text-shadow:none}html.dark-mode .swagger-ui .opblock.opblock-patch .opblock-body>.opblock-description-wrapper,html.dark-mode .swagger-ui .opblock.opblock-patch .opblock-body>.opblock-title_normal{border-top:1px solid #16494b}html.dark-mode .swagger-ui .opblock.opblock-head{background:#282231;border-color:#44336a}html.dark-mode .swagger-ui .opblock.opblock-head thead tr td,html.dark-mode .swagger-ui .opblock.opblock-head thead tr th{border-color:#44336a;opacity:1}html.dark-mode .swagger-ui .opblock.opblock-head .opblock-section-header{background:#352c45;border-bottom:1px solid #44336a;border-top:1px solid #44336a}html.dark-mode .swagger-ui .opblock.opblock-head .opblock-section-header .tab-header .tab-item .opblock-title span:after{background:#b889ff}html.dark-mode .swagger-ui .opblock.opblock-head .opblock-summary{border-bottom:none;border-color:#44336a}html.dark-mode .swagger-ui .opblock.opblock-head .opblock-summary-control:focus{outline:none}html.dark-mode .swagger-ui .opblock.opblock-head .opblock-summary-method{background:#b889ff;color:#080a0b;text-shadow:none}html.dark-mode .swagger-ui .opblock.opblock-head .opblock-body>.opblock-description-wrapper,html.dark-mode .swagger-ui .opblock.opblock-head .opblock-body>.opblock-title_normal{border-top:1px solid #44336a}html.dark-mode .swagger-ui .opblock.opblock-options{background:#202c3c;border-color:#33465e}html.dark-mode .swagger-ui .opblock.opblock-options thead tr td,html.dark-mode .swagger-ui .opblock.opblock-options thead tr th{border-color:#33465e;opacity:1}html.dark-mode .swagger-ui .opblock.opblock-options .opblock-section-header{background:#314558;border-bottom:1px solid #33465e;border-top:1px solid #33465e}html.dark-mode .swagger-ui .opblock.opblock-options .opblock-section-header .tab-header .tab-item .opblock-title span:after{background:#6895c8}html.dark-mode .swagger-ui .opblock.opblock-options .opblock-summary{border-bottom:none;border-color:#33465e}html.dark-mode .swagger-ui .opblock.opblock-options .opblock-summary-control:focus{outline:none}html.dark-mode .swagger-ui .opblock.opblock-options .opblock-summary-method{background:#6895c8;color:#080a0b;text-shadow:none}html.dark-mode .swagger-ui .opblock.opblock-options .opblock-body>.opblock-description-wrapper,html.dark-mode .swagger-ui .opblock.opblock-options .opblock-body>.opblock-title_normal{border-top:1px solid #33465e}html.dark-mode .swagger-ui .opblock .opblock-section-header{box-shadow:none}html.dark-mode .swagger-ui .opblock .opblock-section-header h4,html.dark-mode .swagger-ui .opblock .opblock-section-header label{color:#e4e6e6}html.dark-mode .swagger-ui .opblock .opblock-section-header .try-out__btn{border-color:#b7bcbf;box-shadow:none;color:#e4e6e6}html.dark-mode .swagger-ui .opblock .opblock-section-header .try-out__btn.cancel{border-color:#ff5f5f;color:#ff5f5f}html.dark-mode .swagger-ui .opblock .btn.json-schema-form-item-add,html.dark-mode .swagger-ui .opblock .btn.json-schema-form-item-remove{border-color:#e4e6e6;color:#e4e6e6}html.dark-mode .swagger-ui .opblock .validation-errors.errors-wrapper{background:#434b4f;border-color:#ff5f5f;color:#e4e6e6}html.dark-mode .swagger-ui .opblock .body-param-options label span,html.dark-mode .swagger-ui .opblock .opblock-description-wrapper i,html.dark-mode .swagger-ui .opblock .opblock-description-wrapper p,html.dark-mode .swagger-ui .opblock .opblock-external-docs-wrapper,html.dark-mode .swagger-ui .opblock .opblock-summary-description,html.dark-mode .swagger-ui .opblock .opblock-summary-operation-id,html.dark-mode .swagger-ui .opblock .opblock-summary-path,html.dark-mode .swagger-ui .opblock .opblock-summary-path__deprecated,html.dark-mode .swagger-ui .opblock .opblock-title_normal,html.dark-mode .swagger-ui .opblock .parameter__in,html.dark-mode .swagger-ui .opblock .parameter__name,html.dark-mode .swagger-ui .opblock .parameter__type,html.dark-mode .swagger-ui .opblock .parameter__type .prop-format,html.dark-mode .swagger-ui .opblock .response-col_links,html.dark-mode .swagger-ui .opblock .response-col_status,html.dark-mode .swagger-ui .opblock .response-col_undocumented{color:#e4e6e6}html.dark-mode .swagger-ui .opblock .opblock-external-docs a.link{color:#51a8ff}html.dark-mode .swagger-ui .opblock .parameter__name.required span,html.dark-mode .swagger-ui .opblock .parameter__name.required:after{color:#ff5f5f}html.dark-mode .swagger-ui .opblock .parameter__empty_value_toggle{color:#e4e6e6}html.dark-mode .swagger-ui .opblock .btn.execute{background:#51a8ff;border-color:#51a8ff;color:#080a0b}html.dark-mode .swagger-ui .opblock .btn.btn-clear{border-color:#e4e6e6;color:#e4e6e6}html.dark-mode .swagger-ui .opblock .highlight-code pre.microlight{background:#2a2e30!important;color:#f0f1f1}html.dark-mode .swagger-ui .opblock .curl-command .btn{background:#3b424d!important;border-color:#2a2e30!important;color:#ebebeb!important}html.dark-mode .swagger-ui .opblock .curl-command .btn.active{background:#2a2e30!important;color:#e4e6e6!important}html.dark-mode .swagger-ui .opblock pre.microlight{background:#2a2e30!important;color:#f0f1f1}html.dark-mode .swagger-ui .opblock .model-example .tab button{color:#e4e6e6}html.dark-mode .swagger-ui .opblock .model-example .tabitem:after{background:#6b757a}html.dark-mode .swagger-ui .opblock .responses-inner h4,html.dark-mode .swagger-ui .opblock .responses-inner h5{color:#e4e6e6}html.dark-mode .swagger-ui .opblock .response-control-media-type--accept-controller select.content-type{border-color:#4ac966}html.dark-mode .swagger-ui .opblock .response-control-media-type--accept-controller .response-control-media-type__accept-message{color:#4ac966}html.dark-mode .swagger-ui .model-toggle:after{background:url("data:image/svg+xml;charset=utf-8,") 50% no-repeat;background-size:100%}html.dark-mode .swagger-ui .model .prop-type{color:#b68ae1}html.dark-mode .swagger-ui .model .brace-close,html.dark-mode .swagger-ui .model .brace-open,html.dark-mode .swagger-ui .model .description,html.dark-mode .swagger-ui .model .prop-format,html.dark-mode .swagger-ui .model .property,html.dark-mode .swagger-ui .model .property-row{color:#e4e6e6}html.dark-mode .swagger-ui .model .property-row.required .star{color:#ff5f5f}html.dark-mode .swagger-ui .model-box{background:#2a2e30}html.dark-mode .swagger-ui .model-box .model,html.dark-mode .swagger-ui .model-box .model-title{color:#e4e6e6}html.dark-mode .swagger-ui .model-box-control:focus{outline:none}html.dark-mode .swagger-ui .model-box-control:not(.prop){color:#e4e6e6}html.dark-mode .swagger-ui .json-schema-2020-12,html.dark-mode .swagger-ui .json-schema-2020-12 button{background:#2a2e30}html.dark-mode .swagger-ui .json-schema-2020-12 button svg{fill:#e4e6e6}html.dark-mode .swagger-ui .json-schema-2020-12 a{color:#51a8ff}html.dark-mode .swagger-ui .json-schema-2020-12__title{color:#e4e6e6}html.dark-mode .swagger-ui .json-schema-2020-12-property--required>.json-schema-2020-12:first-of-type>.json-schema-2020-12-head .json-schema-2020-12__title:after{color:#ff5f5f}html.dark-mode .swagger-ui .json-schema-2020-12-expand-deep-button{color:#b7bcbf}html.dark-mode .swagger-ui .json-schema-2020-12-body{border-color:#b7bcbf}html.dark-mode .swagger-ui .json-schema-2020-12-keyword__name--primary{color:#e4e6e6}html.dark-mode .swagger-ui .json-schema-2020-12-keyword__name--secondary,html.dark-mode .swagger-ui .json-schema-2020-12-keyword__value--secondary{color:#b7bcbf}html.dark-mode .swagger-ui .json-schema-2020-12-keyword__value--warning{border-color:#ff5f5f;color:#ff5f5f}html.dark-mode .swagger-ui .json-schema-2020-12-keyword--\$vocabulary ul{border-color:#b7bcbf}html.dark-mode .swagger-ui .json-schema-2020-12-keyword--patternProperties .json-schema-2020-12__title:after,html.dark-mode .swagger-ui .json-schema-2020-12-keyword--patternProperties .json-schema-2020-12__title:before,html.dark-mode .swagger-ui .json-schema-2020-12__attribute--primary{color:#9898ff}html.dark-mode .swagger-ui .json-schema-2020-12__attribute--muted{color:#b7bcbf}html.dark-mode .swagger-ui .json-schema-2020-12__attribute--warning{color:#ff5f5f}html.dark-mode .swagger-ui .json-schema-2020-12-json-viewer__name--secondary,html.dark-mode .swagger-ui .json-schema-2020-12-json-viewer__value--secondary{color:#b7bcbf}html.dark-mode .swagger-ui .json-schema-2020-12__constraint{background:#9898ff;color:#080a0b}html.dark-mode .swagger-ui .json-schema-2020-12__constraint--string{background:#d4aa53}html.dark-mode .swagger-ui section.models,html.dark-mode .swagger-ui section.models h4{border-color:#545d61}html.dark-mode .swagger-ui section.models h4 span{color:#e4e6e6}html.dark-mode .swagger-ui section.models .model-container{background:#2a2e30}html.dark-mode .swagger-ui section.models .models-control:focus{outline:none}html.dark-mode .swagger-ui section.models .models-control svg{fill:#b7bcbf} /*# sourceMappingURL=swagger-ui.css.map*/ \ No newline at end of file diff --git a/pkgs/build.sh b/pkgs/build.sh index d549d448..71018748 100755 --- a/pkgs/build.sh +++ b/pkgs/build.sh @@ -1,6 +1,6 @@ #!/bin/bash -NFPM_VERSION=2.37.1 +NFPM_VERSION=2.45.1 NFPM_ARCH=${NFPM_ARCH:-amd64} if [ -z ${SFTPGO_VERSION} ] then @@ -83,6 +83,12 @@ contents: - src: "${BASE_DIR}/openapi/*" dst: "/usr/share/sftpgo/openapi" + - src: "${BASE_DIR}/LICENSE" + dst: "/usr/share/licenses/sftpgo/LICENSE" + + - src: "${BASE_DIR}/NOTICE" + dst: "/usr/share/licenses/sftpgo/NOTICE" + - src: "./sftpgo.json" dst: "/etc/sftpgo/sftpgo.json" type: "config|noreplace" diff --git a/pkgs/choco/sftpgo.nuspec b/pkgs/choco/sftpgo.nuspec index 854d3603..026340e6 100644 --- a/pkgs/choco/sftpgo.nuspec +++ b/pkgs/choco/sftpgo.nuspec @@ -3,17 +3,17 @@ sftpgo - 2.5.6 + 2.7.1 https://github.com/drakkan/sftpgo/tree/main/pkgs/choco asheroto SFTPGo Nicola Murino - https://github.com/drakkan/sftpgo - https://cdn.statically.io/gh/drakkan/sftpgo/v2.5.6/static/img/logo.png + https://sftpgo.com + https://cdn.statically.io/gh/drakkan/sftpgo/v2.7.1/static/img/logo.png https://github.com/drakkan/sftpgo/blob/main/LICENSE false https://github.com/drakkan/sftpgo - https://github.com/drakkan/sftpgo/tree/v2.5.6/docs + https://docs.sftpgo.com/2.7/ https://github.com/drakkan/sftpgo/issues sftp sftp-server ftp webdav s3 azure-blob google-cloud-storage cloud-storage scp data-at-rest-encryption multi-factor-authentication multi-step-authentication Full-featured and highly configurable file transfer server: SFTP, HTTP/S,FTP/S, WebDAV. @@ -26,13 +26,13 @@ SFTPGo allows to create HTTP/S links to externally share files and folders secur SFTPGo is highly customizable and extensible to suit your needs. -You can find more info [here](https://github.com/drakkan/sftpgo). +You can find more info [here](https://docs.sftpgo.com/2.6/). ### Notes * This package installs SFTPGo as Windows Service. -* After the first installation please take a look at the [Getting Started Guide](https://sftpgo.github.io/latest/initial-configuration/). - https://github.com/drakkan/sftpgo/releases/tag/v2.5.6 +* After the first installation please take a look at the [Getting Started Guide](https://docs.sftpgo.com/2.7/initial-configuration/). + https://github.com/drakkan/sftpgo/releases/tag/v2.7.1 diff --git a/pkgs/choco/tools/ChocolateyInstall.ps1 b/pkgs/choco/tools/ChocolateyInstall.ps1 index fa5fd930..58740ac3 100644 --- a/pkgs/choco/tools/ChocolateyInstall.ps1 +++ b/pkgs/choco/tools/ChocolateyInstall.ps1 @@ -1,8 +1,8 @@ $ErrorActionPreference = 'Stop' $packageName = 'sftpgo' $softwareName = 'SFTPGo' -$url = 'https://github.com/drakkan/sftpgo/releases/download/v2.5.6/sftpgo_v2.5.6_windows_x86_64.exe' -$checksum = 'C20BB051D3EA2ACBF05231ECB94410D01648E15DE304CA6240D37FDC34007DBE' +$url = 'https://github.com/drakkan/sftpgo/releases/download/v2.7.1/sftpgo_v2.7.1_windows_x86_64.exe' +$checksum = '5187F2DAA58987EAE1760B6383095EF8B7E18ED1A872F2514ACB767D781D1883' $silentArgs = '/VERYSILENT' $validExitCodes = @(0) @@ -44,9 +44,9 @@ Write-Output "`t$EnvDirPath" Write-Output "If the SFTPGo service does not start, make sure that TCP ports 2022 and 8080 are" Write-Output "not used by other services or change the SFTPGo configuration to suit your needs." Write-Output "" -Write-Output "General information (README) location:" -Write-Output "`thttps://github.com/drakkan/sftpgo" +Write-Output "General information:" +Write-Output "`thttps://sftpgo.com" Write-Output "Documentation location:" -Write-Output "`thttps://sftpgo.github.io/" +Write-Output "`thttps://docs.sftpgo.com/latest/" Write-Output "" Write-Output "---------------------------" \ No newline at end of file diff --git a/pkgs/debian/changelog b/pkgs/debian/changelog index 9a30f129..1f9ddab0 100644 --- a/pkgs/debian/changelog +++ b/pkgs/debian/changelog @@ -1,3 +1,57 @@ +sftpgo (2.7.1-1ppa1) bionic; urgency=medium + + * New upstream release + + -- Nicola Murino Fri, 13 Mar 2026 21:05:12 +0100 + +sftpgo (2.7.0-1ppa1) bionic; urgency=medium + + * New upstream release + + -- Nicola Murino Thu, 23 Oct 2025 20:05:08 +0200 + +sftpgo (2.6.6-1ppa1) bionic; urgency=medium + + * New upstream release + + -- Nicola Murino Mon, 24 Feb 2025 20:19:49 +0100 + +sftpgo (2.6.5-1ppa1) bionic; urgency=medium + + * New upstream release + + -- Nicola Murino Fri, 07 Feb 2025 19:22:24 +0100 + +sftpgo (2.6.4-1ppa1) bionic; urgency=medium + + * New upstream release + + -- Nicola Murino Thu, 28 Nov 2024 07:39:39 +0100 + +sftpgo (2.6.3-1ppa1) bionic; urgency=medium + + * New upstream release + + -- Nicola Murino Fri, 15 Nov 2024 18:35:41 +0100 + +sftpgo (2.6.2-1ppa1) bionic; urgency=medium + + * New upstream release + + -- Nicola Murino Fri, 21 Jun 2024 19:47:58 +0200 + +sftpgo (2.6.1-1ppa1) bionic; urgency=medium + + * New upstream release + + -- Nicola Murino Wed, 19 Jun 2024 10:17:49 +0200 + +sftpgo (2.6.0-1ppa1) bionic; urgency=medium + + * New upstream release + + -- Nicola Murino Wed, 15 May 2024 19:12:01 +0200 + sftpgo (2.5.6-1ppa1) bionic; urgency=medium * New upstream release diff --git a/pkgs/debian/copyright b/pkgs/debian/copyright index f728da09..083bdd3c 100644 --- a/pkgs/debian/copyright +++ b/pkgs/debian/copyright @@ -3,8 +3,8 @@ Upstream-Name: SFTPGo Source: https://github.com/drakkan/sftpgo Files: * -Copyright: 2019-2023 Nicola Murino -License: AGPL-3 +Copyright: 2019-2025 Nicola Murino +License: AGPL-3 with additional terms License: AGPL-3 GNU AFFERO GENERAL PUBLIC LICENSE @@ -668,3 +668,18 @@ specific requirements. if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . + +ADDITIONAL TERMS + +Additional terms under GNU AGPL version 3 section 7.3(b) and 13.1: + +If you have included SFTPGo so that it is offered through any network +interactions, including by means of an external user interface, or +any other integration, even without modifying its source code and then +SFTPGo is partially, fully or optionally configured via your frontend, +you must provide reasonable but clear attribution to the SFTPGo project +and its author(s), not imply any endorsement by or affiliation with the +SFTPGo project, and you must prominently offer all users interacting +with it remotely through a computer network an opportunity to receive +the Corresponding Source of the SFTPGo version you include by providing +a link to the Corresponding Source in the SFTPGo source code repository. diff --git a/pkgs/debian/patches/config.diff b/pkgs/debian/patches/config.diff index 8f9fbcdb..0bb88dc6 100644 --- a/pkgs/debian/patches/config.diff +++ b/pkgs/debian/patches/config.diff @@ -2,7 +2,7 @@ Index: sftpgo/sftpgo.json =================================================================== --- sftpgo.orig/sftpgo.json +++ sftpgo/sftpgo.json -@@ -57,7 +57,7 @@ +@@ -70,7 +70,7 @@ "domains": [], "email": "", "key_type": "4096", @@ -11,7 +11,7 @@ Index: sftpgo/sftpgo.json "ca_endpoint": "https://acme-v02.api.letsencrypt.org/directory", "renew_days": 30, "http01_challenge": { -@@ -186,7 +186,7 @@ +@@ -200,7 +200,7 @@ }, "data_provider": { "driver": "sqlite", @@ -20,7 +20,7 @@ Index: sftpgo/sftpgo.json "host": "", "port": 0, "username": "", -@@ -202,7 +202,7 @@ +@@ -216,7 +216,7 @@ "track_quota": 2, "delayed_quota_update": 0, "pool_size": 0, @@ -29,7 +29,7 @@ Index: sftpgo/sftpgo.json "actions": { "execute_on": [], "execute_for": [], -@@ -244,7 +244,7 @@ +@@ -258,7 +258,7 @@ "port": 0, "proto": "http" }, diff --git a/sftpgo.json b/sftpgo.json index 55d17315..3b3cf1ba 100644 --- a/sftpgo.json +++ b/sftpgo.json @@ -17,13 +17,13 @@ "startup_hook": "", "post_connect_hook": "", "post_disconnect_hook": "", - "data_retention_hook": "", "max_total_connections": 0, "max_per_host_connections": 20, "allowlist_status": 0, "allow_self_connections": 0, "umask": "", "server_version": "", + "tz": "", "metadata": { "read": 0 }, @@ -39,7 +39,11 @@ "score_no_auth": 0, "observation_time": 30, "entries_soft_limit": 100, - "entries_hard_limit": 150 + "entries_hard_limit": 150, + "login_delay": { + "success": 0, + "password_failed": 1000 + } }, "rate_limiters": [ { @@ -57,7 +61,10 @@ "entries_soft_limit": 100, "entries_hard_limit": 150 } - ] + ], + "event_manager": { + "enabled_commands": [] + } }, "acme": { "domains": [], @@ -87,13 +94,14 @@ "host_keys": [], "host_certificates": [], "host_key_algorithms": [], - "moduli": [], "kex_algorithms": [], "ciphers": [], "macs": [], "public_key_algorithms": [], "trusted_user_ca_keys": [], "revoked_user_certs_file": "", + "opkssh_path": "", + "opkssh_checksum": "", "login_banner_file": "", "enabled_ssh_commands": [ "md5sum", @@ -105,8 +113,7 @@ ], "keyboard_interactive_authentication": true, "keyboard_interactive_auth_hook": "", - "password_authentication": true, - "folder_prefix": "" + "password_authentication": true }, "ftpd": { "bindings": [ @@ -115,7 +122,6 @@ "address": "", "apply_proxy_config": true, "tls_mode": 0, - "tls_session_reuse": 0, "certificate_file": "", "certificate_key_file": "", "min_tls_version": 12, @@ -126,7 +132,6 @@ "tls_cipher_suites": [], "passive_connections_security": 0, "active_connections_security": 0, - "ignore_ascii_transfer_type": 0, "debug": false } ], @@ -158,6 +163,7 @@ "tls_cipher_suites": [], "tls_protocols": [], "prefix": "", + "proxy_mode": 0, "proxy_allowed": [], "client_ip_proxy_header": "", "client_ip_header_depth": 0, @@ -263,6 +269,7 @@ "enable_web_client": true, "enable_rest_api": true, "enabled_login_methods": 0, + "disabled_login_methods": 0, "enable_https": false, "certificate_file": "", "certificate_key_file": "", @@ -270,11 +277,16 @@ "client_auth_type": 0, "tls_cipher_suites": [], "tls_protocols": [], + "proxy_mode": 0, "proxy_allowed": [], "client_ip_proxy_header": "", "client_ip_header_depth": 0, "hide_login_url": 0, "render_openapi": true, + "base_url": "", + "languages": [ + "en" + ], "oidc": { "client_id": "", "client_secret": "", @@ -307,7 +319,11 @@ "content_type_nosniff": false, "content_security_policy": "", "permissions_policy": "", - "cross_origin_opener_policy": "" + "cross_origin_opener_policy": "", + "cross_origin_resource_policy": "", + "cross_origin_embedder_policy": "", + "referrer_policy": "", + "cache_control": "" }, "branding": { "web_admin": { @@ -315,7 +331,6 @@ "short_name": "", "favicon_path": "", "logo_path": "", - "login_image_path": "", "disclaimer_name": "", "disclaimer_path": "", "default_css": [], @@ -326,7 +341,6 @@ "short_name": "", "favicon_path": "", "logo_path": "", - "login_image_path": "", "disclaimer_name": "", "disclaimer_path": "", "default_css": [], @@ -346,6 +360,9 @@ "signing_passphrase": "", "signing_passphrase_file": "", "token_validation": 0, + "cookie_lifetime": 20, + "share_cookie_lifetime": 120, + "jwt_lifetime": 20, "max_upload_file_size": 0, "cors": { "enabled": false, diff --git a/static/assets/css/style.bundle.css b/static/assets/css/style.bundle.css index d675af90..657c8e1a 100644 --- a/static/assets/css/style.bundle.css +++ b/static/assets/css/style.bundle.css @@ -1,8 +1,8 @@ @charset "UTF-8";/*! - * Bootstrap v5.3.3 (https://getbootstrap.com/) - * Copyright 2011-2024 The Bootstrap Authors + * Bootstrap v5.3.8 (https://getbootstrap.com/) + * Copyright 2011-2025 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:#000000;--bs-white:#ffffff;--bs-gray:#78829D;--bs-gray-dark:#252F4A;--bs-gray-100:#F9F9F9;--bs-gray-200:#F1F1F4;--bs-gray-300:#DBDFE9;--bs-gray-400:#C4CADA;--bs-gray-500:#6D6D97;--bs-gray-600:#78829D;--bs-gray-700:#4B5675;--bs-gray-800:#252F4A;--bs-gray-900:#071437;--bs-light:#F9F9F9;--bs-primary:#0069E0;--bs-secondary:#F1F1F4;--bs-success:#17C653;--bs-info:#7239EA;--bs-warning:#F6C000;--bs-danger:#F8285A;--bs-dark:#1E2129;--bs-light-rgb:249,249,249;--bs-primary-rgb:0,105,224;--bs-secondary-rgb:241,241,244;--bs-success-rgb:23,198,83;--bs-info-rgb:114,57,234;--bs-warning-rgb:246,192,0;--bs-danger-rgb:248,40,90;--bs-dark-rgb:30,33,41;--bs-primary-text-emphasis:#002a5a;--bs-secondary-text-emphasis:#606062;--bs-success-text-emphasis:#094f21;--bs-info-text-emphasis:#2e175e;--bs-warning-text-emphasis:#624d00;--bs-danger-text-emphasis:#631024;--bs-light-text-emphasis:#4B5675;--bs-dark-text-emphasis:#4B5675;--bs-primary-bg-subtle:#cce1f9;--bs-secondary-bg-subtle:#fcfcfd;--bs-success-bg-subtle:#d1f4dd;--bs-info-bg-subtle:#e3d7fb;--bs-warning-bg-subtle:#fdf2cc;--bs-danger-bg-subtle:#fed4de;--bs-light-bg-subtle:#fcfcfc;--bs-dark-bg-subtle:#C4CADA;--bs-primary-border-subtle:#99c3f3;--bs-secondary-border-subtle:#f9f9fb;--bs-success-border-subtle:#a2e8ba;--bs-info-border-subtle:#c7b0f7;--bs-warning-border-subtle:#fbe699;--bs-danger-border-subtle:#fca9bd;--bs-light-border-subtle:#F1F1F4;--bs-dark-border-subtle:#6D6D97;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:Inter,Helvetica,"sans-serif";--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:#071437;--bs-body-color-rgb:7,20,55;--bs-body-bg:#ffffff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(7, 20, 55, 0.75);--bs-secondary-color-rgb:7,20,55;--bs-secondary-bg:#F1F1F4;--bs-secondary-bg-rgb:241,241,244;--bs-tertiary-color:rgba(7, 20, 55, 0.5);--bs-tertiary-color-rgb:7,20,55;--bs-tertiary-bg:#F9F9F9;--bs-tertiary-bg-rgb:249,249,249;--bs-heading-color:#071437;--bs-link-color:#0069E0;--bs-link-color-rgb:0,105,224;--bs-link-decoration:none;--bs-link-hover-color:#056EE9;--bs-link-hover-color-rgb:5,110,233;--bs-link-hover-decoration:none;--bs-code-color:#b93993;--bs-highlight-color:#071437;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#F1F1F4;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.475rem;--bs-border-radius-sm:0.425rem;--bs-border-radius-lg:0.625rem;--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 1.5rem 0.5rem rgba(0, 0, 0, 0.075);--bs-box-shadow-sm:0 0.1rem 1rem 0.25rem rgba(0, 0, 0, 0.05);--bs-box-shadow-lg:0 1rem 2rem 1rem rgba(0, 0, 0, 0.1);--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(0, 105, 224, 0.25);--bs-form-valid-color:#17C653;--bs-form-valid-border-color:#17C653;--bs-form-invalid-color:#F8285A;--bs-form-invalid-border-color:#F8285A}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#F5F5F5;--bs-body-color-rgb:245,245,245;--bs-body-bg:#15171C;--bs-body-bg-rgb:21,23,28;--bs-emphasis-color:#ffffff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(245, 245, 245, 0.75);--bs-secondary-color-rgb:245,245,245;--bs-secondary-bg:#252F4A;--bs-secondary-bg-rgb:37,47,74;--bs-tertiary-color:rgba(245, 245, 245, 0.5);--bs-tertiary-color-rgb:245,245,245;--bs-tertiary-bg:#162241;--bs-tertiary-bg-rgb:22,34,65;--bs-primary-text-emphasis:#66a5ec;--bs-secondary-text-emphasis:#f7f7f8;--bs-success-text-emphasis:#74dd98;--bs-info-text-emphasis:#aa88f2;--bs-warning-text-emphasis:#fad966;--bs-danger-text-emphasis:#fb7e9c;--bs-light-text-emphasis:#F9F9F9;--bs-dark-text-emphasis:#DBDFE9;--bs-primary-bg-subtle:#00152d;--bs-secondary-bg-subtle:#303031;--bs-success-bg-subtle:#052811;--bs-info-bg-subtle:#170b2f;--bs-warning-bg-subtle:#312600;--bs-danger-bg-subtle:#320812;--bs-light-bg-subtle:#252F4A;--bs-dark-bg-subtle:#131825;--bs-primary-border-subtle:#003f86;--bs-secondary-border-subtle:#919192;--bs-success-border-subtle:#0e7732;--bs-info-border-subtle:#44228c;--bs-warning-border-subtle:#947300;--bs-danger-border-subtle:#951836;--bs-light-border-subtle:#4B5675;--bs-dark-border-subtle:#252F4A;--bs-heading-color:#F5F5F5;--bs-link-color:#1F87FF;--bs-link-hover-color:#4c9fff;--bs-link-color-rgb:31,135,255;--bs-link-hover-color-rgb:76,159,255;--bs-code-color:#b93993;--bs-highlight-color:#F5F5F5;--bs-highlight-bg:#664d03;--bs-border-color:#26272F;--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}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:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:600;line-height:1.2;color:var(--bs-heading-color)}.h1,h1{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h1,h1{font-size:1.75rem}}.h2,h2{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h2,h2{font-size:1.5rem}}.h3,h3{font-size:calc(1.26rem + .12vw)}@media (min-width:1200px){.h3,h3{font-size:1.35rem}}.h4,h4{font-size:1.25rem}.h5,h5{font-size:1.15rem}.h6,h6{font-size:1.075rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;cursor:help;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:600}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:700}.small,small{font-size:.875em}.mark,mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:none}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb);text-decoration:none}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:1rem}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:1rem;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:1rem;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.425rem}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:.75rem;padding-bottom:.75rem;color:#6d6d97;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}[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:.5rem;font-size:calc(1.275rem + .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;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-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:700;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:700;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:700;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:700;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:700;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:700;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:.5rem}.initialism{font-size:.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:.875em;color:#78829d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);box-shadow:var(--bs-box-shadow-sm);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-gray-600)}.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) * .5);padding-left:calc(var(--bs-gutter-x) * .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(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .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:0rem}.g-0,.gy-0{--bs-gutter-y:0rem}.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:0.75rem}.g-3,.gy-3{--bs-gutter-y:0.75rem}.g-4,.gx-4{--bs-gutter-x:1rem}.g-4,.gy-4{--bs-gutter-y:1rem}.g-5,.gx-5{--bs-gutter-x:1.25rem}.g-5,.gy-5{--bs-gutter-y:1.25rem}.g-6,.gx-6{--bs-gutter-x:1.5rem}.g-6,.gy-6{--bs-gutter-y:1.5rem}.g-7,.gx-7{--bs-gutter-x:1.75rem}.g-7,.gy-7{--bs-gutter-y:1.75rem}.g-8,.gx-8{--bs-gutter-x:2rem}.g-8,.gy-8{--bs-gutter-y:2rem}.g-9,.gx-9{--bs-gutter-x:2.25rem}.g-9,.gy-9{--bs-gutter-y:2.25rem}.g-10,.gx-10{--bs-gutter-x:2.5rem}.g-10,.gy-10{--bs-gutter-y:2.5rem}@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:0rem}.g-sm-0,.gy-sm-0{--bs-gutter-y:0rem}.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:0.75rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:0.75rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:1.25rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:1.25rem}.g-sm-6,.gx-sm-6{--bs-gutter-x:1.5rem}.g-sm-6,.gy-sm-6{--bs-gutter-y:1.5rem}.g-sm-7,.gx-sm-7{--bs-gutter-x:1.75rem}.g-sm-7,.gy-sm-7{--bs-gutter-y:1.75rem}.g-sm-8,.gx-sm-8{--bs-gutter-x:2rem}.g-sm-8,.gy-sm-8{--bs-gutter-y:2rem}.g-sm-9,.gx-sm-9{--bs-gutter-x:2.25rem}.g-sm-9,.gy-sm-9{--bs-gutter-y:2.25rem}.g-sm-10,.gx-sm-10{--bs-gutter-x:2.5rem}.g-sm-10,.gy-sm-10{--bs-gutter-y:2.5rem}}@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:0rem}.g-md-0,.gy-md-0{--bs-gutter-y:0rem}.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:0.75rem}.g-md-3,.gy-md-3{--bs-gutter-y:0.75rem}.g-md-4,.gx-md-4{--bs-gutter-x:1rem}.g-md-4,.gy-md-4{--bs-gutter-y:1rem}.g-md-5,.gx-md-5{--bs-gutter-x:1.25rem}.g-md-5,.gy-md-5{--bs-gutter-y:1.25rem}.g-md-6,.gx-md-6{--bs-gutter-x:1.5rem}.g-md-6,.gy-md-6{--bs-gutter-y:1.5rem}.g-md-7,.gx-md-7{--bs-gutter-x:1.75rem}.g-md-7,.gy-md-7{--bs-gutter-y:1.75rem}.g-md-8,.gx-md-8{--bs-gutter-x:2rem}.g-md-8,.gy-md-8{--bs-gutter-y:2rem}.g-md-9,.gx-md-9{--bs-gutter-x:2.25rem}.g-md-9,.gy-md-9{--bs-gutter-y:2.25rem}.g-md-10,.gx-md-10{--bs-gutter-x:2.5rem}.g-md-10,.gy-md-10{--bs-gutter-y:2.5rem}}@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:0rem}.g-lg-0,.gy-lg-0{--bs-gutter-y:0rem}.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:0.75rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:0.75rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:1.25rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:1.25rem}.g-lg-6,.gx-lg-6{--bs-gutter-x:1.5rem}.g-lg-6,.gy-lg-6{--bs-gutter-y:1.5rem}.g-lg-7,.gx-lg-7{--bs-gutter-x:1.75rem}.g-lg-7,.gy-lg-7{--bs-gutter-y:1.75rem}.g-lg-8,.gx-lg-8{--bs-gutter-x:2rem}.g-lg-8,.gy-lg-8{--bs-gutter-y:2rem}.g-lg-9,.gx-lg-9{--bs-gutter-x:2.25rem}.g-lg-9,.gy-lg-9{--bs-gutter-y:2.25rem}.g-lg-10,.gx-lg-10{--bs-gutter-x:2.5rem}.g-lg-10,.gy-lg-10{--bs-gutter-y:2.5rem}}@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:0rem}.g-xl-0,.gy-xl-0{--bs-gutter-y:0rem}.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:0.75rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:0.75rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:1.25rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:1.25rem}.g-xl-6,.gx-xl-6{--bs-gutter-x:1.5rem}.g-xl-6,.gy-xl-6{--bs-gutter-y:1.5rem}.g-xl-7,.gx-xl-7{--bs-gutter-x:1.75rem}.g-xl-7,.gy-xl-7{--bs-gutter-y:1.75rem}.g-xl-8,.gx-xl-8{--bs-gutter-x:2rem}.g-xl-8,.gy-xl-8{--bs-gutter-y:2rem}.g-xl-9,.gx-xl-9{--bs-gutter-x:2.25rem}.g-xl-9,.gy-xl-9{--bs-gutter-y:2.25rem}.g-xl-10,.gx-xl-10{--bs-gutter-x:2.5rem}.g-xl-10,.gy-xl-10{--bs-gutter-y:2.5rem}}@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:0rem}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0rem}.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:0.75rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:0.75rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:1.25rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:1.25rem}.g-xxl-6,.gx-xxl-6{--bs-gutter-x:1.5rem}.g-xxl-6,.gy-xxl-6{--bs-gutter-y:1.5rem}.g-xxl-7,.gx-xxl-7{--bs-gutter-x:1.75rem}.g-xxl-7,.gy-xxl-7{--bs-gutter-y:1.75rem}.g-xxl-8,.gx-xxl-8{--bs-gutter-x:2rem}.g-xxl-8,.gy-xxl-8{--bs-gutter-y:2rem}.g-xxl-9,.gx-xxl-9{--bs-gutter-x:2.25rem}.g-xxl-9,.gy-xxl-9{--bs-gutter-y:2.25rem}.g-xxl-10,.gx-xxl-10{--bs-gutter-x:2.5rem}.g-xxl-10,.gy-xxl-10{--bs-gutter-y:2.5rem}}.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-body-color);--bs-table-bg:transparent;--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-body-color);--bs-table-striped-bg:rgba(var(--bs-gray-100-rgb), 0.75);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:var(--bs-gray-100);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:var(--bs-gray-100);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.75rem .75rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;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(1px * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.5rem .5rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.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(even){--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:#000000;--bs-table-bg:#cce1f9;--bs-table-border-color:#b8cbe0;--bs-table-striped-bg:#c2d6ed;--bs-table-striped-color:#000000;--bs-table-active-bg:#b8cbe0;--bs-table-active-color:#000000;--bs-table-hover-bg:#bdd0e6;--bs-table-hover-color:#000000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000000;--bs-table-bg:#fcfcfd;--bs-table-border-color:#e3e3e4;--bs-table-striped-bg:#efeff0;--bs-table-striped-color:#000000;--bs-table-active-bg:#e3e3e4;--bs-table-active-color:#000000;--bs-table-hover-bg:#e9e9ea;--bs-table-hover-color:#000000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000000;--bs-table-bg:#d1f4dd;--bs-table-border-color:#bcdcc7;--bs-table-striped-bg:#c7e8d2;--bs-table-striped-color:#000000;--bs-table-active-bg:#bcdcc7;--bs-table-active-color:#000000;--bs-table-hover-bg:#c1e2cc;--bs-table-hover-color:#000000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000000;--bs-table-bg:#e3d7fb;--bs-table-border-color:#ccc2e2;--bs-table-striped-bg:#d8ccee;--bs-table-striped-color:#000000;--bs-table-active-bg:#ccc2e2;--bs-table-active-color:#000000;--bs-table-hover-bg:#d2c7e8;--bs-table-hover-color:#000000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000000;--bs-table-bg:#fdf2cc;--bs-table-border-color:#e4dab8;--bs-table-striped-bg:#f0e6c2;--bs-table-striped-color:#000000;--bs-table-active-bg:#e4dab8;--bs-table-active-color:#000000;--bs-table-hover-bg:#eae0bd;--bs-table-hover-color:#000000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000000;--bs-table-bg:#fed4de;--bs-table-border-color:#e5bfc8;--bs-table-striped-bg:#f1c9d3;--bs-table-striped-color:#000000;--bs-table-active-bg:#e5bfc8;--bs-table-active-color:#000000;--bs-table-hover-bg:#ebc4cd;--bs-table-hover-color:#000000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000000;--bs-table-bg:#F9F9F9;--bs-table-border-color:#e0e0e0;--bs-table-striped-bg:#ededed;--bs-table-striped-color:#000000;--bs-table-active-bg:#e0e0e0;--bs-table-active-color:#000000;--bs-table-hover-bg:#e6e6e6;--bs-table-hover-color:#000000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#ffffff;--bs-table-bg:#1E2129;--bs-table-border-color:#35373e;--bs-table-striped-bg:#292c34;--bs-table-striped-color:#ffffff;--bs-table-active-bg:#35373e;--bs-table-active-color:#ffffff;--bs-table-hover-bg:#2f3239;--bs-table-hover-color:#ffffff;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:.5rem;font-size:1.05rem;font-weight:500;color:var(--bs-gray-800)}.col-form-label{padding-top:calc(.775rem + 1px);padding-bottom:calc(.775rem + 1px);margin-bottom:0;font-size:inherit;font-weight:500;line-height:1.5;color:var(--bs-gray-800)}.col-form-label-lg{padding-top:calc(.825rem + 1px);padding-bottom:calc(.825rem + 1px);font-size:1.15rem}.col-form-label-sm{padding-top:calc(.55rem + 1px);padding-bottom:calc(.55rem + 1px);font-size:.95rem}.form-text{margin-top:.5rem;font-size:.95rem;color:var(--bs-text-muted)}.form-control{display:block;width:100%;padding:.775rem 1rem;font-size:1.1rem;font-weight:500;line-height:1.5;color:var(--bs-gray-700);appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:1px solid var(--bs-gray-300);border-radius:.475rem;box-shadow:false;transition:border-color .15s ease-in-out,box-shadow .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-gray-700);background-color:var(--bs-body-bg);border-color:var(--bs-gray-400);outline:0;box-shadow:false,0 0 0 .25rem rgba(0,105,224,.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::placeholder{color:var(--bs-gray-500);opacity:1}.form-control:disabled{color:var(--bs-gray-500);background-color:var(--bs-gray-200);border-color:var(--bs-gray-300);opacity:1}.form-control::file-selector-button{padding:.775rem 1rem;margin:-.775rem -1rem;margin-inline-end:1rem;color:var(--bs-gray-700);background-color:var(--bs-gray-100);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:shade-color(var(--bs-gray-100),5%)}.form-control-plaintext{display:block;width:100%;padding:.775rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-gray-700);background-color:transparent;border:solid transparent;border-width:1px 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 + 1.1rem + 2px);padding:.55rem .75rem;font-size:.95rem;border-radius:.425rem}.form-control-sm::file-selector-button{padding:.55rem .75rem;margin:-.55rem -.75rem;margin-inline-end:.75rem}.form-control-lg{min-height:calc(1.5em + 1.65rem + 2px);padding:.825rem 1.5rem;font-size:1.15rem;border-radius:.625rem}.form-control-lg::file-selector-button{padding:.825rem 1.5rem;margin:-.825rem -1.5rem;margin-inline-end:1.5rem}textarea.form-control{min-height:calc(1.5em + 1.55rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + 1.1rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1.65rem + 2px)}.form-control-color{width:3rem;height:calc(1.5em + 1.55rem + 2px);padding:.775rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:.475rem}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:.475rem}.form-control-color.form-control-sm{height:calc(1.5em + 1.1rem + 2px)}.form-control-color.form-control-lg{height:calc(1.5em + 1.65rem + 2px)}.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='%2378829D' 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:.775rem 3rem .775rem 1rem;font-size:1.1rem;font-weight:500;line-height:1.5;color:var(--bs-gray-700);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 1rem center;background-size:16px 12px;border:1px solid var(--bs-gray-300);border-radius:.475rem;box-shadow:false;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:var(--bs-gray-400);outline:0;box-shadow:false,0 0 0 .25rem rgba(var(--bs-component-active-bg),.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:1rem;background-image:none}.form-select:disabled{color:var(--bs-gray-500);background-color:var(--bs-gray-200);border-color:var(--bs-gray-300)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-gray-700)}.form-select-sm{padding-top:.55rem;padding-bottom:.55rem;padding-left:.75rem;font-size:.95rem;border-radius:.425rem}.form-select-lg{padding-top:.825rem;padding-bottom:.825rem;padding-left:1.5rem;font-size:1.15rem;border-radius:.625rem}[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='%23808290' 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:2.25rem;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-2.25rem}.form-check-reverse{padding-right:2.25rem;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-2.25rem;margin-left:0}.form-check-input{--bs-form-check-bg:transparent;flex-shrink:0;width:1.75rem;height:1.75rem;margin-top:-.125rem;vertical-align:top;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:1px solid var(--bs-gray-300);print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.45em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:var(--bs-gray-400);outline:0;box-shadow:none}.form-check-input:checked{background-color:#0069e0;border-color:#0069e0}.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 13 11' width='13' height='11' fill='none'%3e%3cpath d='M11.0426 1.02893C11.3258 0.695792 11.8254 0.655283 12.1585 0.938451C12.4917 1.22162 12.5322 1.72124 12.249 2.05437L5.51985 9.97104C5.23224 10.3094 4.72261 10.3451 4.3907 10.05L0.828197 6.88335C0.50141 6.59288 0.471975 6.09249 0.762452 5.7657C1.05293 5.43891 1.55332 5.40948 1.88011 5.69995L4.83765 8.32889L11.0426 1.02893Z' fill='%23ffffff'/%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='%23ffffff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0069e0;border-color:#0069e0;--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='%23ffffff' 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:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-check-label{color:var(--bs-gray-500)}.form-switch{padding-left:3.75rem}.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:3.25rem;margin-left:-3.75rem;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:3.25rem;transition:background-position .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='rgba%280, 0, 0, 0.25%29'/%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='%23ffffff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:3.75rem;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-3.75rem;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:.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;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 .25rem rgba(0,105,224,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(0,105,224,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;appearance:none;background-color:#0069e0;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b3d2f6}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-gray-300);border-color:transparent;border-radius:.475rem;box-shadow:var(--bs-box-shadow-inset)}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;background-color:#0069e0;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b3d2f6}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-gray-300);border-color:transparent;border-radius:.475rem;box-shadow:var(--bs-box-shadow-inset)}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-gray-500)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-gray-500)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.75rem + 2px);min-height:calc(3.75rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem 1rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .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 1rem}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.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.85rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.85rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.85rem;padding-bottom:.625rem}.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),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.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 .5rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:.475rem}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#78829d}.form-floating>.form-control:disabled~label::after,.form-floating>:disabled~label::after{background-color:var(--bs-gray-200)}.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:.775rem 1rem;font-size:1.1rem;font-weight:500;line-height:1.5;color:var(--bs-gray-700);text-align:center;white-space:nowrap;background-color:var(--bs-gray-100);border:1px solid var(--bs-gray-300);border-radius:.475rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.825rem 1.5rem;font-size:1.15rem;border-radius:.625rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.55rem .75rem;font-size:.95rem;border-radius:.425rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:4rem}.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(1px * -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:.5rem;font-size:.95rem;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.75rem 1rem;margin-top:.1rem;font-size:1rem;color:#fff;background-color:var(--bs-success);border-radius:.475rem}.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 + 1.55rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2317C653' 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(.375em + .3875rem) center;background-size:calc(.75em + .775rem) calc(.75em + .775rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:false,0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 1.55rem);background-position:top calc(.375em + .3875rem) right calc(.375em + .3875rem)}.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='%2317C653' 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:5.5rem;background-position:right 1rem center,center right 3rem;background-size:16px 12px,calc(.75em + .775rem) calc(.75em + .775rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:false,0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + 1.55rem))}.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 .25rem rgba(var(--bs-success-rgb),.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:.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:.5rem;font-size:.95rem;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.75rem 1rem;margin-top:.1rem;font-size:1rem;color:#fff;background-color:var(--bs-danger);border-radius:.475rem}.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 + 1.55rem);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='%23F8285A'%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='%23F8285A' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .3875rem) center;background-size:calc(.75em + .775rem) calc(.75em + .775rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:false,0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 1.55rem);background-position:top calc(.375em + .3875rem) right calc(.375em + .3875rem)}.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='%23F8285A'%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='%23F8285A' stroke='none'/%3e%3c/svg%3e");padding-right:5.5rem;background-position:right 1rem center,center right 3rem;background-size:16px 12px,calc(.75em + .775rem) calc(.75em + .775rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:false,0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + 1.55rem))}.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 .25rem rgba(var(--bs-danger-rgb),.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:.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:1.5rem;--bs-btn-padding-y:0.775rem;--bs-btn-font-size:1.1rem;--bs-btn-font-weight:500;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:1px;--bs-btn-border-color:transparent;--bs-btn-border-radius:0.475rem;--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:none;--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .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;vertical-align:middle;cursor:pointer;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);box-shadow:var(--bs-btn-box-shadow);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .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-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-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);box-shadow:var(--bs-btn-active-shadow)}.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-active-shadow),var(--bs-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-active-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);box-shadow:none}.btn-light{--bs-btn-color:#000000;--bs-btn-bg:#F9F9F9;--bs-btn-border-color:#F9F9F9;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#d4d4d4;--bs-btn-hover-border-color:#c7c7c7;--bs-btn-focus-shadow-rgb:212,212,212;--bs-btn-active-color:#000000;--bs-btn-active-bg:#c7c7c7;--bs-btn-active-border-color:#bbbbbb;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#F9F9F9;--bs-btn-disabled-border-color:#F9F9F9}.btn-primary{--bs-btn-color:#ffffff;--bs-btn-bg:#0069E0;--bs-btn-border-color:#0069E0;--bs-btn-hover-color:#ffffff;--bs-btn-hover-bg:#0059be;--bs-btn-hover-border-color:#0054b3;--bs-btn-focus-shadow-rgb:38,128,229;--bs-btn-active-color:#ffffff;--bs-btn-active-bg:#0054b3;--bs-btn-active-border-color:#004fa8;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#ffffff;--bs-btn-disabled-bg:#0069E0;--bs-btn-disabled-border-color:#0069E0}.btn-secondary{--bs-btn-color:#000000;--bs-btn-bg:#F1F1F4;--bs-btn-border-color:#F1F1F4;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#f3f3f6;--bs-btn-hover-border-color:#f2f2f5;--bs-btn-focus-shadow-rgb:205,205,207;--bs-btn-active-color:#000000;--bs-btn-active-bg:#f4f4f6;--bs-btn-active-border-color:#f2f2f5;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#F1F1F4;--bs-btn-disabled-border-color:#F1F1F4}.btn-success{--bs-btn-color:#000000;--bs-btn-bg:#17C653;--bs-btn-border-color:#17C653;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#3acf6d;--bs-btn-hover-border-color:#2ecc64;--bs-btn-focus-shadow-rgb:20,168,71;--bs-btn-active-color:#000000;--bs-btn-active-bg:#45d175;--bs-btn-active-border-color:#2ecc64;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#17C653;--bs-btn-disabled-border-color:#17C653}.btn-info{--bs-btn-color:#ffffff;--bs-btn-bg:#7239EA;--bs-btn-border-color:#7239EA;--bs-btn-hover-color:#ffffff;--bs-btn-hover-bg:#6130c7;--bs-btn-hover-border-color:#5b2ebb;--bs-btn-focus-shadow-rgb:135,87,237;--bs-btn-active-color:#ffffff;--bs-btn-active-bg:#5b2ebb;--bs-btn-active-border-color:#562bb0;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#ffffff;--bs-btn-disabled-bg:#7239EA;--bs-btn-disabled-border-color:#7239EA}.btn-warning{--bs-btn-color:#000000;--bs-btn-bg:#F6C000;--bs-btn-border-color:#F6C000;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#f7c926;--bs-btn-hover-border-color:#f7c61a;--bs-btn-focus-shadow-rgb:209,163,0;--bs-btn-active-color:#000000;--bs-btn-active-bg:#f8cd33;--bs-btn-active-border-color:#f7c61a;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#F6C000;--bs-btn-disabled-border-color:#F6C000}.btn-danger{--bs-btn-color:#000000;--bs-btn-bg:#F8285A;--bs-btn-border-color:#F8285A;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#f94873;--bs-btn-hover-border-color:#f93e6b;--bs-btn-focus-shadow-rgb:211,34,77;--bs-btn-active-color:#000000;--bs-btn-active-bg:#f9537b;--bs-btn-active-border-color:#f93e6b;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#F8285A;--bs-btn-disabled-border-color:#F8285A}.btn-dark{--bs-btn-color:#ffffff;--bs-btn-bg:#1E2129;--bs-btn-border-color:#1E2129;--bs-btn-hover-color:#ffffff;--bs-btn-hover-bg:#404249;--bs-btn-hover-border-color:#35373e;--bs-btn-focus-shadow-rgb:64,66,73;--bs-btn-active-color:#ffffff;--bs-btn-active-bg:#4b4d54;--bs-btn-active-border-color:#35373e;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#ffffff;--bs-btn-disabled-bg:#1E2129;--bs-btn-disabled-border-color:#1E2129}.btn-outline-light{--bs-btn-color:#F9F9F9;--bs-btn-border-color:#F9F9F9;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#F9F9F9;--bs-btn-hover-border-color:#F9F9F9;--bs-btn-focus-shadow-rgb:249,249,249;--bs-btn-active-color:#000000;--bs-btn-active-bg:#F9F9F9;--bs-btn-active-border-color:#F9F9F9;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#F9F9F9;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#F9F9F9;--bs-gradient:none}.btn-outline-primary{--bs-btn-color:#0069E0;--bs-btn-border-color:#0069E0;--bs-btn-hover-color:#ffffff;--bs-btn-hover-bg:#0069E0;--bs-btn-hover-border-color:#0069E0;--bs-btn-focus-shadow-rgb:0,105,224;--bs-btn-active-color:#ffffff;--bs-btn-active-bg:#0069E0;--bs-btn-active-border-color:#0069E0;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#0069E0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0069E0;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#F1F1F4;--bs-btn-border-color:#F1F1F4;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#F1F1F4;--bs-btn-hover-border-color:#F1F1F4;--bs-btn-focus-shadow-rgb:241,241,244;--bs-btn-active-color:#000000;--bs-btn-active-bg:#F1F1F4;--bs-btn-active-border-color:#F1F1F4;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#F1F1F4;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#F1F1F4;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#17C653;--bs-btn-border-color:#17C653;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#17C653;--bs-btn-hover-border-color:#17C653;--bs-btn-focus-shadow-rgb:23,198,83;--bs-btn-active-color:#000000;--bs-btn-active-bg:#17C653;--bs-btn-active-border-color:#17C653;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#17C653;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#17C653;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#7239EA;--bs-btn-border-color:#7239EA;--bs-btn-hover-color:#ffffff;--bs-btn-hover-bg:#7239EA;--bs-btn-hover-border-color:#7239EA;--bs-btn-focus-shadow-rgb:114,57,234;--bs-btn-active-color:#ffffff;--bs-btn-active-bg:#7239EA;--bs-btn-active-border-color:#7239EA;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#7239EA;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#7239EA;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#F6C000;--bs-btn-border-color:#F6C000;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#F6C000;--bs-btn-hover-border-color:#F6C000;--bs-btn-focus-shadow-rgb:246,192,0;--bs-btn-active-color:#000000;--bs-btn-active-bg:#F6C000;--bs-btn-active-border-color:#F6C000;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#F6C000;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#F6C000;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#F8285A;--bs-btn-border-color:#F8285A;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#F8285A;--bs-btn-hover-border-color:#F8285A;--bs-btn-focus-shadow-rgb:248,40,90;--bs-btn-active-color:#000000;--bs-btn-active-bg:#F8285A;--bs-btn-active-border-color:#F8285A;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#F8285A;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#F8285A;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#1E2129;--bs-btn-border-color:#1E2129;--bs-btn-hover-color:#ffffff;--bs-btn-hover-bg:#1E2129;--bs-btn-hover-border-color:#1E2129;--bs-btn-focus-shadow-rgb:30,33,41;--bs-btn-active-color:#ffffff;--bs-btn-active-bg:#1E2129;--bs-btn-active-border-color:#1E2129;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#1E2129;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#1E2129;--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:var(--bs-gray-600);--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:38,128,229;text-decoration:none}.btn-link:focus-visible,.btn-link:hover{text-decoration:none}.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.825rem;--bs-btn-padding-x:1.75rem;--bs-btn-font-size:1.15rem;--bs-btn-border-radius:0.625rem}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.55rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:0.95rem;--bs-btn-border-radius:0.425rem}.fade{transition:opacity .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 .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .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:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.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:0.475rem;--bs-dropdown-border-width:0rem;--bs-dropdown-inner-border-radius:calc(0.475rem - 0rem);--bs-dropdown-divider-bg:var(--bs-gray-100);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:0px 0px 50px 0px rgba(82, 63, 105, 0.15);--bs-dropdown-link-color:var(--bs-gray-900);--bs-dropdown-link-hover-color:var(--bs-gray-900);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:var(--bs-component-hover-color);--bs-dropdown-link-active-bg:var(--bs-component-hover-bg);--bs-dropdown-link-disabled-color:var(--bs-gray-500);--bs-dropdown-item-padding-x:0.85rem;--bs-dropdown-item-padding-y:0.65rem;--bs-dropdown-header-color:var(--bs-gray-600);--bs-dropdown-header-padding-x:0.85rem;--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);box-shadow:var(--bs-dropdown-box-shadow)}.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:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.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:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.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:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.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;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:.95rem;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:#DBDFE9;--bs-dropdown-bg:#252F4A;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-link-color:#DBDFE9;--bs-dropdown-link-hover-color:#ffffff;--bs-dropdown-divider-bg:var(--bs-gray-100);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:var(--bs-component-hover-color);--bs-dropdown-link-active-bg:var(--bs-component-hover-bg);--bs-dropdown-link-disabled-color:#6D6D97;--bs-dropdown-header-color:#6D6D97}.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:.475rem}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(1px * -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:1.125rem;padding-left:1.125rem}.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:.75rem;padding-left:.75rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:1.3125rem;padding-left:1.3125rem}.btn-group.show .dropdown-toggle{box-shadow:none}.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.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(1px * -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-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);background:0 0;border:0;transition:color .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 .25rem rgba(0,105,224,.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:#ffffff;--bs-nav-pills-link-active-bg:#0069E0}.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:600;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.44375rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.075rem;--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.075rem;--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%287, 20, 55, 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:0.475rem;--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);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-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:.5rem;padding-bottom:.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;box-shadow:none;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;box-shadow:none;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;box-shadow:none;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;box-shadow:none;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;box-shadow:none;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;box-shadow:none;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:#ffffff;--bs-navbar-brand-color:#ffffff;--bs-navbar-brand-hover-color:#ffffff;--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:var(--bs-gray-900);--bs-card-border-width:1px;--bs-card-border-color:#F1F1F4;--bs-card-border-radius:0.625rem;--bs-card-box-shadow:0px 3px 4px 0px rgba(0, 0, 0, 0.03);--bs-card-inner-border-radius:calc(0.625rem - 1px);--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:transparent;--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);box-shadow:var(--bs-card-box-shadow)}.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(-.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(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.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(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.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:0.475rem;--bs-accordion-inner-border-radius:calc(0.475rem - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.5rem;--bs-accordion-btn-padding-y:1.5rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-body-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23071437'%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.15rem;--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='%230069E0'%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-box-shadow:none;--bs-accordion-body-padding-x:1.5rem;--bs-accordion-body-padding-y:1.5rem;--bs-accordion-active-color:var(--bs-primary);--bs-accordion-active-bg:var(--bs-gray-100)}.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;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-header .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-header .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-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-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}.accordion-flush>.accordion-item>.accordion-collapse{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='%23F5F5F5'%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='%231F87FF'%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-divider-color:var(--bs-gray-600);--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:var(--bs-primary);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:1.075rem;--bs-pagination-color:var(--bs-gray-700);--bs-pagination-bg:transparent;--bs-pagination-border-width:0;--bs-pagination-border-color:transparent;--bs-pagination-border-radius:0.475rem;--bs-pagination-hover-color:var(--bs-component-hover-color);--bs-pagination-hover-bg:var(--bs-component-hover-bg);--bs-pagination-hover-border-color:transparent;--bs-pagination-focus-color:var(--bs-component-hover-color);--bs-pagination-focus-bg:var(--bs-component-hover-bg);--bs-pagination-focus-box-shadow:none;--bs-pagination-active-color:var(--bs-component-active-color);--bs-pagination-active-bg:var(--bs-component-active-bg);--bs-pagination-active-border-color:transparent;--bs-pagination-disabled-color:var(--bs-gray-400);--bs-pagination-disabled-bg:transparent;--bs-pagination-disabled-border-color:transparent;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);background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .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(0 * -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.075rem;--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.95rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:0.5rem;--bs-badge-padding-y:0.325rem;--bs-badge-font-size:0.85rem;--bs-badge-font-weight:600;--bs-badge-color:var(--bs-body-color);--bs-badge-border-radius:0.425rem;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:600;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-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-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-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-gray-100);--bs-progress-border-radius:6px;--bs-progress-box-shadow:none;--bs-progress-bar-color:#ffffff;--bs-progress-bar-bg:#0069E0;--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);box-shadow:var(--bs-progress-box-shadow)}.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,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.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-gray-900);--bs-list-group-bg:#ffffff;--bs-list-group-border-color:rgba(0, 0, 0, 0.125);--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-gray-700);--bs-list-group-action-hover-color:var(--bs-gray-700);--bs-list-group-action-hover-bg:var(--bs-gray-100);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-gray-200);--bs-list-group-disabled-color:var(--bs-gray-600);--bs-list-group-disabled-bg:#ffffff;--bs-list-group-active-color:var(--bs-component-active-color);--bs-list-group-active-bg:var(--bs-component-active-bg);--bs-list-group-active-border-color:var(--bs-component-active-bg);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);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-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-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-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:#000000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000000'%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:none;--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:.75rem;height:.75rem;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/.75rem auto no-repeat;border:0;border-radius:.475rem;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;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:var(--bs-gray-700);--bs-toast-bg:var(--bs-body-bg);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:transparent;--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-gray-700);--bs-toast-header-bg:var(--bs-body-bg);--bs-toast-header-border-color:var(--bs-border-color);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: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(-.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:1.75rem;--bs-modal-margin:0.5rem;--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:0;--bs-modal-border-radius:0.475rem;--bs-modal-box-shadow:0 0.25rem 0.5rem rgba(0, 0, 0, 0.1);--bs-modal-inner-border-radius:0.475rem;--bs-modal-header-padding-x:1.75rem;--bs-modal-header-padding-y:1.75rem;--bs-modal-header-padding:1.75rem 1.75rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:1px;--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:1px;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 .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);box-shadow:var(--bs-modal-box-shadow);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000000;--bs-backdrop-opacity:0.4;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;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) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.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) * .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) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.1)}.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:1rem;--bs-tooltip-padding-y:0.75rem;--bs-tooltip-margin:0;--bs-tooltip-font-size:1rem;--bs-tooltip-color:var(--bs-gray-800);--bs-tooltip-bg:var(--bs-body-bg);--bs-tooltip-border-radius:0.475rem;--bs-tooltip-opacity:1;--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) * .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) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .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) * .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) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .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:1rem;--bs-popover-bg:#ffffff;--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:#ffffff;--bs-popover-border-radius:0.475rem;--bs-popover-inner-border-radius:0.475rem;--bs-popover-box-shadow:0px 0px 50px 0px rgba(82, 63, 105, 0.15);--bs-popover-header-padding-x:1.25rem;--bs-popover-header-padding-y:1rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:var(--bs-gray-800);--bs-popover-header-bg:#ffffff;--bs-popover-body-padding-x:1.25rem;--bs-popover-body-padding-y:1.25rem;--bs-popover-body-color:var(--bs-gray-800);--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);box-shadow:var(--bs-popover-box-shadow)}.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) * .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) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .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) * .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(-.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) * .5) 0 calc(var(--bs-popover-arrow-width) * .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%;backface-visibility:hidden;transition:transform .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 .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:.5;transition:opacity .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:.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='%23ffffff'%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='%23ffffff'%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:.5;transition:opacity .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.185rem;--bs-spinner-animation-speed:0.65s;--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.145em}@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.65s;--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.3s}}.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:1.75rem;--bs-offcanvas-padding-y:1.75rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:0;--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:0 0.25rem 0.5rem rgba(0, 0, 0, 0.1);--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;box-shadow:var(--bs-offcanvas-box-shadow);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;box-shadow:var(--bs-offcanvas-box-shadow);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;box-shadow:var(--bs-offcanvas-box-shadow);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;box-shadow:var(--bs-offcanvas-box-shadow);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;box-shadow:var(--bs-offcanvas-box-shadow);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;box-shadow:var(--bs-offcanvas-box-shadow);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:.4}.offcanvas-header{display:flex;align-items:center;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin:calc(-.5 * var(--bs-offcanvas-padding-y)) calc(-.5 * var(--bs-offcanvas-padding-x)) calc(-.5 * var(--bs-offcanvas-padding-y)) auto}.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:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,.8) 75%,#000 95%);mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0}}.clearfix::after{display:block;clear:both;content:""}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#000!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#000!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#fff!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:#000!important;background-color:RGBA(var(--bs-danger-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-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-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(250,250,250,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(250,250,250,var(--bs-link-underline-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-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(0,84,179,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(0,84,179,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-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(244,244,246,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(244,244,246,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-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(69,209,117,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(69,209,117,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-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(91,46,187,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(91,46,187,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-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(248,205,51,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(248,205,51,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-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(249,83,123,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(249,83,123,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-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(24,26,33,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(24,26,33,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-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,.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,.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:.375rem;align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,.5));text-underline-offset:.25em;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.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(.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:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{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:.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{object-fit:contain!important}.object-fit-cover{object-fit:cover!important}.object-fit-fill{object-fit:fill!important}.object-fit-scale{object-fit:scale-down!important}.object-fit-none{object-fit:none!important}.opacity-0{opacity:0!important}.opacity-5{opacity:.05!important}.opacity-10{opacity:.1!important}.opacity-15{opacity:.15!important}.opacity-20{opacity:.2!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.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-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.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-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:sticky!important}.top-0{top:0!important}.top-25{top:25%!important}.top-50{top:50%!important}.top-75{top:75%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-25{bottom:25%!important}.bottom-50{bottom:50%!important}.bottom-75{bottom:75%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-25{left:25%!important}.start-50{left:50%!important}.start-75{left:75%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-25{right:25%!important}.end-50{right:50%!important}.end-75{right:75%!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-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!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-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-0{border-width:0!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-unset{width:unset!important}.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}.w-1px{width:1px!important}.w-2px{width:2px!important}.w-3px{width:3px!important}.w-4px{width:4px!important}.w-5px{width:5px!important}.w-6px{width:6px!important}.w-7px{width:7px!important}.w-8px{width:8px!important}.w-9px{width:9px!important}.w-10px{width:10px!important}.w-15px{width:15px!important}.w-20px{width:20px!important}.w-25px{width:25px!important}.w-30px{width:30px!important}.w-35px{width:35px!important}.w-40px{width:40px!important}.w-45px{width:45px!important}.w-50px{width:50px!important}.w-55px{width:55px!important}.w-60px{width:60px!important}.w-65px{width:65px!important}.w-70px{width:70px!important}.w-75px{width:75px!important}.w-80px{width:80px!important}.w-85px{width:85px!important}.w-90px{width:90px!important}.w-95px{width:95px!important}.w-100px{width:100px!important}.w-125px{width:125px!important}.w-150px{width:150px!important}.w-175px{width:175px!important}.w-200px{width:200px!important}.w-225px{width:225px!important}.w-250px{width:250px!important}.w-275px{width:275px!important}.w-300px{width:300px!important}.w-325px{width:325px!important}.w-350px{width:350px!important}.w-375px{width:375px!important}.w-400px{width:400px!important}.w-425px{width:425px!important}.w-450px{width:450px!important}.w-475px{width:475px!important}.w-500px{width:500px!important}.w-550px{width:550px!important}.w-600px{width:600px!important}.w-650px{width:650px!important}.w-700px{width:700px!important}.w-750px{width:750px!important}.w-800px{width:800px!important}.w-850px{width:850px!important}.w-900px{width:900px!important}.w-950px{width:950px!important}.w-1000px{width:1000px!important}.mw-unset{max-width:unset!important}.mw-25{max-width:25%!important}.mw-50{max-width:50%!important}.mw-75{max-width:75%!important}.mw-100{max-width:100%!important}.mw-auto{max-width:auto!important}.mw-1px{max-width:1px!important}.mw-2px{max-width:2px!important}.mw-3px{max-width:3px!important}.mw-4px{max-width:4px!important}.mw-5px{max-width:5px!important}.mw-6px{max-width:6px!important}.mw-7px{max-width:7px!important}.mw-8px{max-width:8px!important}.mw-9px{max-width:9px!important}.mw-10px{max-width:10px!important}.mw-15px{max-width:15px!important}.mw-20px{max-width:20px!important}.mw-25px{max-width:25px!important}.mw-30px{max-width:30px!important}.mw-35px{max-width:35px!important}.mw-40px{max-width:40px!important}.mw-45px{max-width:45px!important}.mw-50px{max-width:50px!important}.mw-55px{max-width:55px!important}.mw-60px{max-width:60px!important}.mw-65px{max-width:65px!important}.mw-70px{max-width:70px!important}.mw-75px{max-width:75px!important}.mw-80px{max-width:80px!important}.mw-85px{max-width:85px!important}.mw-90px{max-width:90px!important}.mw-95px{max-width:95px!important}.mw-100px{max-width:100px!important}.mw-125px{max-width:125px!important}.mw-150px{max-width:150px!important}.mw-175px{max-width:175px!important}.mw-200px{max-width:200px!important}.mw-225px{max-width:225px!important}.mw-250px{max-width:250px!important}.mw-275px{max-width:275px!important}.mw-300px{max-width:300px!important}.mw-325px{max-width:325px!important}.mw-350px{max-width:350px!important}.mw-375px{max-width:375px!important}.mw-400px{max-width:400px!important}.mw-425px{max-width:425px!important}.mw-450px{max-width:450px!important}.mw-475px{max-width:475px!important}.mw-500px{max-width:500px!important}.mw-550px{max-width:550px!important}.mw-600px{max-width:600px!important}.mw-650px{max-width:650px!important}.mw-700px{max-width:700px!important}.mw-750px{max-width:750px!important}.mw-800px{max-width:800px!important}.mw-850px{max-width:850px!important}.mw-900px{max-width:900px!important}.mw-950px{max-width:950px!important}.mw-1000px{max-width:1000px!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-unset{height:unset!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}.h-1px{height:1px!important}.h-2px{height:2px!important}.h-3px{height:3px!important}.h-4px{height:4px!important}.h-5px{height:5px!important}.h-6px{height:6px!important}.h-7px{height:7px!important}.h-8px{height:8px!important}.h-9px{height:9px!important}.h-10px{height:10px!important}.h-15px{height:15px!important}.h-20px{height:20px!important}.h-25px{height:25px!important}.h-30px{height:30px!important}.h-35px{height:35px!important}.h-40px{height:40px!important}.h-45px{height:45px!important}.h-50px{height:50px!important}.h-55px{height:55px!important}.h-60px{height:60px!important}.h-65px{height:65px!important}.h-70px{height:70px!important}.h-75px{height:75px!important}.h-80px{height:80px!important}.h-85px{height:85px!important}.h-90px{height:90px!important}.h-95px{height:95px!important}.h-100px{height:100px!important}.h-125px{height:125px!important}.h-150px{height:150px!important}.h-175px{height:175px!important}.h-200px{height:200px!important}.h-225px{height:225px!important}.h-250px{height:250px!important}.h-275px{height:275px!important}.h-300px{height:300px!important}.h-325px{height:325px!important}.h-350px{height:350px!important}.h-375px{height:375px!important}.h-400px{height:400px!important}.h-425px{height:425px!important}.h-450px{height:450px!important}.h-475px{height:475px!important}.h-500px{height:500px!important}.h-550px{height:550px!important}.h-600px{height:600px!important}.h-650px{height:650px!important}.h-700px{height:700px!important}.h-750px{height:750px!important}.h-800px{height:800px!important}.h-850px{height:850px!important}.h-900px{height:900px!important}.h-950px{height:950px!important}.h-1000px{height:1000px!important}.mh-unset{max-height:unset!important}.mh-25{max-height:25%!important}.mh-50{max-height:50%!important}.mh-75{max-height:75%!important}.mh-100{max-height:100%!important}.mh-auto{max-height:auto!important}.mh-1px{max-height:1px!important}.mh-2px{max-height:2px!important}.mh-3px{max-height:3px!important}.mh-4px{max-height:4px!important}.mh-5px{max-height:5px!important}.mh-6px{max-height:6px!important}.mh-7px{max-height:7px!important}.mh-8px{max-height:8px!important}.mh-9px{max-height:9px!important}.mh-10px{max-height:10px!important}.mh-15px{max-height:15px!important}.mh-20px{max-height:20px!important}.mh-25px{max-height:25px!important}.mh-30px{max-height:30px!important}.mh-35px{max-height:35px!important}.mh-40px{max-height:40px!important}.mh-45px{max-height:45px!important}.mh-50px{max-height:50px!important}.mh-55px{max-height:55px!important}.mh-60px{max-height:60px!important}.mh-65px{max-height:65px!important}.mh-70px{max-height:70px!important}.mh-75px{max-height:75px!important}.mh-80px{max-height:80px!important}.mh-85px{max-height:85px!important}.mh-90px{max-height:90px!important}.mh-95px{max-height:95px!important}.mh-100px{max-height:100px!important}.mh-125px{max-height:125px!important}.mh-150px{max-height:150px!important}.mh-175px{max-height:175px!important}.mh-200px{max-height:200px!important}.mh-225px{max-height:225px!important}.mh-250px{max-height:250px!important}.mh-275px{max-height:275px!important}.mh-300px{max-height:300px!important}.mh-325px{max-height:325px!important}.mh-350px{max-height:350px!important}.mh-375px{max-height:375px!important}.mh-400px{max-height:400px!important}.mh-425px{max-height:425px!important}.mh-450px{max-height:450px!important}.mh-475px{max-height:475px!important}.mh-500px{max-height:500px!important}.mh-550px{max-height:550px!important}.mh-600px{max-height:600px!important}.mh-650px{max-height:650px!important}.mh-700px{max-height:700px!important}.mh-750px{max-height:750px!important}.mh-800px{max-height:800px!important}.mh-850px{max-height:850px!important}.mh-900px{max-height:900px!important}.mh-950px{max-height:950px!important}.mh-1000px{max-height:1000px!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:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:.75rem!important}.m-4{margin:1rem!important}.m-5{margin:1.25rem!important}.m-6{margin:1.5rem!important}.m-7{margin:1.75rem!important}.m-8{margin:2rem!important}.m-9{margin:2.25rem!important}.m-10{margin:2.5rem!important}.m-11{margin:2.75rem!important}.m-12{margin:3rem!important}.m-13{margin:3.25rem!important}.m-14{margin:3.5rem!important}.m-15{margin:3.75rem!important}.m-16{margin:4rem!important}.m-17{margin:4.25rem!important}.m-18{margin:4.5rem!important}.m-19{margin:4.75rem!important}.m-20{margin:5rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:.75rem!important;margin-left:.75rem!important}.mx-4{margin-right:1rem!important;margin-left:1rem!important}.mx-5{margin-right:1.25rem!important;margin-left:1.25rem!important}.mx-6{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-7{margin-right:1.75rem!important;margin-left:1.75rem!important}.mx-8{margin-right:2rem!important;margin-left:2rem!important}.mx-9{margin-right:2.25rem!important;margin-left:2.25rem!important}.mx-10{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-11{margin-right:2.75rem!important;margin-left:2.75rem!important}.mx-12{margin-right:3rem!important;margin-left:3rem!important}.mx-13{margin-right:3.25rem!important;margin-left:3.25rem!important}.mx-14{margin-right:3.5rem!important;margin-left:3.5rem!important}.mx-15{margin-right:3.75rem!important;margin-left:3.75rem!important}.mx-16{margin-right:4rem!important;margin-left:4rem!important}.mx-17{margin-right:4.25rem!important;margin-left:4.25rem!important}.mx-18{margin-right:4.5rem!important;margin-left:4.5rem!important}.mx-19{margin-right:4.75rem!important;margin-left:4.75rem!important}.mx-20{margin-right:5rem!important;margin-left:5rem!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:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.my-5{margin-top:1.25rem!important;margin-bottom:1.25rem!important}.my-6{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-7{margin-top:1.75rem!important;margin-bottom:1.75rem!important}.my-8{margin-top:2rem!important;margin-bottom:2rem!important}.my-9{margin-top:2.25rem!important;margin-bottom:2.25rem!important}.my-10{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-11{margin-top:2.75rem!important;margin-bottom:2.75rem!important}.my-12{margin-top:3rem!important;margin-bottom:3rem!important}.my-13{margin-top:3.25rem!important;margin-bottom:3.25rem!important}.my-14{margin-top:3.5rem!important;margin-bottom:3.5rem!important}.my-15{margin-top:3.75rem!important;margin-bottom:3.75rem!important}.my-16{margin-top:4rem!important;margin-bottom:4rem!important}.my-17{margin-top:4.25rem!important;margin-bottom:4.25rem!important}.my-18{margin-top:4.5rem!important;margin-bottom:4.5rem!important}.my-19{margin-top:4.75rem!important;margin-bottom:4.75rem!important}.my-20{margin-top:5rem!important;margin-bottom:5rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:.75rem!important}.mt-4{margin-top:1rem!important}.mt-5{margin-top:1.25rem!important}.mt-6{margin-top:1.5rem!important}.mt-7{margin-top:1.75rem!important}.mt-8{margin-top:2rem!important}.mt-9{margin-top:2.25rem!important}.mt-10{margin-top:2.5rem!important}.mt-11{margin-top:2.75rem!important}.mt-12{margin-top:3rem!important}.mt-13{margin-top:3.25rem!important}.mt-14{margin-top:3.5rem!important}.mt-15{margin-top:3.75rem!important}.mt-16{margin-top:4rem!important}.mt-17{margin-top:4.25rem!important}.mt-18{margin-top:4.5rem!important}.mt-19{margin-top:4.75rem!important}.mt-20{margin-top:5rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:.75rem!important}.me-4{margin-right:1rem!important}.me-5{margin-right:1.25rem!important}.me-6{margin-right:1.5rem!important}.me-7{margin-right:1.75rem!important}.me-8{margin-right:2rem!important}.me-9{margin-right:2.25rem!important}.me-10{margin-right:2.5rem!important}.me-11{margin-right:2.75rem!important}.me-12{margin-right:3rem!important}.me-13{margin-right:3.25rem!important}.me-14{margin-right:3.5rem!important}.me-15{margin-right:3.75rem!important}.me-16{margin-right:4rem!important}.me-17{margin-right:4.25rem!important}.me-18{margin-right:4.5rem!important}.me-19{margin-right:4.75rem!important}.me-20{margin-right:5rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:.75rem!important}.mb-4{margin-bottom:1rem!important}.mb-5{margin-bottom:1.25rem!important}.mb-6{margin-bottom:1.5rem!important}.mb-7{margin-bottom:1.75rem!important}.mb-8{margin-bottom:2rem!important}.mb-9{margin-bottom:2.25rem!important}.mb-10{margin-bottom:2.5rem!important}.mb-11{margin-bottom:2.75rem!important}.mb-12{margin-bottom:3rem!important}.mb-13{margin-bottom:3.25rem!important}.mb-14{margin-bottom:3.5rem!important}.mb-15{margin-bottom:3.75rem!important}.mb-16{margin-bottom:4rem!important}.mb-17{margin-bottom:4.25rem!important}.mb-18{margin-bottom:4.5rem!important}.mb-19{margin-bottom:4.75rem!important}.mb-20{margin-bottom:5rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:.75rem!important}.ms-4{margin-left:1rem!important}.ms-5{margin-left:1.25rem!important}.ms-6{margin-left:1.5rem!important}.ms-7{margin-left:1.75rem!important}.ms-8{margin-left:2rem!important}.ms-9{margin-left:2.25rem!important}.ms-10{margin-left:2.5rem!important}.ms-11{margin-left:2.75rem!important}.ms-12{margin-left:3rem!important}.ms-13{margin-left:3.25rem!important}.ms-14{margin-left:3.5rem!important}.ms-15{margin-left:3.75rem!important}.ms-16{margin-left:4rem!important}.ms-17{margin-left:4.25rem!important}.ms-18{margin-left:4.5rem!important}.ms-19{margin-left:4.75rem!important}.ms-20{margin-left:5rem!important}.ms-auto{margin-left:auto!important}.m-n1{margin:-.25rem!important}.m-n2{margin:-.5rem!important}.m-n3{margin:-.75rem!important}.m-n4{margin:-1rem!important}.m-n5{margin:-1.25rem!important}.m-n6{margin:-1.5rem!important}.m-n7{margin:-1.75rem!important}.m-n8{margin:-2rem!important}.m-n9{margin:-2.25rem!important}.m-n10{margin:-2.5rem!important}.m-n11{margin:-2.75rem!important}.m-n12{margin:-3rem!important}.m-n13{margin:-3.25rem!important}.m-n14{margin:-3.5rem!important}.m-n15{margin:-3.75rem!important}.m-n16{margin:-4rem!important}.m-n17{margin:-4.25rem!important}.m-n18{margin:-4.5rem!important}.m-n19{margin:-4.75rem!important}.m-n20{margin:-5rem!important}.mx-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-n3{margin-right:-.75rem!important;margin-left:-.75rem!important}.mx-n4{margin-right:-1rem!important;margin-left:-1rem!important}.mx-n5{margin-right:-1.25rem!important;margin-left:-1.25rem!important}.mx-n6{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-n7{margin-right:-1.75rem!important;margin-left:-1.75rem!important}.mx-n8{margin-right:-2rem!important;margin-left:-2rem!important}.mx-n9{margin-right:-2.25rem!important;margin-left:-2.25rem!important}.mx-n10{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.mx-n11{margin-right:-2.75rem!important;margin-left:-2.75rem!important}.mx-n12{margin-right:-3rem!important;margin-left:-3rem!important}.mx-n13{margin-right:-3.25rem!important;margin-left:-3.25rem!important}.mx-n14{margin-right:-3.5rem!important;margin-left:-3.5rem!important}.mx-n15{margin-right:-3.75rem!important;margin-left:-3.75rem!important}.mx-n16{margin-right:-4rem!important;margin-left:-4rem!important}.mx-n17{margin-right:-4.25rem!important;margin-left:-4.25rem!important}.mx-n18{margin-right:-4.5rem!important;margin-left:-4.5rem!important}.mx-n19{margin-right:-4.75rem!important;margin-left:-4.75rem!important}.mx-n20{margin-right:-5rem!important;margin-left:-5rem!important}.my-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-n3{margin-top:-.75rem!important;margin-bottom:-.75rem!important}.my-n4{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-n5{margin-top:-1.25rem!important;margin-bottom:-1.25rem!important}.my-n6{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-n7{margin-top:-1.75rem!important;margin-bottom:-1.75rem!important}.my-n8{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-n9{margin-top:-2.25rem!important;margin-bottom:-2.25rem!important}.my-n10{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.my-n11{margin-top:-2.75rem!important;margin-bottom:-2.75rem!important}.my-n12{margin-top:-3rem!important;margin-bottom:-3rem!important}.my-n13{margin-top:-3.25rem!important;margin-bottom:-3.25rem!important}.my-n14{margin-top:-3.5rem!important;margin-bottom:-3.5rem!important}.my-n15{margin-top:-3.75rem!important;margin-bottom:-3.75rem!important}.my-n16{margin-top:-4rem!important;margin-bottom:-4rem!important}.my-n17{margin-top:-4.25rem!important;margin-bottom:-4.25rem!important}.my-n18{margin-top:-4.5rem!important;margin-bottom:-4.5rem!important}.my-n19{margin-top:-4.75rem!important;margin-bottom:-4.75rem!important}.my-n20{margin-top:-5rem!important;margin-bottom:-5rem!important}.mt-n1{margin-top:-.25rem!important}.mt-n2{margin-top:-.5rem!important}.mt-n3{margin-top:-.75rem!important}.mt-n4{margin-top:-1rem!important}.mt-n5{margin-top:-1.25rem!important}.mt-n6{margin-top:-1.5rem!important}.mt-n7{margin-top:-1.75rem!important}.mt-n8{margin-top:-2rem!important}.mt-n9{margin-top:-2.25rem!important}.mt-n10{margin-top:-2.5rem!important}.mt-n11{margin-top:-2.75rem!important}.mt-n12{margin-top:-3rem!important}.mt-n13{margin-top:-3.25rem!important}.mt-n14{margin-top:-3.5rem!important}.mt-n15{margin-top:-3.75rem!important}.mt-n16{margin-top:-4rem!important}.mt-n17{margin-top:-4.25rem!important}.mt-n18{margin-top:-4.5rem!important}.mt-n19{margin-top:-4.75rem!important}.mt-n20{margin-top:-5rem!important}.me-n1{margin-right:-.25rem!important}.me-n2{margin-right:-.5rem!important}.me-n3{margin-right:-.75rem!important}.me-n4{margin-right:-1rem!important}.me-n5{margin-right:-1.25rem!important}.me-n6{margin-right:-1.5rem!important}.me-n7{margin-right:-1.75rem!important}.me-n8{margin-right:-2rem!important}.me-n9{margin-right:-2.25rem!important}.me-n10{margin-right:-2.5rem!important}.me-n11{margin-right:-2.75rem!important}.me-n12{margin-right:-3rem!important}.me-n13{margin-right:-3.25rem!important}.me-n14{margin-right:-3.5rem!important}.me-n15{margin-right:-3.75rem!important}.me-n16{margin-right:-4rem!important}.me-n17{margin-right:-4.25rem!important}.me-n18{margin-right:-4.5rem!important}.me-n19{margin-right:-4.75rem!important}.me-n20{margin-right:-5rem!important}.mb-n1{margin-bottom:-.25rem!important}.mb-n2{margin-bottom:-.5rem!important}.mb-n3{margin-bottom:-.75rem!important}.mb-n4{margin-bottom:-1rem!important}.mb-n5{margin-bottom:-1.25rem!important}.mb-n6{margin-bottom:-1.5rem!important}.mb-n7{margin-bottom:-1.75rem!important}.mb-n8{margin-bottom:-2rem!important}.mb-n9{margin-bottom:-2.25rem!important}.mb-n10{margin-bottom:-2.5rem!important}.mb-n11{margin-bottom:-2.75rem!important}.mb-n12{margin-bottom:-3rem!important}.mb-n13{margin-bottom:-3.25rem!important}.mb-n14{margin-bottom:-3.5rem!important}.mb-n15{margin-bottom:-3.75rem!important}.mb-n16{margin-bottom:-4rem!important}.mb-n17{margin-bottom:-4.25rem!important}.mb-n18{margin-bottom:-4.5rem!important}.mb-n19{margin-bottom:-4.75rem!important}.mb-n20{margin-bottom:-5rem!important}.ms-n1{margin-left:-.25rem!important}.ms-n2{margin-left:-.5rem!important}.ms-n3{margin-left:-.75rem!important}.ms-n4{margin-left:-1rem!important}.ms-n5{margin-left:-1.25rem!important}.ms-n6{margin-left:-1.5rem!important}.ms-n7{margin-left:-1.75rem!important}.ms-n8{margin-left:-2rem!important}.ms-n9{margin-left:-2.25rem!important}.ms-n10{margin-left:-2.5rem!important}.ms-n11{margin-left:-2.75rem!important}.ms-n12{margin-left:-3rem!important}.ms-n13{margin-left:-3.25rem!important}.ms-n14{margin-left:-3.5rem!important}.ms-n15{margin-left:-3.75rem!important}.ms-n16{margin-left:-4rem!important}.ms-n17{margin-left:-4.25rem!important}.ms-n18{margin-left:-4.5rem!important}.ms-n19{margin-left:-4.75rem!important}.ms-n20{margin-left:-5rem!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:.75rem!important}.p-4{padding:1rem!important}.p-5{padding:1.25rem!important}.p-6{padding:1.5rem!important}.p-7{padding:1.75rem!important}.p-8{padding:2rem!important}.p-9{padding:2.25rem!important}.p-10{padding:2.5rem!important}.p-11{padding:2.75rem!important}.p-12{padding:3rem!important}.p-13{padding:3.25rem!important}.p-14{padding:3.5rem!important}.p-15{padding:3.75rem!important}.p-16{padding:4rem!important}.p-17{padding:4.25rem!important}.p-18{padding:4.5rem!important}.p-19{padding:4.75rem!important}.p-20{padding:5rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:.75rem!important;padding-left:.75rem!important}.px-4{padding-right:1rem!important;padding-left:1rem!important}.px-5{padding-right:1.25rem!important;padding-left:1.25rem!important}.px-6{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-7{padding-right:1.75rem!important;padding-left:1.75rem!important}.px-8{padding-right:2rem!important;padding-left:2rem!important}.px-9{padding-right:2.25rem!important;padding-left:2.25rem!important}.px-10{padding-right:2.5rem!important;padding-left:2.5rem!important}.px-11{padding-right:2.75rem!important;padding-left:2.75rem!important}.px-12{padding-right:3rem!important;padding-left:3rem!important}.px-13{padding-right:3.25rem!important;padding-left:3.25rem!important}.px-14{padding-right:3.5rem!important;padding-left:3.5rem!important}.px-15{padding-right:3.75rem!important;padding-left:3.75rem!important}.px-16{padding-right:4rem!important;padding-left:4rem!important}.px-17{padding-right:4.25rem!important;padding-left:4.25rem!important}.px-18{padding-right:4.5rem!important;padding-left:4.5rem!important}.px-19{padding-right:4.75rem!important;padding-left:4.75rem!important}.px-20{padding-right:5rem!important;padding-left:5rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.py-5{padding-top:1.25rem!important;padding-bottom:1.25rem!important}.py-6{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-7{padding-top:1.75rem!important;padding-bottom:1.75rem!important}.py-8{padding-top:2rem!important;padding-bottom:2rem!important}.py-9{padding-top:2.25rem!important;padding-bottom:2.25rem!important}.py-10{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.py-11{padding-top:2.75rem!important;padding-bottom:2.75rem!important}.py-12{padding-top:3rem!important;padding-bottom:3rem!important}.py-13{padding-top:3.25rem!important;padding-bottom:3.25rem!important}.py-14{padding-top:3.5rem!important;padding-bottom:3.5rem!important}.py-15{padding-top:3.75rem!important;padding-bottom:3.75rem!important}.py-16{padding-top:4rem!important;padding-bottom:4rem!important}.py-17{padding-top:4.25rem!important;padding-bottom:4.25rem!important}.py-18{padding-top:4.5rem!important;padding-bottom:4.5rem!important}.py-19{padding-top:4.75rem!important;padding-bottom:4.75rem!important}.py-20{padding-top:5rem!important;padding-bottom:5rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:.75rem!important}.pt-4{padding-top:1rem!important}.pt-5{padding-top:1.25rem!important}.pt-6{padding-top:1.5rem!important}.pt-7{padding-top:1.75rem!important}.pt-8{padding-top:2rem!important}.pt-9{padding-top:2.25rem!important}.pt-10{padding-top:2.5rem!important}.pt-11{padding-top:2.75rem!important}.pt-12{padding-top:3rem!important}.pt-13{padding-top:3.25rem!important}.pt-14{padding-top:3.5rem!important}.pt-15{padding-top:3.75rem!important}.pt-16{padding-top:4rem!important}.pt-17{padding-top:4.25rem!important}.pt-18{padding-top:4.5rem!important}.pt-19{padding-top:4.75rem!important}.pt-20{padding-top:5rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:.75rem!important}.pe-4{padding-right:1rem!important}.pe-5{padding-right:1.25rem!important}.pe-6{padding-right:1.5rem!important}.pe-7{padding-right:1.75rem!important}.pe-8{padding-right:2rem!important}.pe-9{padding-right:2.25rem!important}.pe-10{padding-right:2.5rem!important}.pe-11{padding-right:2.75rem!important}.pe-12{padding-right:3rem!important}.pe-13{padding-right:3.25rem!important}.pe-14{padding-right:3.5rem!important}.pe-15{padding-right:3.75rem!important}.pe-16{padding-right:4rem!important}.pe-17{padding-right:4.25rem!important}.pe-18{padding-right:4.5rem!important}.pe-19{padding-right:4.75rem!important}.pe-20{padding-right:5rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:.75rem!important}.pb-4{padding-bottom:1rem!important}.pb-5{padding-bottom:1.25rem!important}.pb-6{padding-bottom:1.5rem!important}.pb-7{padding-bottom:1.75rem!important}.pb-8{padding-bottom:2rem!important}.pb-9{padding-bottom:2.25rem!important}.pb-10{padding-bottom:2.5rem!important}.pb-11{padding-bottom:2.75rem!important}.pb-12{padding-bottom:3rem!important}.pb-13{padding-bottom:3.25rem!important}.pb-14{padding-bottom:3.5rem!important}.pb-15{padding-bottom:3.75rem!important}.pb-16{padding-bottom:4rem!important}.pb-17{padding-bottom:4.25rem!important}.pb-18{padding-bottom:4.5rem!important}.pb-19{padding-bottom:4.75rem!important}.pb-20{padding-bottom:5rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:.75rem!important}.ps-4{padding-left:1rem!important}.ps-5{padding-left:1.25rem!important}.ps-6{padding-left:1.5rem!important}.ps-7{padding-left:1.75rem!important}.ps-8{padding-left:2rem!important}.ps-9{padding-left:2.25rem!important}.ps-10{padding-left:2.5rem!important}.ps-11{padding-left:2.75rem!important}.ps-12{padding-left:3rem!important}.ps-13{padding-left:3.25rem!important}.ps-14{padding-left:3.5rem!important}.ps-15{padding-left:3.75rem!important}.ps-16{padding-left:4rem!important}.ps-17{padding-left:4.25rem!important}.ps-18{padding-left:4.5rem!important}.ps-19{padding-left:4.75rem!important}.ps-20{padding-left:5rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:.75rem!important}.gap-4{gap:1rem!important}.gap-5{gap:1.25rem!important}.gap-6{gap:1.5rem!important}.gap-7{gap:1.75rem!important}.gap-8{gap:2rem!important}.gap-9{gap:2.25rem!important}.gap-10{gap:2.5rem!important}.gap-11{gap:2.75rem!important}.gap-12{gap:3rem!important}.gap-13{gap:3.25rem!important}.gap-14{gap:3.5rem!important}.gap-15{gap:3.75rem!important}.gap-16{gap:4rem!important}.gap-17{gap:4.25rem!important}.gap-18{gap:4.5rem!important}.gap-19{gap:4.75rem!important}.gap-20{gap:5rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:.75rem!important}.row-gap-4{row-gap:1rem!important}.row-gap-5{row-gap:1.25rem!important}.row-gap-6{row-gap:1.5rem!important}.row-gap-7{row-gap:1.75rem!important}.row-gap-8{row-gap:2rem!important}.row-gap-9{row-gap:2.25rem!important}.row-gap-10{row-gap:2.5rem!important}.row-gap-11{row-gap:2.75rem!important}.row-gap-12{row-gap:3rem!important}.row-gap-13{row-gap:3.25rem!important}.row-gap-14{row-gap:3.5rem!important}.row-gap-15{row-gap:3.75rem!important}.row-gap-16{row-gap:4rem!important}.row-gap-17{row-gap:4.25rem!important}.row-gap-18{row-gap:4.5rem!important}.row-gap-19{row-gap:4.75rem!important}.row-gap-20{row-gap:5rem!important}.column-gap-0{column-gap:0!important}.column-gap-1{column-gap:.25rem!important}.column-gap-2{column-gap:.5rem!important}.column-gap-3{column-gap:.75rem!important}.column-gap-4{column-gap:1rem!important}.column-gap-5{column-gap:1.25rem!important}.column-gap-6{column-gap:1.5rem!important}.column-gap-7{column-gap:1.75rem!important}.column-gap-8{column-gap:2rem!important}.column-gap-9{column-gap:2.25rem!important}.column-gap-10{column-gap:2.5rem!important}.column-gap-11{column-gap:2.75rem!important}.column-gap-12{column-gap:3rem!important}.column-gap-13{column-gap:3.25rem!important}.column-gap-14{column-gap:3.5rem!important}.column-gap-15{column-gap:3.75rem!important}.column-gap-16{column-gap:4rem!important}.column-gap-17{column-gap:4.25rem!important}.column-gap-18{column-gap:4.5rem!important}.column-gap-19{column-gap:4.75rem!important}.column-gap-20{column-gap:5rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.3rem + .6vw)!important}.fs-2{font-size:calc(1.275rem + .3vw)!important}.fs-3{font-size:calc(1.26rem + .12vw)!important}.fs-4{font-size:1.25rem!important}.fs-5{font-size:1.15rem!important}.fs-6{font-size:1.075rem!important}.fs-7{font-size:.95rem!important}.fs-8{font-size:.85rem!important}.fs-9{font-size:.75rem!important}.fs-10{font-size:.5rem!important}.fs-sm{font-size:.95rem!important}.fs-base{font-size:1rem!important}.fs-lg{font-size:1.075rem!important}.fs-xl{font-size:1.21rem!important}.fs-fluid{font-size:100%!important}.fs-2x{font-size:calc(1.325rem + .9vw)!important}.fs-2qx{font-size:calc(1.35rem + 1.2vw)!important}.fs-2hx{font-size:calc(1.375rem + 1.5vw)!important}.fs-2tx{font-size:calc(1.4rem + 1.8vw)!important}.fs-3x{font-size:calc(1.425rem + 2.1vw)!important}.fs-3qx{font-size:calc(1.45rem + 2.4vw)!important}.fs-3hx{font-size:calc(1.475rem + 2.7vw)!important}.fs-3tx{font-size:calc(1.5rem + 3vw)!important}.fs-4x{font-size:calc(1.525rem + 3.3vw)!important}.fs-4qx{font-size:calc(1.55rem + 3.6vw)!important}.fs-4hx{font-size:calc(1.575rem + 3.9vw)!important}.fs-4tx{font-size:calc(1.6rem + 4.2vw)!important}.fs-5x{font-size:calc(1.625rem + 4.5vw)!important}.fs-5qx{font-size:calc(1.65rem + 4.8vw)!important}.fs-5hx{font-size:calc(1.675rem + 5.1vw)!important}.fs-5tx{font-size:calc(1.7rem + 5.4vw)!important}.fs-6x{font-size:calc(1.725rem + 5.7vw)!important}.fs-6qx{font-size:calc(1.75rem + 6vw)!important}.fs-6hx{font-size:calc(1.775rem + 6.3vw)!important}.fs-6tx{font-size:calc(1.8rem + 6.6vw)!important}.fs-7x{font-size:calc(1.825rem + 6.9vw)!important}.fs-7qx{font-size:calc(1.85rem + 7.2vw)!important}.fs-7hx{font-size:calc(1.875rem + 7.5vw)!important}.fs-7tx{font-size:calc(1.9rem + 7.8vw)!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:500!important}.fw-bold{font-weight:600!important}.fw-bolder{font-weight:700!important}.lh-0{line-height:0!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:1.75!important}.lh-xl{line-height:2!important}.lh-xxl{line-height:2.25!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-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!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-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,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.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:.125em!important}.link-offset-1-hover:hover{text-underline-offset:.125em!important}.link-offset-2{text-underline-offset:.25em!important}.link-offset-2-hover:hover{text-underline-offset:.25em!important}.link-offset-3{text-underline-offset:.375em!important}.link-offset-3-hover:hover{text-underline-offset:.375em!important}.link-underline-light{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-primary{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;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-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.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-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{user-select:all!important}.user-select-auto{user-select:auto!important}.user-select-none{user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.475rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.425rem!important}.rounded-2{border-radius:.475rem!important}.rounded-3{border-radius:.625rem!important}.rounded-4{border-radius:1rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!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-index-n1{z-index:-1!important}.z-index-n2{z-index:-2!important}.z-index-0{z-index:0!important}.z-index-1{z-index:1!important}.z-index-2{z-index:2!important}.z-index-3{z-index:3!important}.cursor-help{cursor:help!important}.cursor-wait{cursor:wait!important}.cursor-crosshair{cursor:crosshair!important}.cursor-not-allowed{cursor:not-allowed!important}.cursor-zoom-in{cursor:zoom-in!important}.cursor-grab{cursor:grab!important}.cursor-pointer{cursor:pointer!important}.opacity-0{opacity:0!important}.opacity-0-hover:hover{opacity:0!important}.opacity-5{opacity:.05!important}.opacity-5-hover:hover{opacity:.05!important}.opacity-10{opacity:.1!important}.opacity-10-hover:hover{opacity:.1!important}.opacity-15{opacity:.15!important}.opacity-15-hover:hover{opacity:.15!important}.opacity-20{opacity:.2!important}.opacity-20-hover:hover{opacity:.2!important}.opacity-25{opacity:.25!important}.opacity-25-hover:hover{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-50-hover:hover{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-75-hover:hover{opacity:.75!important}.opacity-100{opacity:1!important}.opacity-100-hover:hover{opacity:1!important}.min-w-unset{min-width:unset!important}.min-w-25{min-width:25%!important}.min-w-50{min-width:50%!important}.min-w-75{min-width:75%!important}.min-w-100{min-width:100%!important}.min-w-auto{min-width:auto!important}.min-w-1px{min-width:1px!important}.min-w-2px{min-width:2px!important}.min-w-3px{min-width:3px!important}.min-w-4px{min-width:4px!important}.min-w-5px{min-width:5px!important}.min-w-6px{min-width:6px!important}.min-w-7px{min-width:7px!important}.min-w-8px{min-width:8px!important}.min-w-9px{min-width:9px!important}.min-w-10px{min-width:10px!important}.min-w-15px{min-width:15px!important}.min-w-20px{min-width:20px!important}.min-w-25px{min-width:25px!important}.min-w-30px{min-width:30px!important}.min-w-35px{min-width:35px!important}.min-w-40px{min-width:40px!important}.min-w-45px{min-width:45px!important}.min-w-50px{min-width:50px!important}.min-w-55px{min-width:55px!important}.min-w-60px{min-width:60px!important}.min-w-65px{min-width:65px!important}.min-w-70px{min-width:70px!important}.min-w-75px{min-width:75px!important}.min-w-80px{min-width:80px!important}.min-w-85px{min-width:85px!important}.min-w-90px{min-width:90px!important}.min-w-95px{min-width:95px!important}.min-w-100px{min-width:100px!important}.min-w-125px{min-width:125px!important}.min-w-150px{min-width:150px!important}.min-w-175px{min-width:175px!important}.min-w-200px{min-width:200px!important}.min-w-225px{min-width:225px!important}.min-w-250px{min-width:250px!important}.min-w-275px{min-width:275px!important}.min-w-300px{min-width:300px!important}.min-w-325px{min-width:325px!important}.min-w-350px{min-width:350px!important}.min-w-375px{min-width:375px!important}.min-w-400px{min-width:400px!important}.min-w-425px{min-width:425px!important}.min-w-450px{min-width:450px!important}.min-w-475px{min-width:475px!important}.min-w-500px{min-width:500px!important}.min-w-550px{min-width:550px!important}.min-w-600px{min-width:600px!important}.min-w-650px{min-width:650px!important}.min-w-700px{min-width:700px!important}.min-w-750px{min-width:750px!important}.min-w-800px{min-width:800px!important}.min-w-850px{min-width:850px!important}.min-w-900px{min-width:900px!important}.min-w-950px{min-width:950px!important}.min-w-1000px{min-width:1000px!important}.min-h-unset{min-height:unset!important}.min-h-25{min-height:25%!important}.min-h-50{min-height:50%!important}.min-h-75{min-height:75%!important}.min-h-100{min-height:100%!important}.min-h-auto{min-height:auto!important}.min-h-1px{min-height:1px!important}.min-h-2px{min-height:2px!important}.min-h-3px{min-height:3px!important}.min-h-4px{min-height:4px!important}.min-h-5px{min-height:5px!important}.min-h-6px{min-height:6px!important}.min-h-7px{min-height:7px!important}.min-h-8px{min-height:8px!important}.min-h-9px{min-height:9px!important}.min-h-10px{min-height:10px!important}.min-h-15px{min-height:15px!important}.min-h-20px{min-height:20px!important}.min-h-25px{min-height:25px!important}.min-h-30px{min-height:30px!important}.min-h-35px{min-height:35px!important}.min-h-40px{min-height:40px!important}.min-h-45px{min-height:45px!important}.min-h-50px{min-height:50px!important}.min-h-55px{min-height:55px!important}.min-h-60px{min-height:60px!important}.min-h-65px{min-height:65px!important}.min-h-70px{min-height:70px!important}.min-h-75px{min-height:75px!important}.min-h-80px{min-height:80px!important}.min-h-85px{min-height:85px!important}.min-h-90px{min-height:90px!important}.min-h-95px{min-height:95px!important}.min-h-100px{min-height:100px!important}.min-h-125px{min-height:125px!important}.min-h-150px{min-height:150px!important}.min-h-175px{min-height:175px!important}.min-h-200px{min-height:200px!important}.min-h-225px{min-height:225px!important}.min-h-250px{min-height:250px!important}.min-h-275px{min-height:275px!important}.min-h-300px{min-height:300px!important}.min-h-325px{min-height:325px!important}.min-h-350px{min-height:350px!important}.min-h-375px{min-height:375px!important}.min-h-400px{min-height:400px!important}.min-h-425px{min-height:425px!important}.min-h-450px{min-height:450px!important}.min-h-475px{min-height:475px!important}.min-h-500px{min-height:500px!important}.min-h-550px{min-height:550px!important}.min-h-600px{min-height:600px!important}.min-h-650px{min-height:650px!important}.min-h-700px{min-height:700px!important}.min-h-750px{min-height:750px!important}.min-h-800px{min-height:800px!important}.min-h-850px{min-height:850px!important}.min-h-900px{min-height:900px!important}.min-h-950px{min-height:950px!important}.min-h-1000px{min-height:1000px!important}.border-top-0{border-top-width:0!important}.border-top-1{border-top-width:1px!important}.border-top-2{border-top-width:2px!important}.border-top-3{border-top-width:3px!important}.border-top-4{border-top-width:4px!important}.border-top-5{border-top-width:5px!important}.border-bottom-0{border-bottom-width:0!important}.border-bottom-1{border-bottom-width:1px!important}.border-bottom-2{border-bottom-width:2px!important}.border-bottom-3{border-bottom-width:3px!important}.border-bottom-4{border-bottom-width:4px!important}.border-bottom-5{border-bottom-width:5px!important}.border-right-0{border-right-width:0!important}.border-right-1{border-right-width:1px!important}.border-right-2{border-right-width:2px!important}.border-right-3{border-right-width:3px!important}.border-right-4{border-right-width:4px!important}.border-right-5{border-right-width:5px!important}.border-left-0{border-left-width:0!important}.border-left-1{border-left-width:1px!important}.border-left-2{border-left-width:2px!important}.border-left-3{border-left-width:3px!important}.border-left-4{border-left-width:4px!important}.border-left-5{border-left-width:5px!important}.ls-1{letter-spacing:.1rem!important}.ls-2{letter-spacing:.115rem!important}.ls-3{letter-spacing:.125rem!important}.ls-4{letter-spacing:.25rem!important}.ls-5{letter-spacing:.5rem!important}.ls-n1{letter-spacing:-.1rem!important}.ls-n2{letter-spacing:-.115rem!important}.ls-n3{letter-spacing:-.125rem!important}.ls-n4{letter-spacing:-.25rem!important}.ls-n5{letter-spacing:-.5rem!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{object-fit:contain!important}.object-fit-sm-cover{object-fit:cover!important}.object-fit-sm-fill{object-fit:fill!important}.object-fit-sm-scale{object-fit:scale-down!important}.object-fit-sm-none{object-fit:none!important}.overflow-sm-auto{overflow:auto!important}.overflow-sm-hidden{overflow:hidden!important}.overflow-sm-visible{overflow:visible!important}.overflow-sm-scroll{overflow:scroll!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}.position-sm-static{position:static!important}.position-sm-relative{position:relative!important}.position-sm-absolute{position:absolute!important}.position-sm-fixed{position:fixed!important}.position-sm-sticky{position:sticky!important}.w-sm-unset{width:unset!important}.w-sm-25{width:25%!important}.w-sm-50{width:50%!important}.w-sm-75{width:75%!important}.w-sm-100{width:100%!important}.w-sm-auto{width:auto!important}.w-sm-1px{width:1px!important}.w-sm-2px{width:2px!important}.w-sm-3px{width:3px!important}.w-sm-4px{width:4px!important}.w-sm-5px{width:5px!important}.w-sm-6px{width:6px!important}.w-sm-7px{width:7px!important}.w-sm-8px{width:8px!important}.w-sm-9px{width:9px!important}.w-sm-10px{width:10px!important}.w-sm-15px{width:15px!important}.w-sm-20px{width:20px!important}.w-sm-25px{width:25px!important}.w-sm-30px{width:30px!important}.w-sm-35px{width:35px!important}.w-sm-40px{width:40px!important}.w-sm-45px{width:45px!important}.w-sm-50px{width:50px!important}.w-sm-55px{width:55px!important}.w-sm-60px{width:60px!important}.w-sm-65px{width:65px!important}.w-sm-70px{width:70px!important}.w-sm-75px{width:75px!important}.w-sm-80px{width:80px!important}.w-sm-85px{width:85px!important}.w-sm-90px{width:90px!important}.w-sm-95px{width:95px!important}.w-sm-100px{width:100px!important}.w-sm-125px{width:125px!important}.w-sm-150px{width:150px!important}.w-sm-175px{width:175px!important}.w-sm-200px{width:200px!important}.w-sm-225px{width:225px!important}.w-sm-250px{width:250px!important}.w-sm-275px{width:275px!important}.w-sm-300px{width:300px!important}.w-sm-325px{width:325px!important}.w-sm-350px{width:350px!important}.w-sm-375px{width:375px!important}.w-sm-400px{width:400px!important}.w-sm-425px{width:425px!important}.w-sm-450px{width:450px!important}.w-sm-475px{width:475px!important}.w-sm-500px{width:500px!important}.w-sm-550px{width:550px!important}.w-sm-600px{width:600px!important}.w-sm-650px{width:650px!important}.w-sm-700px{width:700px!important}.w-sm-750px{width:750px!important}.w-sm-800px{width:800px!important}.w-sm-850px{width:850px!important}.w-sm-900px{width:900px!important}.w-sm-950px{width:950px!important}.w-sm-1000px{width:1000px!important}.mw-sm-unset{max-width:unset!important}.mw-sm-25{max-width:25%!important}.mw-sm-50{max-width:50%!important}.mw-sm-75{max-width:75%!important}.mw-sm-100{max-width:100%!important}.mw-sm-auto{max-width:auto!important}.mw-sm-1px{max-width:1px!important}.mw-sm-2px{max-width:2px!important}.mw-sm-3px{max-width:3px!important}.mw-sm-4px{max-width:4px!important}.mw-sm-5px{max-width:5px!important}.mw-sm-6px{max-width:6px!important}.mw-sm-7px{max-width:7px!important}.mw-sm-8px{max-width:8px!important}.mw-sm-9px{max-width:9px!important}.mw-sm-10px{max-width:10px!important}.mw-sm-15px{max-width:15px!important}.mw-sm-20px{max-width:20px!important}.mw-sm-25px{max-width:25px!important}.mw-sm-30px{max-width:30px!important}.mw-sm-35px{max-width:35px!important}.mw-sm-40px{max-width:40px!important}.mw-sm-45px{max-width:45px!important}.mw-sm-50px{max-width:50px!important}.mw-sm-55px{max-width:55px!important}.mw-sm-60px{max-width:60px!important}.mw-sm-65px{max-width:65px!important}.mw-sm-70px{max-width:70px!important}.mw-sm-75px{max-width:75px!important}.mw-sm-80px{max-width:80px!important}.mw-sm-85px{max-width:85px!important}.mw-sm-90px{max-width:90px!important}.mw-sm-95px{max-width:95px!important}.mw-sm-100px{max-width:100px!important}.mw-sm-125px{max-width:125px!important}.mw-sm-150px{max-width:150px!important}.mw-sm-175px{max-width:175px!important}.mw-sm-200px{max-width:200px!important}.mw-sm-225px{max-width:225px!important}.mw-sm-250px{max-width:250px!important}.mw-sm-275px{max-width:275px!important}.mw-sm-300px{max-width:300px!important}.mw-sm-325px{max-width:325px!important}.mw-sm-350px{max-width:350px!important}.mw-sm-375px{max-width:375px!important}.mw-sm-400px{max-width:400px!important}.mw-sm-425px{max-width:425px!important}.mw-sm-450px{max-width:450px!important}.mw-sm-475px{max-width:475px!important}.mw-sm-500px{max-width:500px!important}.mw-sm-550px{max-width:550px!important}.mw-sm-600px{max-width:600px!important}.mw-sm-650px{max-width:650px!important}.mw-sm-700px{max-width:700px!important}.mw-sm-750px{max-width:750px!important}.mw-sm-800px{max-width:800px!important}.mw-sm-850px{max-width:850px!important}.mw-sm-900px{max-width:900px!important}.mw-sm-950px{max-width:950px!important}.mw-sm-1000px{max-width:1000px!important}.h-sm-unset{height:unset!important}.h-sm-25{height:25%!important}.h-sm-50{height:50%!important}.h-sm-75{height:75%!important}.h-sm-100{height:100%!important}.h-sm-auto{height:auto!important}.h-sm-1px{height:1px!important}.h-sm-2px{height:2px!important}.h-sm-3px{height:3px!important}.h-sm-4px{height:4px!important}.h-sm-5px{height:5px!important}.h-sm-6px{height:6px!important}.h-sm-7px{height:7px!important}.h-sm-8px{height:8px!important}.h-sm-9px{height:9px!important}.h-sm-10px{height:10px!important}.h-sm-15px{height:15px!important}.h-sm-20px{height:20px!important}.h-sm-25px{height:25px!important}.h-sm-30px{height:30px!important}.h-sm-35px{height:35px!important}.h-sm-40px{height:40px!important}.h-sm-45px{height:45px!important}.h-sm-50px{height:50px!important}.h-sm-55px{height:55px!important}.h-sm-60px{height:60px!important}.h-sm-65px{height:65px!important}.h-sm-70px{height:70px!important}.h-sm-75px{height:75px!important}.h-sm-80px{height:80px!important}.h-sm-85px{height:85px!important}.h-sm-90px{height:90px!important}.h-sm-95px{height:95px!important}.h-sm-100px{height:100px!important}.h-sm-125px{height:125px!important}.h-sm-150px{height:150px!important}.h-sm-175px{height:175px!important}.h-sm-200px{height:200px!important}.h-sm-225px{height:225px!important}.h-sm-250px{height:250px!important}.h-sm-275px{height:275px!important}.h-sm-300px{height:300px!important}.h-sm-325px{height:325px!important}.h-sm-350px{height:350px!important}.h-sm-375px{height:375px!important}.h-sm-400px{height:400px!important}.h-sm-425px{height:425px!important}.h-sm-450px{height:450px!important}.h-sm-475px{height:475px!important}.h-sm-500px{height:500px!important}.h-sm-550px{height:550px!important}.h-sm-600px{height:600px!important}.h-sm-650px{height:650px!important}.h-sm-700px{height:700px!important}.h-sm-750px{height:750px!important}.h-sm-800px{height:800px!important}.h-sm-850px{height:850px!important}.h-sm-900px{height:900px!important}.h-sm-950px{height:950px!important}.h-sm-1000px{height:1000px!important}.mh-sm-unset{max-height:unset!important}.mh-sm-25{max-height:25%!important}.mh-sm-50{max-height:50%!important}.mh-sm-75{max-height:75%!important}.mh-sm-100{max-height:100%!important}.mh-sm-auto{max-height:auto!important}.mh-sm-1px{max-height:1px!important}.mh-sm-2px{max-height:2px!important}.mh-sm-3px{max-height:3px!important}.mh-sm-4px{max-height:4px!important}.mh-sm-5px{max-height:5px!important}.mh-sm-6px{max-height:6px!important}.mh-sm-7px{max-height:7px!important}.mh-sm-8px{max-height:8px!important}.mh-sm-9px{max-height:9px!important}.mh-sm-10px{max-height:10px!important}.mh-sm-15px{max-height:15px!important}.mh-sm-20px{max-height:20px!important}.mh-sm-25px{max-height:25px!important}.mh-sm-30px{max-height:30px!important}.mh-sm-35px{max-height:35px!important}.mh-sm-40px{max-height:40px!important}.mh-sm-45px{max-height:45px!important}.mh-sm-50px{max-height:50px!important}.mh-sm-55px{max-height:55px!important}.mh-sm-60px{max-height:60px!important}.mh-sm-65px{max-height:65px!important}.mh-sm-70px{max-height:70px!important}.mh-sm-75px{max-height:75px!important}.mh-sm-80px{max-height:80px!important}.mh-sm-85px{max-height:85px!important}.mh-sm-90px{max-height:90px!important}.mh-sm-95px{max-height:95px!important}.mh-sm-100px{max-height:100px!important}.mh-sm-125px{max-height:125px!important}.mh-sm-150px{max-height:150px!important}.mh-sm-175px{max-height:175px!important}.mh-sm-200px{max-height:200px!important}.mh-sm-225px{max-height:225px!important}.mh-sm-250px{max-height:250px!important}.mh-sm-275px{max-height:275px!important}.mh-sm-300px{max-height:300px!important}.mh-sm-325px{max-height:325px!important}.mh-sm-350px{max-height:350px!important}.mh-sm-375px{max-height:375px!important}.mh-sm-400px{max-height:400px!important}.mh-sm-425px{max-height:425px!important}.mh-sm-450px{max-height:450px!important}.mh-sm-475px{max-height:475px!important}.mh-sm-500px{max-height:500px!important}.mh-sm-550px{max-height:550px!important}.mh-sm-600px{max-height:600px!important}.mh-sm-650px{max-height:650px!important}.mh-sm-700px{max-height:700px!important}.mh-sm-750px{max-height:750px!important}.mh-sm-800px{max-height:800px!important}.mh-sm-850px{max-height:850px!important}.mh-sm-900px{max-height:900px!important}.mh-sm-950px{max-height:950px!important}.mh-sm-1000px{max-height:1000px!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:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:.75rem!important}.m-sm-4{margin:1rem!important}.m-sm-5{margin:1.25rem!important}.m-sm-6{margin:1.5rem!important}.m-sm-7{margin:1.75rem!important}.m-sm-8{margin:2rem!important}.m-sm-9{margin:2.25rem!important}.m-sm-10{margin:2.5rem!important}.m-sm-11{margin:2.75rem!important}.m-sm-12{margin:3rem!important}.m-sm-13{margin:3.25rem!important}.m-sm-14{margin:3.5rem!important}.m-sm-15{margin:3.75rem!important}.m-sm-16{margin:4rem!important}.m-sm-17{margin:4.25rem!important}.m-sm-18{margin:4.5rem!important}.m-sm-19{margin:4.75rem!important}.m-sm-20{margin:5rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:.75rem!important;margin-left:.75rem!important}.mx-sm-4{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-5{margin-right:1.25rem!important;margin-left:1.25rem!important}.mx-sm-6{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-7{margin-right:1.75rem!important;margin-left:1.75rem!important}.mx-sm-8{margin-right:2rem!important;margin-left:2rem!important}.mx-sm-9{margin-right:2.25rem!important;margin-left:2.25rem!important}.mx-sm-10{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-sm-11{margin-right:2.75rem!important;margin-left:2.75rem!important}.mx-sm-12{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-13{margin-right:3.25rem!important;margin-left:3.25rem!important}.mx-sm-14{margin-right:3.5rem!important;margin-left:3.5rem!important}.mx-sm-15{margin-right:3.75rem!important;margin-left:3.75rem!important}.mx-sm-16{margin-right:4rem!important;margin-left:4rem!important}.mx-sm-17{margin-right:4.25rem!important;margin-left:4.25rem!important}.mx-sm-18{margin-right:4.5rem!important;margin-left:4.5rem!important}.mx-sm-19{margin-right:4.75rem!important;margin-left:4.75rem!important}.mx-sm-20{margin-right:5rem!important;margin-left:5rem!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:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.my-sm-4{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-5{margin-top:1.25rem!important;margin-bottom:1.25rem!important}.my-sm-6{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-7{margin-top:1.75rem!important;margin-bottom:1.75rem!important}.my-sm-8{margin-top:2rem!important;margin-bottom:2rem!important}.my-sm-9{margin-top:2.25rem!important;margin-bottom:2.25rem!important}.my-sm-10{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-sm-11{margin-top:2.75rem!important;margin-bottom:2.75rem!important}.my-sm-12{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-13{margin-top:3.25rem!important;margin-bottom:3.25rem!important}.my-sm-14{margin-top:3.5rem!important;margin-bottom:3.5rem!important}.my-sm-15{margin-top:3.75rem!important;margin-bottom:3.75rem!important}.my-sm-16{margin-top:4rem!important;margin-bottom:4rem!important}.my-sm-17{margin-top:4.25rem!important;margin-bottom:4.25rem!important}.my-sm-18{margin-top:4.5rem!important;margin-bottom:4.5rem!important}.my-sm-19{margin-top:4.75rem!important;margin-bottom:4.75rem!important}.my-sm-20{margin-top:5rem!important;margin-bottom:5rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:.75rem!important}.mt-sm-4{margin-top:1rem!important}.mt-sm-5{margin-top:1.25rem!important}.mt-sm-6{margin-top:1.5rem!important}.mt-sm-7{margin-top:1.75rem!important}.mt-sm-8{margin-top:2rem!important}.mt-sm-9{margin-top:2.25rem!important}.mt-sm-10{margin-top:2.5rem!important}.mt-sm-11{margin-top:2.75rem!important}.mt-sm-12{margin-top:3rem!important}.mt-sm-13{margin-top:3.25rem!important}.mt-sm-14{margin-top:3.5rem!important}.mt-sm-15{margin-top:3.75rem!important}.mt-sm-16{margin-top:4rem!important}.mt-sm-17{margin-top:4.25rem!important}.mt-sm-18{margin-top:4.5rem!important}.mt-sm-19{margin-top:4.75rem!important}.mt-sm-20{margin-top:5rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:.75rem!important}.me-sm-4{margin-right:1rem!important}.me-sm-5{margin-right:1.25rem!important}.me-sm-6{margin-right:1.5rem!important}.me-sm-7{margin-right:1.75rem!important}.me-sm-8{margin-right:2rem!important}.me-sm-9{margin-right:2.25rem!important}.me-sm-10{margin-right:2.5rem!important}.me-sm-11{margin-right:2.75rem!important}.me-sm-12{margin-right:3rem!important}.me-sm-13{margin-right:3.25rem!important}.me-sm-14{margin-right:3.5rem!important}.me-sm-15{margin-right:3.75rem!important}.me-sm-16{margin-right:4rem!important}.me-sm-17{margin-right:4.25rem!important}.me-sm-18{margin-right:4.5rem!important}.me-sm-19{margin-right:4.75rem!important}.me-sm-20{margin-right:5rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:.75rem!important}.mb-sm-4{margin-bottom:1rem!important}.mb-sm-5{margin-bottom:1.25rem!important}.mb-sm-6{margin-bottom:1.5rem!important}.mb-sm-7{margin-bottom:1.75rem!important}.mb-sm-8{margin-bottom:2rem!important}.mb-sm-9{margin-bottom:2.25rem!important}.mb-sm-10{margin-bottom:2.5rem!important}.mb-sm-11{margin-bottom:2.75rem!important}.mb-sm-12{margin-bottom:3rem!important}.mb-sm-13{margin-bottom:3.25rem!important}.mb-sm-14{margin-bottom:3.5rem!important}.mb-sm-15{margin-bottom:3.75rem!important}.mb-sm-16{margin-bottom:4rem!important}.mb-sm-17{margin-bottom:4.25rem!important}.mb-sm-18{margin-bottom:4.5rem!important}.mb-sm-19{margin-bottom:4.75rem!important}.mb-sm-20{margin-bottom:5rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:.75rem!important}.ms-sm-4{margin-left:1rem!important}.ms-sm-5{margin-left:1.25rem!important}.ms-sm-6{margin-left:1.5rem!important}.ms-sm-7{margin-left:1.75rem!important}.ms-sm-8{margin-left:2rem!important}.ms-sm-9{margin-left:2.25rem!important}.ms-sm-10{margin-left:2.5rem!important}.ms-sm-11{margin-left:2.75rem!important}.ms-sm-12{margin-left:3rem!important}.ms-sm-13{margin-left:3.25rem!important}.ms-sm-14{margin-left:3.5rem!important}.ms-sm-15{margin-left:3.75rem!important}.ms-sm-16{margin-left:4rem!important}.ms-sm-17{margin-left:4.25rem!important}.ms-sm-18{margin-left:4.5rem!important}.ms-sm-19{margin-left:4.75rem!important}.ms-sm-20{margin-left:5rem!important}.ms-sm-auto{margin-left:auto!important}.m-sm-n1{margin:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.m-sm-n3{margin:-.75rem!important}.m-sm-n4{margin:-1rem!important}.m-sm-n5{margin:-1.25rem!important}.m-sm-n6{margin:-1.5rem!important}.m-sm-n7{margin:-1.75rem!important}.m-sm-n8{margin:-2rem!important}.m-sm-n9{margin:-2.25rem!important}.m-sm-n10{margin:-2.5rem!important}.m-sm-n11{margin:-2.75rem!important}.m-sm-n12{margin:-3rem!important}.m-sm-n13{margin:-3.25rem!important}.m-sm-n14{margin:-3.5rem!important}.m-sm-n15{margin:-3.75rem!important}.m-sm-n16{margin:-4rem!important}.m-sm-n17{margin:-4.25rem!important}.m-sm-n18{margin:-4.5rem!important}.m-sm-n19{margin:-4.75rem!important}.m-sm-n20{margin:-5rem!important}.mx-sm-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-sm-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-sm-n3{margin-right:-.75rem!important;margin-left:-.75rem!important}.mx-sm-n4{margin-right:-1rem!important;margin-left:-1rem!important}.mx-sm-n5{margin-right:-1.25rem!important;margin-left:-1.25rem!important}.mx-sm-n6{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-sm-n7{margin-right:-1.75rem!important;margin-left:-1.75rem!important}.mx-sm-n8{margin-right:-2rem!important;margin-left:-2rem!important}.mx-sm-n9{margin-right:-2.25rem!important;margin-left:-2.25rem!important}.mx-sm-n10{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.mx-sm-n11{margin-right:-2.75rem!important;margin-left:-2.75rem!important}.mx-sm-n12{margin-right:-3rem!important;margin-left:-3rem!important}.mx-sm-n13{margin-right:-3.25rem!important;margin-left:-3.25rem!important}.mx-sm-n14{margin-right:-3.5rem!important;margin-left:-3.5rem!important}.mx-sm-n15{margin-right:-3.75rem!important;margin-left:-3.75rem!important}.mx-sm-n16{margin-right:-4rem!important;margin-left:-4rem!important}.mx-sm-n17{margin-right:-4.25rem!important;margin-left:-4.25rem!important}.mx-sm-n18{margin-right:-4.5rem!important;margin-left:-4.5rem!important}.mx-sm-n19{margin-right:-4.75rem!important;margin-left:-4.75rem!important}.mx-sm-n20{margin-right:-5rem!important;margin-left:-5rem!important}.my-sm-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-sm-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-sm-n3{margin-top:-.75rem!important;margin-bottom:-.75rem!important}.my-sm-n4{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-sm-n5{margin-top:-1.25rem!important;margin-bottom:-1.25rem!important}.my-sm-n6{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-sm-n7{margin-top:-1.75rem!important;margin-bottom:-1.75rem!important}.my-sm-n8{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-sm-n9{margin-top:-2.25rem!important;margin-bottom:-2.25rem!important}.my-sm-n10{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.my-sm-n11{margin-top:-2.75rem!important;margin-bottom:-2.75rem!important}.my-sm-n12{margin-top:-3rem!important;margin-bottom:-3rem!important}.my-sm-n13{margin-top:-3.25rem!important;margin-bottom:-3.25rem!important}.my-sm-n14{margin-top:-3.5rem!important;margin-bottom:-3.5rem!important}.my-sm-n15{margin-top:-3.75rem!important;margin-bottom:-3.75rem!important}.my-sm-n16{margin-top:-4rem!important;margin-bottom:-4rem!important}.my-sm-n17{margin-top:-4.25rem!important;margin-bottom:-4.25rem!important}.my-sm-n18{margin-top:-4.5rem!important;margin-bottom:-4.5rem!important}.my-sm-n19{margin-top:-4.75rem!important;margin-bottom:-4.75rem!important}.my-sm-n20{margin-top:-5rem!important;margin-bottom:-5rem!important}.mt-sm-n1{margin-top:-.25rem!important}.mt-sm-n2{margin-top:-.5rem!important}.mt-sm-n3{margin-top:-.75rem!important}.mt-sm-n4{margin-top:-1rem!important}.mt-sm-n5{margin-top:-1.25rem!important}.mt-sm-n6{margin-top:-1.5rem!important}.mt-sm-n7{margin-top:-1.75rem!important}.mt-sm-n8{margin-top:-2rem!important}.mt-sm-n9{margin-top:-2.25rem!important}.mt-sm-n10{margin-top:-2.5rem!important}.mt-sm-n11{margin-top:-2.75rem!important}.mt-sm-n12{margin-top:-3rem!important}.mt-sm-n13{margin-top:-3.25rem!important}.mt-sm-n14{margin-top:-3.5rem!important}.mt-sm-n15{margin-top:-3.75rem!important}.mt-sm-n16{margin-top:-4rem!important}.mt-sm-n17{margin-top:-4.25rem!important}.mt-sm-n18{margin-top:-4.5rem!important}.mt-sm-n19{margin-top:-4.75rem!important}.mt-sm-n20{margin-top:-5rem!important}.me-sm-n1{margin-right:-.25rem!important}.me-sm-n2{margin-right:-.5rem!important}.me-sm-n3{margin-right:-.75rem!important}.me-sm-n4{margin-right:-1rem!important}.me-sm-n5{margin-right:-1.25rem!important}.me-sm-n6{margin-right:-1.5rem!important}.me-sm-n7{margin-right:-1.75rem!important}.me-sm-n8{margin-right:-2rem!important}.me-sm-n9{margin-right:-2.25rem!important}.me-sm-n10{margin-right:-2.5rem!important}.me-sm-n11{margin-right:-2.75rem!important}.me-sm-n12{margin-right:-3rem!important}.me-sm-n13{margin-right:-3.25rem!important}.me-sm-n14{margin-right:-3.5rem!important}.me-sm-n15{margin-right:-3.75rem!important}.me-sm-n16{margin-right:-4rem!important}.me-sm-n17{margin-right:-4.25rem!important}.me-sm-n18{margin-right:-4.5rem!important}.me-sm-n19{margin-right:-4.75rem!important}.me-sm-n20{margin-right:-5rem!important}.mb-sm-n1{margin-bottom:-.25rem!important}.mb-sm-n2{margin-bottom:-.5rem!important}.mb-sm-n3{margin-bottom:-.75rem!important}.mb-sm-n4{margin-bottom:-1rem!important}.mb-sm-n5{margin-bottom:-1.25rem!important}.mb-sm-n6{margin-bottom:-1.5rem!important}.mb-sm-n7{margin-bottom:-1.75rem!important}.mb-sm-n8{margin-bottom:-2rem!important}.mb-sm-n9{margin-bottom:-2.25rem!important}.mb-sm-n10{margin-bottom:-2.5rem!important}.mb-sm-n11{margin-bottom:-2.75rem!important}.mb-sm-n12{margin-bottom:-3rem!important}.mb-sm-n13{margin-bottom:-3.25rem!important}.mb-sm-n14{margin-bottom:-3.5rem!important}.mb-sm-n15{margin-bottom:-3.75rem!important}.mb-sm-n16{margin-bottom:-4rem!important}.mb-sm-n17{margin-bottom:-4.25rem!important}.mb-sm-n18{margin-bottom:-4.5rem!important}.mb-sm-n19{margin-bottom:-4.75rem!important}.mb-sm-n20{margin-bottom:-5rem!important}.ms-sm-n1{margin-left:-.25rem!important}.ms-sm-n2{margin-left:-.5rem!important}.ms-sm-n3{margin-left:-.75rem!important}.ms-sm-n4{margin-left:-1rem!important}.ms-sm-n5{margin-left:-1.25rem!important}.ms-sm-n6{margin-left:-1.5rem!important}.ms-sm-n7{margin-left:-1.75rem!important}.ms-sm-n8{margin-left:-2rem!important}.ms-sm-n9{margin-left:-2.25rem!important}.ms-sm-n10{margin-left:-2.5rem!important}.ms-sm-n11{margin-left:-2.75rem!important}.ms-sm-n12{margin-left:-3rem!important}.ms-sm-n13{margin-left:-3.25rem!important}.ms-sm-n14{margin-left:-3.5rem!important}.ms-sm-n15{margin-left:-3.75rem!important}.ms-sm-n16{margin-left:-4rem!important}.ms-sm-n17{margin-left:-4.25rem!important}.ms-sm-n18{margin-left:-4.5rem!important}.ms-sm-n19{margin-left:-4.75rem!important}.ms-sm-n20{margin-left:-5rem!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:.75rem!important}.p-sm-4{padding:1rem!important}.p-sm-5{padding:1.25rem!important}.p-sm-6{padding:1.5rem!important}.p-sm-7{padding:1.75rem!important}.p-sm-8{padding:2rem!important}.p-sm-9{padding:2.25rem!important}.p-sm-10{padding:2.5rem!important}.p-sm-11{padding:2.75rem!important}.p-sm-12{padding:3rem!important}.p-sm-13{padding:3.25rem!important}.p-sm-14{padding:3.5rem!important}.p-sm-15{padding:3.75rem!important}.p-sm-16{padding:4rem!important}.p-sm-17{padding:4.25rem!important}.p-sm-18{padding:4.5rem!important}.p-sm-19{padding:4.75rem!important}.p-sm-20{padding:5rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:.75rem!important;padding-left:.75rem!important}.px-sm-4{padding-right:1rem!important;padding-left:1rem!important}.px-sm-5{padding-right:1.25rem!important;padding-left:1.25rem!important}.px-sm-6{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-7{padding-right:1.75rem!important;padding-left:1.75rem!important}.px-sm-8{padding-right:2rem!important;padding-left:2rem!important}.px-sm-9{padding-right:2.25rem!important;padding-left:2.25rem!important}.px-sm-10{padding-right:2.5rem!important;padding-left:2.5rem!important}.px-sm-11{padding-right:2.75rem!important;padding-left:2.75rem!important}.px-sm-12{padding-right:3rem!important;padding-left:3rem!important}.px-sm-13{padding-right:3.25rem!important;padding-left:3.25rem!important}.px-sm-14{padding-right:3.5rem!important;padding-left:3.5rem!important}.px-sm-15{padding-right:3.75rem!important;padding-left:3.75rem!important}.px-sm-16{padding-right:4rem!important;padding-left:4rem!important}.px-sm-17{padding-right:4.25rem!important;padding-left:4.25rem!important}.px-sm-18{padding-right:4.5rem!important;padding-left:4.5rem!important}.px-sm-19{padding-right:4.75rem!important;padding-left:4.75rem!important}.px-sm-20{padding-right:5rem!important;padding-left:5rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.py-sm-4{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-5{padding-top:1.25rem!important;padding-bottom:1.25rem!important}.py-sm-6{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-7{padding-top:1.75rem!important;padding-bottom:1.75rem!important}.py-sm-8{padding-top:2rem!important;padding-bottom:2rem!important}.py-sm-9{padding-top:2.25rem!important;padding-bottom:2.25rem!important}.py-sm-10{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.py-sm-11{padding-top:2.75rem!important;padding-bottom:2.75rem!important}.py-sm-12{padding-top:3rem!important;padding-bottom:3rem!important}.py-sm-13{padding-top:3.25rem!important;padding-bottom:3.25rem!important}.py-sm-14{padding-top:3.5rem!important;padding-bottom:3.5rem!important}.py-sm-15{padding-top:3.75rem!important;padding-bottom:3.75rem!important}.py-sm-16{padding-top:4rem!important;padding-bottom:4rem!important}.py-sm-17{padding-top:4.25rem!important;padding-bottom:4.25rem!important}.py-sm-18{padding-top:4.5rem!important;padding-bottom:4.5rem!important}.py-sm-19{padding-top:4.75rem!important;padding-bottom:4.75rem!important}.py-sm-20{padding-top:5rem!important;padding-bottom:5rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:.75rem!important}.pt-sm-4{padding-top:1rem!important}.pt-sm-5{padding-top:1.25rem!important}.pt-sm-6{padding-top:1.5rem!important}.pt-sm-7{padding-top:1.75rem!important}.pt-sm-8{padding-top:2rem!important}.pt-sm-9{padding-top:2.25rem!important}.pt-sm-10{padding-top:2.5rem!important}.pt-sm-11{padding-top:2.75rem!important}.pt-sm-12{padding-top:3rem!important}.pt-sm-13{padding-top:3.25rem!important}.pt-sm-14{padding-top:3.5rem!important}.pt-sm-15{padding-top:3.75rem!important}.pt-sm-16{padding-top:4rem!important}.pt-sm-17{padding-top:4.25rem!important}.pt-sm-18{padding-top:4.5rem!important}.pt-sm-19{padding-top:4.75rem!important}.pt-sm-20{padding-top:5rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:.75rem!important}.pe-sm-4{padding-right:1rem!important}.pe-sm-5{padding-right:1.25rem!important}.pe-sm-6{padding-right:1.5rem!important}.pe-sm-7{padding-right:1.75rem!important}.pe-sm-8{padding-right:2rem!important}.pe-sm-9{padding-right:2.25rem!important}.pe-sm-10{padding-right:2.5rem!important}.pe-sm-11{padding-right:2.75rem!important}.pe-sm-12{padding-right:3rem!important}.pe-sm-13{padding-right:3.25rem!important}.pe-sm-14{padding-right:3.5rem!important}.pe-sm-15{padding-right:3.75rem!important}.pe-sm-16{padding-right:4rem!important}.pe-sm-17{padding-right:4.25rem!important}.pe-sm-18{padding-right:4.5rem!important}.pe-sm-19{padding-right:4.75rem!important}.pe-sm-20{padding-right:5rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:.75rem!important}.pb-sm-4{padding-bottom:1rem!important}.pb-sm-5{padding-bottom:1.25rem!important}.pb-sm-6{padding-bottom:1.5rem!important}.pb-sm-7{padding-bottom:1.75rem!important}.pb-sm-8{padding-bottom:2rem!important}.pb-sm-9{padding-bottom:2.25rem!important}.pb-sm-10{padding-bottom:2.5rem!important}.pb-sm-11{padding-bottom:2.75rem!important}.pb-sm-12{padding-bottom:3rem!important}.pb-sm-13{padding-bottom:3.25rem!important}.pb-sm-14{padding-bottom:3.5rem!important}.pb-sm-15{padding-bottom:3.75rem!important}.pb-sm-16{padding-bottom:4rem!important}.pb-sm-17{padding-bottom:4.25rem!important}.pb-sm-18{padding-bottom:4.5rem!important}.pb-sm-19{padding-bottom:4.75rem!important}.pb-sm-20{padding-bottom:5rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:.75rem!important}.ps-sm-4{padding-left:1rem!important}.ps-sm-5{padding-left:1.25rem!important}.ps-sm-6{padding-left:1.5rem!important}.ps-sm-7{padding-left:1.75rem!important}.ps-sm-8{padding-left:2rem!important}.ps-sm-9{padding-left:2.25rem!important}.ps-sm-10{padding-left:2.5rem!important}.ps-sm-11{padding-left:2.75rem!important}.ps-sm-12{padding-left:3rem!important}.ps-sm-13{padding-left:3.25rem!important}.ps-sm-14{padding-left:3.5rem!important}.ps-sm-15{padding-left:3.75rem!important}.ps-sm-16{padding-left:4rem!important}.ps-sm-17{padding-left:4.25rem!important}.ps-sm-18{padding-left:4.5rem!important}.ps-sm-19{padding-left:4.75rem!important}.ps-sm-20{padding-left:5rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:.75rem!important}.gap-sm-4{gap:1rem!important}.gap-sm-5{gap:1.25rem!important}.gap-sm-6{gap:1.5rem!important}.gap-sm-7{gap:1.75rem!important}.gap-sm-8{gap:2rem!important}.gap-sm-9{gap:2.25rem!important}.gap-sm-10{gap:2.5rem!important}.gap-sm-11{gap:2.75rem!important}.gap-sm-12{gap:3rem!important}.gap-sm-13{gap:3.25rem!important}.gap-sm-14{gap:3.5rem!important}.gap-sm-15{gap:3.75rem!important}.gap-sm-16{gap:4rem!important}.gap-sm-17{gap:4.25rem!important}.gap-sm-18{gap:4.5rem!important}.gap-sm-19{gap:4.75rem!important}.gap-sm-20{gap:5rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:.75rem!important}.row-gap-sm-4{row-gap:1rem!important}.row-gap-sm-5{row-gap:1.25rem!important}.row-gap-sm-6{row-gap:1.5rem!important}.row-gap-sm-7{row-gap:1.75rem!important}.row-gap-sm-8{row-gap:2rem!important}.row-gap-sm-9{row-gap:2.25rem!important}.row-gap-sm-10{row-gap:2.5rem!important}.row-gap-sm-11{row-gap:2.75rem!important}.row-gap-sm-12{row-gap:3rem!important}.row-gap-sm-13{row-gap:3.25rem!important}.row-gap-sm-14{row-gap:3.5rem!important}.row-gap-sm-15{row-gap:3.75rem!important}.row-gap-sm-16{row-gap:4rem!important}.row-gap-sm-17{row-gap:4.25rem!important}.row-gap-sm-18{row-gap:4.5rem!important}.row-gap-sm-19{row-gap:4.75rem!important}.row-gap-sm-20{row-gap:5rem!important}.column-gap-sm-0{column-gap:0!important}.column-gap-sm-1{column-gap:.25rem!important}.column-gap-sm-2{column-gap:.5rem!important}.column-gap-sm-3{column-gap:.75rem!important}.column-gap-sm-4{column-gap:1rem!important}.column-gap-sm-5{column-gap:1.25rem!important}.column-gap-sm-6{column-gap:1.5rem!important}.column-gap-sm-7{column-gap:1.75rem!important}.column-gap-sm-8{column-gap:2rem!important}.column-gap-sm-9{column-gap:2.25rem!important}.column-gap-sm-10{column-gap:2.5rem!important}.column-gap-sm-11{column-gap:2.75rem!important}.column-gap-sm-12{column-gap:3rem!important}.column-gap-sm-13{column-gap:3.25rem!important}.column-gap-sm-14{column-gap:3.5rem!important}.column-gap-sm-15{column-gap:3.75rem!important}.column-gap-sm-16{column-gap:4rem!important}.column-gap-sm-17{column-gap:4.25rem!important}.column-gap-sm-18{column-gap:4.5rem!important}.column-gap-sm-19{column-gap:4.75rem!important}.column-gap-sm-20{column-gap:5rem!important}.fs-sm-1{font-size:calc(1.3rem + .6vw)!important}.fs-sm-2{font-size:calc(1.275rem + .3vw)!important}.fs-sm-3{font-size:calc(1.26rem + .12vw)!important}.fs-sm-4{font-size:1.25rem!important}.fs-sm-5{font-size:1.15rem!important}.fs-sm-6{font-size:1.075rem!important}.fs-sm-7{font-size:.95rem!important}.fs-sm-8{font-size:.85rem!important}.fs-sm-9{font-size:.75rem!important}.fs-sm-10{font-size:.5rem!important}.fs-sm-sm{font-size:.95rem!important}.fs-sm-base{font-size:1rem!important}.fs-sm-lg{font-size:1.075rem!important}.fs-sm-xl{font-size:1.21rem!important}.fs-sm-fluid{font-size:100%!important}.fs-sm-2x{font-size:calc(1.325rem + .9vw)!important}.fs-sm-2qx{font-size:calc(1.35rem + 1.2vw)!important}.fs-sm-2hx{font-size:calc(1.375rem + 1.5vw)!important}.fs-sm-2tx{font-size:calc(1.4rem + 1.8vw)!important}.fs-sm-3x{font-size:calc(1.425rem + 2.1vw)!important}.fs-sm-3qx{font-size:calc(1.45rem + 2.4vw)!important}.fs-sm-3hx{font-size:calc(1.475rem + 2.7vw)!important}.fs-sm-3tx{font-size:calc(1.5rem + 3vw)!important}.fs-sm-4x{font-size:calc(1.525rem + 3.3vw)!important}.fs-sm-4qx{font-size:calc(1.55rem + 3.6vw)!important}.fs-sm-4hx{font-size:calc(1.575rem + 3.9vw)!important}.fs-sm-4tx{font-size:calc(1.6rem + 4.2vw)!important}.fs-sm-5x{font-size:calc(1.625rem + 4.5vw)!important}.fs-sm-5qx{font-size:calc(1.65rem + 4.8vw)!important}.fs-sm-5hx{font-size:calc(1.675rem + 5.1vw)!important}.fs-sm-5tx{font-size:calc(1.7rem + 5.4vw)!important}.fs-sm-6x{font-size:calc(1.725rem + 5.7vw)!important}.fs-sm-6qx{font-size:calc(1.75rem + 6vw)!important}.fs-sm-6hx{font-size:calc(1.775rem + 6.3vw)!important}.fs-sm-6tx{font-size:calc(1.8rem + 6.6vw)!important}.fs-sm-7x{font-size:calc(1.825rem + 6.9vw)!important}.fs-sm-7qx{font-size:calc(1.85rem + 7.2vw)!important}.fs-sm-7hx{font-size:calc(1.875rem + 7.5vw)!important}.fs-sm-7tx{font-size:calc(1.9rem + 7.8vw)!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}.min-w-sm-unset{min-width:unset!important}.min-w-sm-25{min-width:25%!important}.min-w-sm-50{min-width:50%!important}.min-w-sm-75{min-width:75%!important}.min-w-sm-100{min-width:100%!important}.min-w-sm-auto{min-width:auto!important}.min-w-sm-1px{min-width:1px!important}.min-w-sm-2px{min-width:2px!important}.min-w-sm-3px{min-width:3px!important}.min-w-sm-4px{min-width:4px!important}.min-w-sm-5px{min-width:5px!important}.min-w-sm-6px{min-width:6px!important}.min-w-sm-7px{min-width:7px!important}.min-w-sm-8px{min-width:8px!important}.min-w-sm-9px{min-width:9px!important}.min-w-sm-10px{min-width:10px!important}.min-w-sm-15px{min-width:15px!important}.min-w-sm-20px{min-width:20px!important}.min-w-sm-25px{min-width:25px!important}.min-w-sm-30px{min-width:30px!important}.min-w-sm-35px{min-width:35px!important}.min-w-sm-40px{min-width:40px!important}.min-w-sm-45px{min-width:45px!important}.min-w-sm-50px{min-width:50px!important}.min-w-sm-55px{min-width:55px!important}.min-w-sm-60px{min-width:60px!important}.min-w-sm-65px{min-width:65px!important}.min-w-sm-70px{min-width:70px!important}.min-w-sm-75px{min-width:75px!important}.min-w-sm-80px{min-width:80px!important}.min-w-sm-85px{min-width:85px!important}.min-w-sm-90px{min-width:90px!important}.min-w-sm-95px{min-width:95px!important}.min-w-sm-100px{min-width:100px!important}.min-w-sm-125px{min-width:125px!important}.min-w-sm-150px{min-width:150px!important}.min-w-sm-175px{min-width:175px!important}.min-w-sm-200px{min-width:200px!important}.min-w-sm-225px{min-width:225px!important}.min-w-sm-250px{min-width:250px!important}.min-w-sm-275px{min-width:275px!important}.min-w-sm-300px{min-width:300px!important}.min-w-sm-325px{min-width:325px!important}.min-w-sm-350px{min-width:350px!important}.min-w-sm-375px{min-width:375px!important}.min-w-sm-400px{min-width:400px!important}.min-w-sm-425px{min-width:425px!important}.min-w-sm-450px{min-width:450px!important}.min-w-sm-475px{min-width:475px!important}.min-w-sm-500px{min-width:500px!important}.min-w-sm-550px{min-width:550px!important}.min-w-sm-600px{min-width:600px!important}.min-w-sm-650px{min-width:650px!important}.min-w-sm-700px{min-width:700px!important}.min-w-sm-750px{min-width:750px!important}.min-w-sm-800px{min-width:800px!important}.min-w-sm-850px{min-width:850px!important}.min-w-sm-900px{min-width:900px!important}.min-w-sm-950px{min-width:950px!important}.min-w-sm-1000px{min-width:1000px!important}.min-h-sm-unset{min-height:unset!important}.min-h-sm-25{min-height:25%!important}.min-h-sm-50{min-height:50%!important}.min-h-sm-75{min-height:75%!important}.min-h-sm-100{min-height:100%!important}.min-h-sm-auto{min-height:auto!important}.min-h-sm-1px{min-height:1px!important}.min-h-sm-2px{min-height:2px!important}.min-h-sm-3px{min-height:3px!important}.min-h-sm-4px{min-height:4px!important}.min-h-sm-5px{min-height:5px!important}.min-h-sm-6px{min-height:6px!important}.min-h-sm-7px{min-height:7px!important}.min-h-sm-8px{min-height:8px!important}.min-h-sm-9px{min-height:9px!important}.min-h-sm-10px{min-height:10px!important}.min-h-sm-15px{min-height:15px!important}.min-h-sm-20px{min-height:20px!important}.min-h-sm-25px{min-height:25px!important}.min-h-sm-30px{min-height:30px!important}.min-h-sm-35px{min-height:35px!important}.min-h-sm-40px{min-height:40px!important}.min-h-sm-45px{min-height:45px!important}.min-h-sm-50px{min-height:50px!important}.min-h-sm-55px{min-height:55px!important}.min-h-sm-60px{min-height:60px!important}.min-h-sm-65px{min-height:65px!important}.min-h-sm-70px{min-height:70px!important}.min-h-sm-75px{min-height:75px!important}.min-h-sm-80px{min-height:80px!important}.min-h-sm-85px{min-height:85px!important}.min-h-sm-90px{min-height:90px!important}.min-h-sm-95px{min-height:95px!important}.min-h-sm-100px{min-height:100px!important}.min-h-sm-125px{min-height:125px!important}.min-h-sm-150px{min-height:150px!important}.min-h-sm-175px{min-height:175px!important}.min-h-sm-200px{min-height:200px!important}.min-h-sm-225px{min-height:225px!important}.min-h-sm-250px{min-height:250px!important}.min-h-sm-275px{min-height:275px!important}.min-h-sm-300px{min-height:300px!important}.min-h-sm-325px{min-height:325px!important}.min-h-sm-350px{min-height:350px!important}.min-h-sm-375px{min-height:375px!important}.min-h-sm-400px{min-height:400px!important}.min-h-sm-425px{min-height:425px!important}.min-h-sm-450px{min-height:450px!important}.min-h-sm-475px{min-height:475px!important}.min-h-sm-500px{min-height:500px!important}.min-h-sm-550px{min-height:550px!important}.min-h-sm-600px{min-height:600px!important}.min-h-sm-650px{min-height:650px!important}.min-h-sm-700px{min-height:700px!important}.min-h-sm-750px{min-height:750px!important}.min-h-sm-800px{min-height:800px!important}.min-h-sm-850px{min-height:850px!important}.min-h-sm-900px{min-height:900px!important}.min-h-sm-950px{min-height:950px!important}.min-h-sm-1000px{min-height:1000px!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{object-fit:contain!important}.object-fit-md-cover{object-fit:cover!important}.object-fit-md-fill{object-fit:fill!important}.object-fit-md-scale{object-fit:scale-down!important}.object-fit-md-none{object-fit:none!important}.overflow-md-auto{overflow:auto!important}.overflow-md-hidden{overflow:hidden!important}.overflow-md-visible{overflow:visible!important}.overflow-md-scroll{overflow:scroll!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}.position-md-static{position:static!important}.position-md-relative{position:relative!important}.position-md-absolute{position:absolute!important}.position-md-fixed{position:fixed!important}.position-md-sticky{position:sticky!important}.w-md-unset{width:unset!important}.w-md-25{width:25%!important}.w-md-50{width:50%!important}.w-md-75{width:75%!important}.w-md-100{width:100%!important}.w-md-auto{width:auto!important}.w-md-1px{width:1px!important}.w-md-2px{width:2px!important}.w-md-3px{width:3px!important}.w-md-4px{width:4px!important}.w-md-5px{width:5px!important}.w-md-6px{width:6px!important}.w-md-7px{width:7px!important}.w-md-8px{width:8px!important}.w-md-9px{width:9px!important}.w-md-10px{width:10px!important}.w-md-15px{width:15px!important}.w-md-20px{width:20px!important}.w-md-25px{width:25px!important}.w-md-30px{width:30px!important}.w-md-35px{width:35px!important}.w-md-40px{width:40px!important}.w-md-45px{width:45px!important}.w-md-50px{width:50px!important}.w-md-55px{width:55px!important}.w-md-60px{width:60px!important}.w-md-65px{width:65px!important}.w-md-70px{width:70px!important}.w-md-75px{width:75px!important}.w-md-80px{width:80px!important}.w-md-85px{width:85px!important}.w-md-90px{width:90px!important}.w-md-95px{width:95px!important}.w-md-100px{width:100px!important}.w-md-125px{width:125px!important}.w-md-150px{width:150px!important}.w-md-175px{width:175px!important}.w-md-200px{width:200px!important}.w-md-225px{width:225px!important}.w-md-250px{width:250px!important}.w-md-275px{width:275px!important}.w-md-300px{width:300px!important}.w-md-325px{width:325px!important}.w-md-350px{width:350px!important}.w-md-375px{width:375px!important}.w-md-400px{width:400px!important}.w-md-425px{width:425px!important}.w-md-450px{width:450px!important}.w-md-475px{width:475px!important}.w-md-500px{width:500px!important}.w-md-550px{width:550px!important}.w-md-600px{width:600px!important}.w-md-650px{width:650px!important}.w-md-700px{width:700px!important}.w-md-750px{width:750px!important}.w-md-800px{width:800px!important}.w-md-850px{width:850px!important}.w-md-900px{width:900px!important}.w-md-950px{width:950px!important}.w-md-1000px{width:1000px!important}.mw-md-unset{max-width:unset!important}.mw-md-25{max-width:25%!important}.mw-md-50{max-width:50%!important}.mw-md-75{max-width:75%!important}.mw-md-100{max-width:100%!important}.mw-md-auto{max-width:auto!important}.mw-md-1px{max-width:1px!important}.mw-md-2px{max-width:2px!important}.mw-md-3px{max-width:3px!important}.mw-md-4px{max-width:4px!important}.mw-md-5px{max-width:5px!important}.mw-md-6px{max-width:6px!important}.mw-md-7px{max-width:7px!important}.mw-md-8px{max-width:8px!important}.mw-md-9px{max-width:9px!important}.mw-md-10px{max-width:10px!important}.mw-md-15px{max-width:15px!important}.mw-md-20px{max-width:20px!important}.mw-md-25px{max-width:25px!important}.mw-md-30px{max-width:30px!important}.mw-md-35px{max-width:35px!important}.mw-md-40px{max-width:40px!important}.mw-md-45px{max-width:45px!important}.mw-md-50px{max-width:50px!important}.mw-md-55px{max-width:55px!important}.mw-md-60px{max-width:60px!important}.mw-md-65px{max-width:65px!important}.mw-md-70px{max-width:70px!important}.mw-md-75px{max-width:75px!important}.mw-md-80px{max-width:80px!important}.mw-md-85px{max-width:85px!important}.mw-md-90px{max-width:90px!important}.mw-md-95px{max-width:95px!important}.mw-md-100px{max-width:100px!important}.mw-md-125px{max-width:125px!important}.mw-md-150px{max-width:150px!important}.mw-md-175px{max-width:175px!important}.mw-md-200px{max-width:200px!important}.mw-md-225px{max-width:225px!important}.mw-md-250px{max-width:250px!important}.mw-md-275px{max-width:275px!important}.mw-md-300px{max-width:300px!important}.mw-md-325px{max-width:325px!important}.mw-md-350px{max-width:350px!important}.mw-md-375px{max-width:375px!important}.mw-md-400px{max-width:400px!important}.mw-md-425px{max-width:425px!important}.mw-md-450px{max-width:450px!important}.mw-md-475px{max-width:475px!important}.mw-md-500px{max-width:500px!important}.mw-md-550px{max-width:550px!important}.mw-md-600px{max-width:600px!important}.mw-md-650px{max-width:650px!important}.mw-md-700px{max-width:700px!important}.mw-md-750px{max-width:750px!important}.mw-md-800px{max-width:800px!important}.mw-md-850px{max-width:850px!important}.mw-md-900px{max-width:900px!important}.mw-md-950px{max-width:950px!important}.mw-md-1000px{max-width:1000px!important}.h-md-unset{height:unset!important}.h-md-25{height:25%!important}.h-md-50{height:50%!important}.h-md-75{height:75%!important}.h-md-100{height:100%!important}.h-md-auto{height:auto!important}.h-md-1px{height:1px!important}.h-md-2px{height:2px!important}.h-md-3px{height:3px!important}.h-md-4px{height:4px!important}.h-md-5px{height:5px!important}.h-md-6px{height:6px!important}.h-md-7px{height:7px!important}.h-md-8px{height:8px!important}.h-md-9px{height:9px!important}.h-md-10px{height:10px!important}.h-md-15px{height:15px!important}.h-md-20px{height:20px!important}.h-md-25px{height:25px!important}.h-md-30px{height:30px!important}.h-md-35px{height:35px!important}.h-md-40px{height:40px!important}.h-md-45px{height:45px!important}.h-md-50px{height:50px!important}.h-md-55px{height:55px!important}.h-md-60px{height:60px!important}.h-md-65px{height:65px!important}.h-md-70px{height:70px!important}.h-md-75px{height:75px!important}.h-md-80px{height:80px!important}.h-md-85px{height:85px!important}.h-md-90px{height:90px!important}.h-md-95px{height:95px!important}.h-md-100px{height:100px!important}.h-md-125px{height:125px!important}.h-md-150px{height:150px!important}.h-md-175px{height:175px!important}.h-md-200px{height:200px!important}.h-md-225px{height:225px!important}.h-md-250px{height:250px!important}.h-md-275px{height:275px!important}.h-md-300px{height:300px!important}.h-md-325px{height:325px!important}.h-md-350px{height:350px!important}.h-md-375px{height:375px!important}.h-md-400px{height:400px!important}.h-md-425px{height:425px!important}.h-md-450px{height:450px!important}.h-md-475px{height:475px!important}.h-md-500px{height:500px!important}.h-md-550px{height:550px!important}.h-md-600px{height:600px!important}.h-md-650px{height:650px!important}.h-md-700px{height:700px!important}.h-md-750px{height:750px!important}.h-md-800px{height:800px!important}.h-md-850px{height:850px!important}.h-md-900px{height:900px!important}.h-md-950px{height:950px!important}.h-md-1000px{height:1000px!important}.mh-md-unset{max-height:unset!important}.mh-md-25{max-height:25%!important}.mh-md-50{max-height:50%!important}.mh-md-75{max-height:75%!important}.mh-md-100{max-height:100%!important}.mh-md-auto{max-height:auto!important}.mh-md-1px{max-height:1px!important}.mh-md-2px{max-height:2px!important}.mh-md-3px{max-height:3px!important}.mh-md-4px{max-height:4px!important}.mh-md-5px{max-height:5px!important}.mh-md-6px{max-height:6px!important}.mh-md-7px{max-height:7px!important}.mh-md-8px{max-height:8px!important}.mh-md-9px{max-height:9px!important}.mh-md-10px{max-height:10px!important}.mh-md-15px{max-height:15px!important}.mh-md-20px{max-height:20px!important}.mh-md-25px{max-height:25px!important}.mh-md-30px{max-height:30px!important}.mh-md-35px{max-height:35px!important}.mh-md-40px{max-height:40px!important}.mh-md-45px{max-height:45px!important}.mh-md-50px{max-height:50px!important}.mh-md-55px{max-height:55px!important}.mh-md-60px{max-height:60px!important}.mh-md-65px{max-height:65px!important}.mh-md-70px{max-height:70px!important}.mh-md-75px{max-height:75px!important}.mh-md-80px{max-height:80px!important}.mh-md-85px{max-height:85px!important}.mh-md-90px{max-height:90px!important}.mh-md-95px{max-height:95px!important}.mh-md-100px{max-height:100px!important}.mh-md-125px{max-height:125px!important}.mh-md-150px{max-height:150px!important}.mh-md-175px{max-height:175px!important}.mh-md-200px{max-height:200px!important}.mh-md-225px{max-height:225px!important}.mh-md-250px{max-height:250px!important}.mh-md-275px{max-height:275px!important}.mh-md-300px{max-height:300px!important}.mh-md-325px{max-height:325px!important}.mh-md-350px{max-height:350px!important}.mh-md-375px{max-height:375px!important}.mh-md-400px{max-height:400px!important}.mh-md-425px{max-height:425px!important}.mh-md-450px{max-height:450px!important}.mh-md-475px{max-height:475px!important}.mh-md-500px{max-height:500px!important}.mh-md-550px{max-height:550px!important}.mh-md-600px{max-height:600px!important}.mh-md-650px{max-height:650px!important}.mh-md-700px{max-height:700px!important}.mh-md-750px{max-height:750px!important}.mh-md-800px{max-height:800px!important}.mh-md-850px{max-height:850px!important}.mh-md-900px{max-height:900px!important}.mh-md-950px{max-height:950px!important}.mh-md-1000px{max-height:1000px!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:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:.75rem!important}.m-md-4{margin:1rem!important}.m-md-5{margin:1.25rem!important}.m-md-6{margin:1.5rem!important}.m-md-7{margin:1.75rem!important}.m-md-8{margin:2rem!important}.m-md-9{margin:2.25rem!important}.m-md-10{margin:2.5rem!important}.m-md-11{margin:2.75rem!important}.m-md-12{margin:3rem!important}.m-md-13{margin:3.25rem!important}.m-md-14{margin:3.5rem!important}.m-md-15{margin:3.75rem!important}.m-md-16{margin:4rem!important}.m-md-17{margin:4.25rem!important}.m-md-18{margin:4.5rem!important}.m-md-19{margin:4.75rem!important}.m-md-20{margin:5rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:.75rem!important;margin-left:.75rem!important}.mx-md-4{margin-right:1rem!important;margin-left:1rem!important}.mx-md-5{margin-right:1.25rem!important;margin-left:1.25rem!important}.mx-md-6{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-7{margin-right:1.75rem!important;margin-left:1.75rem!important}.mx-md-8{margin-right:2rem!important;margin-left:2rem!important}.mx-md-9{margin-right:2.25rem!important;margin-left:2.25rem!important}.mx-md-10{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-md-11{margin-right:2.75rem!important;margin-left:2.75rem!important}.mx-md-12{margin-right:3rem!important;margin-left:3rem!important}.mx-md-13{margin-right:3.25rem!important;margin-left:3.25rem!important}.mx-md-14{margin-right:3.5rem!important;margin-left:3.5rem!important}.mx-md-15{margin-right:3.75rem!important;margin-left:3.75rem!important}.mx-md-16{margin-right:4rem!important;margin-left:4rem!important}.mx-md-17{margin-right:4.25rem!important;margin-left:4.25rem!important}.mx-md-18{margin-right:4.5rem!important;margin-left:4.5rem!important}.mx-md-19{margin-right:4.75rem!important;margin-left:4.75rem!important}.mx-md-20{margin-right:5rem!important;margin-left:5rem!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:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.my-md-4{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-5{margin-top:1.25rem!important;margin-bottom:1.25rem!important}.my-md-6{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-7{margin-top:1.75rem!important;margin-bottom:1.75rem!important}.my-md-8{margin-top:2rem!important;margin-bottom:2rem!important}.my-md-9{margin-top:2.25rem!important;margin-bottom:2.25rem!important}.my-md-10{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-md-11{margin-top:2.75rem!important;margin-bottom:2.75rem!important}.my-md-12{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-13{margin-top:3.25rem!important;margin-bottom:3.25rem!important}.my-md-14{margin-top:3.5rem!important;margin-bottom:3.5rem!important}.my-md-15{margin-top:3.75rem!important;margin-bottom:3.75rem!important}.my-md-16{margin-top:4rem!important;margin-bottom:4rem!important}.my-md-17{margin-top:4.25rem!important;margin-bottom:4.25rem!important}.my-md-18{margin-top:4.5rem!important;margin-bottom:4.5rem!important}.my-md-19{margin-top:4.75rem!important;margin-bottom:4.75rem!important}.my-md-20{margin-top:5rem!important;margin-bottom:5rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:.75rem!important}.mt-md-4{margin-top:1rem!important}.mt-md-5{margin-top:1.25rem!important}.mt-md-6{margin-top:1.5rem!important}.mt-md-7{margin-top:1.75rem!important}.mt-md-8{margin-top:2rem!important}.mt-md-9{margin-top:2.25rem!important}.mt-md-10{margin-top:2.5rem!important}.mt-md-11{margin-top:2.75rem!important}.mt-md-12{margin-top:3rem!important}.mt-md-13{margin-top:3.25rem!important}.mt-md-14{margin-top:3.5rem!important}.mt-md-15{margin-top:3.75rem!important}.mt-md-16{margin-top:4rem!important}.mt-md-17{margin-top:4.25rem!important}.mt-md-18{margin-top:4.5rem!important}.mt-md-19{margin-top:4.75rem!important}.mt-md-20{margin-top:5rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:.75rem!important}.me-md-4{margin-right:1rem!important}.me-md-5{margin-right:1.25rem!important}.me-md-6{margin-right:1.5rem!important}.me-md-7{margin-right:1.75rem!important}.me-md-8{margin-right:2rem!important}.me-md-9{margin-right:2.25rem!important}.me-md-10{margin-right:2.5rem!important}.me-md-11{margin-right:2.75rem!important}.me-md-12{margin-right:3rem!important}.me-md-13{margin-right:3.25rem!important}.me-md-14{margin-right:3.5rem!important}.me-md-15{margin-right:3.75rem!important}.me-md-16{margin-right:4rem!important}.me-md-17{margin-right:4.25rem!important}.me-md-18{margin-right:4.5rem!important}.me-md-19{margin-right:4.75rem!important}.me-md-20{margin-right:5rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:.75rem!important}.mb-md-4{margin-bottom:1rem!important}.mb-md-5{margin-bottom:1.25rem!important}.mb-md-6{margin-bottom:1.5rem!important}.mb-md-7{margin-bottom:1.75rem!important}.mb-md-8{margin-bottom:2rem!important}.mb-md-9{margin-bottom:2.25rem!important}.mb-md-10{margin-bottom:2.5rem!important}.mb-md-11{margin-bottom:2.75rem!important}.mb-md-12{margin-bottom:3rem!important}.mb-md-13{margin-bottom:3.25rem!important}.mb-md-14{margin-bottom:3.5rem!important}.mb-md-15{margin-bottom:3.75rem!important}.mb-md-16{margin-bottom:4rem!important}.mb-md-17{margin-bottom:4.25rem!important}.mb-md-18{margin-bottom:4.5rem!important}.mb-md-19{margin-bottom:4.75rem!important}.mb-md-20{margin-bottom:5rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:.75rem!important}.ms-md-4{margin-left:1rem!important}.ms-md-5{margin-left:1.25rem!important}.ms-md-6{margin-left:1.5rem!important}.ms-md-7{margin-left:1.75rem!important}.ms-md-8{margin-left:2rem!important}.ms-md-9{margin-left:2.25rem!important}.ms-md-10{margin-left:2.5rem!important}.ms-md-11{margin-left:2.75rem!important}.ms-md-12{margin-left:3rem!important}.ms-md-13{margin-left:3.25rem!important}.ms-md-14{margin-left:3.5rem!important}.ms-md-15{margin-left:3.75rem!important}.ms-md-16{margin-left:4rem!important}.ms-md-17{margin-left:4.25rem!important}.ms-md-18{margin-left:4.5rem!important}.ms-md-19{margin-left:4.75rem!important}.ms-md-20{margin-left:5rem!important}.ms-md-auto{margin-left:auto!important}.m-md-n1{margin:-.25rem!important}.m-md-n2{margin:-.5rem!important}.m-md-n3{margin:-.75rem!important}.m-md-n4{margin:-1rem!important}.m-md-n5{margin:-1.25rem!important}.m-md-n6{margin:-1.5rem!important}.m-md-n7{margin:-1.75rem!important}.m-md-n8{margin:-2rem!important}.m-md-n9{margin:-2.25rem!important}.m-md-n10{margin:-2.5rem!important}.m-md-n11{margin:-2.75rem!important}.m-md-n12{margin:-3rem!important}.m-md-n13{margin:-3.25rem!important}.m-md-n14{margin:-3.5rem!important}.m-md-n15{margin:-3.75rem!important}.m-md-n16{margin:-4rem!important}.m-md-n17{margin:-4.25rem!important}.m-md-n18{margin:-4.5rem!important}.m-md-n19{margin:-4.75rem!important}.m-md-n20{margin:-5rem!important}.mx-md-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-md-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-md-n3{margin-right:-.75rem!important;margin-left:-.75rem!important}.mx-md-n4{margin-right:-1rem!important;margin-left:-1rem!important}.mx-md-n5{margin-right:-1.25rem!important;margin-left:-1.25rem!important}.mx-md-n6{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-md-n7{margin-right:-1.75rem!important;margin-left:-1.75rem!important}.mx-md-n8{margin-right:-2rem!important;margin-left:-2rem!important}.mx-md-n9{margin-right:-2.25rem!important;margin-left:-2.25rem!important}.mx-md-n10{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.mx-md-n11{margin-right:-2.75rem!important;margin-left:-2.75rem!important}.mx-md-n12{margin-right:-3rem!important;margin-left:-3rem!important}.mx-md-n13{margin-right:-3.25rem!important;margin-left:-3.25rem!important}.mx-md-n14{margin-right:-3.5rem!important;margin-left:-3.5rem!important}.mx-md-n15{margin-right:-3.75rem!important;margin-left:-3.75rem!important}.mx-md-n16{margin-right:-4rem!important;margin-left:-4rem!important}.mx-md-n17{margin-right:-4.25rem!important;margin-left:-4.25rem!important}.mx-md-n18{margin-right:-4.5rem!important;margin-left:-4.5rem!important}.mx-md-n19{margin-right:-4.75rem!important;margin-left:-4.75rem!important}.mx-md-n20{margin-right:-5rem!important;margin-left:-5rem!important}.my-md-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-md-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-md-n3{margin-top:-.75rem!important;margin-bottom:-.75rem!important}.my-md-n4{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-md-n5{margin-top:-1.25rem!important;margin-bottom:-1.25rem!important}.my-md-n6{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-md-n7{margin-top:-1.75rem!important;margin-bottom:-1.75rem!important}.my-md-n8{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-md-n9{margin-top:-2.25rem!important;margin-bottom:-2.25rem!important}.my-md-n10{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.my-md-n11{margin-top:-2.75rem!important;margin-bottom:-2.75rem!important}.my-md-n12{margin-top:-3rem!important;margin-bottom:-3rem!important}.my-md-n13{margin-top:-3.25rem!important;margin-bottom:-3.25rem!important}.my-md-n14{margin-top:-3.5rem!important;margin-bottom:-3.5rem!important}.my-md-n15{margin-top:-3.75rem!important;margin-bottom:-3.75rem!important}.my-md-n16{margin-top:-4rem!important;margin-bottom:-4rem!important}.my-md-n17{margin-top:-4.25rem!important;margin-bottom:-4.25rem!important}.my-md-n18{margin-top:-4.5rem!important;margin-bottom:-4.5rem!important}.my-md-n19{margin-top:-4.75rem!important;margin-bottom:-4.75rem!important}.my-md-n20{margin-top:-5rem!important;margin-bottom:-5rem!important}.mt-md-n1{margin-top:-.25rem!important}.mt-md-n2{margin-top:-.5rem!important}.mt-md-n3{margin-top:-.75rem!important}.mt-md-n4{margin-top:-1rem!important}.mt-md-n5{margin-top:-1.25rem!important}.mt-md-n6{margin-top:-1.5rem!important}.mt-md-n7{margin-top:-1.75rem!important}.mt-md-n8{margin-top:-2rem!important}.mt-md-n9{margin-top:-2.25rem!important}.mt-md-n10{margin-top:-2.5rem!important}.mt-md-n11{margin-top:-2.75rem!important}.mt-md-n12{margin-top:-3rem!important}.mt-md-n13{margin-top:-3.25rem!important}.mt-md-n14{margin-top:-3.5rem!important}.mt-md-n15{margin-top:-3.75rem!important}.mt-md-n16{margin-top:-4rem!important}.mt-md-n17{margin-top:-4.25rem!important}.mt-md-n18{margin-top:-4.5rem!important}.mt-md-n19{margin-top:-4.75rem!important}.mt-md-n20{margin-top:-5rem!important}.me-md-n1{margin-right:-.25rem!important}.me-md-n2{margin-right:-.5rem!important}.me-md-n3{margin-right:-.75rem!important}.me-md-n4{margin-right:-1rem!important}.me-md-n5{margin-right:-1.25rem!important}.me-md-n6{margin-right:-1.5rem!important}.me-md-n7{margin-right:-1.75rem!important}.me-md-n8{margin-right:-2rem!important}.me-md-n9{margin-right:-2.25rem!important}.me-md-n10{margin-right:-2.5rem!important}.me-md-n11{margin-right:-2.75rem!important}.me-md-n12{margin-right:-3rem!important}.me-md-n13{margin-right:-3.25rem!important}.me-md-n14{margin-right:-3.5rem!important}.me-md-n15{margin-right:-3.75rem!important}.me-md-n16{margin-right:-4rem!important}.me-md-n17{margin-right:-4.25rem!important}.me-md-n18{margin-right:-4.5rem!important}.me-md-n19{margin-right:-4.75rem!important}.me-md-n20{margin-right:-5rem!important}.mb-md-n1{margin-bottom:-.25rem!important}.mb-md-n2{margin-bottom:-.5rem!important}.mb-md-n3{margin-bottom:-.75rem!important}.mb-md-n4{margin-bottom:-1rem!important}.mb-md-n5{margin-bottom:-1.25rem!important}.mb-md-n6{margin-bottom:-1.5rem!important}.mb-md-n7{margin-bottom:-1.75rem!important}.mb-md-n8{margin-bottom:-2rem!important}.mb-md-n9{margin-bottom:-2.25rem!important}.mb-md-n10{margin-bottom:-2.5rem!important}.mb-md-n11{margin-bottom:-2.75rem!important}.mb-md-n12{margin-bottom:-3rem!important}.mb-md-n13{margin-bottom:-3.25rem!important}.mb-md-n14{margin-bottom:-3.5rem!important}.mb-md-n15{margin-bottom:-3.75rem!important}.mb-md-n16{margin-bottom:-4rem!important}.mb-md-n17{margin-bottom:-4.25rem!important}.mb-md-n18{margin-bottom:-4.5rem!important}.mb-md-n19{margin-bottom:-4.75rem!important}.mb-md-n20{margin-bottom:-5rem!important}.ms-md-n1{margin-left:-.25rem!important}.ms-md-n2{margin-left:-.5rem!important}.ms-md-n3{margin-left:-.75rem!important}.ms-md-n4{margin-left:-1rem!important}.ms-md-n5{margin-left:-1.25rem!important}.ms-md-n6{margin-left:-1.5rem!important}.ms-md-n7{margin-left:-1.75rem!important}.ms-md-n8{margin-left:-2rem!important}.ms-md-n9{margin-left:-2.25rem!important}.ms-md-n10{margin-left:-2.5rem!important}.ms-md-n11{margin-left:-2.75rem!important}.ms-md-n12{margin-left:-3rem!important}.ms-md-n13{margin-left:-3.25rem!important}.ms-md-n14{margin-left:-3.5rem!important}.ms-md-n15{margin-left:-3.75rem!important}.ms-md-n16{margin-left:-4rem!important}.ms-md-n17{margin-left:-4.25rem!important}.ms-md-n18{margin-left:-4.5rem!important}.ms-md-n19{margin-left:-4.75rem!important}.ms-md-n20{margin-left:-5rem!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:.75rem!important}.p-md-4{padding:1rem!important}.p-md-5{padding:1.25rem!important}.p-md-6{padding:1.5rem!important}.p-md-7{padding:1.75rem!important}.p-md-8{padding:2rem!important}.p-md-9{padding:2.25rem!important}.p-md-10{padding:2.5rem!important}.p-md-11{padding:2.75rem!important}.p-md-12{padding:3rem!important}.p-md-13{padding:3.25rem!important}.p-md-14{padding:3.5rem!important}.p-md-15{padding:3.75rem!important}.p-md-16{padding:4rem!important}.p-md-17{padding:4.25rem!important}.p-md-18{padding:4.5rem!important}.p-md-19{padding:4.75rem!important}.p-md-20{padding:5rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:.75rem!important;padding-left:.75rem!important}.px-md-4{padding-right:1rem!important;padding-left:1rem!important}.px-md-5{padding-right:1.25rem!important;padding-left:1.25rem!important}.px-md-6{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-7{padding-right:1.75rem!important;padding-left:1.75rem!important}.px-md-8{padding-right:2rem!important;padding-left:2rem!important}.px-md-9{padding-right:2.25rem!important;padding-left:2.25rem!important}.px-md-10{padding-right:2.5rem!important;padding-left:2.5rem!important}.px-md-11{padding-right:2.75rem!important;padding-left:2.75rem!important}.px-md-12{padding-right:3rem!important;padding-left:3rem!important}.px-md-13{padding-right:3.25rem!important;padding-left:3.25rem!important}.px-md-14{padding-right:3.5rem!important;padding-left:3.5rem!important}.px-md-15{padding-right:3.75rem!important;padding-left:3.75rem!important}.px-md-16{padding-right:4rem!important;padding-left:4rem!important}.px-md-17{padding-right:4.25rem!important;padding-left:4.25rem!important}.px-md-18{padding-right:4.5rem!important;padding-left:4.5rem!important}.px-md-19{padding-right:4.75rem!important;padding-left:4.75rem!important}.px-md-20{padding-right:5rem!important;padding-left:5rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.py-md-4{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-5{padding-top:1.25rem!important;padding-bottom:1.25rem!important}.py-md-6{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-7{padding-top:1.75rem!important;padding-bottom:1.75rem!important}.py-md-8{padding-top:2rem!important;padding-bottom:2rem!important}.py-md-9{padding-top:2.25rem!important;padding-bottom:2.25rem!important}.py-md-10{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.py-md-11{padding-top:2.75rem!important;padding-bottom:2.75rem!important}.py-md-12{padding-top:3rem!important;padding-bottom:3rem!important}.py-md-13{padding-top:3.25rem!important;padding-bottom:3.25rem!important}.py-md-14{padding-top:3.5rem!important;padding-bottom:3.5rem!important}.py-md-15{padding-top:3.75rem!important;padding-bottom:3.75rem!important}.py-md-16{padding-top:4rem!important;padding-bottom:4rem!important}.py-md-17{padding-top:4.25rem!important;padding-bottom:4.25rem!important}.py-md-18{padding-top:4.5rem!important;padding-bottom:4.5rem!important}.py-md-19{padding-top:4.75rem!important;padding-bottom:4.75rem!important}.py-md-20{padding-top:5rem!important;padding-bottom:5rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:.75rem!important}.pt-md-4{padding-top:1rem!important}.pt-md-5{padding-top:1.25rem!important}.pt-md-6{padding-top:1.5rem!important}.pt-md-7{padding-top:1.75rem!important}.pt-md-8{padding-top:2rem!important}.pt-md-9{padding-top:2.25rem!important}.pt-md-10{padding-top:2.5rem!important}.pt-md-11{padding-top:2.75rem!important}.pt-md-12{padding-top:3rem!important}.pt-md-13{padding-top:3.25rem!important}.pt-md-14{padding-top:3.5rem!important}.pt-md-15{padding-top:3.75rem!important}.pt-md-16{padding-top:4rem!important}.pt-md-17{padding-top:4.25rem!important}.pt-md-18{padding-top:4.5rem!important}.pt-md-19{padding-top:4.75rem!important}.pt-md-20{padding-top:5rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:.75rem!important}.pe-md-4{padding-right:1rem!important}.pe-md-5{padding-right:1.25rem!important}.pe-md-6{padding-right:1.5rem!important}.pe-md-7{padding-right:1.75rem!important}.pe-md-8{padding-right:2rem!important}.pe-md-9{padding-right:2.25rem!important}.pe-md-10{padding-right:2.5rem!important}.pe-md-11{padding-right:2.75rem!important}.pe-md-12{padding-right:3rem!important}.pe-md-13{padding-right:3.25rem!important}.pe-md-14{padding-right:3.5rem!important}.pe-md-15{padding-right:3.75rem!important}.pe-md-16{padding-right:4rem!important}.pe-md-17{padding-right:4.25rem!important}.pe-md-18{padding-right:4.5rem!important}.pe-md-19{padding-right:4.75rem!important}.pe-md-20{padding-right:5rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:.75rem!important}.pb-md-4{padding-bottom:1rem!important}.pb-md-5{padding-bottom:1.25rem!important}.pb-md-6{padding-bottom:1.5rem!important}.pb-md-7{padding-bottom:1.75rem!important}.pb-md-8{padding-bottom:2rem!important}.pb-md-9{padding-bottom:2.25rem!important}.pb-md-10{padding-bottom:2.5rem!important}.pb-md-11{padding-bottom:2.75rem!important}.pb-md-12{padding-bottom:3rem!important}.pb-md-13{padding-bottom:3.25rem!important}.pb-md-14{padding-bottom:3.5rem!important}.pb-md-15{padding-bottom:3.75rem!important}.pb-md-16{padding-bottom:4rem!important}.pb-md-17{padding-bottom:4.25rem!important}.pb-md-18{padding-bottom:4.5rem!important}.pb-md-19{padding-bottom:4.75rem!important}.pb-md-20{padding-bottom:5rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:.75rem!important}.ps-md-4{padding-left:1rem!important}.ps-md-5{padding-left:1.25rem!important}.ps-md-6{padding-left:1.5rem!important}.ps-md-7{padding-left:1.75rem!important}.ps-md-8{padding-left:2rem!important}.ps-md-9{padding-left:2.25rem!important}.ps-md-10{padding-left:2.5rem!important}.ps-md-11{padding-left:2.75rem!important}.ps-md-12{padding-left:3rem!important}.ps-md-13{padding-left:3.25rem!important}.ps-md-14{padding-left:3.5rem!important}.ps-md-15{padding-left:3.75rem!important}.ps-md-16{padding-left:4rem!important}.ps-md-17{padding-left:4.25rem!important}.ps-md-18{padding-left:4.5rem!important}.ps-md-19{padding-left:4.75rem!important}.ps-md-20{padding-left:5rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:.75rem!important}.gap-md-4{gap:1rem!important}.gap-md-5{gap:1.25rem!important}.gap-md-6{gap:1.5rem!important}.gap-md-7{gap:1.75rem!important}.gap-md-8{gap:2rem!important}.gap-md-9{gap:2.25rem!important}.gap-md-10{gap:2.5rem!important}.gap-md-11{gap:2.75rem!important}.gap-md-12{gap:3rem!important}.gap-md-13{gap:3.25rem!important}.gap-md-14{gap:3.5rem!important}.gap-md-15{gap:3.75rem!important}.gap-md-16{gap:4rem!important}.gap-md-17{gap:4.25rem!important}.gap-md-18{gap:4.5rem!important}.gap-md-19{gap:4.75rem!important}.gap-md-20{gap:5rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:.75rem!important}.row-gap-md-4{row-gap:1rem!important}.row-gap-md-5{row-gap:1.25rem!important}.row-gap-md-6{row-gap:1.5rem!important}.row-gap-md-7{row-gap:1.75rem!important}.row-gap-md-8{row-gap:2rem!important}.row-gap-md-9{row-gap:2.25rem!important}.row-gap-md-10{row-gap:2.5rem!important}.row-gap-md-11{row-gap:2.75rem!important}.row-gap-md-12{row-gap:3rem!important}.row-gap-md-13{row-gap:3.25rem!important}.row-gap-md-14{row-gap:3.5rem!important}.row-gap-md-15{row-gap:3.75rem!important}.row-gap-md-16{row-gap:4rem!important}.row-gap-md-17{row-gap:4.25rem!important}.row-gap-md-18{row-gap:4.5rem!important}.row-gap-md-19{row-gap:4.75rem!important}.row-gap-md-20{row-gap:5rem!important}.column-gap-md-0{column-gap:0!important}.column-gap-md-1{column-gap:.25rem!important}.column-gap-md-2{column-gap:.5rem!important}.column-gap-md-3{column-gap:.75rem!important}.column-gap-md-4{column-gap:1rem!important}.column-gap-md-5{column-gap:1.25rem!important}.column-gap-md-6{column-gap:1.5rem!important}.column-gap-md-7{column-gap:1.75rem!important}.column-gap-md-8{column-gap:2rem!important}.column-gap-md-9{column-gap:2.25rem!important}.column-gap-md-10{column-gap:2.5rem!important}.column-gap-md-11{column-gap:2.75rem!important}.column-gap-md-12{column-gap:3rem!important}.column-gap-md-13{column-gap:3.25rem!important}.column-gap-md-14{column-gap:3.5rem!important}.column-gap-md-15{column-gap:3.75rem!important}.column-gap-md-16{column-gap:4rem!important}.column-gap-md-17{column-gap:4.25rem!important}.column-gap-md-18{column-gap:4.5rem!important}.column-gap-md-19{column-gap:4.75rem!important}.column-gap-md-20{column-gap:5rem!important}.fs-md-1{font-size:calc(1.3rem + .6vw)!important}.fs-md-2{font-size:calc(1.275rem + .3vw)!important}.fs-md-3{font-size:calc(1.26rem + .12vw)!important}.fs-md-4{font-size:1.25rem!important}.fs-md-5{font-size:1.15rem!important}.fs-md-6{font-size:1.075rem!important}.fs-md-7{font-size:.95rem!important}.fs-md-8{font-size:.85rem!important}.fs-md-9{font-size:.75rem!important}.fs-md-10{font-size:.5rem!important}.fs-md-sm{font-size:.95rem!important}.fs-md-base{font-size:1rem!important}.fs-md-lg{font-size:1.075rem!important}.fs-md-xl{font-size:1.21rem!important}.fs-md-fluid{font-size:100%!important}.fs-md-2x{font-size:calc(1.325rem + .9vw)!important}.fs-md-2qx{font-size:calc(1.35rem + 1.2vw)!important}.fs-md-2hx{font-size:calc(1.375rem + 1.5vw)!important}.fs-md-2tx{font-size:calc(1.4rem + 1.8vw)!important}.fs-md-3x{font-size:calc(1.425rem + 2.1vw)!important}.fs-md-3qx{font-size:calc(1.45rem + 2.4vw)!important}.fs-md-3hx{font-size:calc(1.475rem + 2.7vw)!important}.fs-md-3tx{font-size:calc(1.5rem + 3vw)!important}.fs-md-4x{font-size:calc(1.525rem + 3.3vw)!important}.fs-md-4qx{font-size:calc(1.55rem + 3.6vw)!important}.fs-md-4hx{font-size:calc(1.575rem + 3.9vw)!important}.fs-md-4tx{font-size:calc(1.6rem + 4.2vw)!important}.fs-md-5x{font-size:calc(1.625rem + 4.5vw)!important}.fs-md-5qx{font-size:calc(1.65rem + 4.8vw)!important}.fs-md-5hx{font-size:calc(1.675rem + 5.1vw)!important}.fs-md-5tx{font-size:calc(1.7rem + 5.4vw)!important}.fs-md-6x{font-size:calc(1.725rem + 5.7vw)!important}.fs-md-6qx{font-size:calc(1.75rem + 6vw)!important}.fs-md-6hx{font-size:calc(1.775rem + 6.3vw)!important}.fs-md-6tx{font-size:calc(1.8rem + 6.6vw)!important}.fs-md-7x{font-size:calc(1.825rem + 6.9vw)!important}.fs-md-7qx{font-size:calc(1.85rem + 7.2vw)!important}.fs-md-7hx{font-size:calc(1.875rem + 7.5vw)!important}.fs-md-7tx{font-size:calc(1.9rem + 7.8vw)!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}.min-w-md-unset{min-width:unset!important}.min-w-md-25{min-width:25%!important}.min-w-md-50{min-width:50%!important}.min-w-md-75{min-width:75%!important}.min-w-md-100{min-width:100%!important}.min-w-md-auto{min-width:auto!important}.min-w-md-1px{min-width:1px!important}.min-w-md-2px{min-width:2px!important}.min-w-md-3px{min-width:3px!important}.min-w-md-4px{min-width:4px!important}.min-w-md-5px{min-width:5px!important}.min-w-md-6px{min-width:6px!important}.min-w-md-7px{min-width:7px!important}.min-w-md-8px{min-width:8px!important}.min-w-md-9px{min-width:9px!important}.min-w-md-10px{min-width:10px!important}.min-w-md-15px{min-width:15px!important}.min-w-md-20px{min-width:20px!important}.min-w-md-25px{min-width:25px!important}.min-w-md-30px{min-width:30px!important}.min-w-md-35px{min-width:35px!important}.min-w-md-40px{min-width:40px!important}.min-w-md-45px{min-width:45px!important}.min-w-md-50px{min-width:50px!important}.min-w-md-55px{min-width:55px!important}.min-w-md-60px{min-width:60px!important}.min-w-md-65px{min-width:65px!important}.min-w-md-70px{min-width:70px!important}.min-w-md-75px{min-width:75px!important}.min-w-md-80px{min-width:80px!important}.min-w-md-85px{min-width:85px!important}.min-w-md-90px{min-width:90px!important}.min-w-md-95px{min-width:95px!important}.min-w-md-100px{min-width:100px!important}.min-w-md-125px{min-width:125px!important}.min-w-md-150px{min-width:150px!important}.min-w-md-175px{min-width:175px!important}.min-w-md-200px{min-width:200px!important}.min-w-md-225px{min-width:225px!important}.min-w-md-250px{min-width:250px!important}.min-w-md-275px{min-width:275px!important}.min-w-md-300px{min-width:300px!important}.min-w-md-325px{min-width:325px!important}.min-w-md-350px{min-width:350px!important}.min-w-md-375px{min-width:375px!important}.min-w-md-400px{min-width:400px!important}.min-w-md-425px{min-width:425px!important}.min-w-md-450px{min-width:450px!important}.min-w-md-475px{min-width:475px!important}.min-w-md-500px{min-width:500px!important}.min-w-md-550px{min-width:550px!important}.min-w-md-600px{min-width:600px!important}.min-w-md-650px{min-width:650px!important}.min-w-md-700px{min-width:700px!important}.min-w-md-750px{min-width:750px!important}.min-w-md-800px{min-width:800px!important}.min-w-md-850px{min-width:850px!important}.min-w-md-900px{min-width:900px!important}.min-w-md-950px{min-width:950px!important}.min-w-md-1000px{min-width:1000px!important}.min-h-md-unset{min-height:unset!important}.min-h-md-25{min-height:25%!important}.min-h-md-50{min-height:50%!important}.min-h-md-75{min-height:75%!important}.min-h-md-100{min-height:100%!important}.min-h-md-auto{min-height:auto!important}.min-h-md-1px{min-height:1px!important}.min-h-md-2px{min-height:2px!important}.min-h-md-3px{min-height:3px!important}.min-h-md-4px{min-height:4px!important}.min-h-md-5px{min-height:5px!important}.min-h-md-6px{min-height:6px!important}.min-h-md-7px{min-height:7px!important}.min-h-md-8px{min-height:8px!important}.min-h-md-9px{min-height:9px!important}.min-h-md-10px{min-height:10px!important}.min-h-md-15px{min-height:15px!important}.min-h-md-20px{min-height:20px!important}.min-h-md-25px{min-height:25px!important}.min-h-md-30px{min-height:30px!important}.min-h-md-35px{min-height:35px!important}.min-h-md-40px{min-height:40px!important}.min-h-md-45px{min-height:45px!important}.min-h-md-50px{min-height:50px!important}.min-h-md-55px{min-height:55px!important}.min-h-md-60px{min-height:60px!important}.min-h-md-65px{min-height:65px!important}.min-h-md-70px{min-height:70px!important}.min-h-md-75px{min-height:75px!important}.min-h-md-80px{min-height:80px!important}.min-h-md-85px{min-height:85px!important}.min-h-md-90px{min-height:90px!important}.min-h-md-95px{min-height:95px!important}.min-h-md-100px{min-height:100px!important}.min-h-md-125px{min-height:125px!important}.min-h-md-150px{min-height:150px!important}.min-h-md-175px{min-height:175px!important}.min-h-md-200px{min-height:200px!important}.min-h-md-225px{min-height:225px!important}.min-h-md-250px{min-height:250px!important}.min-h-md-275px{min-height:275px!important}.min-h-md-300px{min-height:300px!important}.min-h-md-325px{min-height:325px!important}.min-h-md-350px{min-height:350px!important}.min-h-md-375px{min-height:375px!important}.min-h-md-400px{min-height:400px!important}.min-h-md-425px{min-height:425px!important}.min-h-md-450px{min-height:450px!important}.min-h-md-475px{min-height:475px!important}.min-h-md-500px{min-height:500px!important}.min-h-md-550px{min-height:550px!important}.min-h-md-600px{min-height:600px!important}.min-h-md-650px{min-height:650px!important}.min-h-md-700px{min-height:700px!important}.min-h-md-750px{min-height:750px!important}.min-h-md-800px{min-height:800px!important}.min-h-md-850px{min-height:850px!important}.min-h-md-900px{min-height:900px!important}.min-h-md-950px{min-height:950px!important}.min-h-md-1000px{min-height:1000px!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{object-fit:contain!important}.object-fit-lg-cover{object-fit:cover!important}.object-fit-lg-fill{object-fit:fill!important}.object-fit-lg-scale{object-fit:scale-down!important}.object-fit-lg-none{object-fit:none!important}.overflow-lg-auto{overflow:auto!important}.overflow-lg-hidden{overflow:hidden!important}.overflow-lg-visible{overflow:visible!important}.overflow-lg-scroll{overflow:scroll!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}.position-lg-static{position:static!important}.position-lg-relative{position:relative!important}.position-lg-absolute{position:absolute!important}.position-lg-fixed{position:fixed!important}.position-lg-sticky{position:sticky!important}.w-lg-unset{width:unset!important}.w-lg-25{width:25%!important}.w-lg-50{width:50%!important}.w-lg-75{width:75%!important}.w-lg-100{width:100%!important}.w-lg-auto{width:auto!important}.w-lg-1px{width:1px!important}.w-lg-2px{width:2px!important}.w-lg-3px{width:3px!important}.w-lg-4px{width:4px!important}.w-lg-5px{width:5px!important}.w-lg-6px{width:6px!important}.w-lg-7px{width:7px!important}.w-lg-8px{width:8px!important}.w-lg-9px{width:9px!important}.w-lg-10px{width:10px!important}.w-lg-15px{width:15px!important}.w-lg-20px{width:20px!important}.w-lg-25px{width:25px!important}.w-lg-30px{width:30px!important}.w-lg-35px{width:35px!important}.w-lg-40px{width:40px!important}.w-lg-45px{width:45px!important}.w-lg-50px{width:50px!important}.w-lg-55px{width:55px!important}.w-lg-60px{width:60px!important}.w-lg-65px{width:65px!important}.w-lg-70px{width:70px!important}.w-lg-75px{width:75px!important}.w-lg-80px{width:80px!important}.w-lg-85px{width:85px!important}.w-lg-90px{width:90px!important}.w-lg-95px{width:95px!important}.w-lg-100px{width:100px!important}.w-lg-125px{width:125px!important}.w-lg-150px{width:150px!important}.w-lg-175px{width:175px!important}.w-lg-200px{width:200px!important}.w-lg-225px{width:225px!important}.w-lg-250px{width:250px!important}.w-lg-275px{width:275px!important}.w-lg-300px{width:300px!important}.w-lg-325px{width:325px!important}.w-lg-350px{width:350px!important}.w-lg-375px{width:375px!important}.w-lg-400px{width:400px!important}.w-lg-425px{width:425px!important}.w-lg-450px{width:450px!important}.w-lg-475px{width:475px!important}.w-lg-500px{width:500px!important}.w-lg-550px{width:550px!important}.w-lg-600px{width:600px!important}.w-lg-650px{width:650px!important}.w-lg-700px{width:700px!important}.w-lg-750px{width:750px!important}.w-lg-800px{width:800px!important}.w-lg-850px{width:850px!important}.w-lg-900px{width:900px!important}.w-lg-950px{width:950px!important}.w-lg-1000px{width:1000px!important}.mw-lg-unset{max-width:unset!important}.mw-lg-25{max-width:25%!important}.mw-lg-50{max-width:50%!important}.mw-lg-75{max-width:75%!important}.mw-lg-100{max-width:100%!important}.mw-lg-auto{max-width:auto!important}.mw-lg-1px{max-width:1px!important}.mw-lg-2px{max-width:2px!important}.mw-lg-3px{max-width:3px!important}.mw-lg-4px{max-width:4px!important}.mw-lg-5px{max-width:5px!important}.mw-lg-6px{max-width:6px!important}.mw-lg-7px{max-width:7px!important}.mw-lg-8px{max-width:8px!important}.mw-lg-9px{max-width:9px!important}.mw-lg-10px{max-width:10px!important}.mw-lg-15px{max-width:15px!important}.mw-lg-20px{max-width:20px!important}.mw-lg-25px{max-width:25px!important}.mw-lg-30px{max-width:30px!important}.mw-lg-35px{max-width:35px!important}.mw-lg-40px{max-width:40px!important}.mw-lg-45px{max-width:45px!important}.mw-lg-50px{max-width:50px!important}.mw-lg-55px{max-width:55px!important}.mw-lg-60px{max-width:60px!important}.mw-lg-65px{max-width:65px!important}.mw-lg-70px{max-width:70px!important}.mw-lg-75px{max-width:75px!important}.mw-lg-80px{max-width:80px!important}.mw-lg-85px{max-width:85px!important}.mw-lg-90px{max-width:90px!important}.mw-lg-95px{max-width:95px!important}.mw-lg-100px{max-width:100px!important}.mw-lg-125px{max-width:125px!important}.mw-lg-150px{max-width:150px!important}.mw-lg-175px{max-width:175px!important}.mw-lg-200px{max-width:200px!important}.mw-lg-225px{max-width:225px!important}.mw-lg-250px{max-width:250px!important}.mw-lg-275px{max-width:275px!important}.mw-lg-300px{max-width:300px!important}.mw-lg-325px{max-width:325px!important}.mw-lg-350px{max-width:350px!important}.mw-lg-375px{max-width:375px!important}.mw-lg-400px{max-width:400px!important}.mw-lg-425px{max-width:425px!important}.mw-lg-450px{max-width:450px!important}.mw-lg-475px{max-width:475px!important}.mw-lg-500px{max-width:500px!important}.mw-lg-550px{max-width:550px!important}.mw-lg-600px{max-width:600px!important}.mw-lg-650px{max-width:650px!important}.mw-lg-700px{max-width:700px!important}.mw-lg-750px{max-width:750px!important}.mw-lg-800px{max-width:800px!important}.mw-lg-850px{max-width:850px!important}.mw-lg-900px{max-width:900px!important}.mw-lg-950px{max-width:950px!important}.mw-lg-1000px{max-width:1000px!important}.h-lg-unset{height:unset!important}.h-lg-25{height:25%!important}.h-lg-50{height:50%!important}.h-lg-75{height:75%!important}.h-lg-100{height:100%!important}.h-lg-auto{height:auto!important}.h-lg-1px{height:1px!important}.h-lg-2px{height:2px!important}.h-lg-3px{height:3px!important}.h-lg-4px{height:4px!important}.h-lg-5px{height:5px!important}.h-lg-6px{height:6px!important}.h-lg-7px{height:7px!important}.h-lg-8px{height:8px!important}.h-lg-9px{height:9px!important}.h-lg-10px{height:10px!important}.h-lg-15px{height:15px!important}.h-lg-20px{height:20px!important}.h-lg-25px{height:25px!important}.h-lg-30px{height:30px!important}.h-lg-35px{height:35px!important}.h-lg-40px{height:40px!important}.h-lg-45px{height:45px!important}.h-lg-50px{height:50px!important}.h-lg-55px{height:55px!important}.h-lg-60px{height:60px!important}.h-lg-65px{height:65px!important}.h-lg-70px{height:70px!important}.h-lg-75px{height:75px!important}.h-lg-80px{height:80px!important}.h-lg-85px{height:85px!important}.h-lg-90px{height:90px!important}.h-lg-95px{height:95px!important}.h-lg-100px{height:100px!important}.h-lg-125px{height:125px!important}.h-lg-150px{height:150px!important}.h-lg-175px{height:175px!important}.h-lg-200px{height:200px!important}.h-lg-225px{height:225px!important}.h-lg-250px{height:250px!important}.h-lg-275px{height:275px!important}.h-lg-300px{height:300px!important}.h-lg-325px{height:325px!important}.h-lg-350px{height:350px!important}.h-lg-375px{height:375px!important}.h-lg-400px{height:400px!important}.h-lg-425px{height:425px!important}.h-lg-450px{height:450px!important}.h-lg-475px{height:475px!important}.h-lg-500px{height:500px!important}.h-lg-550px{height:550px!important}.h-lg-600px{height:600px!important}.h-lg-650px{height:650px!important}.h-lg-700px{height:700px!important}.h-lg-750px{height:750px!important}.h-lg-800px{height:800px!important}.h-lg-850px{height:850px!important}.h-lg-900px{height:900px!important}.h-lg-950px{height:950px!important}.h-lg-1000px{height:1000px!important}.mh-lg-unset{max-height:unset!important}.mh-lg-25{max-height:25%!important}.mh-lg-50{max-height:50%!important}.mh-lg-75{max-height:75%!important}.mh-lg-100{max-height:100%!important}.mh-lg-auto{max-height:auto!important}.mh-lg-1px{max-height:1px!important}.mh-lg-2px{max-height:2px!important}.mh-lg-3px{max-height:3px!important}.mh-lg-4px{max-height:4px!important}.mh-lg-5px{max-height:5px!important}.mh-lg-6px{max-height:6px!important}.mh-lg-7px{max-height:7px!important}.mh-lg-8px{max-height:8px!important}.mh-lg-9px{max-height:9px!important}.mh-lg-10px{max-height:10px!important}.mh-lg-15px{max-height:15px!important}.mh-lg-20px{max-height:20px!important}.mh-lg-25px{max-height:25px!important}.mh-lg-30px{max-height:30px!important}.mh-lg-35px{max-height:35px!important}.mh-lg-40px{max-height:40px!important}.mh-lg-45px{max-height:45px!important}.mh-lg-50px{max-height:50px!important}.mh-lg-55px{max-height:55px!important}.mh-lg-60px{max-height:60px!important}.mh-lg-65px{max-height:65px!important}.mh-lg-70px{max-height:70px!important}.mh-lg-75px{max-height:75px!important}.mh-lg-80px{max-height:80px!important}.mh-lg-85px{max-height:85px!important}.mh-lg-90px{max-height:90px!important}.mh-lg-95px{max-height:95px!important}.mh-lg-100px{max-height:100px!important}.mh-lg-125px{max-height:125px!important}.mh-lg-150px{max-height:150px!important}.mh-lg-175px{max-height:175px!important}.mh-lg-200px{max-height:200px!important}.mh-lg-225px{max-height:225px!important}.mh-lg-250px{max-height:250px!important}.mh-lg-275px{max-height:275px!important}.mh-lg-300px{max-height:300px!important}.mh-lg-325px{max-height:325px!important}.mh-lg-350px{max-height:350px!important}.mh-lg-375px{max-height:375px!important}.mh-lg-400px{max-height:400px!important}.mh-lg-425px{max-height:425px!important}.mh-lg-450px{max-height:450px!important}.mh-lg-475px{max-height:475px!important}.mh-lg-500px{max-height:500px!important}.mh-lg-550px{max-height:550px!important}.mh-lg-600px{max-height:600px!important}.mh-lg-650px{max-height:650px!important}.mh-lg-700px{max-height:700px!important}.mh-lg-750px{max-height:750px!important}.mh-lg-800px{max-height:800px!important}.mh-lg-850px{max-height:850px!important}.mh-lg-900px{max-height:900px!important}.mh-lg-950px{max-height:950px!important}.mh-lg-1000px{max-height:1000px!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:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:.75rem!important}.m-lg-4{margin:1rem!important}.m-lg-5{margin:1.25rem!important}.m-lg-6{margin:1.5rem!important}.m-lg-7{margin:1.75rem!important}.m-lg-8{margin:2rem!important}.m-lg-9{margin:2.25rem!important}.m-lg-10{margin:2.5rem!important}.m-lg-11{margin:2.75rem!important}.m-lg-12{margin:3rem!important}.m-lg-13{margin:3.25rem!important}.m-lg-14{margin:3.5rem!important}.m-lg-15{margin:3.75rem!important}.m-lg-16{margin:4rem!important}.m-lg-17{margin:4.25rem!important}.m-lg-18{margin:4.5rem!important}.m-lg-19{margin:4.75rem!important}.m-lg-20{margin:5rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:.75rem!important;margin-left:.75rem!important}.mx-lg-4{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-5{margin-right:1.25rem!important;margin-left:1.25rem!important}.mx-lg-6{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-7{margin-right:1.75rem!important;margin-left:1.75rem!important}.mx-lg-8{margin-right:2rem!important;margin-left:2rem!important}.mx-lg-9{margin-right:2.25rem!important;margin-left:2.25rem!important}.mx-lg-10{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-lg-11{margin-right:2.75rem!important;margin-left:2.75rem!important}.mx-lg-12{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-13{margin-right:3.25rem!important;margin-left:3.25rem!important}.mx-lg-14{margin-right:3.5rem!important;margin-left:3.5rem!important}.mx-lg-15{margin-right:3.75rem!important;margin-left:3.75rem!important}.mx-lg-16{margin-right:4rem!important;margin-left:4rem!important}.mx-lg-17{margin-right:4.25rem!important;margin-left:4.25rem!important}.mx-lg-18{margin-right:4.5rem!important;margin-left:4.5rem!important}.mx-lg-19{margin-right:4.75rem!important;margin-left:4.75rem!important}.mx-lg-20{margin-right:5rem!important;margin-left:5rem!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:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.my-lg-4{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-5{margin-top:1.25rem!important;margin-bottom:1.25rem!important}.my-lg-6{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-7{margin-top:1.75rem!important;margin-bottom:1.75rem!important}.my-lg-8{margin-top:2rem!important;margin-bottom:2rem!important}.my-lg-9{margin-top:2.25rem!important;margin-bottom:2.25rem!important}.my-lg-10{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-lg-11{margin-top:2.75rem!important;margin-bottom:2.75rem!important}.my-lg-12{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-13{margin-top:3.25rem!important;margin-bottom:3.25rem!important}.my-lg-14{margin-top:3.5rem!important;margin-bottom:3.5rem!important}.my-lg-15{margin-top:3.75rem!important;margin-bottom:3.75rem!important}.my-lg-16{margin-top:4rem!important;margin-bottom:4rem!important}.my-lg-17{margin-top:4.25rem!important;margin-bottom:4.25rem!important}.my-lg-18{margin-top:4.5rem!important;margin-bottom:4.5rem!important}.my-lg-19{margin-top:4.75rem!important;margin-bottom:4.75rem!important}.my-lg-20{margin-top:5rem!important;margin-bottom:5rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:.75rem!important}.mt-lg-4{margin-top:1rem!important}.mt-lg-5{margin-top:1.25rem!important}.mt-lg-6{margin-top:1.5rem!important}.mt-lg-7{margin-top:1.75rem!important}.mt-lg-8{margin-top:2rem!important}.mt-lg-9{margin-top:2.25rem!important}.mt-lg-10{margin-top:2.5rem!important}.mt-lg-11{margin-top:2.75rem!important}.mt-lg-12{margin-top:3rem!important}.mt-lg-13{margin-top:3.25rem!important}.mt-lg-14{margin-top:3.5rem!important}.mt-lg-15{margin-top:3.75rem!important}.mt-lg-16{margin-top:4rem!important}.mt-lg-17{margin-top:4.25rem!important}.mt-lg-18{margin-top:4.5rem!important}.mt-lg-19{margin-top:4.75rem!important}.mt-lg-20{margin-top:5rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:.75rem!important}.me-lg-4{margin-right:1rem!important}.me-lg-5{margin-right:1.25rem!important}.me-lg-6{margin-right:1.5rem!important}.me-lg-7{margin-right:1.75rem!important}.me-lg-8{margin-right:2rem!important}.me-lg-9{margin-right:2.25rem!important}.me-lg-10{margin-right:2.5rem!important}.me-lg-11{margin-right:2.75rem!important}.me-lg-12{margin-right:3rem!important}.me-lg-13{margin-right:3.25rem!important}.me-lg-14{margin-right:3.5rem!important}.me-lg-15{margin-right:3.75rem!important}.me-lg-16{margin-right:4rem!important}.me-lg-17{margin-right:4.25rem!important}.me-lg-18{margin-right:4.5rem!important}.me-lg-19{margin-right:4.75rem!important}.me-lg-20{margin-right:5rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:.75rem!important}.mb-lg-4{margin-bottom:1rem!important}.mb-lg-5{margin-bottom:1.25rem!important}.mb-lg-6{margin-bottom:1.5rem!important}.mb-lg-7{margin-bottom:1.75rem!important}.mb-lg-8{margin-bottom:2rem!important}.mb-lg-9{margin-bottom:2.25rem!important}.mb-lg-10{margin-bottom:2.5rem!important}.mb-lg-11{margin-bottom:2.75rem!important}.mb-lg-12{margin-bottom:3rem!important}.mb-lg-13{margin-bottom:3.25rem!important}.mb-lg-14{margin-bottom:3.5rem!important}.mb-lg-15{margin-bottom:3.75rem!important}.mb-lg-16{margin-bottom:4rem!important}.mb-lg-17{margin-bottom:4.25rem!important}.mb-lg-18{margin-bottom:4.5rem!important}.mb-lg-19{margin-bottom:4.75rem!important}.mb-lg-20{margin-bottom:5rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:.75rem!important}.ms-lg-4{margin-left:1rem!important}.ms-lg-5{margin-left:1.25rem!important}.ms-lg-6{margin-left:1.5rem!important}.ms-lg-7{margin-left:1.75rem!important}.ms-lg-8{margin-left:2rem!important}.ms-lg-9{margin-left:2.25rem!important}.ms-lg-10{margin-left:2.5rem!important}.ms-lg-11{margin-left:2.75rem!important}.ms-lg-12{margin-left:3rem!important}.ms-lg-13{margin-left:3.25rem!important}.ms-lg-14{margin-left:3.5rem!important}.ms-lg-15{margin-left:3.75rem!important}.ms-lg-16{margin-left:4rem!important}.ms-lg-17{margin-left:4.25rem!important}.ms-lg-18{margin-left:4.5rem!important}.ms-lg-19{margin-left:4.75rem!important}.ms-lg-20{margin-left:5rem!important}.ms-lg-auto{margin-left:auto!important}.m-lg-n1{margin:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.m-lg-n3{margin:-.75rem!important}.m-lg-n4{margin:-1rem!important}.m-lg-n5{margin:-1.25rem!important}.m-lg-n6{margin:-1.5rem!important}.m-lg-n7{margin:-1.75rem!important}.m-lg-n8{margin:-2rem!important}.m-lg-n9{margin:-2.25rem!important}.m-lg-n10{margin:-2.5rem!important}.m-lg-n11{margin:-2.75rem!important}.m-lg-n12{margin:-3rem!important}.m-lg-n13{margin:-3.25rem!important}.m-lg-n14{margin:-3.5rem!important}.m-lg-n15{margin:-3.75rem!important}.m-lg-n16{margin:-4rem!important}.m-lg-n17{margin:-4.25rem!important}.m-lg-n18{margin:-4.5rem!important}.m-lg-n19{margin:-4.75rem!important}.m-lg-n20{margin:-5rem!important}.mx-lg-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-lg-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-lg-n3{margin-right:-.75rem!important;margin-left:-.75rem!important}.mx-lg-n4{margin-right:-1rem!important;margin-left:-1rem!important}.mx-lg-n5{margin-right:-1.25rem!important;margin-left:-1.25rem!important}.mx-lg-n6{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-lg-n7{margin-right:-1.75rem!important;margin-left:-1.75rem!important}.mx-lg-n8{margin-right:-2rem!important;margin-left:-2rem!important}.mx-lg-n9{margin-right:-2.25rem!important;margin-left:-2.25rem!important}.mx-lg-n10{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.mx-lg-n11{margin-right:-2.75rem!important;margin-left:-2.75rem!important}.mx-lg-n12{margin-right:-3rem!important;margin-left:-3rem!important}.mx-lg-n13{margin-right:-3.25rem!important;margin-left:-3.25rem!important}.mx-lg-n14{margin-right:-3.5rem!important;margin-left:-3.5rem!important}.mx-lg-n15{margin-right:-3.75rem!important;margin-left:-3.75rem!important}.mx-lg-n16{margin-right:-4rem!important;margin-left:-4rem!important}.mx-lg-n17{margin-right:-4.25rem!important;margin-left:-4.25rem!important}.mx-lg-n18{margin-right:-4.5rem!important;margin-left:-4.5rem!important}.mx-lg-n19{margin-right:-4.75rem!important;margin-left:-4.75rem!important}.mx-lg-n20{margin-right:-5rem!important;margin-left:-5rem!important}.my-lg-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-lg-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-lg-n3{margin-top:-.75rem!important;margin-bottom:-.75rem!important}.my-lg-n4{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-lg-n5{margin-top:-1.25rem!important;margin-bottom:-1.25rem!important}.my-lg-n6{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-lg-n7{margin-top:-1.75rem!important;margin-bottom:-1.75rem!important}.my-lg-n8{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-lg-n9{margin-top:-2.25rem!important;margin-bottom:-2.25rem!important}.my-lg-n10{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.my-lg-n11{margin-top:-2.75rem!important;margin-bottom:-2.75rem!important}.my-lg-n12{margin-top:-3rem!important;margin-bottom:-3rem!important}.my-lg-n13{margin-top:-3.25rem!important;margin-bottom:-3.25rem!important}.my-lg-n14{margin-top:-3.5rem!important;margin-bottom:-3.5rem!important}.my-lg-n15{margin-top:-3.75rem!important;margin-bottom:-3.75rem!important}.my-lg-n16{margin-top:-4rem!important;margin-bottom:-4rem!important}.my-lg-n17{margin-top:-4.25rem!important;margin-bottom:-4.25rem!important}.my-lg-n18{margin-top:-4.5rem!important;margin-bottom:-4.5rem!important}.my-lg-n19{margin-top:-4.75rem!important;margin-bottom:-4.75rem!important}.my-lg-n20{margin-top:-5rem!important;margin-bottom:-5rem!important}.mt-lg-n1{margin-top:-.25rem!important}.mt-lg-n2{margin-top:-.5rem!important}.mt-lg-n3{margin-top:-.75rem!important}.mt-lg-n4{margin-top:-1rem!important}.mt-lg-n5{margin-top:-1.25rem!important}.mt-lg-n6{margin-top:-1.5rem!important}.mt-lg-n7{margin-top:-1.75rem!important}.mt-lg-n8{margin-top:-2rem!important}.mt-lg-n9{margin-top:-2.25rem!important}.mt-lg-n10{margin-top:-2.5rem!important}.mt-lg-n11{margin-top:-2.75rem!important}.mt-lg-n12{margin-top:-3rem!important}.mt-lg-n13{margin-top:-3.25rem!important}.mt-lg-n14{margin-top:-3.5rem!important}.mt-lg-n15{margin-top:-3.75rem!important}.mt-lg-n16{margin-top:-4rem!important}.mt-lg-n17{margin-top:-4.25rem!important}.mt-lg-n18{margin-top:-4.5rem!important}.mt-lg-n19{margin-top:-4.75rem!important}.mt-lg-n20{margin-top:-5rem!important}.me-lg-n1{margin-right:-.25rem!important}.me-lg-n2{margin-right:-.5rem!important}.me-lg-n3{margin-right:-.75rem!important}.me-lg-n4{margin-right:-1rem!important}.me-lg-n5{margin-right:-1.25rem!important}.me-lg-n6{margin-right:-1.5rem!important}.me-lg-n7{margin-right:-1.75rem!important}.me-lg-n8{margin-right:-2rem!important}.me-lg-n9{margin-right:-2.25rem!important}.me-lg-n10{margin-right:-2.5rem!important}.me-lg-n11{margin-right:-2.75rem!important}.me-lg-n12{margin-right:-3rem!important}.me-lg-n13{margin-right:-3.25rem!important}.me-lg-n14{margin-right:-3.5rem!important}.me-lg-n15{margin-right:-3.75rem!important}.me-lg-n16{margin-right:-4rem!important}.me-lg-n17{margin-right:-4.25rem!important}.me-lg-n18{margin-right:-4.5rem!important}.me-lg-n19{margin-right:-4.75rem!important}.me-lg-n20{margin-right:-5rem!important}.mb-lg-n1{margin-bottom:-.25rem!important}.mb-lg-n2{margin-bottom:-.5rem!important}.mb-lg-n3{margin-bottom:-.75rem!important}.mb-lg-n4{margin-bottom:-1rem!important}.mb-lg-n5{margin-bottom:-1.25rem!important}.mb-lg-n6{margin-bottom:-1.5rem!important}.mb-lg-n7{margin-bottom:-1.75rem!important}.mb-lg-n8{margin-bottom:-2rem!important}.mb-lg-n9{margin-bottom:-2.25rem!important}.mb-lg-n10{margin-bottom:-2.5rem!important}.mb-lg-n11{margin-bottom:-2.75rem!important}.mb-lg-n12{margin-bottom:-3rem!important}.mb-lg-n13{margin-bottom:-3.25rem!important}.mb-lg-n14{margin-bottom:-3.5rem!important}.mb-lg-n15{margin-bottom:-3.75rem!important}.mb-lg-n16{margin-bottom:-4rem!important}.mb-lg-n17{margin-bottom:-4.25rem!important}.mb-lg-n18{margin-bottom:-4.5rem!important}.mb-lg-n19{margin-bottom:-4.75rem!important}.mb-lg-n20{margin-bottom:-5rem!important}.ms-lg-n1{margin-left:-.25rem!important}.ms-lg-n2{margin-left:-.5rem!important}.ms-lg-n3{margin-left:-.75rem!important}.ms-lg-n4{margin-left:-1rem!important}.ms-lg-n5{margin-left:-1.25rem!important}.ms-lg-n6{margin-left:-1.5rem!important}.ms-lg-n7{margin-left:-1.75rem!important}.ms-lg-n8{margin-left:-2rem!important}.ms-lg-n9{margin-left:-2.25rem!important}.ms-lg-n10{margin-left:-2.5rem!important}.ms-lg-n11{margin-left:-2.75rem!important}.ms-lg-n12{margin-left:-3rem!important}.ms-lg-n13{margin-left:-3.25rem!important}.ms-lg-n14{margin-left:-3.5rem!important}.ms-lg-n15{margin-left:-3.75rem!important}.ms-lg-n16{margin-left:-4rem!important}.ms-lg-n17{margin-left:-4.25rem!important}.ms-lg-n18{margin-left:-4.5rem!important}.ms-lg-n19{margin-left:-4.75rem!important}.ms-lg-n20{margin-left:-5rem!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:.75rem!important}.p-lg-4{padding:1rem!important}.p-lg-5{padding:1.25rem!important}.p-lg-6{padding:1.5rem!important}.p-lg-7{padding:1.75rem!important}.p-lg-8{padding:2rem!important}.p-lg-9{padding:2.25rem!important}.p-lg-10{padding:2.5rem!important}.p-lg-11{padding:2.75rem!important}.p-lg-12{padding:3rem!important}.p-lg-13{padding:3.25rem!important}.p-lg-14{padding:3.5rem!important}.p-lg-15{padding:3.75rem!important}.p-lg-16{padding:4rem!important}.p-lg-17{padding:4.25rem!important}.p-lg-18{padding:4.5rem!important}.p-lg-19{padding:4.75rem!important}.p-lg-20{padding:5rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:.75rem!important;padding-left:.75rem!important}.px-lg-4{padding-right:1rem!important;padding-left:1rem!important}.px-lg-5{padding-right:1.25rem!important;padding-left:1.25rem!important}.px-lg-6{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-7{padding-right:1.75rem!important;padding-left:1.75rem!important}.px-lg-8{padding-right:2rem!important;padding-left:2rem!important}.px-lg-9{padding-right:2.25rem!important;padding-left:2.25rem!important}.px-lg-10{padding-right:2.5rem!important;padding-left:2.5rem!important}.px-lg-11{padding-right:2.75rem!important;padding-left:2.75rem!important}.px-lg-12{padding-right:3rem!important;padding-left:3rem!important}.px-lg-13{padding-right:3.25rem!important;padding-left:3.25rem!important}.px-lg-14{padding-right:3.5rem!important;padding-left:3.5rem!important}.px-lg-15{padding-right:3.75rem!important;padding-left:3.75rem!important}.px-lg-16{padding-right:4rem!important;padding-left:4rem!important}.px-lg-17{padding-right:4.25rem!important;padding-left:4.25rem!important}.px-lg-18{padding-right:4.5rem!important;padding-left:4.5rem!important}.px-lg-19{padding-right:4.75rem!important;padding-left:4.75rem!important}.px-lg-20{padding-right:5rem!important;padding-left:5rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.py-lg-4{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-5{padding-top:1.25rem!important;padding-bottom:1.25rem!important}.py-lg-6{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-7{padding-top:1.75rem!important;padding-bottom:1.75rem!important}.py-lg-8{padding-top:2rem!important;padding-bottom:2rem!important}.py-lg-9{padding-top:2.25rem!important;padding-bottom:2.25rem!important}.py-lg-10{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.py-lg-11{padding-top:2.75rem!important;padding-bottom:2.75rem!important}.py-lg-12{padding-top:3rem!important;padding-bottom:3rem!important}.py-lg-13{padding-top:3.25rem!important;padding-bottom:3.25rem!important}.py-lg-14{padding-top:3.5rem!important;padding-bottom:3.5rem!important}.py-lg-15{padding-top:3.75rem!important;padding-bottom:3.75rem!important}.py-lg-16{padding-top:4rem!important;padding-bottom:4rem!important}.py-lg-17{padding-top:4.25rem!important;padding-bottom:4.25rem!important}.py-lg-18{padding-top:4.5rem!important;padding-bottom:4.5rem!important}.py-lg-19{padding-top:4.75rem!important;padding-bottom:4.75rem!important}.py-lg-20{padding-top:5rem!important;padding-bottom:5rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:.75rem!important}.pt-lg-4{padding-top:1rem!important}.pt-lg-5{padding-top:1.25rem!important}.pt-lg-6{padding-top:1.5rem!important}.pt-lg-7{padding-top:1.75rem!important}.pt-lg-8{padding-top:2rem!important}.pt-lg-9{padding-top:2.25rem!important}.pt-lg-10{padding-top:2.5rem!important}.pt-lg-11{padding-top:2.75rem!important}.pt-lg-12{padding-top:3rem!important}.pt-lg-13{padding-top:3.25rem!important}.pt-lg-14{padding-top:3.5rem!important}.pt-lg-15{padding-top:3.75rem!important}.pt-lg-16{padding-top:4rem!important}.pt-lg-17{padding-top:4.25rem!important}.pt-lg-18{padding-top:4.5rem!important}.pt-lg-19{padding-top:4.75rem!important}.pt-lg-20{padding-top:5rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:.75rem!important}.pe-lg-4{padding-right:1rem!important}.pe-lg-5{padding-right:1.25rem!important}.pe-lg-6{padding-right:1.5rem!important}.pe-lg-7{padding-right:1.75rem!important}.pe-lg-8{padding-right:2rem!important}.pe-lg-9{padding-right:2.25rem!important}.pe-lg-10{padding-right:2.5rem!important}.pe-lg-11{padding-right:2.75rem!important}.pe-lg-12{padding-right:3rem!important}.pe-lg-13{padding-right:3.25rem!important}.pe-lg-14{padding-right:3.5rem!important}.pe-lg-15{padding-right:3.75rem!important}.pe-lg-16{padding-right:4rem!important}.pe-lg-17{padding-right:4.25rem!important}.pe-lg-18{padding-right:4.5rem!important}.pe-lg-19{padding-right:4.75rem!important}.pe-lg-20{padding-right:5rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:.75rem!important}.pb-lg-4{padding-bottom:1rem!important}.pb-lg-5{padding-bottom:1.25rem!important}.pb-lg-6{padding-bottom:1.5rem!important}.pb-lg-7{padding-bottom:1.75rem!important}.pb-lg-8{padding-bottom:2rem!important}.pb-lg-9{padding-bottom:2.25rem!important}.pb-lg-10{padding-bottom:2.5rem!important}.pb-lg-11{padding-bottom:2.75rem!important}.pb-lg-12{padding-bottom:3rem!important}.pb-lg-13{padding-bottom:3.25rem!important}.pb-lg-14{padding-bottom:3.5rem!important}.pb-lg-15{padding-bottom:3.75rem!important}.pb-lg-16{padding-bottom:4rem!important}.pb-lg-17{padding-bottom:4.25rem!important}.pb-lg-18{padding-bottom:4.5rem!important}.pb-lg-19{padding-bottom:4.75rem!important}.pb-lg-20{padding-bottom:5rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:.75rem!important}.ps-lg-4{padding-left:1rem!important}.ps-lg-5{padding-left:1.25rem!important}.ps-lg-6{padding-left:1.5rem!important}.ps-lg-7{padding-left:1.75rem!important}.ps-lg-8{padding-left:2rem!important}.ps-lg-9{padding-left:2.25rem!important}.ps-lg-10{padding-left:2.5rem!important}.ps-lg-11{padding-left:2.75rem!important}.ps-lg-12{padding-left:3rem!important}.ps-lg-13{padding-left:3.25rem!important}.ps-lg-14{padding-left:3.5rem!important}.ps-lg-15{padding-left:3.75rem!important}.ps-lg-16{padding-left:4rem!important}.ps-lg-17{padding-left:4.25rem!important}.ps-lg-18{padding-left:4.5rem!important}.ps-lg-19{padding-left:4.75rem!important}.ps-lg-20{padding-left:5rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:.75rem!important}.gap-lg-4{gap:1rem!important}.gap-lg-5{gap:1.25rem!important}.gap-lg-6{gap:1.5rem!important}.gap-lg-7{gap:1.75rem!important}.gap-lg-8{gap:2rem!important}.gap-lg-9{gap:2.25rem!important}.gap-lg-10{gap:2.5rem!important}.gap-lg-11{gap:2.75rem!important}.gap-lg-12{gap:3rem!important}.gap-lg-13{gap:3.25rem!important}.gap-lg-14{gap:3.5rem!important}.gap-lg-15{gap:3.75rem!important}.gap-lg-16{gap:4rem!important}.gap-lg-17{gap:4.25rem!important}.gap-lg-18{gap:4.5rem!important}.gap-lg-19{gap:4.75rem!important}.gap-lg-20{gap:5rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:.75rem!important}.row-gap-lg-4{row-gap:1rem!important}.row-gap-lg-5{row-gap:1.25rem!important}.row-gap-lg-6{row-gap:1.5rem!important}.row-gap-lg-7{row-gap:1.75rem!important}.row-gap-lg-8{row-gap:2rem!important}.row-gap-lg-9{row-gap:2.25rem!important}.row-gap-lg-10{row-gap:2.5rem!important}.row-gap-lg-11{row-gap:2.75rem!important}.row-gap-lg-12{row-gap:3rem!important}.row-gap-lg-13{row-gap:3.25rem!important}.row-gap-lg-14{row-gap:3.5rem!important}.row-gap-lg-15{row-gap:3.75rem!important}.row-gap-lg-16{row-gap:4rem!important}.row-gap-lg-17{row-gap:4.25rem!important}.row-gap-lg-18{row-gap:4.5rem!important}.row-gap-lg-19{row-gap:4.75rem!important}.row-gap-lg-20{row-gap:5rem!important}.column-gap-lg-0{column-gap:0!important}.column-gap-lg-1{column-gap:.25rem!important}.column-gap-lg-2{column-gap:.5rem!important}.column-gap-lg-3{column-gap:.75rem!important}.column-gap-lg-4{column-gap:1rem!important}.column-gap-lg-5{column-gap:1.25rem!important}.column-gap-lg-6{column-gap:1.5rem!important}.column-gap-lg-7{column-gap:1.75rem!important}.column-gap-lg-8{column-gap:2rem!important}.column-gap-lg-9{column-gap:2.25rem!important}.column-gap-lg-10{column-gap:2.5rem!important}.column-gap-lg-11{column-gap:2.75rem!important}.column-gap-lg-12{column-gap:3rem!important}.column-gap-lg-13{column-gap:3.25rem!important}.column-gap-lg-14{column-gap:3.5rem!important}.column-gap-lg-15{column-gap:3.75rem!important}.column-gap-lg-16{column-gap:4rem!important}.column-gap-lg-17{column-gap:4.25rem!important}.column-gap-lg-18{column-gap:4.5rem!important}.column-gap-lg-19{column-gap:4.75rem!important}.column-gap-lg-20{column-gap:5rem!important}.fs-lg-1{font-size:calc(1.3rem + .6vw)!important}.fs-lg-2{font-size:calc(1.275rem + .3vw)!important}.fs-lg-3{font-size:calc(1.26rem + .12vw)!important}.fs-lg-4{font-size:1.25rem!important}.fs-lg-5{font-size:1.15rem!important}.fs-lg-6{font-size:1.075rem!important}.fs-lg-7{font-size:.95rem!important}.fs-lg-8{font-size:.85rem!important}.fs-lg-9{font-size:.75rem!important}.fs-lg-10{font-size:.5rem!important}.fs-lg-sm{font-size:.95rem!important}.fs-lg-base{font-size:1rem!important}.fs-lg-lg{font-size:1.075rem!important}.fs-lg-xl{font-size:1.21rem!important}.fs-lg-fluid{font-size:100%!important}.fs-lg-2x{font-size:calc(1.325rem + .9vw)!important}.fs-lg-2qx{font-size:calc(1.35rem + 1.2vw)!important}.fs-lg-2hx{font-size:calc(1.375rem + 1.5vw)!important}.fs-lg-2tx{font-size:calc(1.4rem + 1.8vw)!important}.fs-lg-3x{font-size:calc(1.425rem + 2.1vw)!important}.fs-lg-3qx{font-size:calc(1.45rem + 2.4vw)!important}.fs-lg-3hx{font-size:calc(1.475rem + 2.7vw)!important}.fs-lg-3tx{font-size:calc(1.5rem + 3vw)!important}.fs-lg-4x{font-size:calc(1.525rem + 3.3vw)!important}.fs-lg-4qx{font-size:calc(1.55rem + 3.6vw)!important}.fs-lg-4hx{font-size:calc(1.575rem + 3.9vw)!important}.fs-lg-4tx{font-size:calc(1.6rem + 4.2vw)!important}.fs-lg-5x{font-size:calc(1.625rem + 4.5vw)!important}.fs-lg-5qx{font-size:calc(1.65rem + 4.8vw)!important}.fs-lg-5hx{font-size:calc(1.675rem + 5.1vw)!important}.fs-lg-5tx{font-size:calc(1.7rem + 5.4vw)!important}.fs-lg-6x{font-size:calc(1.725rem + 5.7vw)!important}.fs-lg-6qx{font-size:calc(1.75rem + 6vw)!important}.fs-lg-6hx{font-size:calc(1.775rem + 6.3vw)!important}.fs-lg-6tx{font-size:calc(1.8rem + 6.6vw)!important}.fs-lg-7x{font-size:calc(1.825rem + 6.9vw)!important}.fs-lg-7qx{font-size:calc(1.85rem + 7.2vw)!important}.fs-lg-7hx{font-size:calc(1.875rem + 7.5vw)!important}.fs-lg-7tx{font-size:calc(1.9rem + 7.8vw)!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}.min-w-lg-unset{min-width:unset!important}.min-w-lg-25{min-width:25%!important}.min-w-lg-50{min-width:50%!important}.min-w-lg-75{min-width:75%!important}.min-w-lg-100{min-width:100%!important}.min-w-lg-auto{min-width:auto!important}.min-w-lg-1px{min-width:1px!important}.min-w-lg-2px{min-width:2px!important}.min-w-lg-3px{min-width:3px!important}.min-w-lg-4px{min-width:4px!important}.min-w-lg-5px{min-width:5px!important}.min-w-lg-6px{min-width:6px!important}.min-w-lg-7px{min-width:7px!important}.min-w-lg-8px{min-width:8px!important}.min-w-lg-9px{min-width:9px!important}.min-w-lg-10px{min-width:10px!important}.min-w-lg-15px{min-width:15px!important}.min-w-lg-20px{min-width:20px!important}.min-w-lg-25px{min-width:25px!important}.min-w-lg-30px{min-width:30px!important}.min-w-lg-35px{min-width:35px!important}.min-w-lg-40px{min-width:40px!important}.min-w-lg-45px{min-width:45px!important}.min-w-lg-50px{min-width:50px!important}.min-w-lg-55px{min-width:55px!important}.min-w-lg-60px{min-width:60px!important}.min-w-lg-65px{min-width:65px!important}.min-w-lg-70px{min-width:70px!important}.min-w-lg-75px{min-width:75px!important}.min-w-lg-80px{min-width:80px!important}.min-w-lg-85px{min-width:85px!important}.min-w-lg-90px{min-width:90px!important}.min-w-lg-95px{min-width:95px!important}.min-w-lg-100px{min-width:100px!important}.min-w-lg-125px{min-width:125px!important}.min-w-lg-150px{min-width:150px!important}.min-w-lg-175px{min-width:175px!important}.min-w-lg-200px{min-width:200px!important}.min-w-lg-225px{min-width:225px!important}.min-w-lg-250px{min-width:250px!important}.min-w-lg-275px{min-width:275px!important}.min-w-lg-300px{min-width:300px!important}.min-w-lg-325px{min-width:325px!important}.min-w-lg-350px{min-width:350px!important}.min-w-lg-375px{min-width:375px!important}.min-w-lg-400px{min-width:400px!important}.min-w-lg-425px{min-width:425px!important}.min-w-lg-450px{min-width:450px!important}.min-w-lg-475px{min-width:475px!important}.min-w-lg-500px{min-width:500px!important}.min-w-lg-550px{min-width:550px!important}.min-w-lg-600px{min-width:600px!important}.min-w-lg-650px{min-width:650px!important}.min-w-lg-700px{min-width:700px!important}.min-w-lg-750px{min-width:750px!important}.min-w-lg-800px{min-width:800px!important}.min-w-lg-850px{min-width:850px!important}.min-w-lg-900px{min-width:900px!important}.min-w-lg-950px{min-width:950px!important}.min-w-lg-1000px{min-width:1000px!important}.min-h-lg-unset{min-height:unset!important}.min-h-lg-25{min-height:25%!important}.min-h-lg-50{min-height:50%!important}.min-h-lg-75{min-height:75%!important}.min-h-lg-100{min-height:100%!important}.min-h-lg-auto{min-height:auto!important}.min-h-lg-1px{min-height:1px!important}.min-h-lg-2px{min-height:2px!important}.min-h-lg-3px{min-height:3px!important}.min-h-lg-4px{min-height:4px!important}.min-h-lg-5px{min-height:5px!important}.min-h-lg-6px{min-height:6px!important}.min-h-lg-7px{min-height:7px!important}.min-h-lg-8px{min-height:8px!important}.min-h-lg-9px{min-height:9px!important}.min-h-lg-10px{min-height:10px!important}.min-h-lg-15px{min-height:15px!important}.min-h-lg-20px{min-height:20px!important}.min-h-lg-25px{min-height:25px!important}.min-h-lg-30px{min-height:30px!important}.min-h-lg-35px{min-height:35px!important}.min-h-lg-40px{min-height:40px!important}.min-h-lg-45px{min-height:45px!important}.min-h-lg-50px{min-height:50px!important}.min-h-lg-55px{min-height:55px!important}.min-h-lg-60px{min-height:60px!important}.min-h-lg-65px{min-height:65px!important}.min-h-lg-70px{min-height:70px!important}.min-h-lg-75px{min-height:75px!important}.min-h-lg-80px{min-height:80px!important}.min-h-lg-85px{min-height:85px!important}.min-h-lg-90px{min-height:90px!important}.min-h-lg-95px{min-height:95px!important}.min-h-lg-100px{min-height:100px!important}.min-h-lg-125px{min-height:125px!important}.min-h-lg-150px{min-height:150px!important}.min-h-lg-175px{min-height:175px!important}.min-h-lg-200px{min-height:200px!important}.min-h-lg-225px{min-height:225px!important}.min-h-lg-250px{min-height:250px!important}.min-h-lg-275px{min-height:275px!important}.min-h-lg-300px{min-height:300px!important}.min-h-lg-325px{min-height:325px!important}.min-h-lg-350px{min-height:350px!important}.min-h-lg-375px{min-height:375px!important}.min-h-lg-400px{min-height:400px!important}.min-h-lg-425px{min-height:425px!important}.min-h-lg-450px{min-height:450px!important}.min-h-lg-475px{min-height:475px!important}.min-h-lg-500px{min-height:500px!important}.min-h-lg-550px{min-height:550px!important}.min-h-lg-600px{min-height:600px!important}.min-h-lg-650px{min-height:650px!important}.min-h-lg-700px{min-height:700px!important}.min-h-lg-750px{min-height:750px!important}.min-h-lg-800px{min-height:800px!important}.min-h-lg-850px{min-height:850px!important}.min-h-lg-900px{min-height:900px!important}.min-h-lg-950px{min-height:950px!important}.min-h-lg-1000px{min-height:1000px!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{object-fit:contain!important}.object-fit-xl-cover{object-fit:cover!important}.object-fit-xl-fill{object-fit:fill!important}.object-fit-xl-scale{object-fit:scale-down!important}.object-fit-xl-none{object-fit:none!important}.overflow-xl-auto{overflow:auto!important}.overflow-xl-hidden{overflow:hidden!important}.overflow-xl-visible{overflow:visible!important}.overflow-xl-scroll{overflow:scroll!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}.position-xl-static{position:static!important}.position-xl-relative{position:relative!important}.position-xl-absolute{position:absolute!important}.position-xl-fixed{position:fixed!important}.position-xl-sticky{position:sticky!important}.w-xl-unset{width:unset!important}.w-xl-25{width:25%!important}.w-xl-50{width:50%!important}.w-xl-75{width:75%!important}.w-xl-100{width:100%!important}.w-xl-auto{width:auto!important}.w-xl-1px{width:1px!important}.w-xl-2px{width:2px!important}.w-xl-3px{width:3px!important}.w-xl-4px{width:4px!important}.w-xl-5px{width:5px!important}.w-xl-6px{width:6px!important}.w-xl-7px{width:7px!important}.w-xl-8px{width:8px!important}.w-xl-9px{width:9px!important}.w-xl-10px{width:10px!important}.w-xl-15px{width:15px!important}.w-xl-20px{width:20px!important}.w-xl-25px{width:25px!important}.w-xl-30px{width:30px!important}.w-xl-35px{width:35px!important}.w-xl-40px{width:40px!important}.w-xl-45px{width:45px!important}.w-xl-50px{width:50px!important}.w-xl-55px{width:55px!important}.w-xl-60px{width:60px!important}.w-xl-65px{width:65px!important}.w-xl-70px{width:70px!important}.w-xl-75px{width:75px!important}.w-xl-80px{width:80px!important}.w-xl-85px{width:85px!important}.w-xl-90px{width:90px!important}.w-xl-95px{width:95px!important}.w-xl-100px{width:100px!important}.w-xl-125px{width:125px!important}.w-xl-150px{width:150px!important}.w-xl-175px{width:175px!important}.w-xl-200px{width:200px!important}.w-xl-225px{width:225px!important}.w-xl-250px{width:250px!important}.w-xl-275px{width:275px!important}.w-xl-300px{width:300px!important}.w-xl-325px{width:325px!important}.w-xl-350px{width:350px!important}.w-xl-375px{width:375px!important}.w-xl-400px{width:400px!important}.w-xl-425px{width:425px!important}.w-xl-450px{width:450px!important}.w-xl-475px{width:475px!important}.w-xl-500px{width:500px!important}.w-xl-550px{width:550px!important}.w-xl-600px{width:600px!important}.w-xl-650px{width:650px!important}.w-xl-700px{width:700px!important}.w-xl-750px{width:750px!important}.w-xl-800px{width:800px!important}.w-xl-850px{width:850px!important}.w-xl-900px{width:900px!important}.w-xl-950px{width:950px!important}.w-xl-1000px{width:1000px!important}.mw-xl-unset{max-width:unset!important}.mw-xl-25{max-width:25%!important}.mw-xl-50{max-width:50%!important}.mw-xl-75{max-width:75%!important}.mw-xl-100{max-width:100%!important}.mw-xl-auto{max-width:auto!important}.mw-xl-1px{max-width:1px!important}.mw-xl-2px{max-width:2px!important}.mw-xl-3px{max-width:3px!important}.mw-xl-4px{max-width:4px!important}.mw-xl-5px{max-width:5px!important}.mw-xl-6px{max-width:6px!important}.mw-xl-7px{max-width:7px!important}.mw-xl-8px{max-width:8px!important}.mw-xl-9px{max-width:9px!important}.mw-xl-10px{max-width:10px!important}.mw-xl-15px{max-width:15px!important}.mw-xl-20px{max-width:20px!important}.mw-xl-25px{max-width:25px!important}.mw-xl-30px{max-width:30px!important}.mw-xl-35px{max-width:35px!important}.mw-xl-40px{max-width:40px!important}.mw-xl-45px{max-width:45px!important}.mw-xl-50px{max-width:50px!important}.mw-xl-55px{max-width:55px!important}.mw-xl-60px{max-width:60px!important}.mw-xl-65px{max-width:65px!important}.mw-xl-70px{max-width:70px!important}.mw-xl-75px{max-width:75px!important}.mw-xl-80px{max-width:80px!important}.mw-xl-85px{max-width:85px!important}.mw-xl-90px{max-width:90px!important}.mw-xl-95px{max-width:95px!important}.mw-xl-100px{max-width:100px!important}.mw-xl-125px{max-width:125px!important}.mw-xl-150px{max-width:150px!important}.mw-xl-175px{max-width:175px!important}.mw-xl-200px{max-width:200px!important}.mw-xl-225px{max-width:225px!important}.mw-xl-250px{max-width:250px!important}.mw-xl-275px{max-width:275px!important}.mw-xl-300px{max-width:300px!important}.mw-xl-325px{max-width:325px!important}.mw-xl-350px{max-width:350px!important}.mw-xl-375px{max-width:375px!important}.mw-xl-400px{max-width:400px!important}.mw-xl-425px{max-width:425px!important}.mw-xl-450px{max-width:450px!important}.mw-xl-475px{max-width:475px!important}.mw-xl-500px{max-width:500px!important}.mw-xl-550px{max-width:550px!important}.mw-xl-600px{max-width:600px!important}.mw-xl-650px{max-width:650px!important}.mw-xl-700px{max-width:700px!important}.mw-xl-750px{max-width:750px!important}.mw-xl-800px{max-width:800px!important}.mw-xl-850px{max-width:850px!important}.mw-xl-900px{max-width:900px!important}.mw-xl-950px{max-width:950px!important}.mw-xl-1000px{max-width:1000px!important}.h-xl-unset{height:unset!important}.h-xl-25{height:25%!important}.h-xl-50{height:50%!important}.h-xl-75{height:75%!important}.h-xl-100{height:100%!important}.h-xl-auto{height:auto!important}.h-xl-1px{height:1px!important}.h-xl-2px{height:2px!important}.h-xl-3px{height:3px!important}.h-xl-4px{height:4px!important}.h-xl-5px{height:5px!important}.h-xl-6px{height:6px!important}.h-xl-7px{height:7px!important}.h-xl-8px{height:8px!important}.h-xl-9px{height:9px!important}.h-xl-10px{height:10px!important}.h-xl-15px{height:15px!important}.h-xl-20px{height:20px!important}.h-xl-25px{height:25px!important}.h-xl-30px{height:30px!important}.h-xl-35px{height:35px!important}.h-xl-40px{height:40px!important}.h-xl-45px{height:45px!important}.h-xl-50px{height:50px!important}.h-xl-55px{height:55px!important}.h-xl-60px{height:60px!important}.h-xl-65px{height:65px!important}.h-xl-70px{height:70px!important}.h-xl-75px{height:75px!important}.h-xl-80px{height:80px!important}.h-xl-85px{height:85px!important}.h-xl-90px{height:90px!important}.h-xl-95px{height:95px!important}.h-xl-100px{height:100px!important}.h-xl-125px{height:125px!important}.h-xl-150px{height:150px!important}.h-xl-175px{height:175px!important}.h-xl-200px{height:200px!important}.h-xl-225px{height:225px!important}.h-xl-250px{height:250px!important}.h-xl-275px{height:275px!important}.h-xl-300px{height:300px!important}.h-xl-325px{height:325px!important}.h-xl-350px{height:350px!important}.h-xl-375px{height:375px!important}.h-xl-400px{height:400px!important}.h-xl-425px{height:425px!important}.h-xl-450px{height:450px!important}.h-xl-475px{height:475px!important}.h-xl-500px{height:500px!important}.h-xl-550px{height:550px!important}.h-xl-600px{height:600px!important}.h-xl-650px{height:650px!important}.h-xl-700px{height:700px!important}.h-xl-750px{height:750px!important}.h-xl-800px{height:800px!important}.h-xl-850px{height:850px!important}.h-xl-900px{height:900px!important}.h-xl-950px{height:950px!important}.h-xl-1000px{height:1000px!important}.mh-xl-unset{max-height:unset!important}.mh-xl-25{max-height:25%!important}.mh-xl-50{max-height:50%!important}.mh-xl-75{max-height:75%!important}.mh-xl-100{max-height:100%!important}.mh-xl-auto{max-height:auto!important}.mh-xl-1px{max-height:1px!important}.mh-xl-2px{max-height:2px!important}.mh-xl-3px{max-height:3px!important}.mh-xl-4px{max-height:4px!important}.mh-xl-5px{max-height:5px!important}.mh-xl-6px{max-height:6px!important}.mh-xl-7px{max-height:7px!important}.mh-xl-8px{max-height:8px!important}.mh-xl-9px{max-height:9px!important}.mh-xl-10px{max-height:10px!important}.mh-xl-15px{max-height:15px!important}.mh-xl-20px{max-height:20px!important}.mh-xl-25px{max-height:25px!important}.mh-xl-30px{max-height:30px!important}.mh-xl-35px{max-height:35px!important}.mh-xl-40px{max-height:40px!important}.mh-xl-45px{max-height:45px!important}.mh-xl-50px{max-height:50px!important}.mh-xl-55px{max-height:55px!important}.mh-xl-60px{max-height:60px!important}.mh-xl-65px{max-height:65px!important}.mh-xl-70px{max-height:70px!important}.mh-xl-75px{max-height:75px!important}.mh-xl-80px{max-height:80px!important}.mh-xl-85px{max-height:85px!important}.mh-xl-90px{max-height:90px!important}.mh-xl-95px{max-height:95px!important}.mh-xl-100px{max-height:100px!important}.mh-xl-125px{max-height:125px!important}.mh-xl-150px{max-height:150px!important}.mh-xl-175px{max-height:175px!important}.mh-xl-200px{max-height:200px!important}.mh-xl-225px{max-height:225px!important}.mh-xl-250px{max-height:250px!important}.mh-xl-275px{max-height:275px!important}.mh-xl-300px{max-height:300px!important}.mh-xl-325px{max-height:325px!important}.mh-xl-350px{max-height:350px!important}.mh-xl-375px{max-height:375px!important}.mh-xl-400px{max-height:400px!important}.mh-xl-425px{max-height:425px!important}.mh-xl-450px{max-height:450px!important}.mh-xl-475px{max-height:475px!important}.mh-xl-500px{max-height:500px!important}.mh-xl-550px{max-height:550px!important}.mh-xl-600px{max-height:600px!important}.mh-xl-650px{max-height:650px!important}.mh-xl-700px{max-height:700px!important}.mh-xl-750px{max-height:750px!important}.mh-xl-800px{max-height:800px!important}.mh-xl-850px{max-height:850px!important}.mh-xl-900px{max-height:900px!important}.mh-xl-950px{max-height:950px!important}.mh-xl-1000px{max-height:1000px!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:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:.75rem!important}.m-xl-4{margin:1rem!important}.m-xl-5{margin:1.25rem!important}.m-xl-6{margin:1.5rem!important}.m-xl-7{margin:1.75rem!important}.m-xl-8{margin:2rem!important}.m-xl-9{margin:2.25rem!important}.m-xl-10{margin:2.5rem!important}.m-xl-11{margin:2.75rem!important}.m-xl-12{margin:3rem!important}.m-xl-13{margin:3.25rem!important}.m-xl-14{margin:3.5rem!important}.m-xl-15{margin:3.75rem!important}.m-xl-16{margin:4rem!important}.m-xl-17{margin:4.25rem!important}.m-xl-18{margin:4.5rem!important}.m-xl-19{margin:4.75rem!important}.m-xl-20{margin:5rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:.75rem!important;margin-left:.75rem!important}.mx-xl-4{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-5{margin-right:1.25rem!important;margin-left:1.25rem!important}.mx-xl-6{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-7{margin-right:1.75rem!important;margin-left:1.75rem!important}.mx-xl-8{margin-right:2rem!important;margin-left:2rem!important}.mx-xl-9{margin-right:2.25rem!important;margin-left:2.25rem!important}.mx-xl-10{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-xl-11{margin-right:2.75rem!important;margin-left:2.75rem!important}.mx-xl-12{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-13{margin-right:3.25rem!important;margin-left:3.25rem!important}.mx-xl-14{margin-right:3.5rem!important;margin-left:3.5rem!important}.mx-xl-15{margin-right:3.75rem!important;margin-left:3.75rem!important}.mx-xl-16{margin-right:4rem!important;margin-left:4rem!important}.mx-xl-17{margin-right:4.25rem!important;margin-left:4.25rem!important}.mx-xl-18{margin-right:4.5rem!important;margin-left:4.5rem!important}.mx-xl-19{margin-right:4.75rem!important;margin-left:4.75rem!important}.mx-xl-20{margin-right:5rem!important;margin-left:5rem!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:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.my-xl-4{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-5{margin-top:1.25rem!important;margin-bottom:1.25rem!important}.my-xl-6{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-7{margin-top:1.75rem!important;margin-bottom:1.75rem!important}.my-xl-8{margin-top:2rem!important;margin-bottom:2rem!important}.my-xl-9{margin-top:2.25rem!important;margin-bottom:2.25rem!important}.my-xl-10{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-xl-11{margin-top:2.75rem!important;margin-bottom:2.75rem!important}.my-xl-12{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-13{margin-top:3.25rem!important;margin-bottom:3.25rem!important}.my-xl-14{margin-top:3.5rem!important;margin-bottom:3.5rem!important}.my-xl-15{margin-top:3.75rem!important;margin-bottom:3.75rem!important}.my-xl-16{margin-top:4rem!important;margin-bottom:4rem!important}.my-xl-17{margin-top:4.25rem!important;margin-bottom:4.25rem!important}.my-xl-18{margin-top:4.5rem!important;margin-bottom:4.5rem!important}.my-xl-19{margin-top:4.75rem!important;margin-bottom:4.75rem!important}.my-xl-20{margin-top:5rem!important;margin-bottom:5rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:.75rem!important}.mt-xl-4{margin-top:1rem!important}.mt-xl-5{margin-top:1.25rem!important}.mt-xl-6{margin-top:1.5rem!important}.mt-xl-7{margin-top:1.75rem!important}.mt-xl-8{margin-top:2rem!important}.mt-xl-9{margin-top:2.25rem!important}.mt-xl-10{margin-top:2.5rem!important}.mt-xl-11{margin-top:2.75rem!important}.mt-xl-12{margin-top:3rem!important}.mt-xl-13{margin-top:3.25rem!important}.mt-xl-14{margin-top:3.5rem!important}.mt-xl-15{margin-top:3.75rem!important}.mt-xl-16{margin-top:4rem!important}.mt-xl-17{margin-top:4.25rem!important}.mt-xl-18{margin-top:4.5rem!important}.mt-xl-19{margin-top:4.75rem!important}.mt-xl-20{margin-top:5rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:.75rem!important}.me-xl-4{margin-right:1rem!important}.me-xl-5{margin-right:1.25rem!important}.me-xl-6{margin-right:1.5rem!important}.me-xl-7{margin-right:1.75rem!important}.me-xl-8{margin-right:2rem!important}.me-xl-9{margin-right:2.25rem!important}.me-xl-10{margin-right:2.5rem!important}.me-xl-11{margin-right:2.75rem!important}.me-xl-12{margin-right:3rem!important}.me-xl-13{margin-right:3.25rem!important}.me-xl-14{margin-right:3.5rem!important}.me-xl-15{margin-right:3.75rem!important}.me-xl-16{margin-right:4rem!important}.me-xl-17{margin-right:4.25rem!important}.me-xl-18{margin-right:4.5rem!important}.me-xl-19{margin-right:4.75rem!important}.me-xl-20{margin-right:5rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:.75rem!important}.mb-xl-4{margin-bottom:1rem!important}.mb-xl-5{margin-bottom:1.25rem!important}.mb-xl-6{margin-bottom:1.5rem!important}.mb-xl-7{margin-bottom:1.75rem!important}.mb-xl-8{margin-bottom:2rem!important}.mb-xl-9{margin-bottom:2.25rem!important}.mb-xl-10{margin-bottom:2.5rem!important}.mb-xl-11{margin-bottom:2.75rem!important}.mb-xl-12{margin-bottom:3rem!important}.mb-xl-13{margin-bottom:3.25rem!important}.mb-xl-14{margin-bottom:3.5rem!important}.mb-xl-15{margin-bottom:3.75rem!important}.mb-xl-16{margin-bottom:4rem!important}.mb-xl-17{margin-bottom:4.25rem!important}.mb-xl-18{margin-bottom:4.5rem!important}.mb-xl-19{margin-bottom:4.75rem!important}.mb-xl-20{margin-bottom:5rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:.75rem!important}.ms-xl-4{margin-left:1rem!important}.ms-xl-5{margin-left:1.25rem!important}.ms-xl-6{margin-left:1.5rem!important}.ms-xl-7{margin-left:1.75rem!important}.ms-xl-8{margin-left:2rem!important}.ms-xl-9{margin-left:2.25rem!important}.ms-xl-10{margin-left:2.5rem!important}.ms-xl-11{margin-left:2.75rem!important}.ms-xl-12{margin-left:3rem!important}.ms-xl-13{margin-left:3.25rem!important}.ms-xl-14{margin-left:3.5rem!important}.ms-xl-15{margin-left:3.75rem!important}.ms-xl-16{margin-left:4rem!important}.ms-xl-17{margin-left:4.25rem!important}.ms-xl-18{margin-left:4.5rem!important}.ms-xl-19{margin-left:4.75rem!important}.ms-xl-20{margin-left:5rem!important}.ms-xl-auto{margin-left:auto!important}.m-xl-n1{margin:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.m-xl-n3{margin:-.75rem!important}.m-xl-n4{margin:-1rem!important}.m-xl-n5{margin:-1.25rem!important}.m-xl-n6{margin:-1.5rem!important}.m-xl-n7{margin:-1.75rem!important}.m-xl-n8{margin:-2rem!important}.m-xl-n9{margin:-2.25rem!important}.m-xl-n10{margin:-2.5rem!important}.m-xl-n11{margin:-2.75rem!important}.m-xl-n12{margin:-3rem!important}.m-xl-n13{margin:-3.25rem!important}.m-xl-n14{margin:-3.5rem!important}.m-xl-n15{margin:-3.75rem!important}.m-xl-n16{margin:-4rem!important}.m-xl-n17{margin:-4.25rem!important}.m-xl-n18{margin:-4.5rem!important}.m-xl-n19{margin:-4.75rem!important}.m-xl-n20{margin:-5rem!important}.mx-xl-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-xl-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-xl-n3{margin-right:-.75rem!important;margin-left:-.75rem!important}.mx-xl-n4{margin-right:-1rem!important;margin-left:-1rem!important}.mx-xl-n5{margin-right:-1.25rem!important;margin-left:-1.25rem!important}.mx-xl-n6{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-xl-n7{margin-right:-1.75rem!important;margin-left:-1.75rem!important}.mx-xl-n8{margin-right:-2rem!important;margin-left:-2rem!important}.mx-xl-n9{margin-right:-2.25rem!important;margin-left:-2.25rem!important}.mx-xl-n10{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.mx-xl-n11{margin-right:-2.75rem!important;margin-left:-2.75rem!important}.mx-xl-n12{margin-right:-3rem!important;margin-left:-3rem!important}.mx-xl-n13{margin-right:-3.25rem!important;margin-left:-3.25rem!important}.mx-xl-n14{margin-right:-3.5rem!important;margin-left:-3.5rem!important}.mx-xl-n15{margin-right:-3.75rem!important;margin-left:-3.75rem!important}.mx-xl-n16{margin-right:-4rem!important;margin-left:-4rem!important}.mx-xl-n17{margin-right:-4.25rem!important;margin-left:-4.25rem!important}.mx-xl-n18{margin-right:-4.5rem!important;margin-left:-4.5rem!important}.mx-xl-n19{margin-right:-4.75rem!important;margin-left:-4.75rem!important}.mx-xl-n20{margin-right:-5rem!important;margin-left:-5rem!important}.my-xl-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-xl-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-xl-n3{margin-top:-.75rem!important;margin-bottom:-.75rem!important}.my-xl-n4{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-xl-n5{margin-top:-1.25rem!important;margin-bottom:-1.25rem!important}.my-xl-n6{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-xl-n7{margin-top:-1.75rem!important;margin-bottom:-1.75rem!important}.my-xl-n8{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-xl-n9{margin-top:-2.25rem!important;margin-bottom:-2.25rem!important}.my-xl-n10{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.my-xl-n11{margin-top:-2.75rem!important;margin-bottom:-2.75rem!important}.my-xl-n12{margin-top:-3rem!important;margin-bottom:-3rem!important}.my-xl-n13{margin-top:-3.25rem!important;margin-bottom:-3.25rem!important}.my-xl-n14{margin-top:-3.5rem!important;margin-bottom:-3.5rem!important}.my-xl-n15{margin-top:-3.75rem!important;margin-bottom:-3.75rem!important}.my-xl-n16{margin-top:-4rem!important;margin-bottom:-4rem!important}.my-xl-n17{margin-top:-4.25rem!important;margin-bottom:-4.25rem!important}.my-xl-n18{margin-top:-4.5rem!important;margin-bottom:-4.5rem!important}.my-xl-n19{margin-top:-4.75rem!important;margin-bottom:-4.75rem!important}.my-xl-n20{margin-top:-5rem!important;margin-bottom:-5rem!important}.mt-xl-n1{margin-top:-.25rem!important}.mt-xl-n2{margin-top:-.5rem!important}.mt-xl-n3{margin-top:-.75rem!important}.mt-xl-n4{margin-top:-1rem!important}.mt-xl-n5{margin-top:-1.25rem!important}.mt-xl-n6{margin-top:-1.5rem!important}.mt-xl-n7{margin-top:-1.75rem!important}.mt-xl-n8{margin-top:-2rem!important}.mt-xl-n9{margin-top:-2.25rem!important}.mt-xl-n10{margin-top:-2.5rem!important}.mt-xl-n11{margin-top:-2.75rem!important}.mt-xl-n12{margin-top:-3rem!important}.mt-xl-n13{margin-top:-3.25rem!important}.mt-xl-n14{margin-top:-3.5rem!important}.mt-xl-n15{margin-top:-3.75rem!important}.mt-xl-n16{margin-top:-4rem!important}.mt-xl-n17{margin-top:-4.25rem!important}.mt-xl-n18{margin-top:-4.5rem!important}.mt-xl-n19{margin-top:-4.75rem!important}.mt-xl-n20{margin-top:-5rem!important}.me-xl-n1{margin-right:-.25rem!important}.me-xl-n2{margin-right:-.5rem!important}.me-xl-n3{margin-right:-.75rem!important}.me-xl-n4{margin-right:-1rem!important}.me-xl-n5{margin-right:-1.25rem!important}.me-xl-n6{margin-right:-1.5rem!important}.me-xl-n7{margin-right:-1.75rem!important}.me-xl-n8{margin-right:-2rem!important}.me-xl-n9{margin-right:-2.25rem!important}.me-xl-n10{margin-right:-2.5rem!important}.me-xl-n11{margin-right:-2.75rem!important}.me-xl-n12{margin-right:-3rem!important}.me-xl-n13{margin-right:-3.25rem!important}.me-xl-n14{margin-right:-3.5rem!important}.me-xl-n15{margin-right:-3.75rem!important}.me-xl-n16{margin-right:-4rem!important}.me-xl-n17{margin-right:-4.25rem!important}.me-xl-n18{margin-right:-4.5rem!important}.me-xl-n19{margin-right:-4.75rem!important}.me-xl-n20{margin-right:-5rem!important}.mb-xl-n1{margin-bottom:-.25rem!important}.mb-xl-n2{margin-bottom:-.5rem!important}.mb-xl-n3{margin-bottom:-.75rem!important}.mb-xl-n4{margin-bottom:-1rem!important}.mb-xl-n5{margin-bottom:-1.25rem!important}.mb-xl-n6{margin-bottom:-1.5rem!important}.mb-xl-n7{margin-bottom:-1.75rem!important}.mb-xl-n8{margin-bottom:-2rem!important}.mb-xl-n9{margin-bottom:-2.25rem!important}.mb-xl-n10{margin-bottom:-2.5rem!important}.mb-xl-n11{margin-bottom:-2.75rem!important}.mb-xl-n12{margin-bottom:-3rem!important}.mb-xl-n13{margin-bottom:-3.25rem!important}.mb-xl-n14{margin-bottom:-3.5rem!important}.mb-xl-n15{margin-bottom:-3.75rem!important}.mb-xl-n16{margin-bottom:-4rem!important}.mb-xl-n17{margin-bottom:-4.25rem!important}.mb-xl-n18{margin-bottom:-4.5rem!important}.mb-xl-n19{margin-bottom:-4.75rem!important}.mb-xl-n20{margin-bottom:-5rem!important}.ms-xl-n1{margin-left:-.25rem!important}.ms-xl-n2{margin-left:-.5rem!important}.ms-xl-n3{margin-left:-.75rem!important}.ms-xl-n4{margin-left:-1rem!important}.ms-xl-n5{margin-left:-1.25rem!important}.ms-xl-n6{margin-left:-1.5rem!important}.ms-xl-n7{margin-left:-1.75rem!important}.ms-xl-n8{margin-left:-2rem!important}.ms-xl-n9{margin-left:-2.25rem!important}.ms-xl-n10{margin-left:-2.5rem!important}.ms-xl-n11{margin-left:-2.75rem!important}.ms-xl-n12{margin-left:-3rem!important}.ms-xl-n13{margin-left:-3.25rem!important}.ms-xl-n14{margin-left:-3.5rem!important}.ms-xl-n15{margin-left:-3.75rem!important}.ms-xl-n16{margin-left:-4rem!important}.ms-xl-n17{margin-left:-4.25rem!important}.ms-xl-n18{margin-left:-4.5rem!important}.ms-xl-n19{margin-left:-4.75rem!important}.ms-xl-n20{margin-left:-5rem!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:.75rem!important}.p-xl-4{padding:1rem!important}.p-xl-5{padding:1.25rem!important}.p-xl-6{padding:1.5rem!important}.p-xl-7{padding:1.75rem!important}.p-xl-8{padding:2rem!important}.p-xl-9{padding:2.25rem!important}.p-xl-10{padding:2.5rem!important}.p-xl-11{padding:2.75rem!important}.p-xl-12{padding:3rem!important}.p-xl-13{padding:3.25rem!important}.p-xl-14{padding:3.5rem!important}.p-xl-15{padding:3.75rem!important}.p-xl-16{padding:4rem!important}.p-xl-17{padding:4.25rem!important}.p-xl-18{padding:4.5rem!important}.p-xl-19{padding:4.75rem!important}.p-xl-20{padding:5rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:.75rem!important;padding-left:.75rem!important}.px-xl-4{padding-right:1rem!important;padding-left:1rem!important}.px-xl-5{padding-right:1.25rem!important;padding-left:1.25rem!important}.px-xl-6{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-7{padding-right:1.75rem!important;padding-left:1.75rem!important}.px-xl-8{padding-right:2rem!important;padding-left:2rem!important}.px-xl-9{padding-right:2.25rem!important;padding-left:2.25rem!important}.px-xl-10{padding-right:2.5rem!important;padding-left:2.5rem!important}.px-xl-11{padding-right:2.75rem!important;padding-left:2.75rem!important}.px-xl-12{padding-right:3rem!important;padding-left:3rem!important}.px-xl-13{padding-right:3.25rem!important;padding-left:3.25rem!important}.px-xl-14{padding-right:3.5rem!important;padding-left:3.5rem!important}.px-xl-15{padding-right:3.75rem!important;padding-left:3.75rem!important}.px-xl-16{padding-right:4rem!important;padding-left:4rem!important}.px-xl-17{padding-right:4.25rem!important;padding-left:4.25rem!important}.px-xl-18{padding-right:4.5rem!important;padding-left:4.5rem!important}.px-xl-19{padding-right:4.75rem!important;padding-left:4.75rem!important}.px-xl-20{padding-right:5rem!important;padding-left:5rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.py-xl-4{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-5{padding-top:1.25rem!important;padding-bottom:1.25rem!important}.py-xl-6{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-7{padding-top:1.75rem!important;padding-bottom:1.75rem!important}.py-xl-8{padding-top:2rem!important;padding-bottom:2rem!important}.py-xl-9{padding-top:2.25rem!important;padding-bottom:2.25rem!important}.py-xl-10{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.py-xl-11{padding-top:2.75rem!important;padding-bottom:2.75rem!important}.py-xl-12{padding-top:3rem!important;padding-bottom:3rem!important}.py-xl-13{padding-top:3.25rem!important;padding-bottom:3.25rem!important}.py-xl-14{padding-top:3.5rem!important;padding-bottom:3.5rem!important}.py-xl-15{padding-top:3.75rem!important;padding-bottom:3.75rem!important}.py-xl-16{padding-top:4rem!important;padding-bottom:4rem!important}.py-xl-17{padding-top:4.25rem!important;padding-bottom:4.25rem!important}.py-xl-18{padding-top:4.5rem!important;padding-bottom:4.5rem!important}.py-xl-19{padding-top:4.75rem!important;padding-bottom:4.75rem!important}.py-xl-20{padding-top:5rem!important;padding-bottom:5rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:.75rem!important}.pt-xl-4{padding-top:1rem!important}.pt-xl-5{padding-top:1.25rem!important}.pt-xl-6{padding-top:1.5rem!important}.pt-xl-7{padding-top:1.75rem!important}.pt-xl-8{padding-top:2rem!important}.pt-xl-9{padding-top:2.25rem!important}.pt-xl-10{padding-top:2.5rem!important}.pt-xl-11{padding-top:2.75rem!important}.pt-xl-12{padding-top:3rem!important}.pt-xl-13{padding-top:3.25rem!important}.pt-xl-14{padding-top:3.5rem!important}.pt-xl-15{padding-top:3.75rem!important}.pt-xl-16{padding-top:4rem!important}.pt-xl-17{padding-top:4.25rem!important}.pt-xl-18{padding-top:4.5rem!important}.pt-xl-19{padding-top:4.75rem!important}.pt-xl-20{padding-top:5rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:.75rem!important}.pe-xl-4{padding-right:1rem!important}.pe-xl-5{padding-right:1.25rem!important}.pe-xl-6{padding-right:1.5rem!important}.pe-xl-7{padding-right:1.75rem!important}.pe-xl-8{padding-right:2rem!important}.pe-xl-9{padding-right:2.25rem!important}.pe-xl-10{padding-right:2.5rem!important}.pe-xl-11{padding-right:2.75rem!important}.pe-xl-12{padding-right:3rem!important}.pe-xl-13{padding-right:3.25rem!important}.pe-xl-14{padding-right:3.5rem!important}.pe-xl-15{padding-right:3.75rem!important}.pe-xl-16{padding-right:4rem!important}.pe-xl-17{padding-right:4.25rem!important}.pe-xl-18{padding-right:4.5rem!important}.pe-xl-19{padding-right:4.75rem!important}.pe-xl-20{padding-right:5rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:.75rem!important}.pb-xl-4{padding-bottom:1rem!important}.pb-xl-5{padding-bottom:1.25rem!important}.pb-xl-6{padding-bottom:1.5rem!important}.pb-xl-7{padding-bottom:1.75rem!important}.pb-xl-8{padding-bottom:2rem!important}.pb-xl-9{padding-bottom:2.25rem!important}.pb-xl-10{padding-bottom:2.5rem!important}.pb-xl-11{padding-bottom:2.75rem!important}.pb-xl-12{padding-bottom:3rem!important}.pb-xl-13{padding-bottom:3.25rem!important}.pb-xl-14{padding-bottom:3.5rem!important}.pb-xl-15{padding-bottom:3.75rem!important}.pb-xl-16{padding-bottom:4rem!important}.pb-xl-17{padding-bottom:4.25rem!important}.pb-xl-18{padding-bottom:4.5rem!important}.pb-xl-19{padding-bottom:4.75rem!important}.pb-xl-20{padding-bottom:5rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:.75rem!important}.ps-xl-4{padding-left:1rem!important}.ps-xl-5{padding-left:1.25rem!important}.ps-xl-6{padding-left:1.5rem!important}.ps-xl-7{padding-left:1.75rem!important}.ps-xl-8{padding-left:2rem!important}.ps-xl-9{padding-left:2.25rem!important}.ps-xl-10{padding-left:2.5rem!important}.ps-xl-11{padding-left:2.75rem!important}.ps-xl-12{padding-left:3rem!important}.ps-xl-13{padding-left:3.25rem!important}.ps-xl-14{padding-left:3.5rem!important}.ps-xl-15{padding-left:3.75rem!important}.ps-xl-16{padding-left:4rem!important}.ps-xl-17{padding-left:4.25rem!important}.ps-xl-18{padding-left:4.5rem!important}.ps-xl-19{padding-left:4.75rem!important}.ps-xl-20{padding-left:5rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:.75rem!important}.gap-xl-4{gap:1rem!important}.gap-xl-5{gap:1.25rem!important}.gap-xl-6{gap:1.5rem!important}.gap-xl-7{gap:1.75rem!important}.gap-xl-8{gap:2rem!important}.gap-xl-9{gap:2.25rem!important}.gap-xl-10{gap:2.5rem!important}.gap-xl-11{gap:2.75rem!important}.gap-xl-12{gap:3rem!important}.gap-xl-13{gap:3.25rem!important}.gap-xl-14{gap:3.5rem!important}.gap-xl-15{gap:3.75rem!important}.gap-xl-16{gap:4rem!important}.gap-xl-17{gap:4.25rem!important}.gap-xl-18{gap:4.5rem!important}.gap-xl-19{gap:4.75rem!important}.gap-xl-20{gap:5rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:.75rem!important}.row-gap-xl-4{row-gap:1rem!important}.row-gap-xl-5{row-gap:1.25rem!important}.row-gap-xl-6{row-gap:1.5rem!important}.row-gap-xl-7{row-gap:1.75rem!important}.row-gap-xl-8{row-gap:2rem!important}.row-gap-xl-9{row-gap:2.25rem!important}.row-gap-xl-10{row-gap:2.5rem!important}.row-gap-xl-11{row-gap:2.75rem!important}.row-gap-xl-12{row-gap:3rem!important}.row-gap-xl-13{row-gap:3.25rem!important}.row-gap-xl-14{row-gap:3.5rem!important}.row-gap-xl-15{row-gap:3.75rem!important}.row-gap-xl-16{row-gap:4rem!important}.row-gap-xl-17{row-gap:4.25rem!important}.row-gap-xl-18{row-gap:4.5rem!important}.row-gap-xl-19{row-gap:4.75rem!important}.row-gap-xl-20{row-gap:5rem!important}.column-gap-xl-0{column-gap:0!important}.column-gap-xl-1{column-gap:.25rem!important}.column-gap-xl-2{column-gap:.5rem!important}.column-gap-xl-3{column-gap:.75rem!important}.column-gap-xl-4{column-gap:1rem!important}.column-gap-xl-5{column-gap:1.25rem!important}.column-gap-xl-6{column-gap:1.5rem!important}.column-gap-xl-7{column-gap:1.75rem!important}.column-gap-xl-8{column-gap:2rem!important}.column-gap-xl-9{column-gap:2.25rem!important}.column-gap-xl-10{column-gap:2.5rem!important}.column-gap-xl-11{column-gap:2.75rem!important}.column-gap-xl-12{column-gap:3rem!important}.column-gap-xl-13{column-gap:3.25rem!important}.column-gap-xl-14{column-gap:3.5rem!important}.column-gap-xl-15{column-gap:3.75rem!important}.column-gap-xl-16{column-gap:4rem!important}.column-gap-xl-17{column-gap:4.25rem!important}.column-gap-xl-18{column-gap:4.5rem!important}.column-gap-xl-19{column-gap:4.75rem!important}.column-gap-xl-20{column-gap:5rem!important}.fs-xl-1{font-size:calc(1.3rem + .6vw)!important}.fs-xl-2{font-size:calc(1.275rem + .3vw)!important}.fs-xl-3{font-size:calc(1.26rem + .12vw)!important}.fs-xl-4{font-size:1.25rem!important}.fs-xl-5{font-size:1.15rem!important}.fs-xl-6{font-size:1.075rem!important}.fs-xl-7{font-size:.95rem!important}.fs-xl-8{font-size:.85rem!important}.fs-xl-9{font-size:.75rem!important}.fs-xl-10{font-size:.5rem!important}.fs-xl-sm{font-size:.95rem!important}.fs-xl-base{font-size:1rem!important}.fs-xl-lg{font-size:1.075rem!important}.fs-xl-xl{font-size:1.21rem!important}.fs-xl-fluid{font-size:100%!important}.fs-xl-2x{font-size:calc(1.325rem + .9vw)!important}.fs-xl-2qx{font-size:calc(1.35rem + 1.2vw)!important}.fs-xl-2hx{font-size:calc(1.375rem + 1.5vw)!important}.fs-xl-2tx{font-size:calc(1.4rem + 1.8vw)!important}.fs-xl-3x{font-size:calc(1.425rem + 2.1vw)!important}.fs-xl-3qx{font-size:calc(1.45rem + 2.4vw)!important}.fs-xl-3hx{font-size:calc(1.475rem + 2.7vw)!important}.fs-xl-3tx{font-size:calc(1.5rem + 3vw)!important}.fs-xl-4x{font-size:calc(1.525rem + 3.3vw)!important}.fs-xl-4qx{font-size:calc(1.55rem + 3.6vw)!important}.fs-xl-4hx{font-size:calc(1.575rem + 3.9vw)!important}.fs-xl-4tx{font-size:calc(1.6rem + 4.2vw)!important}.fs-xl-5x{font-size:calc(1.625rem + 4.5vw)!important}.fs-xl-5qx{font-size:calc(1.65rem + 4.8vw)!important}.fs-xl-5hx{font-size:calc(1.675rem + 5.1vw)!important}.fs-xl-5tx{font-size:calc(1.7rem + 5.4vw)!important}.fs-xl-6x{font-size:calc(1.725rem + 5.7vw)!important}.fs-xl-6qx{font-size:calc(1.75rem + 6vw)!important}.fs-xl-6hx{font-size:calc(1.775rem + 6.3vw)!important}.fs-xl-6tx{font-size:calc(1.8rem + 6.6vw)!important}.fs-xl-7x{font-size:calc(1.825rem + 6.9vw)!important}.fs-xl-7qx{font-size:calc(1.85rem + 7.2vw)!important}.fs-xl-7hx{font-size:calc(1.875rem + 7.5vw)!important}.fs-xl-7tx{font-size:calc(1.9rem + 7.8vw)!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}.min-w-xl-unset{min-width:unset!important}.min-w-xl-25{min-width:25%!important}.min-w-xl-50{min-width:50%!important}.min-w-xl-75{min-width:75%!important}.min-w-xl-100{min-width:100%!important}.min-w-xl-auto{min-width:auto!important}.min-w-xl-1px{min-width:1px!important}.min-w-xl-2px{min-width:2px!important}.min-w-xl-3px{min-width:3px!important}.min-w-xl-4px{min-width:4px!important}.min-w-xl-5px{min-width:5px!important}.min-w-xl-6px{min-width:6px!important}.min-w-xl-7px{min-width:7px!important}.min-w-xl-8px{min-width:8px!important}.min-w-xl-9px{min-width:9px!important}.min-w-xl-10px{min-width:10px!important}.min-w-xl-15px{min-width:15px!important}.min-w-xl-20px{min-width:20px!important}.min-w-xl-25px{min-width:25px!important}.min-w-xl-30px{min-width:30px!important}.min-w-xl-35px{min-width:35px!important}.min-w-xl-40px{min-width:40px!important}.min-w-xl-45px{min-width:45px!important}.min-w-xl-50px{min-width:50px!important}.min-w-xl-55px{min-width:55px!important}.min-w-xl-60px{min-width:60px!important}.min-w-xl-65px{min-width:65px!important}.min-w-xl-70px{min-width:70px!important}.min-w-xl-75px{min-width:75px!important}.min-w-xl-80px{min-width:80px!important}.min-w-xl-85px{min-width:85px!important}.min-w-xl-90px{min-width:90px!important}.min-w-xl-95px{min-width:95px!important}.min-w-xl-100px{min-width:100px!important}.min-w-xl-125px{min-width:125px!important}.min-w-xl-150px{min-width:150px!important}.min-w-xl-175px{min-width:175px!important}.min-w-xl-200px{min-width:200px!important}.min-w-xl-225px{min-width:225px!important}.min-w-xl-250px{min-width:250px!important}.min-w-xl-275px{min-width:275px!important}.min-w-xl-300px{min-width:300px!important}.min-w-xl-325px{min-width:325px!important}.min-w-xl-350px{min-width:350px!important}.min-w-xl-375px{min-width:375px!important}.min-w-xl-400px{min-width:400px!important}.min-w-xl-425px{min-width:425px!important}.min-w-xl-450px{min-width:450px!important}.min-w-xl-475px{min-width:475px!important}.min-w-xl-500px{min-width:500px!important}.min-w-xl-550px{min-width:550px!important}.min-w-xl-600px{min-width:600px!important}.min-w-xl-650px{min-width:650px!important}.min-w-xl-700px{min-width:700px!important}.min-w-xl-750px{min-width:750px!important}.min-w-xl-800px{min-width:800px!important}.min-w-xl-850px{min-width:850px!important}.min-w-xl-900px{min-width:900px!important}.min-w-xl-950px{min-width:950px!important}.min-w-xl-1000px{min-width:1000px!important}.min-h-xl-unset{min-height:unset!important}.min-h-xl-25{min-height:25%!important}.min-h-xl-50{min-height:50%!important}.min-h-xl-75{min-height:75%!important}.min-h-xl-100{min-height:100%!important}.min-h-xl-auto{min-height:auto!important}.min-h-xl-1px{min-height:1px!important}.min-h-xl-2px{min-height:2px!important}.min-h-xl-3px{min-height:3px!important}.min-h-xl-4px{min-height:4px!important}.min-h-xl-5px{min-height:5px!important}.min-h-xl-6px{min-height:6px!important}.min-h-xl-7px{min-height:7px!important}.min-h-xl-8px{min-height:8px!important}.min-h-xl-9px{min-height:9px!important}.min-h-xl-10px{min-height:10px!important}.min-h-xl-15px{min-height:15px!important}.min-h-xl-20px{min-height:20px!important}.min-h-xl-25px{min-height:25px!important}.min-h-xl-30px{min-height:30px!important}.min-h-xl-35px{min-height:35px!important}.min-h-xl-40px{min-height:40px!important}.min-h-xl-45px{min-height:45px!important}.min-h-xl-50px{min-height:50px!important}.min-h-xl-55px{min-height:55px!important}.min-h-xl-60px{min-height:60px!important}.min-h-xl-65px{min-height:65px!important}.min-h-xl-70px{min-height:70px!important}.min-h-xl-75px{min-height:75px!important}.min-h-xl-80px{min-height:80px!important}.min-h-xl-85px{min-height:85px!important}.min-h-xl-90px{min-height:90px!important}.min-h-xl-95px{min-height:95px!important}.min-h-xl-100px{min-height:100px!important}.min-h-xl-125px{min-height:125px!important}.min-h-xl-150px{min-height:150px!important}.min-h-xl-175px{min-height:175px!important}.min-h-xl-200px{min-height:200px!important}.min-h-xl-225px{min-height:225px!important}.min-h-xl-250px{min-height:250px!important}.min-h-xl-275px{min-height:275px!important}.min-h-xl-300px{min-height:300px!important}.min-h-xl-325px{min-height:325px!important}.min-h-xl-350px{min-height:350px!important}.min-h-xl-375px{min-height:375px!important}.min-h-xl-400px{min-height:400px!important}.min-h-xl-425px{min-height:425px!important}.min-h-xl-450px{min-height:450px!important}.min-h-xl-475px{min-height:475px!important}.min-h-xl-500px{min-height:500px!important}.min-h-xl-550px{min-height:550px!important}.min-h-xl-600px{min-height:600px!important}.min-h-xl-650px{min-height:650px!important}.min-h-xl-700px{min-height:700px!important}.min-h-xl-750px{min-height:750px!important}.min-h-xl-800px{min-height:800px!important}.min-h-xl-850px{min-height:850px!important}.min-h-xl-900px{min-height:900px!important}.min-h-xl-950px{min-height:950px!important}.min-h-xl-1000px{min-height:1000px!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{object-fit:contain!important}.object-fit-xxl-cover{object-fit:cover!important}.object-fit-xxl-fill{object-fit:fill!important}.object-fit-xxl-scale{object-fit:scale-down!important}.object-fit-xxl-none{object-fit:none!important}.overflow-xxl-auto{overflow:auto!important}.overflow-xxl-hidden{overflow:hidden!important}.overflow-xxl-visible{overflow:visible!important}.overflow-xxl-scroll{overflow:scroll!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}.position-xxl-static{position:static!important}.position-xxl-relative{position:relative!important}.position-xxl-absolute{position:absolute!important}.position-xxl-fixed{position:fixed!important}.position-xxl-sticky{position:sticky!important}.w-xxl-unset{width:unset!important}.w-xxl-25{width:25%!important}.w-xxl-50{width:50%!important}.w-xxl-75{width:75%!important}.w-xxl-100{width:100%!important}.w-xxl-auto{width:auto!important}.w-xxl-1px{width:1px!important}.w-xxl-2px{width:2px!important}.w-xxl-3px{width:3px!important}.w-xxl-4px{width:4px!important}.w-xxl-5px{width:5px!important}.w-xxl-6px{width:6px!important}.w-xxl-7px{width:7px!important}.w-xxl-8px{width:8px!important}.w-xxl-9px{width:9px!important}.w-xxl-10px{width:10px!important}.w-xxl-15px{width:15px!important}.w-xxl-20px{width:20px!important}.w-xxl-25px{width:25px!important}.w-xxl-30px{width:30px!important}.w-xxl-35px{width:35px!important}.w-xxl-40px{width:40px!important}.w-xxl-45px{width:45px!important}.w-xxl-50px{width:50px!important}.w-xxl-55px{width:55px!important}.w-xxl-60px{width:60px!important}.w-xxl-65px{width:65px!important}.w-xxl-70px{width:70px!important}.w-xxl-75px{width:75px!important}.w-xxl-80px{width:80px!important}.w-xxl-85px{width:85px!important}.w-xxl-90px{width:90px!important}.w-xxl-95px{width:95px!important}.w-xxl-100px{width:100px!important}.w-xxl-125px{width:125px!important}.w-xxl-150px{width:150px!important}.w-xxl-175px{width:175px!important}.w-xxl-200px{width:200px!important}.w-xxl-225px{width:225px!important}.w-xxl-250px{width:250px!important}.w-xxl-275px{width:275px!important}.w-xxl-300px{width:300px!important}.w-xxl-325px{width:325px!important}.w-xxl-350px{width:350px!important}.w-xxl-375px{width:375px!important}.w-xxl-400px{width:400px!important}.w-xxl-425px{width:425px!important}.w-xxl-450px{width:450px!important}.w-xxl-475px{width:475px!important}.w-xxl-500px{width:500px!important}.w-xxl-550px{width:550px!important}.w-xxl-600px{width:600px!important}.w-xxl-650px{width:650px!important}.w-xxl-700px{width:700px!important}.w-xxl-750px{width:750px!important}.w-xxl-800px{width:800px!important}.w-xxl-850px{width:850px!important}.w-xxl-900px{width:900px!important}.w-xxl-950px{width:950px!important}.w-xxl-1000px{width:1000px!important}.mw-xxl-unset{max-width:unset!important}.mw-xxl-25{max-width:25%!important}.mw-xxl-50{max-width:50%!important}.mw-xxl-75{max-width:75%!important}.mw-xxl-100{max-width:100%!important}.mw-xxl-auto{max-width:auto!important}.mw-xxl-1px{max-width:1px!important}.mw-xxl-2px{max-width:2px!important}.mw-xxl-3px{max-width:3px!important}.mw-xxl-4px{max-width:4px!important}.mw-xxl-5px{max-width:5px!important}.mw-xxl-6px{max-width:6px!important}.mw-xxl-7px{max-width:7px!important}.mw-xxl-8px{max-width:8px!important}.mw-xxl-9px{max-width:9px!important}.mw-xxl-10px{max-width:10px!important}.mw-xxl-15px{max-width:15px!important}.mw-xxl-20px{max-width:20px!important}.mw-xxl-25px{max-width:25px!important}.mw-xxl-30px{max-width:30px!important}.mw-xxl-35px{max-width:35px!important}.mw-xxl-40px{max-width:40px!important}.mw-xxl-45px{max-width:45px!important}.mw-xxl-50px{max-width:50px!important}.mw-xxl-55px{max-width:55px!important}.mw-xxl-60px{max-width:60px!important}.mw-xxl-65px{max-width:65px!important}.mw-xxl-70px{max-width:70px!important}.mw-xxl-75px{max-width:75px!important}.mw-xxl-80px{max-width:80px!important}.mw-xxl-85px{max-width:85px!important}.mw-xxl-90px{max-width:90px!important}.mw-xxl-95px{max-width:95px!important}.mw-xxl-100px{max-width:100px!important}.mw-xxl-125px{max-width:125px!important}.mw-xxl-150px{max-width:150px!important}.mw-xxl-175px{max-width:175px!important}.mw-xxl-200px{max-width:200px!important}.mw-xxl-225px{max-width:225px!important}.mw-xxl-250px{max-width:250px!important}.mw-xxl-275px{max-width:275px!important}.mw-xxl-300px{max-width:300px!important}.mw-xxl-325px{max-width:325px!important}.mw-xxl-350px{max-width:350px!important}.mw-xxl-375px{max-width:375px!important}.mw-xxl-400px{max-width:400px!important}.mw-xxl-425px{max-width:425px!important}.mw-xxl-450px{max-width:450px!important}.mw-xxl-475px{max-width:475px!important}.mw-xxl-500px{max-width:500px!important}.mw-xxl-550px{max-width:550px!important}.mw-xxl-600px{max-width:600px!important}.mw-xxl-650px{max-width:650px!important}.mw-xxl-700px{max-width:700px!important}.mw-xxl-750px{max-width:750px!important}.mw-xxl-800px{max-width:800px!important}.mw-xxl-850px{max-width:850px!important}.mw-xxl-900px{max-width:900px!important}.mw-xxl-950px{max-width:950px!important}.mw-xxl-1000px{max-width:1000px!important}.h-xxl-unset{height:unset!important}.h-xxl-25{height:25%!important}.h-xxl-50{height:50%!important}.h-xxl-75{height:75%!important}.h-xxl-100{height:100%!important}.h-xxl-auto{height:auto!important}.h-xxl-1px{height:1px!important}.h-xxl-2px{height:2px!important}.h-xxl-3px{height:3px!important}.h-xxl-4px{height:4px!important}.h-xxl-5px{height:5px!important}.h-xxl-6px{height:6px!important}.h-xxl-7px{height:7px!important}.h-xxl-8px{height:8px!important}.h-xxl-9px{height:9px!important}.h-xxl-10px{height:10px!important}.h-xxl-15px{height:15px!important}.h-xxl-20px{height:20px!important}.h-xxl-25px{height:25px!important}.h-xxl-30px{height:30px!important}.h-xxl-35px{height:35px!important}.h-xxl-40px{height:40px!important}.h-xxl-45px{height:45px!important}.h-xxl-50px{height:50px!important}.h-xxl-55px{height:55px!important}.h-xxl-60px{height:60px!important}.h-xxl-65px{height:65px!important}.h-xxl-70px{height:70px!important}.h-xxl-75px{height:75px!important}.h-xxl-80px{height:80px!important}.h-xxl-85px{height:85px!important}.h-xxl-90px{height:90px!important}.h-xxl-95px{height:95px!important}.h-xxl-100px{height:100px!important}.h-xxl-125px{height:125px!important}.h-xxl-150px{height:150px!important}.h-xxl-175px{height:175px!important}.h-xxl-200px{height:200px!important}.h-xxl-225px{height:225px!important}.h-xxl-250px{height:250px!important}.h-xxl-275px{height:275px!important}.h-xxl-300px{height:300px!important}.h-xxl-325px{height:325px!important}.h-xxl-350px{height:350px!important}.h-xxl-375px{height:375px!important}.h-xxl-400px{height:400px!important}.h-xxl-425px{height:425px!important}.h-xxl-450px{height:450px!important}.h-xxl-475px{height:475px!important}.h-xxl-500px{height:500px!important}.h-xxl-550px{height:550px!important}.h-xxl-600px{height:600px!important}.h-xxl-650px{height:650px!important}.h-xxl-700px{height:700px!important}.h-xxl-750px{height:750px!important}.h-xxl-800px{height:800px!important}.h-xxl-850px{height:850px!important}.h-xxl-900px{height:900px!important}.h-xxl-950px{height:950px!important}.h-xxl-1000px{height:1000px!important}.mh-xxl-unset{max-height:unset!important}.mh-xxl-25{max-height:25%!important}.mh-xxl-50{max-height:50%!important}.mh-xxl-75{max-height:75%!important}.mh-xxl-100{max-height:100%!important}.mh-xxl-auto{max-height:auto!important}.mh-xxl-1px{max-height:1px!important}.mh-xxl-2px{max-height:2px!important}.mh-xxl-3px{max-height:3px!important}.mh-xxl-4px{max-height:4px!important}.mh-xxl-5px{max-height:5px!important}.mh-xxl-6px{max-height:6px!important}.mh-xxl-7px{max-height:7px!important}.mh-xxl-8px{max-height:8px!important}.mh-xxl-9px{max-height:9px!important}.mh-xxl-10px{max-height:10px!important}.mh-xxl-15px{max-height:15px!important}.mh-xxl-20px{max-height:20px!important}.mh-xxl-25px{max-height:25px!important}.mh-xxl-30px{max-height:30px!important}.mh-xxl-35px{max-height:35px!important}.mh-xxl-40px{max-height:40px!important}.mh-xxl-45px{max-height:45px!important}.mh-xxl-50px{max-height:50px!important}.mh-xxl-55px{max-height:55px!important}.mh-xxl-60px{max-height:60px!important}.mh-xxl-65px{max-height:65px!important}.mh-xxl-70px{max-height:70px!important}.mh-xxl-75px{max-height:75px!important}.mh-xxl-80px{max-height:80px!important}.mh-xxl-85px{max-height:85px!important}.mh-xxl-90px{max-height:90px!important}.mh-xxl-95px{max-height:95px!important}.mh-xxl-100px{max-height:100px!important}.mh-xxl-125px{max-height:125px!important}.mh-xxl-150px{max-height:150px!important}.mh-xxl-175px{max-height:175px!important}.mh-xxl-200px{max-height:200px!important}.mh-xxl-225px{max-height:225px!important}.mh-xxl-250px{max-height:250px!important}.mh-xxl-275px{max-height:275px!important}.mh-xxl-300px{max-height:300px!important}.mh-xxl-325px{max-height:325px!important}.mh-xxl-350px{max-height:350px!important}.mh-xxl-375px{max-height:375px!important}.mh-xxl-400px{max-height:400px!important}.mh-xxl-425px{max-height:425px!important}.mh-xxl-450px{max-height:450px!important}.mh-xxl-475px{max-height:475px!important}.mh-xxl-500px{max-height:500px!important}.mh-xxl-550px{max-height:550px!important}.mh-xxl-600px{max-height:600px!important}.mh-xxl-650px{max-height:650px!important}.mh-xxl-700px{max-height:700px!important}.mh-xxl-750px{max-height:750px!important}.mh-xxl-800px{max-height:800px!important}.mh-xxl-850px{max-height:850px!important}.mh-xxl-900px{max-height:900px!important}.mh-xxl-950px{max-height:950px!important}.mh-xxl-1000px{max-height:1000px!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:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:.75rem!important}.m-xxl-4{margin:1rem!important}.m-xxl-5{margin:1.25rem!important}.m-xxl-6{margin:1.5rem!important}.m-xxl-7{margin:1.75rem!important}.m-xxl-8{margin:2rem!important}.m-xxl-9{margin:2.25rem!important}.m-xxl-10{margin:2.5rem!important}.m-xxl-11{margin:2.75rem!important}.m-xxl-12{margin:3rem!important}.m-xxl-13{margin:3.25rem!important}.m-xxl-14{margin:3.5rem!important}.m-xxl-15{margin:3.75rem!important}.m-xxl-16{margin:4rem!important}.m-xxl-17{margin:4.25rem!important}.m-xxl-18{margin:4.5rem!important}.m-xxl-19{margin:4.75rem!important}.m-xxl-20{margin:5rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:.75rem!important;margin-left:.75rem!important}.mx-xxl-4{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-5{margin-right:1.25rem!important;margin-left:1.25rem!important}.mx-xxl-6{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-7{margin-right:1.75rem!important;margin-left:1.75rem!important}.mx-xxl-8{margin-right:2rem!important;margin-left:2rem!important}.mx-xxl-9{margin-right:2.25rem!important;margin-left:2.25rem!important}.mx-xxl-10{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-xxl-11{margin-right:2.75rem!important;margin-left:2.75rem!important}.mx-xxl-12{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-13{margin-right:3.25rem!important;margin-left:3.25rem!important}.mx-xxl-14{margin-right:3.5rem!important;margin-left:3.5rem!important}.mx-xxl-15{margin-right:3.75rem!important;margin-left:3.75rem!important}.mx-xxl-16{margin-right:4rem!important;margin-left:4rem!important}.mx-xxl-17{margin-right:4.25rem!important;margin-left:4.25rem!important}.mx-xxl-18{margin-right:4.5rem!important;margin-left:4.5rem!important}.mx-xxl-19{margin-right:4.75rem!important;margin-left:4.75rem!important}.mx-xxl-20{margin-right:5rem!important;margin-left:5rem!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:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.my-xxl-4{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-5{margin-top:1.25rem!important;margin-bottom:1.25rem!important}.my-xxl-6{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-7{margin-top:1.75rem!important;margin-bottom:1.75rem!important}.my-xxl-8{margin-top:2rem!important;margin-bottom:2rem!important}.my-xxl-9{margin-top:2.25rem!important;margin-bottom:2.25rem!important}.my-xxl-10{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-xxl-11{margin-top:2.75rem!important;margin-bottom:2.75rem!important}.my-xxl-12{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-13{margin-top:3.25rem!important;margin-bottom:3.25rem!important}.my-xxl-14{margin-top:3.5rem!important;margin-bottom:3.5rem!important}.my-xxl-15{margin-top:3.75rem!important;margin-bottom:3.75rem!important}.my-xxl-16{margin-top:4rem!important;margin-bottom:4rem!important}.my-xxl-17{margin-top:4.25rem!important;margin-bottom:4.25rem!important}.my-xxl-18{margin-top:4.5rem!important;margin-bottom:4.5rem!important}.my-xxl-19{margin-top:4.75rem!important;margin-bottom:4.75rem!important}.my-xxl-20{margin-top:5rem!important;margin-bottom:5rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:.75rem!important}.mt-xxl-4{margin-top:1rem!important}.mt-xxl-5{margin-top:1.25rem!important}.mt-xxl-6{margin-top:1.5rem!important}.mt-xxl-7{margin-top:1.75rem!important}.mt-xxl-8{margin-top:2rem!important}.mt-xxl-9{margin-top:2.25rem!important}.mt-xxl-10{margin-top:2.5rem!important}.mt-xxl-11{margin-top:2.75rem!important}.mt-xxl-12{margin-top:3rem!important}.mt-xxl-13{margin-top:3.25rem!important}.mt-xxl-14{margin-top:3.5rem!important}.mt-xxl-15{margin-top:3.75rem!important}.mt-xxl-16{margin-top:4rem!important}.mt-xxl-17{margin-top:4.25rem!important}.mt-xxl-18{margin-top:4.5rem!important}.mt-xxl-19{margin-top:4.75rem!important}.mt-xxl-20{margin-top:5rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:.75rem!important}.me-xxl-4{margin-right:1rem!important}.me-xxl-5{margin-right:1.25rem!important}.me-xxl-6{margin-right:1.5rem!important}.me-xxl-7{margin-right:1.75rem!important}.me-xxl-8{margin-right:2rem!important}.me-xxl-9{margin-right:2.25rem!important}.me-xxl-10{margin-right:2.5rem!important}.me-xxl-11{margin-right:2.75rem!important}.me-xxl-12{margin-right:3rem!important}.me-xxl-13{margin-right:3.25rem!important}.me-xxl-14{margin-right:3.5rem!important}.me-xxl-15{margin-right:3.75rem!important}.me-xxl-16{margin-right:4rem!important}.me-xxl-17{margin-right:4.25rem!important}.me-xxl-18{margin-right:4.5rem!important}.me-xxl-19{margin-right:4.75rem!important}.me-xxl-20{margin-right:5rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:.75rem!important}.mb-xxl-4{margin-bottom:1rem!important}.mb-xxl-5{margin-bottom:1.25rem!important}.mb-xxl-6{margin-bottom:1.5rem!important}.mb-xxl-7{margin-bottom:1.75rem!important}.mb-xxl-8{margin-bottom:2rem!important}.mb-xxl-9{margin-bottom:2.25rem!important}.mb-xxl-10{margin-bottom:2.5rem!important}.mb-xxl-11{margin-bottom:2.75rem!important}.mb-xxl-12{margin-bottom:3rem!important}.mb-xxl-13{margin-bottom:3.25rem!important}.mb-xxl-14{margin-bottom:3.5rem!important}.mb-xxl-15{margin-bottom:3.75rem!important}.mb-xxl-16{margin-bottom:4rem!important}.mb-xxl-17{margin-bottom:4.25rem!important}.mb-xxl-18{margin-bottom:4.5rem!important}.mb-xxl-19{margin-bottom:4.75rem!important}.mb-xxl-20{margin-bottom:5rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:.75rem!important}.ms-xxl-4{margin-left:1rem!important}.ms-xxl-5{margin-left:1.25rem!important}.ms-xxl-6{margin-left:1.5rem!important}.ms-xxl-7{margin-left:1.75rem!important}.ms-xxl-8{margin-left:2rem!important}.ms-xxl-9{margin-left:2.25rem!important}.ms-xxl-10{margin-left:2.5rem!important}.ms-xxl-11{margin-left:2.75rem!important}.ms-xxl-12{margin-left:3rem!important}.ms-xxl-13{margin-left:3.25rem!important}.ms-xxl-14{margin-left:3.5rem!important}.ms-xxl-15{margin-left:3.75rem!important}.ms-xxl-16{margin-left:4rem!important}.ms-xxl-17{margin-left:4.25rem!important}.ms-xxl-18{margin-left:4.5rem!important}.ms-xxl-19{margin-left:4.75rem!important}.ms-xxl-20{margin-left:5rem!important}.ms-xxl-auto{margin-left:auto!important}.m-xxl-n1{margin:-.25rem!important}.m-xxl-n2{margin:-.5rem!important}.m-xxl-n3{margin:-.75rem!important}.m-xxl-n4{margin:-1rem!important}.m-xxl-n5{margin:-1.25rem!important}.m-xxl-n6{margin:-1.5rem!important}.m-xxl-n7{margin:-1.75rem!important}.m-xxl-n8{margin:-2rem!important}.m-xxl-n9{margin:-2.25rem!important}.m-xxl-n10{margin:-2.5rem!important}.m-xxl-n11{margin:-2.75rem!important}.m-xxl-n12{margin:-3rem!important}.m-xxl-n13{margin:-3.25rem!important}.m-xxl-n14{margin:-3.5rem!important}.m-xxl-n15{margin:-3.75rem!important}.m-xxl-n16{margin:-4rem!important}.m-xxl-n17{margin:-4.25rem!important}.m-xxl-n18{margin:-4.5rem!important}.m-xxl-n19{margin:-4.75rem!important}.m-xxl-n20{margin:-5rem!important}.mx-xxl-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-xxl-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-xxl-n3{margin-right:-.75rem!important;margin-left:-.75rem!important}.mx-xxl-n4{margin-right:-1rem!important;margin-left:-1rem!important}.mx-xxl-n5{margin-right:-1.25rem!important;margin-left:-1.25rem!important}.mx-xxl-n6{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-xxl-n7{margin-right:-1.75rem!important;margin-left:-1.75rem!important}.mx-xxl-n8{margin-right:-2rem!important;margin-left:-2rem!important}.mx-xxl-n9{margin-right:-2.25rem!important;margin-left:-2.25rem!important}.mx-xxl-n10{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.mx-xxl-n11{margin-right:-2.75rem!important;margin-left:-2.75rem!important}.mx-xxl-n12{margin-right:-3rem!important;margin-left:-3rem!important}.mx-xxl-n13{margin-right:-3.25rem!important;margin-left:-3.25rem!important}.mx-xxl-n14{margin-right:-3.5rem!important;margin-left:-3.5rem!important}.mx-xxl-n15{margin-right:-3.75rem!important;margin-left:-3.75rem!important}.mx-xxl-n16{margin-right:-4rem!important;margin-left:-4rem!important}.mx-xxl-n17{margin-right:-4.25rem!important;margin-left:-4.25rem!important}.mx-xxl-n18{margin-right:-4.5rem!important;margin-left:-4.5rem!important}.mx-xxl-n19{margin-right:-4.75rem!important;margin-left:-4.75rem!important}.mx-xxl-n20{margin-right:-5rem!important;margin-left:-5rem!important}.my-xxl-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-xxl-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-xxl-n3{margin-top:-.75rem!important;margin-bottom:-.75rem!important}.my-xxl-n4{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-xxl-n5{margin-top:-1.25rem!important;margin-bottom:-1.25rem!important}.my-xxl-n6{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-xxl-n7{margin-top:-1.75rem!important;margin-bottom:-1.75rem!important}.my-xxl-n8{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-xxl-n9{margin-top:-2.25rem!important;margin-bottom:-2.25rem!important}.my-xxl-n10{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.my-xxl-n11{margin-top:-2.75rem!important;margin-bottom:-2.75rem!important}.my-xxl-n12{margin-top:-3rem!important;margin-bottom:-3rem!important}.my-xxl-n13{margin-top:-3.25rem!important;margin-bottom:-3.25rem!important}.my-xxl-n14{margin-top:-3.5rem!important;margin-bottom:-3.5rem!important}.my-xxl-n15{margin-top:-3.75rem!important;margin-bottom:-3.75rem!important}.my-xxl-n16{margin-top:-4rem!important;margin-bottom:-4rem!important}.my-xxl-n17{margin-top:-4.25rem!important;margin-bottom:-4.25rem!important}.my-xxl-n18{margin-top:-4.5rem!important;margin-bottom:-4.5rem!important}.my-xxl-n19{margin-top:-4.75rem!important;margin-bottom:-4.75rem!important}.my-xxl-n20{margin-top:-5rem!important;margin-bottom:-5rem!important}.mt-xxl-n1{margin-top:-.25rem!important}.mt-xxl-n2{margin-top:-.5rem!important}.mt-xxl-n3{margin-top:-.75rem!important}.mt-xxl-n4{margin-top:-1rem!important}.mt-xxl-n5{margin-top:-1.25rem!important}.mt-xxl-n6{margin-top:-1.5rem!important}.mt-xxl-n7{margin-top:-1.75rem!important}.mt-xxl-n8{margin-top:-2rem!important}.mt-xxl-n9{margin-top:-2.25rem!important}.mt-xxl-n10{margin-top:-2.5rem!important}.mt-xxl-n11{margin-top:-2.75rem!important}.mt-xxl-n12{margin-top:-3rem!important}.mt-xxl-n13{margin-top:-3.25rem!important}.mt-xxl-n14{margin-top:-3.5rem!important}.mt-xxl-n15{margin-top:-3.75rem!important}.mt-xxl-n16{margin-top:-4rem!important}.mt-xxl-n17{margin-top:-4.25rem!important}.mt-xxl-n18{margin-top:-4.5rem!important}.mt-xxl-n19{margin-top:-4.75rem!important}.mt-xxl-n20{margin-top:-5rem!important}.me-xxl-n1{margin-right:-.25rem!important}.me-xxl-n2{margin-right:-.5rem!important}.me-xxl-n3{margin-right:-.75rem!important}.me-xxl-n4{margin-right:-1rem!important}.me-xxl-n5{margin-right:-1.25rem!important}.me-xxl-n6{margin-right:-1.5rem!important}.me-xxl-n7{margin-right:-1.75rem!important}.me-xxl-n8{margin-right:-2rem!important}.me-xxl-n9{margin-right:-2.25rem!important}.me-xxl-n10{margin-right:-2.5rem!important}.me-xxl-n11{margin-right:-2.75rem!important}.me-xxl-n12{margin-right:-3rem!important}.me-xxl-n13{margin-right:-3.25rem!important}.me-xxl-n14{margin-right:-3.5rem!important}.me-xxl-n15{margin-right:-3.75rem!important}.me-xxl-n16{margin-right:-4rem!important}.me-xxl-n17{margin-right:-4.25rem!important}.me-xxl-n18{margin-right:-4.5rem!important}.me-xxl-n19{margin-right:-4.75rem!important}.me-xxl-n20{margin-right:-5rem!important}.mb-xxl-n1{margin-bottom:-.25rem!important}.mb-xxl-n2{margin-bottom:-.5rem!important}.mb-xxl-n3{margin-bottom:-.75rem!important}.mb-xxl-n4{margin-bottom:-1rem!important}.mb-xxl-n5{margin-bottom:-1.25rem!important}.mb-xxl-n6{margin-bottom:-1.5rem!important}.mb-xxl-n7{margin-bottom:-1.75rem!important}.mb-xxl-n8{margin-bottom:-2rem!important}.mb-xxl-n9{margin-bottom:-2.25rem!important}.mb-xxl-n10{margin-bottom:-2.5rem!important}.mb-xxl-n11{margin-bottom:-2.75rem!important}.mb-xxl-n12{margin-bottom:-3rem!important}.mb-xxl-n13{margin-bottom:-3.25rem!important}.mb-xxl-n14{margin-bottom:-3.5rem!important}.mb-xxl-n15{margin-bottom:-3.75rem!important}.mb-xxl-n16{margin-bottom:-4rem!important}.mb-xxl-n17{margin-bottom:-4.25rem!important}.mb-xxl-n18{margin-bottom:-4.5rem!important}.mb-xxl-n19{margin-bottom:-4.75rem!important}.mb-xxl-n20{margin-bottom:-5rem!important}.ms-xxl-n1{margin-left:-.25rem!important}.ms-xxl-n2{margin-left:-.5rem!important}.ms-xxl-n3{margin-left:-.75rem!important}.ms-xxl-n4{margin-left:-1rem!important}.ms-xxl-n5{margin-left:-1.25rem!important}.ms-xxl-n6{margin-left:-1.5rem!important}.ms-xxl-n7{margin-left:-1.75rem!important}.ms-xxl-n8{margin-left:-2rem!important}.ms-xxl-n9{margin-left:-2.25rem!important}.ms-xxl-n10{margin-left:-2.5rem!important}.ms-xxl-n11{margin-left:-2.75rem!important}.ms-xxl-n12{margin-left:-3rem!important}.ms-xxl-n13{margin-left:-3.25rem!important}.ms-xxl-n14{margin-left:-3.5rem!important}.ms-xxl-n15{margin-left:-3.75rem!important}.ms-xxl-n16{margin-left:-4rem!important}.ms-xxl-n17{margin-left:-4.25rem!important}.ms-xxl-n18{margin-left:-4.5rem!important}.ms-xxl-n19{margin-left:-4.75rem!important}.ms-xxl-n20{margin-left:-5rem!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:.75rem!important}.p-xxl-4{padding:1rem!important}.p-xxl-5{padding:1.25rem!important}.p-xxl-6{padding:1.5rem!important}.p-xxl-7{padding:1.75rem!important}.p-xxl-8{padding:2rem!important}.p-xxl-9{padding:2.25rem!important}.p-xxl-10{padding:2.5rem!important}.p-xxl-11{padding:2.75rem!important}.p-xxl-12{padding:3rem!important}.p-xxl-13{padding:3.25rem!important}.p-xxl-14{padding:3.5rem!important}.p-xxl-15{padding:3.75rem!important}.p-xxl-16{padding:4rem!important}.p-xxl-17{padding:4.25rem!important}.p-xxl-18{padding:4.5rem!important}.p-xxl-19{padding:4.75rem!important}.p-xxl-20{padding:5rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:.75rem!important;padding-left:.75rem!important}.px-xxl-4{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-5{padding-right:1.25rem!important;padding-left:1.25rem!important}.px-xxl-6{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-7{padding-right:1.75rem!important;padding-left:1.75rem!important}.px-xxl-8{padding-right:2rem!important;padding-left:2rem!important}.px-xxl-9{padding-right:2.25rem!important;padding-left:2.25rem!important}.px-xxl-10{padding-right:2.5rem!important;padding-left:2.5rem!important}.px-xxl-11{padding-right:2.75rem!important;padding-left:2.75rem!important}.px-xxl-12{padding-right:3rem!important;padding-left:3rem!important}.px-xxl-13{padding-right:3.25rem!important;padding-left:3.25rem!important}.px-xxl-14{padding-right:3.5rem!important;padding-left:3.5rem!important}.px-xxl-15{padding-right:3.75rem!important;padding-left:3.75rem!important}.px-xxl-16{padding-right:4rem!important;padding-left:4rem!important}.px-xxl-17{padding-right:4.25rem!important;padding-left:4.25rem!important}.px-xxl-18{padding-right:4.5rem!important;padding-left:4.5rem!important}.px-xxl-19{padding-right:4.75rem!important;padding-left:4.75rem!important}.px-xxl-20{padding-right:5rem!important;padding-left:5rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.py-xxl-4{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-5{padding-top:1.25rem!important;padding-bottom:1.25rem!important}.py-xxl-6{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-7{padding-top:1.75rem!important;padding-bottom:1.75rem!important}.py-xxl-8{padding-top:2rem!important;padding-bottom:2rem!important}.py-xxl-9{padding-top:2.25rem!important;padding-bottom:2.25rem!important}.py-xxl-10{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.py-xxl-11{padding-top:2.75rem!important;padding-bottom:2.75rem!important}.py-xxl-12{padding-top:3rem!important;padding-bottom:3rem!important}.py-xxl-13{padding-top:3.25rem!important;padding-bottom:3.25rem!important}.py-xxl-14{padding-top:3.5rem!important;padding-bottom:3.5rem!important}.py-xxl-15{padding-top:3.75rem!important;padding-bottom:3.75rem!important}.py-xxl-16{padding-top:4rem!important;padding-bottom:4rem!important}.py-xxl-17{padding-top:4.25rem!important;padding-bottom:4.25rem!important}.py-xxl-18{padding-top:4.5rem!important;padding-bottom:4.5rem!important}.py-xxl-19{padding-top:4.75rem!important;padding-bottom:4.75rem!important}.py-xxl-20{padding-top:5rem!important;padding-bottom:5rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:.75rem!important}.pt-xxl-4{padding-top:1rem!important}.pt-xxl-5{padding-top:1.25rem!important}.pt-xxl-6{padding-top:1.5rem!important}.pt-xxl-7{padding-top:1.75rem!important}.pt-xxl-8{padding-top:2rem!important}.pt-xxl-9{padding-top:2.25rem!important}.pt-xxl-10{padding-top:2.5rem!important}.pt-xxl-11{padding-top:2.75rem!important}.pt-xxl-12{padding-top:3rem!important}.pt-xxl-13{padding-top:3.25rem!important}.pt-xxl-14{padding-top:3.5rem!important}.pt-xxl-15{padding-top:3.75rem!important}.pt-xxl-16{padding-top:4rem!important}.pt-xxl-17{padding-top:4.25rem!important}.pt-xxl-18{padding-top:4.5rem!important}.pt-xxl-19{padding-top:4.75rem!important}.pt-xxl-20{padding-top:5rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:.75rem!important}.pe-xxl-4{padding-right:1rem!important}.pe-xxl-5{padding-right:1.25rem!important}.pe-xxl-6{padding-right:1.5rem!important}.pe-xxl-7{padding-right:1.75rem!important}.pe-xxl-8{padding-right:2rem!important}.pe-xxl-9{padding-right:2.25rem!important}.pe-xxl-10{padding-right:2.5rem!important}.pe-xxl-11{padding-right:2.75rem!important}.pe-xxl-12{padding-right:3rem!important}.pe-xxl-13{padding-right:3.25rem!important}.pe-xxl-14{padding-right:3.5rem!important}.pe-xxl-15{padding-right:3.75rem!important}.pe-xxl-16{padding-right:4rem!important}.pe-xxl-17{padding-right:4.25rem!important}.pe-xxl-18{padding-right:4.5rem!important}.pe-xxl-19{padding-right:4.75rem!important}.pe-xxl-20{padding-right:5rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:.75rem!important}.pb-xxl-4{padding-bottom:1rem!important}.pb-xxl-5{padding-bottom:1.25rem!important}.pb-xxl-6{padding-bottom:1.5rem!important}.pb-xxl-7{padding-bottom:1.75rem!important}.pb-xxl-8{padding-bottom:2rem!important}.pb-xxl-9{padding-bottom:2.25rem!important}.pb-xxl-10{padding-bottom:2.5rem!important}.pb-xxl-11{padding-bottom:2.75rem!important}.pb-xxl-12{padding-bottom:3rem!important}.pb-xxl-13{padding-bottom:3.25rem!important}.pb-xxl-14{padding-bottom:3.5rem!important}.pb-xxl-15{padding-bottom:3.75rem!important}.pb-xxl-16{padding-bottom:4rem!important}.pb-xxl-17{padding-bottom:4.25rem!important}.pb-xxl-18{padding-bottom:4.5rem!important}.pb-xxl-19{padding-bottom:4.75rem!important}.pb-xxl-20{padding-bottom:5rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:.75rem!important}.ps-xxl-4{padding-left:1rem!important}.ps-xxl-5{padding-left:1.25rem!important}.ps-xxl-6{padding-left:1.5rem!important}.ps-xxl-7{padding-left:1.75rem!important}.ps-xxl-8{padding-left:2rem!important}.ps-xxl-9{padding-left:2.25rem!important}.ps-xxl-10{padding-left:2.5rem!important}.ps-xxl-11{padding-left:2.75rem!important}.ps-xxl-12{padding-left:3rem!important}.ps-xxl-13{padding-left:3.25rem!important}.ps-xxl-14{padding-left:3.5rem!important}.ps-xxl-15{padding-left:3.75rem!important}.ps-xxl-16{padding-left:4rem!important}.ps-xxl-17{padding-left:4.25rem!important}.ps-xxl-18{padding-left:4.5rem!important}.ps-xxl-19{padding-left:4.75rem!important}.ps-xxl-20{padding-left:5rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:.75rem!important}.gap-xxl-4{gap:1rem!important}.gap-xxl-5{gap:1.25rem!important}.gap-xxl-6{gap:1.5rem!important}.gap-xxl-7{gap:1.75rem!important}.gap-xxl-8{gap:2rem!important}.gap-xxl-9{gap:2.25rem!important}.gap-xxl-10{gap:2.5rem!important}.gap-xxl-11{gap:2.75rem!important}.gap-xxl-12{gap:3rem!important}.gap-xxl-13{gap:3.25rem!important}.gap-xxl-14{gap:3.5rem!important}.gap-xxl-15{gap:3.75rem!important}.gap-xxl-16{gap:4rem!important}.gap-xxl-17{gap:4.25rem!important}.gap-xxl-18{gap:4.5rem!important}.gap-xxl-19{gap:4.75rem!important}.gap-xxl-20{gap:5rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:.75rem!important}.row-gap-xxl-4{row-gap:1rem!important}.row-gap-xxl-5{row-gap:1.25rem!important}.row-gap-xxl-6{row-gap:1.5rem!important}.row-gap-xxl-7{row-gap:1.75rem!important}.row-gap-xxl-8{row-gap:2rem!important}.row-gap-xxl-9{row-gap:2.25rem!important}.row-gap-xxl-10{row-gap:2.5rem!important}.row-gap-xxl-11{row-gap:2.75rem!important}.row-gap-xxl-12{row-gap:3rem!important}.row-gap-xxl-13{row-gap:3.25rem!important}.row-gap-xxl-14{row-gap:3.5rem!important}.row-gap-xxl-15{row-gap:3.75rem!important}.row-gap-xxl-16{row-gap:4rem!important}.row-gap-xxl-17{row-gap:4.25rem!important}.row-gap-xxl-18{row-gap:4.5rem!important}.row-gap-xxl-19{row-gap:4.75rem!important}.row-gap-xxl-20{row-gap:5rem!important}.column-gap-xxl-0{column-gap:0!important}.column-gap-xxl-1{column-gap:.25rem!important}.column-gap-xxl-2{column-gap:.5rem!important}.column-gap-xxl-3{column-gap:.75rem!important}.column-gap-xxl-4{column-gap:1rem!important}.column-gap-xxl-5{column-gap:1.25rem!important}.column-gap-xxl-6{column-gap:1.5rem!important}.column-gap-xxl-7{column-gap:1.75rem!important}.column-gap-xxl-8{column-gap:2rem!important}.column-gap-xxl-9{column-gap:2.25rem!important}.column-gap-xxl-10{column-gap:2.5rem!important}.column-gap-xxl-11{column-gap:2.75rem!important}.column-gap-xxl-12{column-gap:3rem!important}.column-gap-xxl-13{column-gap:3.25rem!important}.column-gap-xxl-14{column-gap:3.5rem!important}.column-gap-xxl-15{column-gap:3.75rem!important}.column-gap-xxl-16{column-gap:4rem!important}.column-gap-xxl-17{column-gap:4.25rem!important}.column-gap-xxl-18{column-gap:4.5rem!important}.column-gap-xxl-19{column-gap:4.75rem!important}.column-gap-xxl-20{column-gap:5rem!important}.fs-xxl-1{font-size:calc(1.3rem + .6vw)!important}.fs-xxl-2{font-size:calc(1.275rem + .3vw)!important}.fs-xxl-3{font-size:calc(1.26rem + .12vw)!important}.fs-xxl-4{font-size:1.25rem!important}.fs-xxl-5{font-size:1.15rem!important}.fs-xxl-6{font-size:1.075rem!important}.fs-xxl-7{font-size:.95rem!important}.fs-xxl-8{font-size:.85rem!important}.fs-xxl-9{font-size:.75rem!important}.fs-xxl-10{font-size:.5rem!important}.fs-xxl-sm{font-size:.95rem!important}.fs-xxl-base{font-size:1rem!important}.fs-xxl-lg{font-size:1.075rem!important}.fs-xxl-xl{font-size:1.21rem!important}.fs-xxl-fluid{font-size:100%!important}.fs-xxl-2x{font-size:calc(1.325rem + .9vw)!important}.fs-xxl-2qx{font-size:calc(1.35rem + 1.2vw)!important}.fs-xxl-2hx{font-size:calc(1.375rem + 1.5vw)!important}.fs-xxl-2tx{font-size:calc(1.4rem + 1.8vw)!important}.fs-xxl-3x{font-size:calc(1.425rem + 2.1vw)!important}.fs-xxl-3qx{font-size:calc(1.45rem + 2.4vw)!important}.fs-xxl-3hx{font-size:calc(1.475rem + 2.7vw)!important}.fs-xxl-3tx{font-size:calc(1.5rem + 3vw)!important}.fs-xxl-4x{font-size:calc(1.525rem + 3.3vw)!important}.fs-xxl-4qx{font-size:calc(1.55rem + 3.6vw)!important}.fs-xxl-4hx{font-size:calc(1.575rem + 3.9vw)!important}.fs-xxl-4tx{font-size:calc(1.6rem + 4.2vw)!important}.fs-xxl-5x{font-size:calc(1.625rem + 4.5vw)!important}.fs-xxl-5qx{font-size:calc(1.65rem + 4.8vw)!important}.fs-xxl-5hx{font-size:calc(1.675rem + 5.1vw)!important}.fs-xxl-5tx{font-size:calc(1.7rem + 5.4vw)!important}.fs-xxl-6x{font-size:calc(1.725rem + 5.7vw)!important}.fs-xxl-6qx{font-size:calc(1.75rem + 6vw)!important}.fs-xxl-6hx{font-size:calc(1.775rem + 6.3vw)!important}.fs-xxl-6tx{font-size:calc(1.8rem + 6.6vw)!important}.fs-xxl-7x{font-size:calc(1.825rem + 6.9vw)!important}.fs-xxl-7qx{font-size:calc(1.85rem + 7.2vw)!important}.fs-xxl-7hx{font-size:calc(1.875rem + 7.5vw)!important}.fs-xxl-7tx{font-size:calc(1.9rem + 7.8vw)!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}.min-w-xxl-unset{min-width:unset!important}.min-w-xxl-25{min-width:25%!important}.min-w-xxl-50{min-width:50%!important}.min-w-xxl-75{min-width:75%!important}.min-w-xxl-100{min-width:100%!important}.min-w-xxl-auto{min-width:auto!important}.min-w-xxl-1px{min-width:1px!important}.min-w-xxl-2px{min-width:2px!important}.min-w-xxl-3px{min-width:3px!important}.min-w-xxl-4px{min-width:4px!important}.min-w-xxl-5px{min-width:5px!important}.min-w-xxl-6px{min-width:6px!important}.min-w-xxl-7px{min-width:7px!important}.min-w-xxl-8px{min-width:8px!important}.min-w-xxl-9px{min-width:9px!important}.min-w-xxl-10px{min-width:10px!important}.min-w-xxl-15px{min-width:15px!important}.min-w-xxl-20px{min-width:20px!important}.min-w-xxl-25px{min-width:25px!important}.min-w-xxl-30px{min-width:30px!important}.min-w-xxl-35px{min-width:35px!important}.min-w-xxl-40px{min-width:40px!important}.min-w-xxl-45px{min-width:45px!important}.min-w-xxl-50px{min-width:50px!important}.min-w-xxl-55px{min-width:55px!important}.min-w-xxl-60px{min-width:60px!important}.min-w-xxl-65px{min-width:65px!important}.min-w-xxl-70px{min-width:70px!important}.min-w-xxl-75px{min-width:75px!important}.min-w-xxl-80px{min-width:80px!important}.min-w-xxl-85px{min-width:85px!important}.min-w-xxl-90px{min-width:90px!important}.min-w-xxl-95px{min-width:95px!important}.min-w-xxl-100px{min-width:100px!important}.min-w-xxl-125px{min-width:125px!important}.min-w-xxl-150px{min-width:150px!important}.min-w-xxl-175px{min-width:175px!important}.min-w-xxl-200px{min-width:200px!important}.min-w-xxl-225px{min-width:225px!important}.min-w-xxl-250px{min-width:250px!important}.min-w-xxl-275px{min-width:275px!important}.min-w-xxl-300px{min-width:300px!important}.min-w-xxl-325px{min-width:325px!important}.min-w-xxl-350px{min-width:350px!important}.min-w-xxl-375px{min-width:375px!important}.min-w-xxl-400px{min-width:400px!important}.min-w-xxl-425px{min-width:425px!important}.min-w-xxl-450px{min-width:450px!important}.min-w-xxl-475px{min-width:475px!important}.min-w-xxl-500px{min-width:500px!important}.min-w-xxl-550px{min-width:550px!important}.min-w-xxl-600px{min-width:600px!important}.min-w-xxl-650px{min-width:650px!important}.min-w-xxl-700px{min-width:700px!important}.min-w-xxl-750px{min-width:750px!important}.min-w-xxl-800px{min-width:800px!important}.min-w-xxl-850px{min-width:850px!important}.min-w-xxl-900px{min-width:900px!important}.min-w-xxl-950px{min-width:950px!important}.min-w-xxl-1000px{min-width:1000px!important}.min-h-xxl-unset{min-height:unset!important}.min-h-xxl-25{min-height:25%!important}.min-h-xxl-50{min-height:50%!important}.min-h-xxl-75{min-height:75%!important}.min-h-xxl-100{min-height:100%!important}.min-h-xxl-auto{min-height:auto!important}.min-h-xxl-1px{min-height:1px!important}.min-h-xxl-2px{min-height:2px!important}.min-h-xxl-3px{min-height:3px!important}.min-h-xxl-4px{min-height:4px!important}.min-h-xxl-5px{min-height:5px!important}.min-h-xxl-6px{min-height:6px!important}.min-h-xxl-7px{min-height:7px!important}.min-h-xxl-8px{min-height:8px!important}.min-h-xxl-9px{min-height:9px!important}.min-h-xxl-10px{min-height:10px!important}.min-h-xxl-15px{min-height:15px!important}.min-h-xxl-20px{min-height:20px!important}.min-h-xxl-25px{min-height:25px!important}.min-h-xxl-30px{min-height:30px!important}.min-h-xxl-35px{min-height:35px!important}.min-h-xxl-40px{min-height:40px!important}.min-h-xxl-45px{min-height:45px!important}.min-h-xxl-50px{min-height:50px!important}.min-h-xxl-55px{min-height:55px!important}.min-h-xxl-60px{min-height:60px!important}.min-h-xxl-65px{min-height:65px!important}.min-h-xxl-70px{min-height:70px!important}.min-h-xxl-75px{min-height:75px!important}.min-h-xxl-80px{min-height:80px!important}.min-h-xxl-85px{min-height:85px!important}.min-h-xxl-90px{min-height:90px!important}.min-h-xxl-95px{min-height:95px!important}.min-h-xxl-100px{min-height:100px!important}.min-h-xxl-125px{min-height:125px!important}.min-h-xxl-150px{min-height:150px!important}.min-h-xxl-175px{min-height:175px!important}.min-h-xxl-200px{min-height:200px!important}.min-h-xxl-225px{min-height:225px!important}.min-h-xxl-250px{min-height:250px!important}.min-h-xxl-275px{min-height:275px!important}.min-h-xxl-300px{min-height:300px!important}.min-h-xxl-325px{min-height:325px!important}.min-h-xxl-350px{min-height:350px!important}.min-h-xxl-375px{min-height:375px!important}.min-h-xxl-400px{min-height:400px!important}.min-h-xxl-425px{min-height:425px!important}.min-h-xxl-450px{min-height:450px!important}.min-h-xxl-475px{min-height:475px!important}.min-h-xxl-500px{min-height:500px!important}.min-h-xxl-550px{min-height:550px!important}.min-h-xxl-600px{min-height:600px!important}.min-h-xxl-650px{min-height:650px!important}.min-h-xxl-700px{min-height:700px!important}.min-h-xxl-750px{min-height:750px!important}.min-h-xxl-800px{min-height:800px!important}.min-h-xxl-850px{min-height:850px!important}.min-h-xxl-900px{min-height:900px!important}.min-h-xxl-950px{min-height:950px!important}.min-h-xxl-1000px{min-height:1000px!important}}@media (min-width:1200px){.fs-1{font-size:1.75rem!important}.fs-2{font-size:1.5rem!important}.fs-3{font-size:1.35rem!important}.fs-2x{font-size:2rem!important}.fs-2qx{font-size:2.25rem!important}.fs-2hx{font-size:2.5rem!important}.fs-2tx{font-size:2.75rem!important}.fs-3x{font-size:3rem!important}.fs-3qx{font-size:3.25rem!important}.fs-3hx{font-size:3.5rem!important}.fs-3tx{font-size:3.75rem!important}.fs-4x{font-size:4rem!important}.fs-4qx{font-size:4.25rem!important}.fs-4hx{font-size:4.5rem!important}.fs-4tx{font-size:4.75rem!important}.fs-5x{font-size:5rem!important}.fs-5qx{font-size:5.25rem!important}.fs-5hx{font-size:5.5rem!important}.fs-5tx{font-size:5.75rem!important}.fs-6x{font-size:6rem!important}.fs-6qx{font-size:6.25rem!important}.fs-6hx{font-size:6.5rem!important}.fs-6tx{font-size:6.75rem!important}.fs-7x{font-size:7rem!important}.fs-7qx{font-size:7.25rem!important}.fs-7hx{font-size:7.5rem!important}.fs-7tx{font-size:7.75rem!important}.fs-sm-1{font-size:1.75rem!important}.fs-sm-2{font-size:1.5rem!important}.fs-sm-3{font-size:1.35rem!important}.fs-sm-2x{font-size:2rem!important}.fs-sm-2qx{font-size:2.25rem!important}.fs-sm-2hx{font-size:2.5rem!important}.fs-sm-2tx{font-size:2.75rem!important}.fs-sm-3x{font-size:3rem!important}.fs-sm-3qx{font-size:3.25rem!important}.fs-sm-3hx{font-size:3.5rem!important}.fs-sm-3tx{font-size:3.75rem!important}.fs-sm-4x{font-size:4rem!important}.fs-sm-4qx{font-size:4.25rem!important}.fs-sm-4hx{font-size:4.5rem!important}.fs-sm-4tx{font-size:4.75rem!important}.fs-sm-5x{font-size:5rem!important}.fs-sm-5qx{font-size:5.25rem!important}.fs-sm-5hx{font-size:5.5rem!important}.fs-sm-5tx{font-size:5.75rem!important}.fs-sm-6x{font-size:6rem!important}.fs-sm-6qx{font-size:6.25rem!important}.fs-sm-6hx{font-size:6.5rem!important}.fs-sm-6tx{font-size:6.75rem!important}.fs-sm-7x{font-size:7rem!important}.fs-sm-7qx{font-size:7.25rem!important}.fs-sm-7hx{font-size:7.5rem!important}.fs-sm-7tx{font-size:7.75rem!important}.fs-md-1{font-size:1.75rem!important}.fs-md-2{font-size:1.5rem!important}.fs-md-3{font-size:1.35rem!important}.fs-md-2x{font-size:2rem!important}.fs-md-2qx{font-size:2.25rem!important}.fs-md-2hx{font-size:2.5rem!important}.fs-md-2tx{font-size:2.75rem!important}.fs-md-3x{font-size:3rem!important}.fs-md-3qx{font-size:3.25rem!important}.fs-md-3hx{font-size:3.5rem!important}.fs-md-3tx{font-size:3.75rem!important}.fs-md-4x{font-size:4rem!important}.fs-md-4qx{font-size:4.25rem!important}.fs-md-4hx{font-size:4.5rem!important}.fs-md-4tx{font-size:4.75rem!important}.fs-md-5x{font-size:5rem!important}.fs-md-5qx{font-size:5.25rem!important}.fs-md-5hx{font-size:5.5rem!important}.fs-md-5tx{font-size:5.75rem!important}.fs-md-6x{font-size:6rem!important}.fs-md-6qx{font-size:6.25rem!important}.fs-md-6hx{font-size:6.5rem!important}.fs-md-6tx{font-size:6.75rem!important}.fs-md-7x{font-size:7rem!important}.fs-md-7qx{font-size:7.25rem!important}.fs-md-7hx{font-size:7.5rem!important}.fs-md-7tx{font-size:7.75rem!important}.fs-lg-1{font-size:1.75rem!important}.fs-lg-2{font-size:1.5rem!important}.fs-lg-3{font-size:1.35rem!important}.fs-lg-2x{font-size:2rem!important}.fs-lg-2qx{font-size:2.25rem!important}.fs-lg-2hx{font-size:2.5rem!important}.fs-lg-2tx{font-size:2.75rem!important}.fs-lg-3x{font-size:3rem!important}.fs-lg-3qx{font-size:3.25rem!important}.fs-lg-3hx{font-size:3.5rem!important}.fs-lg-3tx{font-size:3.75rem!important}.fs-lg-4x{font-size:4rem!important}.fs-lg-4qx{font-size:4.25rem!important}.fs-lg-4hx{font-size:4.5rem!important}.fs-lg-4tx{font-size:4.75rem!important}.fs-lg-5x{font-size:5rem!important}.fs-lg-5qx{font-size:5.25rem!important}.fs-lg-5hx{font-size:5.5rem!important}.fs-lg-5tx{font-size:5.75rem!important}.fs-lg-6x{font-size:6rem!important}.fs-lg-6qx{font-size:6.25rem!important}.fs-lg-6hx{font-size:6.5rem!important}.fs-lg-6tx{font-size:6.75rem!important}.fs-lg-7x{font-size:7rem!important}.fs-lg-7qx{font-size:7.25rem!important}.fs-lg-7hx{font-size:7.5rem!important}.fs-lg-7tx{font-size:7.75rem!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}}:root{--bs-xs:0;--bs-sm:576px;--bs-md:768px;--bs-lg:992px;--bs-xl:1200px;--bs-xxl:1400px;--bs-scrollbar-size:5px;--bs-scrollbar-overlay-size:19px;--bs-scrollbar-overlay-space:7px;--bs-white-bg-rgb:255,255,255;--bs-black-bg-rgb:0,0,0}[data-bs-theme=light]{--bs-text-muted:#6D6D97;--bs-gray-100:#F9F9F9;--bs-gray-100-rgb:249,249,249;--bs-gray-200:#F1F1F4;--bs-gray-200-rgb:241,241,244;--bs-gray-300:#DBDFE9;--bs-gray-300-rgb:219,223,233;--bs-gray-400:#C4CADA;--bs-gray-400-rgb:196,202,218;--bs-gray-500:#6D6D97;--bs-gray-500-rgb:109,109,151;--bs-gray-600:#78829D;--bs-gray-600-rgb:120,130,157;--bs-gray-700:#4B5675;--bs-gray-700-rgb:75,86,117;--bs-gray-800:#252F4A;--bs-gray-800-rgb:37,47,74;--bs-gray-900:#071437;--bs-gray-900-rgb:7,20,55;--bs-light:#F9F9F9;--bs-primary:#0069E0;--bs-secondary:#F1F1F4;--bs-success:#17C653;--bs-info:#7239EA;--bs-warning:#F6C000;--bs-danger:#F8285A;--bs-dark:#1E2129;--bs-primary-active:#056EE9;--bs-secondary-active:#C4CADA;--bs-light-active:#F1F1F4;--bs-success-active:#04B440;--bs-info-active:#5014D0;--bs-warning-active:#DEAD00;--bs-danger-active:#D81A48;--bs-dark-active:#111318;--bs-primary-light:#E9F3FF;--bs-secondary-light:#F9F9F9;--bs-success-light:#DFFFEA;--bs-info-light:#F8F5FF;--bs-warning-light:#FFF8DD;--bs-danger-light:#FFEEF3;--bs-dark-light:#F9F9F9;--bs-light-light:#ffffff;--bs-primary-inverse:#ffffff;--bs-secondary-inverse:#252F4A;--bs-light-inverse:#252F4A;--bs-success-inverse:#ffffff;--bs-info-inverse:#ffffff;--bs-warning-inverse:#ffffff;--bs-danger-inverse:#ffffff;--bs-dark-inverse:#ffffff;--bs-primary-clarity:rgba(0, 105, 224, 0.2);--bs-secondary-clarity:rgba(249, 249, 249, 0.2);--bs-success-clarity:rgba(23, 198, 83, 0.2);--bs-info-clarity:rgba(114, 57, 234, 0.2);--bs-warning-clarity:rgba(246, 192, 0, 0.2);--bs-danger-clarity:rgba(248, 40, 90, 0.2);--bs-dark-clarity:rgba(30, 33, 41, 0.2);--bs-light-clarity:rgba(255, 255, 255, 0.2);--bs-light-rgb:249,249,249;--bs-primary-rgb:0,105,224;--bs-secondary-rgb:241,241,244;--bs-success-rgb:23,198,83;--bs-info-rgb:114,57,234;--bs-warning-rgb:246,192,0;--bs-danger-rgb:248,40,90;--bs-dark-rgb:30,33,41;--bs-text-white:#ffffff;--bs-text-primary:#0069E0;--bs-text-secondary:#F1F1F4;--bs-text-light:#F9F9F9;--bs-text-success:#17C653;--bs-text-info:#7239EA;--bs-text-warning:#F6C000;--bs-text-danger:#F8285A;--bs-text-dark:#1E2129;--bs-text-muted:#6D6D97;--bs-text-gray-100:#F9F9F9;--bs-text-gray-200:#F1F1F4;--bs-text-gray-300:#DBDFE9;--bs-text-gray-400:#C4CADA;--bs-text-gray-500:#6D6D97;--bs-text-gray-600:#78829D;--bs-text-gray-700:#4B5675;--bs-text-gray-800:#252F4A;--bs-text-gray-900:#071437;--bs-border-color:#F1F1F4;--bs-border-dashed-color:#DBDFE9;--bs-component-active-color:#ffffff;--bs-component-active-bg:#0069E0;--bs-component-hover-color:#0069E0;--bs-component-hover-bg:#F9F9F9;--bs-component-checked-color:#ffffff;--bs-component-checked-bg:#0069E0;--bs-box-shadow-xs:0 0.1rem 0.75rem 0.25rem rgba(0, 0, 0, 0.05);--bs-box-shadow-sm:0 0.1rem 1rem 0.25rem rgba(0, 0, 0, 0.05);--bs-box-shadow:0 0.5rem 1.5rem 0.5rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 2rem 1rem rgba(0, 0, 0, 0.1);--bs-input-bg:var(--bs-body-bg);--bs-input-color:var(--bs-gray-700);--bs-input-solid-color:var(--bs-gray-700);--bs-input-solid-bg:var(--bs-gray-100);--bs-input-solid-bg-focus:var(--bs-gray-200);--bs-input-solid-placeholder-color:var(--bs-gray-500);--bs-root-card-box-shadow:0px 3px 4px 0px rgba(0, 0, 0, 0.03);--bs-root-card-border-color:#F1F1F4;--bs-tooltip-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.15);--bs-table-striped-bg:rgba(var(--bs-gray-100-rgb), 0.75);--bs-table-loading-message-box-shadow:0px 0px 50px 0px rgba(82, 63, 105, 0.15);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-box-shadow:0px 0px 50px 0px rgba(82, 63, 105, 0.15);--bs-code-bg:#f1f3f8;--bs-code-shadow:0px 3px 9px rgba(0, 0, 0, 0.08);--bs-code-border-color:transparent;--bs-code-color:#b93993;--bs-symbol-label-color:var(--bs-gray-800);--bs-symbol-label-bg:var(--bs-gray-100);--bs-symbol-border-color:rgba(var(--bs-body-bg), 0.5);--bs-bullet-bg-color:var(--bs-gray-400);--bs-scrolltop-opacity:0;--bs-scrolltop-opacity-on:0.3;--bs-scrolltop-opacity-hover:1;--bs-scrolltop-box-shadow:var(--bs-box-shadow);--bs-scrolltop-bg-color:var(--bs-primary);--bs-scrolltop-bg-color-hover:var(--bs-primary);--bs-scrolltop-icon-color:var(--bs-primary-inverse);--bs-scrolltop-icon-color-hover:var(--bs-primary-inverse);--bs-drawer-box-shadow:0px 1px 9px -3px rgba(0, 0, 0, 0.05);--bs-drawer-bg-color:#ffffff;--bs-drawer-overlay-bg-color:rgba(0, 0, 0, 0.2);--bs-menu-dropdown-box-shadow:0px 0px 50px 0px rgba(82, 63, 105, 0.15);--bs-menu-dropdown-bg-color:var(--bs-body-bg);--bs-menu-heading-color:#6D6D97;--bs-menu-link-color-hover:#0069E0;--bs-menu-link-color-show:#0069E0;--bs-menu-link-color-here:#0069E0;--bs-menu-link-color-active:#0069E0;--bs-menu-link-bg-color-hover:#F9F9F9;--bs-menu-link-bg-color-show:#F9F9F9;--bs-menu-link-bg-color-here:#F9F9F9;--bs-menu-link-bg-color-active:#F9F9F9;--bs-scrollbar-color:#F1F1F4;--bs-scrollbar-hover-color:#DBDFE9;--bs-overlay-bg:rgba(0, 0, 0, 0.05);--bs-blockui-overlay-bg:rgba(0, 0, 0, 0.05);--bs-rating-color-default:#C4CADA;--bs-rating-color-active:#FFAD0F;--bs-ribbon-label-box-shadow:0px -1px 5px 0px rgba(30, 33, 41, 0.1);--bs-ribbon-label-bg:#0069E0;--bs-ribbon-label-border-color:#00397a;--bs-ribbon-clip-bg:#1E2129;--bs-engage-btn-bg:#ffffff;--bs-engage-btn-box-shadow:0px 0px 22px #E0E0E0;--bs-engage-btn-border-color:#E8E8E8;--bs-engage-btn-color:#252F4A;--bs-engage-btn-icon-color:#78829D;--bs-engage-btn-color-active:#252F4A}[data-bs-theme=dark]{--bs-text-muted:#9A9CAE;--bs-gray-100:#1B1C22;--bs-gray-100-rgb:27,28,34;--bs-gray-200:#26272F;--bs-gray-200-rgb:38,39,47;--bs-gray-300:#363843;--bs-gray-300-rgb:54,56,67;--bs-gray-400:#464852;--bs-gray-400-rgb:70,72,82;--bs-gray-500:#9A9CAE;--bs-gray-500-rgb:154,156,174;--bs-gray-600:#808290;--bs-gray-600-rgb:128,130,144;--bs-gray-700:#9A9CAE;--bs-gray-700-rgb:154,156,174;--bs-gray-800:#B5B7C8;--bs-gray-800-rgb:181,183,200;--bs-gray-900:#F5F5F5;--bs-gray-900-rgb:245,245,245;--bs-light:#1B1C22;--bs-primary:#1F87FF;--bs-secondary:#363843;--bs-success:#00A261;--bs-info:#883FFF;--bs-warning:#C59A00;--bs-danger:#E42855;--bs-dark:#272A34;--bs-primary-active:#107EFF;--bs-secondary-active:#464852;--bs-light-active:#1F212A;--bs-success-active:#01BF73;--bs-info-active:#9E63FF;--bs-warning-active:#D9AA00;--bs-danger-active:#FF3767;--bs-dark-active:#2D2F39;--bs-primary-light:#172331;--bs-secondary-light:#363843;--bs-success-light:#1F212A;--bs-info-light:#272134;--bs-warning-light:#242320;--bs-danger-light:#302024;--bs-dark-light:#1E2027;--bs-light-light:#1F212A;--bs-primary-inverse:#ffffff;--bs-secondary-inverse:#ffffff;--bs-light-inverse:#808290;--bs-success-inverse:#ffffff;--bs-info-inverse:#ffffff;--bs-warning-inverse:#ffffff;--bs-danger-inverse:#ffffff;--bs-dark-inverse:#ffffff;--bs-primary-clarity:rgba(31, 135, 255, 0.2);--bs-secondary-clarity:rgba(54, 56, 67, 0.2);--bs-success-clarity:rgba(0, 162, 97, 0.2);--bs-info-clarity:rgba(136, 63, 255, 0.2);--bs-warning-clarity:rgba(197, 154, 0, 0.2);--bs-danger-clarity:rgba(228, 40, 85, 0.2);--bs-dark-clarity:rgba(39, 42, 52, 0.2);--bs-light-clarity:rgba(31, 33, 42, 0.2);--bs-light-rgb:27,28,34;--bs-primary-rgb:31,135,255;--bs-secondary-rgb:54,56,67;--bs-success-rgb:0,162,97;--bs-info-rgb:136,63,255;--bs-warning-rgb:197,154,0;--bs-danger-rgb:228,40,85;--bs-dark-rgb:39,42,52;--bs-text-white:#ffffff;--bs-text-primary:#1F87FF;--bs-text-secondary:#363843;--bs-text-light:#1B1C22;--bs-text-success:#00A261;--bs-text-info:#883FFF;--bs-text-warning:#C59A00;--bs-text-danger:#E42855;--bs-text-dark:#272A34;--bs-text-muted:#9A9CAE;--bs-text-gray-100:#1B1C22;--bs-text-gray-200:#26272F;--bs-text-gray-300:#363843;--bs-text-gray-400:#464852;--bs-text-gray-500:#9A9CAE;--bs-text-gray-600:#808290;--bs-text-gray-700:#9A9CAE;--bs-text-gray-800:#B5B7C8;--bs-text-gray-900:#F5F5F5;--bs-border-color:#26272F;--bs-border-dashed-color:#363843;--bs-component-active-color:#ffffff;--bs-component-active-bg:#1F87FF;--bs-component-hover-color:#1F87FF;--bs-component-hover-bg:#1B1C22;--bs-component-checked-color:#ffffff;--bs-component-checked-bg:#1F87FF;--bs-box-shadow-xs:0 0.1rem 0.75rem 0.25rem rgba(0, 0, 0, 0.05);--bs-box-shadow-sm:0 0.1rem 1rem 0.25rem rgba(0, 0, 0, 0.05);--bs-box-shadow:0 0.5rem 1.5rem 0.5rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 2rem 1rem rgba(0, 0, 0, 0.1);--bs-input-color:var(--bs-gray-700);--bs-input-bg:var(--bs-body-bg);--bs-input-solid-color:var(--bs-gray-700);--bs-input-solid-bg:var(--bs-gray-100);--bs-input-solid-bg-focus:var(--bs-gray-200);--bs-input-solid-placeholder-color:var(--bs-gray-500);--bs-tooltip-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.15);--bs-root-card-box-shadow:none;--bs-root-card-border-color:#1E2027;--bs-table-striped-bg:rgba(27, 28, 34, 0.75);--bs-table-loading-message-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.3);--bs-dropdown-bg:#1C1D22;--bs-dropdown-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.3);--bs-code-bg:#2b2b40;--bs-code-shadow:rgba(0, 0, 0, 0.08) 0px 3px 9px 0px;--bs-code-border-color:transparent;--bs-code-color:#b93993;--bs-symbol-label-color:#B5B7C8;--bs-symbol-label-bg:#1B1C22;--bs-symbol-border-color:rgba(255, 255, 255, 0.5);--bs-bullet-bg-color:#464852;--bs-scrolltop-opacity:0;--bs-scrolltop-opacity-on:0.3;--bs-scrolltop-opacity-hover:1;--bs-scrolltop-box-shadow:0 0.5rem 1.5rem 0.5rem rgba(0, 0, 0, 0.075);--bs-scrolltop-bg-color:#0069E0;--bs-scrolltop-bg-color-hover:#0069E0;--bs-scrolltop-icon-color:#ffffff;--bs-scrolltop-icon-color-hover:#ffffff;--bs-drawer-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.1);--bs-drawer-bg-color:#1C1D22;--bs-drawer-overlay-bg-color:rgba(0, 0, 0, 0.4);--bs-menu-dropdown-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.3);--bs-menu-dropdown-bg-color:#1C1D22;--bs-menu-heading-color:#9A9CAE;--bs-menu-link-color-hover:#1F87FF;--bs-menu-link-color-show:#1F87FF;--bs-menu-link-color-here:#1F87FF;--bs-menu-link-color-active:#1F87FF;--bs-menu-link-bg-color-hover:#1B1C22;--bs-menu-link-bg-color-show:#1B1C22;--bs-menu-link-bg-color-here:#1B1C22;--bs-menu-link-bg-color-active:#1B1C22;--bs-scrollbar-color:#26272F;--bs-scrollbar-hover-color:#363843;--bs-overlay-bg:rgba(255, 255, 255, 0.05);--bs-blockui-overlay-bg:rgba(255, 255, 255, 0.05);--bs-rating-color-default:#464852;--bs-rating-color-active:#FFAD0F;--bs-ribbon-label-box-shadow:0px -1px 5px 0px rgba(255, 255, 255, 0.1);--bs-ribbon-label-bg:#0069E0;--bs-ribbon-label-border-color:#00397a;--bs-ribbon-clip-bg:#F9F9F9;--bs-engage-btn-bg:#26272F;--bs-engage-btn-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.3);--bs-engage-btn-border-color:#26272F;--bs-engage-btn-color:#B5B7C8;--bs-engage-btn-icon-color:#808290;--bs-engage-btn-color-active:#B5B7C8}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{outline:0}.blockquote-footer{color:var(--bs-blockquote-footer-color)}.list-style-none{list-style:none}[data-kt-theme-mode-switching=true] *{transition:none!important}[data-bs-theme=light] .theme-dark-show{display:none!important}[data-bs-theme=light] .theme-light-bg-transparent{background-color:transparent!important}[data-bs-theme=light] .theme-light-bg-body{background-color:var(--bs-body-bg)!important}[data-bs-theme=dark] .theme-light-show{display:none!important}[data-bs-theme=dark] .theme-dark-bg-transparent{background-color:transparent!important}[data-bs-theme=dark] .theme-dark-bg-body{background-color:var(--bs-body-bg)!important}.animation{animation-duration:1s;animation-fill-mode:both}@keyframes animationSlideInDown{from{transform:translate3d(0,-100%,0);visibility:visible}to{transform:translate3d(0,0,0)}}.animation-slide-in-down{animation-name:animationSlideInDown}@keyframes animationSlideInUp{from{transform:translate3d(0,100%,0);visibility:visible}to{transform:translate3d(0,0,0)}}.animation-slide-in-up{animation-name:animationSlideInUp}@keyframes animationFadeIn{from{opacity:0}to{opacity:1}}.animation-fade-in{animation-name:animationFadeIn}@keyframes animationFadeOut{from{opacity:1}to{opacity:0}}.animation-fade-out{animation-name:animationFadeOut}.animation-blink{animation:animationBlink 1s steps(5,start) infinite}@keyframes animationBlink{to{visibility:hidden}}.alert-light{color:var(--bs-light);border-color:var(--bs-light);background-color:var(--bs-light-light)}.alert-light .alert-link{color:var(--bs-light)}.alert-primary{color:var(--bs-primary);border-color:var(--bs-primary);background-color:var(--bs-primary-light)}.alert-primary .alert-link{color:var(--bs-primary)}.alert-secondary{color:var(--bs-secondary);border-color:var(--bs-secondary);background-color:var(--bs-secondary-light)}.alert-secondary .alert-link{color:var(--bs-secondary)}.alert-success{color:var(--bs-success);border-color:var(--bs-success);background-color:var(--bs-success-light)}.alert-success .alert-link{color:var(--bs-success)}.alert-info{color:var(--bs-info);border-color:var(--bs-info);background-color:var(--bs-info-light)}.alert-info .alert-link{color:var(--bs-info)}.alert-warning{color:var(--bs-warning);border-color:var(--bs-warning);background-color:var(--bs-warning-light)}.alert-warning .alert-link{color:var(--bs-warning)}.alert-danger{color:var(--bs-danger);border-color:var(--bs-danger);background-color:var(--bs-danger-light)}.alert-danger .alert-link{color:var(--bs-danger)}.alert-dark{color:var(--bs-dark);border-color:var(--bs-dark);background-color:var(--bs-dark-light)}.alert-dark .alert-link{color:var(--bs-dark)}[data-bs-theme=dark] .dropdown-menu{box-shadow:0 0 30px rgba(0,0,0,.3)}.toast .toast-header .btn-close{margin-right:0}[data-bs-theme=dark] .toast{--bs-toast-bg:#26272F;--bs-toast-header-bg:#26272F;--bs-toast-header-border-color:#363843}.nav-pills .nav-item{margin-right:.5rem}.nav-pills .nav-item:last-child{margin-right:0}.nav-stretch{align-items:stretch;padding-top:0!important;padding-bottom:0!important}.nav-stretch .nav-item{display:flex;align-items:stretch;padding-top:0!important;padding-bottom:0!important}.nav-stretch .nav-link{display:flex;align-items:center}.nav-group{padding:.35rem;border-radius:.475rem;background-color:var(--bs-gray-100)}.nav-group.nav-group-outline{background-color:transparent;border:1px solid var(--bs-border-color)}.nav-group.nav-group-fluid{display:flex}.nav-group.nav-group-fluid>.btn,.nav-group.nav-group-fluid>label{position:relative;flex-shrink:0;flex-grow:1;flex-basis:0}.nav-group.nav-group-fluid>label{margin-right:.1rem}.nav-group.nav-group-fluid>label>.btn{width:100%}.nav-group.nav-group-fluid>label:last-child{margin-right:0}.nav-line-tabs{border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:var(--bs-border-color)}.nav-line-tabs .nav-item{margin-bottom:-1px}.nav-line-tabs .nav-item .nav-link{color:var(--bs-gray-500);border:0;border-bottom:1px solid transparent;transition:color .2s ease;padding:.5rem 0;margin:0 1rem}.nav-line-tabs .nav-item:first-child .nav-link{margin-left:0}.nav-line-tabs .nav-item:last-child .nav-link{margin-right:0}.nav-line-tabs .nav-item .nav-link.active,.nav-line-tabs .nav-item .nav-link:hover:not(.disabled),.nav-line-tabs .nav-item.show .nav-link{background-color:transparent;border:0;border-bottom:1px solid var(--bs-primary);transition:color .2s ease}.nav-line-tabs.nav-line-tabs-2x{border-bottom-width:2px}.nav-line-tabs.nav-line-tabs-2x .nav-item{margin-bottom:-2px}.nav-line-tabs.nav-line-tabs-2x .nav-item .nav-link{border-bottom-width:2px}.nav-line-tabs.nav-line-tabs-2x .nav-item .nav-link.active,.nav-line-tabs.nav-line-tabs-2x .nav-item .nav-link:hover:not(.disabled),.nav-line-tabs.nav-line-tabs-2x .nav-item.show .nav-link{border-bottom-width:2px}.nav.nav-pills.nav-pills-custom .nav-link,.nav.nav-pills.nav-pills-custom .show>.nav-link{border:1px dashed var(--bs-border-dashed-color);border-radius:.625rem}.nav.nav-pills.nav-pills-custom .nav-link.nav-link-border-solid,.nav.nav-pills.nav-pills-custom .show>.nav-link.nav-link-border-solid{border:3px solid var(--bs-border-dashed-color)}.nav.nav-pills.nav-pills-custom .nav-link.nav-link-border-solid.active,.nav.nav-pills.nav-pills-custom .show>.nav-link.nav-link-border-solid.active{border:3px solid var(--bs-primary)}.nav.nav-pills.nav-pills-custom .nav-link .nav-icon img,.nav.nav-pills.nav-pills-custom .show>.nav-link .nav-icon img{width:30px;transition:color .2s ease}.nav.nav-pills.nav-pills-custom .nav-link .nav-icon img.default,.nav.nav-pills.nav-pills-custom .show>.nav-link .nav-icon img.default{display:inline-block}.nav.nav-pills.nav-pills-custom .nav-link .nav-icon img.active,.nav.nav-pills.nav-pills-custom .show>.nav-link .nav-icon img.active{display:none}.nav.nav-pills.nav-pills-custom .nav-link.active,.nav.nav-pills.nav-pills-custom .show>.nav-link.active{background-color:transparent;border:1px solid var(--bs-border-dashed-color);transition-duration:1ms;position:relative}.nav.nav-pills.nav-pills-custom .nav-link.active .nav-text,.nav.nav-pills.nav-pills-custom .show>.nav-link.active .nav-text{color:var(--bs-gray-800)!important;transition:color .2s ease}.nav.nav-pills.nav-pills-custom .nav-link.active .bullet-custom,.nav.nav-pills.nav-pills-custom .show>.nav-link.active .bullet-custom{display:block}.nav.nav-pills.nav-pills-custom .nav-link .bullet-custom,.nav.nav-pills.nav-pills-custom .show>.nav-link .bullet-custom{display:none}.nav.nav-pills.nav-pills-custom.nav-pills-active-custom .nav-item .nav-link:not(:active) span:nth-child(1){color:#b5b5c3}.nav.nav-pills.nav-pills-custom.nav-pills-active-custom .nav-item .nav-link:not(:active) span:nth-child(2){color:#3f4254}.nav.nav-pills.nav-pills-custom.nav-pills-active-custom .nav-item .nav-link:hover span:nth-child(1){color:#fff!important}.nav.nav-pills.nav-pills-custom.nav-pills-active-custom .nav-item .nav-link:hover span:nth-child(2){color:#fff!important}.nav.nav-pills.nav-pills-custom.nav-pills-active-custom .nav-item .nav-link.active span:nth-child(1){color:#fff!important}.nav.nav-pills.nav-pills-custom.nav-pills-active-custom .nav-item .nav-link.active span:nth-child(2){color:#fff!important}.pagination{display:flex;flex-wrap:wrap;justify-content:center;margin:0}.pagination.pagination-circle .page-link{border-radius:50%}.pagination.pagination-outline .page-link{border:1px solid var(--bs-border-color)}.pagination.pagination-outline .page-item.active .page-link,.pagination.pagination-outline .page-item:hover:not(.disabled) .page-link{border-color:var(--bs-primary-light)}.page-item{margin-right:.5rem}.page-item:last-child{margin-right:0}.page-item .page-link{display:flex;justify-content:center;align-items:center;border-radius:.475rem;height:2.5rem;min-width:2.5rem;font-weight:500;font-size:1.075rem}.page-item .page-link i{font-size:.85rem}.page-item .page-link .next,.page-item .page-link .previous{display:block;height:.875rem;width:.875rem}.page-item .page-link .first{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-700);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e")}.page-item .page-link .previous{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-700);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e")}.page-item .page-link .next{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-700);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.page-item .page-link .last{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-700);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.page-item:focus .page-link{color:var(--bs-pagination-focus-color)}.page-item:focus .page-link .svg-icon,.page-item:focus .page-link i{color:var(--bs-pagination-focus-color)}.page-item:focus .page-link .previous{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-pagination-focus-color);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-focus-color%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-focus-color%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e")}.page-item:focus .page-link .next{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-pagination-focus-color);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-focus-color%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-focus-color%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.page-item:hover:not(.active):not(.offset):not(.disabled) .page-link{color:var(--bs-pagination-hover-color)}.page-item:hover:not(.active):not(.offset):not(.disabled) .page-link.page-text{background-color:transparent}.page-item:hover:not(.active):not(.offset):not(.disabled) .page-link .svg-icon,.page-item:hover:not(.active):not(.offset):not(.disabled) .page-link i{color:var(--bs-pagination-hover-color)}.page-item:hover:not(.active):not(.offset):not(.disabled) .page-link .previous{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-pagination-hover-color);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-hover-color%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-hover-color%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e")}.page-item:hover:not(.active):not(.offset):not(.disabled) .page-link .next{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-pagination-hover-color);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-hover-color%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-hover-color%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.page-item.active .page-link{color:var(--bs-pagination-active-color)}.page-item.active .page-link.page-text{background-color:transparent}.page-item.active .page-link .svg-icon,.page-item.active .page-link i{color:var(--bs-pagination-active-color)}.page-item.active .page-link .previous{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-pagination-active-color);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-active-color%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-active-color%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e")}.page-item.active .page-link .next{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-pagination-active-color);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-active-color%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-active-color%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.page-item.disabled .page-link{color:var(--bs-pagination-disabled-color)}.page-item.disabled .page-link .svg-icon,.page-item.disabled .page-link i{color:var(--bs-pagination-disabled-color)}.page-item.disabled .page-link .previous{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-pagination-disabled-color);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-disabled-color%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-disabled-color%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e")}.page-item.disabled .page-link .next{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-pagination-disabled-color);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-disabled-color%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-disabled-color%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}@media (max-width:991.98px){.page-item{margin-right:.25rem}.page-item:last-child{margin-right:0}}.separator{display:block;height:0;border-bottom:1px solid var(--bs-border-color)}.separator.separator-dotted{border-bottom-style:dotted;border-bottom-color:var(--bs-border-dashed-color)}.separator.separator-dashed{border-bottom-style:dashed;border-bottom-color:var(--bs-border-dashed-color)}.separator.separator-content{display:flex;align-items:center;border-bottom:0;text-align:center}.separator.separator-content::after,.separator.separator-content::before{content:" ";width:50%;border-bottom:1px solid var(--bs-border-color)}.separator.separator-content::before{margin-right:1.25rem}.separator.separator-content::after{margin-left:1.25rem}.separator.separator-content.separator-dotted::after,.separator.separator-content.separator-dotted::before{border-bottom-style:dotted;border-bottom-color:var(--bs-border-dashed-color)}.separator.separator-content.separator-dashed::after,.separator.separator-content.separator-dashed::before{border-bottom-style:dashed;border-bottom-color:var(--bs-border-dashed-color)}.separator.separator-content.border-light::after,.separator.separator-content.border-light::before{border-color:#f9f9f9!important}.separator.separator-content.border-primary::after,.separator.separator-content.border-primary::before{border-color:#0069e0!important}.separator.separator-content.border-secondary::after,.separator.separator-content.border-secondary::before{border-color:#f1f1f4!important}.separator.separator-content.border-success::after,.separator.separator-content.border-success::before{border-color:#17c653!important}.separator.separator-content.border-info::after,.separator.separator-content.border-info::before{border-color:#7239ea!important}.separator.separator-content.border-warning::after,.separator.separator-content.border-warning::before{border-color:#f6c000!important}.separator.separator-content.border-danger::after,.separator.separator-content.border-danger::before{border-color:#f8285a!important}.separator.separator-content.border-dark::after,.separator.separator-content.border-dark::before{border-color:#1e2129!important}.carousel-custom .carousel-indicators{align-items:center;position:static;z-index:auto;margin:0;padding:0;list-style:none}.carousel-custom .carousel-indicators li{transform:none;opacity:1}.carousel-custom .carousel-indicators li.active{transform:none;opacity:1}.carousel-custom .carousel-indicators.carousel-indicators-dots li{border-radius:0;background-color:transparent!important;height:13px;width:13px;display:flex;align-items:center;justify-content:center;text-align:center}.carousel-custom .carousel-indicators.carousel-indicators-dots li:after{display:inline-block;content:" ";border-radius:50%;transition:all .3s ease;background-color:var(--bs-gray-200);height:9px;width:9px}.carousel-custom .carousel-indicators.carousel-indicators-dots li.active{background-color:transparent}.carousel-custom .carousel-indicators.carousel-indicators-dots li.active:after{transition:all .3s ease;height:13px;width:13px;background-color:var(--bs-gray-400)}.carousel-custom .carousel-indicators.carousel-indicators-bullet li{transition:all .3s ease;background-color:transparent!important;border-radius:6px;height:6px;width:6px;display:flex;align-items:center;justify-content:center;text-align:center}.carousel-custom .carousel-indicators.carousel-indicators-bullet li:after{display:inline-block;content:" ";transition:all .3s ease;background-color:var(--bs-gray-400);border-radius:6px;height:6px;width:6px}.carousel-custom .carousel-indicators.carousel-indicators-bullet li.active{transition:all .3s ease;background-color:transparent;height:6px;width:16px}.carousel-custom .carousel-indicators.carousel-indicators-bullet li.active:after{transition:all .3s ease;height:6px;width:16px;background-color:var(--bs-gray-600)}.carousel-custom .carousel-indicators-active-light li.active:after{background-color:var(--bs-light)!important}.carousel-custom .carousel-indicators-active-primary li.active:after{background-color:var(--bs-primary)!important}.carousel-custom .carousel-indicators-active-secondary li.active:after{background-color:var(--bs-secondary)!important}.carousel-custom .carousel-indicators-active-success li.active:after{background-color:var(--bs-success)!important}.carousel-custom .carousel-indicators-active-info li.active:after{background-color:var(--bs-info)!important}.carousel-custom .carousel-indicators-active-warning li.active:after{background-color:var(--bs-warning)!important}.carousel-custom .carousel-indicators-active-danger li.active:after{background-color:var(--bs-danger)!important}.carousel-custom .carousel-indicators-active-dark li.active:after{background-color:var(--bs-dark)!important}.carousel-custom.carousel-stretch{height:100%;display:flex;flex-direction:column}.carousel-custom.carousel-stretch .carousel-inner{flex-grow:1}.carousel-custom.carousel-stretch .carousel-item{height:100%}.carousel-custom.carousel-stretch .carousel-wrapper{display:flex;flex-direction:column;height:100%}.menu-group{display:flex}.menu,.menu-wrapper{display:flex;padding:0;margin:0;list-style:none}.menu-inner{padding:0;margin:0;list-style:none}.menu-sub{display:none;padding:0;margin:0;list-style:none;flex-direction:column}.menu-item{display:block;padding:.15rem 0}.menu-item .menu-link{cursor:pointer;display:flex;align-items:center;padding:0;flex:0 0 100%;padding:.65rem 1rem;transition:none;outline:0!important}.menu-item .menu-link .menu-icon{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:2rem;margin-right:.5rem}.menu-item .menu-link .menu-icon .svg-icon,.menu-item .menu-link .menu-icon i{line-height:1}.menu-item .menu-link .menu-bullet{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:1.25rem;margin-right:.5rem}.menu-item .menu-link .menu-title{display:flex;align-items:center;flex-grow:1}.menu-item .menu-link .menu-badge{display:flex;align-items:center;flex-shrink:0;margin-left:.5rem}.menu-item .menu-link .menu-arrow{display:flex;align-items:stretch;position:relative;overflow:hidden;flex-shrink:0;margin-left:5px;width:9px;height:9px}.menu-item .menu-link .menu-arrow:after{display:block;width:100%;content:" ";will-change:transform;background-size:100% 100%;mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-muted);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-muted);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-item .menu-content{padding:.65rem 1rem}.menu-item.show .menu-link .menu-arrow:after{backface-visibility:hidden;transition:transform .3s ease}.menu-nowrap .menu-link,.menu-nowrap .menu-title{flex-wrap:nowrap;flex-shrink:0}.menu-center{justify-content:center}.menu-heading{color:var(--bs-menu-heading-color)}.menu-item.menu-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-dropdown.menu.show,.menu-sub-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-accordion{display:none}.menu-sub-accordion.show,.show:not(.menu-dropdown)>.menu-sub-accordion{display:flex}.menu-sub-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-inline{display:flex}.menu-fit>.menu-item>.menu-content,.menu-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-column{flex-direction:column;width:100%}.menu-row{flex-direction:row}.menu-row>.menu-item{display:flex;align-items:center}.menu-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-rounded .menu-link{border-radius:.475rem}.menu-pill .menu-link{border-radius:50px}.menu-rounded-0 .menu-link{border-radius:0!important}@media (min-width:576px){.menu-item.menu-sm-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-sm-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-sm-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-sm-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-sm-dropdown.menu.show,.menu-sub-sm-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-sm-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-sm-accordion{display:none}.menu-sub-sm-accordion.show,.show:not(.menu-dropdown)>.menu-sub-sm-accordion{display:flex}.menu-sub-sm-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-sm-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-sm-inline{display:flex}.menu-sm-fit>.menu-item>.menu-content,.menu-sm-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-sm-column{flex-direction:column;width:100%}.menu-sm-row{flex-direction:row}.menu-sm-row>.menu-item{display:flex;align-items:center}.menu-sm-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-sm-rounded .menu-link{border-radius:.475rem}.menu-sm-pill .menu-link{border-radius:50px}.menu-sm-rounded-0 .menu-link{border-radius:0!important}}@media (min-width:768px){.menu-item.menu-md-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-md-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-md-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-md-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-md-dropdown.menu.show,.menu-sub-md-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-md-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-md-accordion{display:none}.menu-sub-md-accordion.show,.show:not(.menu-dropdown)>.menu-sub-md-accordion{display:flex}.menu-sub-md-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-md-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-md-inline{display:flex}.menu-md-fit>.menu-item>.menu-content,.menu-md-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-md-column{flex-direction:column;width:100%}.menu-md-row{flex-direction:row}.menu-md-row>.menu-item{display:flex;align-items:center}.menu-md-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-md-rounded .menu-link{border-radius:.475rem}.menu-md-pill .menu-link{border-radius:50px}.menu-md-rounded-0 .menu-link{border-radius:0!important}}@media (min-width:992px){.menu-item.menu-lg-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-lg-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-lg-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-lg-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-lg-dropdown.menu.show,.menu-sub-lg-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-lg-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-lg-accordion{display:none}.menu-sub-lg-accordion.show,.show:not(.menu-dropdown)>.menu-sub-lg-accordion{display:flex}.menu-sub-lg-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-lg-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-lg-inline{display:flex}.menu-lg-fit>.menu-item>.menu-content,.menu-lg-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-lg-column{flex-direction:column;width:100%}.menu-lg-row{flex-direction:row}.menu-lg-row>.menu-item{display:flex;align-items:center}.menu-lg-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-lg-rounded .menu-link{border-radius:.475rem}.menu-lg-pill .menu-link{border-radius:50px}.menu-lg-rounded-0 .menu-link{border-radius:0!important}}@media (min-width:1200px){.menu-item.menu-xl-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-xl-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-xl-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-xl-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-xl-dropdown.menu.show,.menu-sub-xl-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-xl-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-xl-accordion{display:none}.menu-sub-xl-accordion.show,.show:not(.menu-dropdown)>.menu-sub-xl-accordion{display:flex}.menu-sub-xl-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-xl-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-xl-inline{display:flex}.menu-xl-fit>.menu-item>.menu-content,.menu-xl-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-xl-column{flex-direction:column;width:100%}.menu-xl-row{flex-direction:row}.menu-xl-row>.menu-item{display:flex;align-items:center}.menu-xl-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-xl-rounded .menu-link{border-radius:.475rem}.menu-xl-pill .menu-link{border-radius:50px}.menu-xl-rounded-0 .menu-link{border-radius:0!important}}@media (min-width:1400px){.menu-item.menu-xxl-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-xxl-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-xxl-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-xxl-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-xxl-dropdown.menu.show,.menu-sub-xxl-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-xxl-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-xxl-accordion{display:none}.menu-sub-xxl-accordion.show,.show:not(.menu-dropdown)>.menu-sub-xxl-accordion{display:flex}.menu-sub-xxl-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-xxl-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-xxl-inline{display:flex}.menu-xxl-fit>.menu-item>.menu-content,.menu-xxl-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-xxl-column{flex-direction:column;width:100%}.menu-xxl-row{flex-direction:row}.menu-xxl-row>.menu-item{display:flex;align-items:center}.menu-xxl-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-xxl-rounded .menu-link{border-radius:.475rem}.menu-xxl-pill .menu-link{border-radius:50px}.menu-xxl-rounded-0 .menu-link{border-radius:0!important}}@media (max-width:575.98px){.menu-item.menu-sm-down-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-sm-down-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-sm-down-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-sm-down-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-sm-down-dropdown.menu.show,.menu-sub-sm-down-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-sm-down-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-sm-down-accordion{display:none}.menu-sub-sm-down-accordion.show,.show:not(.menu-dropdown)>.menu-sub-sm-down-accordion{display:flex}.menu-sub-sm-down-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-sm-down-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-sm-down-inline{display:flex}.menu-sm-down-fit>.menu-item>.menu-content,.menu-sm-down-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-sm-down-column{flex-direction:column;width:100%}.menu-sm-down-row{flex-direction:row}.menu-sm-down-row>.menu-item{display:flex;align-items:center}.menu-sm-down-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-sm-down-rounded .menu-link{border-radius:.475rem}.menu-sm-down-pill .menu-link{border-radius:50px}.menu-sm-down-rounded-0 .menu-link{border-radius:0!important}}@media (max-width:767.98px){.menu-item.menu-md-down-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-md-down-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-md-down-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-md-down-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-md-down-dropdown.menu.show,.menu-sub-md-down-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-md-down-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-md-down-accordion{display:none}.menu-sub-md-down-accordion.show,.show:not(.menu-dropdown)>.menu-sub-md-down-accordion{display:flex}.menu-sub-md-down-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-md-down-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-md-down-inline{display:flex}.menu-md-down-fit>.menu-item>.menu-content,.menu-md-down-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-md-down-column{flex-direction:column;width:100%}.menu-md-down-row{flex-direction:row}.menu-md-down-row>.menu-item{display:flex;align-items:center}.menu-md-down-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-md-down-rounded .menu-link{border-radius:.475rem}.menu-md-down-pill .menu-link{border-radius:50px}.menu-md-down-rounded-0 .menu-link{border-radius:0!important}}@media (max-width:991.98px){.menu-item.menu-lg-down-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-lg-down-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-lg-down-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-lg-down-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-lg-down-dropdown.menu.show,.menu-sub-lg-down-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-lg-down-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-lg-down-accordion{display:none}.menu-sub-lg-down-accordion.show,.show:not(.menu-dropdown)>.menu-sub-lg-down-accordion{display:flex}.menu-sub-lg-down-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-lg-down-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-lg-down-inline{display:flex}.menu-lg-down-fit>.menu-item>.menu-content,.menu-lg-down-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-lg-down-column{flex-direction:column;width:100%}.menu-lg-down-row{flex-direction:row}.menu-lg-down-row>.menu-item{display:flex;align-items:center}.menu-lg-down-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-lg-down-rounded .menu-link{border-radius:.475rem}.menu-lg-down-pill .menu-link{border-radius:50px}.menu-lg-down-rounded-0 .menu-link{border-radius:0!important}}@media (max-width:1199.98px){.menu-item.menu-xl-down-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-xl-down-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-xl-down-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-xl-down-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-xl-down-dropdown.menu.show,.menu-sub-xl-down-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-xl-down-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-xl-down-accordion{display:none}.menu-sub-xl-down-accordion.show,.show:not(.menu-dropdown)>.menu-sub-xl-down-accordion{display:flex}.menu-sub-xl-down-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-xl-down-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-xl-down-inline{display:flex}.menu-xl-down-fit>.menu-item>.menu-content,.menu-xl-down-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-xl-down-column{flex-direction:column;width:100%}.menu-xl-down-row{flex-direction:row}.menu-xl-down-row>.menu-item{display:flex;align-items:center}.menu-xl-down-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-xl-down-rounded .menu-link{border-radius:.475rem}.menu-xl-down-pill .menu-link{border-radius:50px}.menu-xl-down-rounded-0 .menu-link{border-radius:0!important}}@media (max-width:1399.98px){.menu-item.menu-xxl-down-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-xxl-down-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-xxl-down-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-xxl-down-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-xxl-down-dropdown.menu.show,.menu-sub-xxl-down-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-xxl-down-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-xxl-down-accordion{display:none}.menu-sub-xxl-down-accordion.show,.show:not(.menu-dropdown)>.menu-sub-xxl-down-accordion{display:flex}.menu-sub-xxl-down-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-xxl-down-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-xxl-down-inline{display:flex}.menu-xxl-down-fit>.menu-item>.menu-content,.menu-xxl-down-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-xxl-down-column{flex-direction:column;width:100%}.menu-xxl-down-row{flex-direction:row}.menu-xxl-down-row>.menu-item{display:flex;align-items:center}.menu-xxl-down-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-xxl-down-rounded .menu-link{border-radius:.475rem}.menu-xxl-down-pill .menu-link{border-radius:50px}.menu-xxl-down-rounded-0 .menu-link{border-radius:0!important}}.menu-link-indention .menu-item{padding-top:0;padding-bottom:0}.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-link{padding-left:calc(1rem + 1rem)}.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link{padding-left:calc(2rem + 1rem)}.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link{padding-left:calc(3rem + 1rem)}.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link{padding-left:calc(4rem + 1rem)}.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-link{padding-left:1rem;padding-right:0}.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link{padding-left:calc(2rem);padding-right:0}.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link{padding-left:calc(3rem);padding-right:0}.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link{padding-left:calc(4rem);padding-right:0}@keyframes menu-sub-dropdown-animation-fade-in{from{opacity:0}to{opacity:1}}@keyframes menu-sub-dropdown-animation-move-up{from{margin-top:.75rem}to{margin-top:0}}@keyframes menu-sub-dropdown-animation-move-down{from{margin-bottom:.75rem}to{margin-bottom:0}}.menu-white .menu-item .menu-link{color:var(--bs-white)}.menu-white .menu-item .menu-link .menu-title{color:var(--bs-white)}.menu-white .menu-item .menu-link .menu-icon,.menu-white .menu-item .menu-link .menu-icon .svg-icon,.menu-white .menu-item .menu-link .menu-icon i{color:var(--bs-white)}.menu-white .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-white)}.menu-white .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-white);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-white%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-white%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-white);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-white%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-white%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-white .menu-item .menu-link{color:var(--bs-text-white)}.menu-title-white .menu-item .menu-link .menu-title{color:var(--bs-text-white)}.menu-icon-white .menu-item .menu-link .menu-icon,.menu-icon-white .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-white .menu-item .menu-link .menu-icon i{color:var(--bs-text-white)}.menu-bullet-white .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-white)}.menu-arrow-white .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-white);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-white%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-white%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-white);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-white%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-white%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-primary .menu-item .menu-link{color:var(--bs-primary)}.menu-primary .menu-item .menu-link .menu-title{color:var(--bs-primary)}.menu-primary .menu-item .menu-link .menu-icon,.menu-primary .menu-item .menu-link .menu-icon .svg-icon,.menu-primary .menu-item .menu-link .menu-icon i{color:var(--bs-primary)}.menu-primary .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-primary .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-primary .menu-item .menu-link{color:var(--bs-text-primary)}.menu-title-primary .menu-item .menu-link .menu-title{color:var(--bs-text-primary)}.menu-icon-primary .menu-item .menu-link .menu-icon,.menu-icon-primary .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-primary .menu-item .menu-link .menu-icon i{color:var(--bs-text-primary)}.menu-bullet-primary .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-primary)}.menu-arrow-primary .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-secondary .menu-item .menu-link{color:var(--bs-secondary)}.menu-secondary .menu-item .menu-link .menu-title{color:var(--bs-secondary)}.menu-secondary .menu-item .menu-link .menu-icon,.menu-secondary .menu-item .menu-link .menu-icon .svg-icon,.menu-secondary .menu-item .menu-link .menu-icon i{color:var(--bs-secondary)}.menu-secondary .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-secondary)}.menu-secondary .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-secondary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-secondary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-secondary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-secondary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-secondary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-secondary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-secondary .menu-item .menu-link{color:var(--bs-text-secondary)}.menu-title-secondary .menu-item .menu-link .menu-title{color:var(--bs-text-secondary)}.menu-icon-secondary .menu-item .menu-link .menu-icon,.menu-icon-secondary .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-secondary .menu-item .menu-link .menu-icon i{color:var(--bs-text-secondary)}.menu-bullet-secondary .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-secondary)}.menu-arrow-secondary .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-secondary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-secondary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-secondary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-secondary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-secondary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-secondary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-light .menu-item .menu-link{color:var(--bs-light)}.menu-light .menu-item .menu-link .menu-title{color:var(--bs-light)}.menu-light .menu-item .menu-link .menu-icon,.menu-light .menu-item .menu-link .menu-icon .svg-icon,.menu-light .menu-item .menu-link .menu-icon i{color:var(--bs-light)}.menu-light .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-light)}.menu-light .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-light);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-light%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-light%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-light);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-light%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-light%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-light .menu-item .menu-link{color:var(--bs-text-light)}.menu-title-light .menu-item .menu-link .menu-title{color:var(--bs-text-light)}.menu-icon-light .menu-item .menu-link .menu-icon,.menu-icon-light .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-light .menu-item .menu-link .menu-icon i{color:var(--bs-text-light)}.menu-bullet-light .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-light)}.menu-arrow-light .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-light);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-light%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-light%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-light);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-light%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-light%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-success .menu-item .menu-link{color:var(--bs-success)}.menu-success .menu-item .menu-link .menu-title{color:var(--bs-success)}.menu-success .menu-item .menu-link .menu-icon,.menu-success .menu-item .menu-link .menu-icon .svg-icon,.menu-success .menu-item .menu-link .menu-icon i{color:var(--bs-success)}.menu-success .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-success)}.menu-success .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-success);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-success%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-success%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-success);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-success%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-success%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-success .menu-item .menu-link{color:var(--bs-text-success)}.menu-title-success .menu-item .menu-link .menu-title{color:var(--bs-text-success)}.menu-icon-success .menu-item .menu-link .menu-icon,.menu-icon-success .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-success .menu-item .menu-link .menu-icon i{color:var(--bs-text-success)}.menu-bullet-success .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-success)}.menu-arrow-success .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-success);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-success%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-success%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-success);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-success%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-success%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-info .menu-item .menu-link{color:var(--bs-info)}.menu-info .menu-item .menu-link .menu-title{color:var(--bs-info)}.menu-info .menu-item .menu-link .menu-icon,.menu-info .menu-item .menu-link .menu-icon .svg-icon,.menu-info .menu-item .menu-link .menu-icon i{color:var(--bs-info)}.menu-info .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-info)}.menu-info .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-info);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-info%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-info%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-info);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-info%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-info%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-info .menu-item .menu-link{color:var(--bs-text-info)}.menu-title-info .menu-item .menu-link .menu-title{color:var(--bs-text-info)}.menu-icon-info .menu-item .menu-link .menu-icon,.menu-icon-info .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-info .menu-item .menu-link .menu-icon i{color:var(--bs-text-info)}.menu-bullet-info .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-info)}.menu-arrow-info .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-info);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-info%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-info%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-info);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-info%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-info%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-warning .menu-item .menu-link{color:var(--bs-warning)}.menu-warning .menu-item .menu-link .menu-title{color:var(--bs-warning)}.menu-warning .menu-item .menu-link .menu-icon,.menu-warning .menu-item .menu-link .menu-icon .svg-icon,.menu-warning .menu-item .menu-link .menu-icon i{color:var(--bs-warning)}.menu-warning .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-warning)}.menu-warning .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-warning);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-warning%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-warning%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-warning);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-warning%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-warning%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-warning .menu-item .menu-link{color:var(--bs-text-warning)}.menu-title-warning .menu-item .menu-link .menu-title{color:var(--bs-text-warning)}.menu-icon-warning .menu-item .menu-link .menu-icon,.menu-icon-warning .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-warning .menu-item .menu-link .menu-icon i{color:var(--bs-text-warning)}.menu-bullet-warning .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-warning)}.menu-arrow-warning .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-warning);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-warning%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-warning%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-warning);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-warning%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-warning%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-danger .menu-item .menu-link{color:var(--bs-danger)}.menu-danger .menu-item .menu-link .menu-title{color:var(--bs-danger)}.menu-danger .menu-item .menu-link .menu-icon,.menu-danger .menu-item .menu-link .menu-icon .svg-icon,.menu-danger .menu-item .menu-link .menu-icon i{color:var(--bs-danger)}.menu-danger .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-danger)}.menu-danger .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-danger);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-danger%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-danger%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-danger);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-danger%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-danger%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-danger .menu-item .menu-link{color:var(--bs-text-danger)}.menu-title-danger .menu-item .menu-link .menu-title{color:var(--bs-text-danger)}.menu-icon-danger .menu-item .menu-link .menu-icon,.menu-icon-danger .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-danger .menu-item .menu-link .menu-icon i{color:var(--bs-text-danger)}.menu-bullet-danger .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-danger)}.menu-arrow-danger .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-danger);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-danger%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-danger%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-danger);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-danger%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-danger%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-dark .menu-item .menu-link{color:var(--bs-dark)}.menu-dark .menu-item .menu-link .menu-title{color:var(--bs-dark)}.menu-dark .menu-item .menu-link .menu-icon,.menu-dark .menu-item .menu-link .menu-icon .svg-icon,.menu-dark .menu-item .menu-link .menu-icon i{color:var(--bs-dark)}.menu-dark .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-dark)}.menu-dark .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-dark .menu-item .menu-link{color:var(--bs-text-dark)}.menu-title-dark .menu-item .menu-link .menu-title{color:var(--bs-text-dark)}.menu-icon-dark .menu-item .menu-link .menu-icon,.menu-icon-dark .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-dark .menu-item .menu-link .menu-icon i{color:var(--bs-text-dark)}.menu-bullet-dark .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-dark)}.menu-arrow-dark .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-muted .menu-item .menu-link{color:var(--bs-muted)}.menu-muted .menu-item .menu-link .menu-title{color:var(--bs-muted)}.menu-muted .menu-item .menu-link .menu-icon,.menu-muted .menu-item .menu-link .menu-icon .svg-icon,.menu-muted .menu-item .menu-link .menu-icon i{color:var(--bs-muted)}.menu-muted .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-muted)}.menu-muted .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-muted);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-muted%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-muted%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-muted);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-muted%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-muted%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-muted .menu-item .menu-link{color:var(--bs-text-muted)}.menu-title-muted .menu-item .menu-link .menu-title{color:var(--bs-text-muted)}.menu-icon-muted .menu-item .menu-link .menu-icon,.menu-icon-muted .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-muted .menu-item .menu-link .menu-icon i{color:var(--bs-text-muted)}.menu-bullet-muted .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-muted)}.menu-arrow-muted .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-muted);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-muted);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-100 .menu-item .menu-link{color:var(--bs-gray-100)}.menu-gray-100 .menu-item .menu-link .menu-title{color:var(--bs-gray-100)}.menu-gray-100 .menu-item .menu-link .menu-icon,.menu-gray-100 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-100 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-100)}.menu-gray-100 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-100)}.menu-gray-100 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-100);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-100%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-100%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-100);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-100%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-100%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-100 .menu-item .menu-link{color:var(--bs-text-gray-100)}.menu-title-gray-100 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-100)}.menu-icon-gray-100 .menu-item .menu-link .menu-icon,.menu-icon-gray-100 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-100 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-100)}.menu-bullet-gray-100 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-100)}.menu-arrow-gray-100 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-100);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-100%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-100%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-100);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-100%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-100%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-200 .menu-item .menu-link{color:var(--bs-gray-200)}.menu-gray-200 .menu-item .menu-link .menu-title{color:var(--bs-gray-200)}.menu-gray-200 .menu-item .menu-link .menu-icon,.menu-gray-200 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-200 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-200)}.menu-gray-200 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-200)}.menu-gray-200 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-200);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-200%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-200%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-200);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-200%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-200%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-200 .menu-item .menu-link{color:var(--bs-text-gray-200)}.menu-title-gray-200 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-200)}.menu-icon-gray-200 .menu-item .menu-link .menu-icon,.menu-icon-gray-200 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-200 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-200)}.menu-bullet-gray-200 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-200)}.menu-arrow-gray-200 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-200);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-200%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-200%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-200);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-200%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-200%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-300 .menu-item .menu-link{color:var(--bs-gray-300)}.menu-gray-300 .menu-item .menu-link .menu-title{color:var(--bs-gray-300)}.menu-gray-300 .menu-item .menu-link .menu-icon,.menu-gray-300 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-300 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-300)}.menu-gray-300 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-300)}.menu-gray-300 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-300);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-300%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-300%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-300);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-300%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-300%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-300 .menu-item .menu-link{color:var(--bs-text-gray-300)}.menu-title-gray-300 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-300)}.menu-icon-gray-300 .menu-item .menu-link .menu-icon,.menu-icon-gray-300 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-300 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-300)}.menu-bullet-gray-300 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-300)}.menu-arrow-gray-300 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-300);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-300%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-300%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-300);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-300%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-300%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-400 .menu-item .menu-link{color:var(--bs-gray-400)}.menu-gray-400 .menu-item .menu-link .menu-title{color:var(--bs-gray-400)}.menu-gray-400 .menu-item .menu-link .menu-icon,.menu-gray-400 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-400 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-400)}.menu-gray-400 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-400)}.menu-gray-400 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-400);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-400%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-400%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-400);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-400%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-400%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-400 .menu-item .menu-link{color:var(--bs-text-gray-400)}.menu-title-gray-400 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-400)}.menu-icon-gray-400 .menu-item .menu-link .menu-icon,.menu-icon-gray-400 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-400 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-400)}.menu-bullet-gray-400 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-400)}.menu-arrow-gray-400 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-400);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-400%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-400%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-400);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-400%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-400%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-500 .menu-item .menu-link{color:var(--bs-gray-500)}.menu-gray-500 .menu-item .menu-link .menu-title{color:var(--bs-gray-500)}.menu-gray-500 .menu-item .menu-link .menu-icon,.menu-gray-500 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-500 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-500)}.menu-gray-500 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-500)}.menu-gray-500 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-500);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-500%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-500%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-500);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-500%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-500%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-500 .menu-item .menu-link{color:var(--bs-text-gray-500)}.menu-title-gray-500 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-500)}.menu-icon-gray-500 .menu-item .menu-link .menu-icon,.menu-icon-gray-500 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-500 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-500)}.menu-bullet-gray-500 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-500)}.menu-arrow-gray-500 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-500);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-500%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-500%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-500);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-500%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-500%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-600 .menu-item .menu-link{color:var(--bs-gray-600)}.menu-gray-600 .menu-item .menu-link .menu-title{color:var(--bs-gray-600)}.menu-gray-600 .menu-item .menu-link .menu-icon,.menu-gray-600 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-600 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-600)}.menu-gray-600 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-600)}.menu-gray-600 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-600);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-600%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-600%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-600);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-600%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-600%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-600 .menu-item .menu-link{color:var(--bs-text-gray-600)}.menu-title-gray-600 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-600)}.menu-icon-gray-600 .menu-item .menu-link .menu-icon,.menu-icon-gray-600 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-600 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-600)}.menu-bullet-gray-600 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-600)}.menu-arrow-gray-600 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-600);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-600%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-600%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-600);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-600%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-600%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-700 .menu-item .menu-link{color:var(--bs-gray-700)}.menu-gray-700 .menu-item .menu-link .menu-title{color:var(--bs-gray-700)}.menu-gray-700 .menu-item .menu-link .menu-icon,.menu-gray-700 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-700 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-700)}.menu-gray-700 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-700)}.menu-gray-700 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-700);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-700);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-700 .menu-item .menu-link{color:var(--bs-text-gray-700)}.menu-title-gray-700 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-700)}.menu-icon-gray-700 .menu-item .menu-link .menu-icon,.menu-icon-gray-700 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-700 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-700)}.menu-bullet-gray-700 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-700)}.menu-arrow-gray-700 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-700);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-700%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-700%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-700);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-700%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-700%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-800 .menu-item .menu-link{color:var(--bs-gray-800)}.menu-gray-800 .menu-item .menu-link .menu-title{color:var(--bs-gray-800)}.menu-gray-800 .menu-item .menu-link .menu-icon,.menu-gray-800 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-800 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-800)}.menu-gray-800 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-800)}.menu-gray-800 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-800);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-800%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-800%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-800);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-800%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-800%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-800 .menu-item .menu-link{color:var(--bs-text-gray-800)}.menu-title-gray-800 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-800)}.menu-icon-gray-800 .menu-item .menu-link .menu-icon,.menu-icon-gray-800 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-800 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-800)}.menu-bullet-gray-800 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-800)}.menu-arrow-gray-800 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-800);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-800%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-800%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-800);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-800%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-800%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-900 .menu-item .menu-link{color:var(--bs-gray-900)}.menu-gray-900 .menu-item .menu-link .menu-title{color:var(--bs-gray-900)}.menu-gray-900 .menu-item .menu-link .menu-icon,.menu-gray-900 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-900 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-900)}.menu-gray-900 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-900)}.menu-gray-900 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-900 .menu-item .menu-link{color:var(--bs-text-gray-900)}.menu-title-gray-900 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-900)}.menu-icon-gray-900 .menu-item .menu-link .menu-icon,.menu-icon-gray-900 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-900 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-900)}.menu-bullet-gray-900 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-900)}.menu-arrow-gray-900 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-hover-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-hover-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-hover);color:var(--bs-menu-link-color-hover)}.menu-hover-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-hover-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-menu-link-color-hover)}.menu-hover-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-hover-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-menu-link-color-hover)}.menu-hover-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-hover-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-menu-link-color-hover)}.menu-hover-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-hover-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-hover);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-hover);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-here-bg .menu-item.here>.menu-link{transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-here);color:var(--bs-menu-link-color-here)}.menu-here-bg .menu-item.here>.menu-link .menu-title{color:var(--bs-menu-link-color-here)}.menu-here-bg .menu-item.here>.menu-link .menu-icon,.menu-here-bg .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-here-bg .menu-item.here>.menu-link .menu-icon i{color:var(--bs-menu-link-color-here)}.menu-here-bg .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-menu-link-color-here)}.menu-here-bg .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-root-here-bg>.menu-item.here>.menu-link{transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-here);color:var(--bs-menu-link-color-here)}.menu-root-here-bg>.menu-item.here>.menu-link .menu-title{color:var(--bs-menu-link-color-here)}.menu-root-here-bg>.menu-item.here>.menu-link .menu-icon,.menu-root-here-bg>.menu-item.here>.menu-link .menu-icon .svg-icon,.menu-root-here-bg>.menu-item.here>.menu-link .menu-icon i{color:var(--bs-menu-link-color-here)}.menu-root-here-bg>.menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-menu-link-color-here)}.menu-root-here-bg>.menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}@media (min-width:992px){.menu-root-here-bg-desktop>.menu-item.here>.menu-link{transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-here);color:var(--bs-menu-link-color-here)}.menu-root-here-bg-desktop>.menu-item.here>.menu-link .menu-title{color:var(--bs-menu-link-color-here)}.menu-root-here-bg-desktop>.menu-item.here>.menu-link .menu-icon,.menu-root-here-bg-desktop>.menu-item.here>.menu-link .menu-icon .svg-icon,.menu-root-here-bg-desktop>.menu-item.here>.menu-link .menu-icon i{color:var(--bs-menu-link-color-here)}.menu-root-here-bg-desktop>.menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-menu-link-color-here)}.menu-root-here-bg-desktop>.menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}}.menu-show-bg .menu-item.show>.menu-link{transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-show);color:var(--bs-menu-link-color-show)}.menu-show-bg .menu-item.show>.menu-link .menu-title{color:var(--bs-menu-link-color-show)}.menu-show-bg .menu-item.show>.menu-link .menu-icon,.menu-show-bg .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-show-bg .menu-item.show>.menu-link .menu-icon i{color:var(--bs-menu-link-color-show)}.menu-show-bg .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-menu-link-color-show)}.menu-show-bg .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-show);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-show);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-active-bg .menu-item .menu-link.active{transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-active);color:var(--bs-menu-link-color-active)}.menu-active-bg .menu-item .menu-link.active .menu-title{color:var(--bs-menu-link-color-active)}.menu-active-bg .menu-item .menu-link.active .menu-icon,.menu-active-bg .menu-item .menu-link.active .menu-icon .svg-icon,.menu-active-bg .menu-item .menu-link.active .menu-icon i{color:var(--bs-menu-link-color-active)}.menu-active-bg .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-menu-link-color-active)}.menu-active-bg .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-active);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-active);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-hover);color:var(--bs-menu-link-color-hover)}.menu-state-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-state-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-menu-link-color-hover)}.menu-state-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-state-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-menu-link-color-hover)}.menu-state-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-state-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-menu-link-color-hover)}.menu-state-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-state-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-hover);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-hover);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg .menu-item.here>.menu-link{transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-here);color:var(--bs-menu-link-color-here)}.menu-state-bg .menu-item.here>.menu-link .menu-title{color:var(--bs-menu-link-color-here)}.menu-state-bg .menu-item.here>.menu-link .menu-icon,.menu-state-bg .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-state-bg .menu-item.here>.menu-link .menu-icon i{color:var(--bs-menu-link-color-here)}.menu-state-bg .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-menu-link-color-here)}.menu-state-bg .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg .menu-item.show>.menu-link{transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-show);color:var(--bs-menu-link-color-show)}.menu-state-bg .menu-item.show>.menu-link .menu-title{color:var(--bs-menu-link-color-show)}.menu-state-bg .menu-item.show>.menu-link .menu-icon,.menu-state-bg .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-bg .menu-item.show>.menu-link .menu-icon i{color:var(--bs-menu-link-color-show)}.menu-state-bg .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-menu-link-color-show)}.menu-state-bg .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-show);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-show);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg .menu-item .menu-link.active{transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-active);color:var(--bs-menu-link-color-active)}.menu-state-bg .menu-item .menu-link.active .menu-title{color:var(--bs-menu-link-color-active)}.menu-state-bg .menu-item .menu-link.active .menu-icon,.menu-state-bg .menu-item .menu-link.active .menu-icon .svg-icon,.menu-state-bg .menu-item .menu-link.active .menu-icon i{color:var(--bs-menu-link-color-active)}.menu-state-bg .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-menu-link-color-active)}.menu-state-bg .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-active);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-active);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-color .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-color .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;color:var(--bs-menu-link-color-hover)}.menu-state-color .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-state-color .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-menu-link-color-hover)}.menu-state-color .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-color .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-color .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-state-color .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-color .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-color .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-menu-link-color-hover)}.menu-state-color .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-state-color .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-menu-link-color-hover)}.menu-state-color .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-state-color .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-hover);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-hover);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-color .menu-item.here>.menu-link{transition:color .2s ease;color:var(--bs-menu-link-color-here)}.menu-state-color .menu-item.here>.menu-link .menu-title{color:var(--bs-menu-link-color-here)}.menu-state-color .menu-item.here>.menu-link .menu-icon,.menu-state-color .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-state-color .menu-item.here>.menu-link .menu-icon i{color:var(--bs-menu-link-color-here)}.menu-state-color .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-menu-link-color-here)}.menu-state-color .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-color .menu-item.show>.menu-link{transition:color .2s ease;color:var(--bs-menu-link-color-show)}.menu-state-color .menu-item.show>.menu-link .menu-title{color:var(--bs-menu-link-color-show)}.menu-state-color .menu-item.show>.menu-link .menu-icon,.menu-state-color .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-color .menu-item.show>.menu-link .menu-icon i{color:var(--bs-menu-link-color-show)}.menu-state-color .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-menu-link-color-show)}.menu-state-color .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-show);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-show);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-color .menu-item .menu-link.active{transition:color .2s ease;color:var(--bs-menu-link-color-active)}.menu-state-color .menu-item .menu-link.active .menu-title{color:var(--bs-menu-link-color-active)}.menu-state-color .menu-item .menu-link.active .menu-icon,.menu-state-color .menu-item .menu-link.active .menu-icon .svg-icon,.menu-state-color .menu-item .menu-link.active .menu-icon i{color:var(--bs-menu-link-color-active)}.menu-state-color .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-menu-link-color-active)}.menu-state-color .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-active);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-active);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-hover-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-hover-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-hover-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-hover-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-primary-inverse)}.menu-hover-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-hover-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-primary-inverse)}.menu-hover-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-hover-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-hover-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-hover-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-show-bg-primary .menu-item.show>.menu-link{transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-show-bg-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary-inverse)}.menu-show-bg-primary .menu-item.show>.menu-link .menu-icon,.menu-show-bg-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-show-bg-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary-inverse)}.menu-show-bg-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-show-bg-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-here-bg-primary .menu-item.here>.menu-link{transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-here-bg-primary .menu-item.here>.menu-link .menu-title{color:var(--bs-primary-inverse)}.menu-here-bg-primary .menu-item.here>.menu-link .menu-icon,.menu-here-bg-primary .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-here-bg-primary .menu-item.here>.menu-link .menu-icon i{color:var(--bs-primary-inverse)}.menu-here-bg-primary .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-here-bg-primary .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-active-bg-primary .menu-item .menu-link.active{transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-active-bg-primary .menu-item .menu-link.active .menu-title{color:var(--bs-primary-inverse)}.menu-active-bg-primary .menu-item .menu-link.active .menu-icon,.menu-active-bg-primary .menu-item .menu-link.active .menu-icon .svg-icon,.menu-active-bg-primary .menu-item .menu-link.active .menu-icon i{color:var(--bs-primary-inverse)}.menu-active-bg-primary .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-active-bg-primary .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-state-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-state-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-state-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-state-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-primary .menu-item.show>.menu-link{transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.show>.menu-link .menu-icon,.menu-state-bg-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-bg-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-primary .menu-item.here>.menu-link{transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.here>.menu-link .menu-title{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.here>.menu-link .menu-icon,.menu-state-bg-primary .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-state-bg-primary .menu-item.here>.menu-link .menu-icon i{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-primary .menu-item .menu-link.active{transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item .menu-link.active .menu-title{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item .menu-link.active .menu-icon,.menu-state-bg-primary .menu-item .menu-link.active .menu-icon .svg-icon,.menu-state-bg-primary .menu-item .menu-link.active .menu-icon i{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-primary .menu-item.show>.menu-link{transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.show>.menu-link .menu-icon,.menu-state-bg-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-bg-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-show-bg-light-primary .menu-item.show>.menu-link{transition:color .2s ease;background-color:var(--bs-primary-light);color:var(--bs-primary)}.menu-show-bg-light-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary)}.menu-show-bg-light-primary .menu-item.show>.menu-link .menu-icon,.menu-show-bg-light-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-show-bg-light-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-show-bg-light-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-show-bg-light-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-here-bg-light-primary .menu-item.here>.menu-link{transition:color .2s ease;background-color:var(--bs-primary-light);color:var(--bs-primary)}.menu-here-bg-light-primary .menu-item.here>.menu-link .menu-title{color:var(--bs-primary)}.menu-here-bg-light-primary .menu-item.here>.menu-link .menu-icon,.menu-here-bg-light-primary .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-here-bg-light-primary .menu-item.here>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-here-bg-light-primary .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-here-bg-light-primary .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-hover-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-hover-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;background-color:var(--bs-primary-light);color:var(--bs-primary)}.menu-hover-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-hover-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-primary)}.menu-hover-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-hover-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-primary)}.menu-hover-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-hover-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-hover-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-hover-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-active-bg-light-primary .menu-item .menu-link.active{transition:color .2s ease;background-color:var(--bs-primary-light);color:var(--bs-primary)}.menu-active-bg-light-primary .menu-item .menu-link.active .menu-title{color:var(--bs-primary)}.menu-active-bg-light-primary .menu-item .menu-link.active .menu-icon,.menu-active-bg-light-primary .menu-item .menu-link.active .menu-icon .svg-icon,.menu-active-bg-light-primary .menu-item .menu-link.active .menu-icon i{color:var(--bs-primary)}.menu-active-bg-light-primary .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-active-bg-light-primary .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-light-primary .menu-item.show>.menu-link{transition:color .2s ease;background-color:var(--bs-primary-light);color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.show>.menu-link .menu-icon,.menu-state-bg-light-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-bg-light-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-light-primary .menu-item.here>.menu-link{transition:color .2s ease;background-color:var(--bs-primary-light);color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.here>.menu-link .menu-title{color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.here>.menu-link .menu-icon,.menu-state-bg-light-primary .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-state-bg-light-primary .menu-item.here>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;background-color:var(--bs-primary-light);color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-state-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-state-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-state-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-state-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-light-primary .menu-item .menu-link.active{transition:color .2s ease;background-color:var(--bs-primary-light);color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item .menu-link.active .menu-title{color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item .menu-link.active .menu-icon,.menu-state-bg-light-primary .menu-item .menu-link.active .menu-icon .svg-icon,.menu-state-bg-light-primary .menu-item .menu-link.active .menu-icon i{color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-hover-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-hover-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;color:var(--bs-primary)}.menu-hover-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-hover-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-primary)}.menu-hover-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-hover-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-primary)}.menu-hover-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-hover-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-hover-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-hover-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-show-primary .menu-item.show>.menu-link{transition:color .2s ease;color:var(--bs-primary)}.menu-show-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary)}.menu-show-primary .menu-item.show>.menu-link .menu-icon,.menu-show-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-show-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-show-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-show-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-here-primary .menu-item.here>.menu-link{transition:color .2s ease;color:var(--bs-primary)}.menu-here-primary .menu-item.here>.menu-link .menu-title{color:var(--bs-primary)}.menu-here-primary .menu-item.here>.menu-link .menu-icon,.menu-here-primary .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-here-primary .menu-item.here>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-here-primary .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-here-primary .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-active-primary .menu-item .menu-link.active{transition:color .2s ease;color:var(--bs-primary)}.menu-active-primary .menu-item .menu-link.active .menu-title{color:var(--bs-primary)}.menu-active-primary .menu-item .menu-link.active .menu-icon,.menu-active-primary .menu-item .menu-link.active .menu-icon .svg-icon,.menu-active-primary .menu-item .menu-link.active .menu-icon i{color:var(--bs-primary)}.menu-active-primary .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-active-primary .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;color:var(--bs-primary)}.menu-state-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-state-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-primary)}.menu-state-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-state-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-primary)}.menu-state-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-state-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-state-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-primary .menu-item.show>.menu-link{transition:color .2s ease;color:var(--bs-primary)}.menu-state-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary)}.menu-state-primary .menu-item.show>.menu-link .menu-icon,.menu-state-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-state-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-primary .menu-item.here>.menu-link{transition:color .2s ease;color:var(--bs-primary)}.menu-state-primary .menu-item.here>.menu-link .menu-title{color:var(--bs-primary)}.menu-state-primary .menu-item.here>.menu-link .menu-icon,.menu-state-primary .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-state-primary .menu-item.here>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-state-primary .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-primary .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-primary .menu-item .menu-link.active{transition:color .2s ease;color:var(--bs-primary)}.menu-state-primary .menu-item .menu-link.active .menu-title{color:var(--bs-primary)}.menu-state-primary .menu-item .menu-link.active .menu-icon,.menu-state-primary .menu-item .menu-link.active .menu-icon .svg-icon,.menu-state-primary .menu-item .menu-link.active .menu-icon i{color:var(--bs-primary)}.menu-state-primary .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-primary .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-dark .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-dark .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;color:var(--bs-dark)}.menu-state-dark .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-state-dark .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-dark)}.menu-state-dark .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-dark .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-dark .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-state-dark .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-dark .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-dark .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-dark)}.menu-state-dark .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-state-dark .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-dark)}.menu-state-dark .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-state-dark .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-dark .menu-item.show>.menu-link{transition:color .2s ease;color:var(--bs-dark)}.menu-state-dark .menu-item.show>.menu-link .menu-title{color:var(--bs-dark)}.menu-state-dark .menu-item.show>.menu-link .menu-icon,.menu-state-dark .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-dark .menu-item.show>.menu-link .menu-icon i{color:var(--bs-dark)}.menu-state-dark .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-dark)}.menu-state-dark .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-dark .menu-item.here>.menu-link{transition:color .2s ease;color:var(--bs-dark)}.menu-state-dark .menu-item.here>.menu-link .menu-title{color:var(--bs-dark)}.menu-state-dark .menu-item.here>.menu-link .menu-icon,.menu-state-dark .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-state-dark .menu-item.here>.menu-link .menu-icon i{color:var(--bs-dark)}.menu-state-dark .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-dark)}.menu-state-dark .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-dark .menu-item .menu-link.active{transition:color .2s ease;color:var(--bs-dark)}.menu-state-dark .menu-item .menu-link.active .menu-title{color:var(--bs-dark)}.menu-state-dark .menu-item .menu-link.active .menu-icon,.menu-state-dark .menu-item .menu-link.active .menu-icon .svg-icon,.menu-state-dark .menu-item .menu-link.active .menu-icon i{color:var(--bs-dark)}.menu-state-dark .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-dark)}.menu-state-dark .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-gray-900 .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-gray-900 .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-state-gray-900 .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-gray-900 .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-gray-900 .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-state-gray-900 .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-gray-900 .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-gray-900 .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-state-gray-900 .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-state-gray-900 .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-gray-900 .menu-item.show>.menu-link{transition:color .2s ease;color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.show>.menu-link .menu-title{color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.show>.menu-link .menu-icon,.menu-state-gray-900 .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-gray-900 .menu-item.show>.menu-link .menu-icon i{color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-gray-900 .menu-item.here>.menu-link{transition:color .2s ease;color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.here>.menu-link .menu-title{color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.here>.menu-link .menu-icon,.menu-state-gray-900 .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-state-gray-900 .menu-item.here>.menu-link .menu-icon i{color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-gray-900 .menu-item .menu-link.active{transition:color .2s ease;color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item .menu-link.active .menu-title{color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item .menu-link.active .menu-icon,.menu-state-gray-900 .menu-item .menu-link.active .menu-icon .svg-icon,.menu-state-gray-900 .menu-item .menu-link.active .menu-icon i{color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-hover-title-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-hover-title-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;color:var(--bs-primary)}.menu-hover-title-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-hover-title-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-primary)}.menu-here-title-primary .menu-item.here>.menu-link{transition:color .2s ease;color:var(--bs-primary)}.menu-here-title-primary .menu-item.here>.menu-link .menu-title{color:var(--bs-primary)}.menu-show-title-primary .menu-item.show>.menu-link{transition:color .2s ease;color:var(--bs-primary)}.menu-show-title-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary)}.menu-active-title-primary .menu-item .menu-link.active{transition:color .2s ease;color:var(--bs-primary)}.menu-active-title-primary .menu-item .menu-link.active .menu-title{color:var(--bs-primary)}.menu-state-title-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-title-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;color:var(--bs-primary)}.menu-state-title-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-state-title-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-primary)}.menu-state-title-primary .menu-item.here>.menu-link{transition:color .2s ease;color:var(--bs-primary)}.menu-state-title-primary .menu-item.here>.menu-link .menu-title{color:var(--bs-primary)}.menu-state-title-primary .menu-item.show>.menu-link{transition:color .2s ease;color:var(--bs-primary)}.menu-state-title-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary)}.menu-state-title-primary .menu-item .menu-link.active{transition:color .2s ease;color:var(--bs-primary)}.menu-state-title-primary .menu-item .menu-link.active .menu-title{color:var(--bs-primary)}.menu-hover-icon-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-hover-icon-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease}.menu-hover-icon-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-icon-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-icon-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-hover-icon-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-icon-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-icon-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-primary)}.menu-here-icon-primary .menu-item.here>.menu-link{transition:color .2s ease}.menu-here-icon-primary .menu-item.here>.menu-link .menu-icon,.menu-here-icon-primary .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-here-icon-primary .menu-item.here>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-show-icon-primary .menu-item.show>.menu-link{transition:color .2s ease}.menu-show-icon-primary .menu-item.show>.menu-link .menu-icon,.menu-show-icon-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-show-icon-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-active-icon-primary .menu-item .menu-link.active{transition:color .2s ease}.menu-active-icon-primary .menu-item .menu-link.active .menu-icon,.menu-active-icon-primary .menu-item .menu-link.active .menu-icon .svg-icon,.menu-active-icon-primary .menu-item .menu-link.active .menu-icon i{color:var(--bs-primary)}.menu-state-icon-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-icon-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease}.menu-state-icon-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-icon-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-icon-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-state-icon-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-icon-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-icon-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-primary)}.menu-state-icon-primary .menu-item.here>.menu-link{transition:color .2s ease}.menu-state-icon-primary .menu-item.here>.menu-link .menu-icon,.menu-state-icon-primary .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-state-icon-primary .menu-item.here>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-state-icon-primary .menu-item.show>.menu-link{transition:color .2s ease}.menu-state-icon-primary .menu-item.show>.menu-link .menu-icon,.menu-state-icon-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-icon-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-state-icon-primary .menu-item .menu-link.active{transition:color .2s ease}.menu-state-icon-primary .menu-item .menu-link.active .menu-icon,.menu-state-icon-primary .menu-item .menu-link.active .menu-icon .svg-icon,.menu-state-icon-primary .menu-item .menu-link.active .menu-icon i{color:var(--bs-primary)}.menu-hover-bullet-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-hover-bullet-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease}.menu-hover-bullet-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-hover-bullet-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-show-bullet-primary .menu-item.show>.menu-link{transition:color .2s ease}.menu-show-bullet-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-here-bullet-primary .menu-item.here>.menu-link{transition:color .2s ease}.menu-here-bullet-primary .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-active-bullet-primary .menu-item .menu-link.active{transition:color .2s ease}.menu-active-bullet-primary .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-bullet-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-bullet-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease}.menu-state-bullet-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-state-bullet-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-bullet-primary .menu-item.here>.menu-link{transition:color .2s ease}.menu-state-bullet-primary .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-bullet-primary .menu-item.show>.menu-link{transition:color .2s ease}.menu-state-bullet-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-bullet-primary .menu-item .menu-link.active{transition:color .2s ease}.menu-state-bullet-primary .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-hover-arrow-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-hover-arrow-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease}.menu-hover-arrow-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-hover-arrow-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-here-arrow-primary .menu-item.here>.menu-link{transition:color .2s ease}.menu-here-arrow-primary .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-show-arrow-primary .menu-item.show>.menu-link{transition:color .2s ease}.menu-show-arrow-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-active-arrow-primary .menu-item .menu-link.active{transition:color .2s ease}.menu-active-arrow-primary .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-arrow-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-arrow-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease}.menu-state-arrow-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-state-arrow-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-arrow-primary .menu-item.here>.menu-link{transition:color .2s ease}.menu-state-arrow-primary .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-arrow-primary .menu-item.show>.menu-link{transition:color .2s ease}.menu-state-arrow-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-arrow-primary .menu-item .menu-link.active{transition:color .2s ease}.menu-state-arrow-primary .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.anchor{display:flex;align-items:center}.anchor a{position:relative;display:none;align-items:center;justify-content:flex-start;height:1em;width:1.25em;margin-left:-1.25em;font-weight:500;font-size:.8em;color:var(--bs-text-muted);transition:all .2s ease-in-out}.anchor a:before{content:"#"}.anchor:hover a{display:flex}.anchor:hover a:hover{color:var(--bs-primary);transition:all .2s ease-in-out}.card{--bs-card-box-shadow:var(--bs-root-card-box-shadow);--bs-card-border-color:var(--bs-root-card-border-color);border:1px solid var(--bs-card-border-color)}.card .card-header{display:flex;justify-content:space-between;align-items:stretch;flex-wrap:wrap;min-height:70px;padding:0 2.25rem;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:1px solid var(--bs-card-border-color)}.card .card-header .card-title{display:flex;align-items:center;margin:.5rem;margin-left:0}.card .card-header .card-title.flex-column{align-items:flex-start;justify-content:center}.card .card-header .card-title .card-icon{margin-right:.75rem;line-height:0}.card .card-header .card-title .card-icon i{font-size:1.25rem;color:var(--bs-gray-600);line-height:0}.card .card-header .card-title .card-icon i:after,.card .card-header .card-title .card-icon i:before{line-height:0}.card .card-header .card-title .card-icon .svg-icon{color:var(--bs-gray-600)}.card .card-header .card-title .card-icon .svg-icon svg{height:24px;width:24px}.card .card-header .card-title,.card .card-header .card-title .card-label{font-weight:500;font-size:1.275rem;color:var(--bs-text-gray-900)}.card .card-header .card-title .card-label{margin:0 .75rem 0 0;flex-wrap:wrap}.card .card-header .card-title .small,.card .card-header .card-title small{color:var(--bs-text-muted);font-size:1rem}.card .card-header .card-title .h1,.card .card-header .card-title .h2,.card .card-header .card-title .h3,.card .card-header .card-title .h4,.card .card-header .card-title .h5,.card .card-header .card-title .h6,.card .card-header .card-title h1,.card .card-header .card-title h2,.card .card-header .card-title h3,.card .card-header .card-title h4,.card .card-header .card-title h5,.card .card-header .card-title h6{margin-bottom:0}.card .card-header .card-toolbar{display:flex;align-items:center;margin:.5rem 0;flex-wrap:wrap}.card .card-body{padding:2rem 2.25rem;color:var(--bs-card-color)}.card .card-footer{padding:2rem 2.25rem;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:1px solid var(--bs-card-border-color)}.card .card-scroll{position:relative;overflow:auto}.card.card-px-0 .card-body,.card.card-px-0 .card-footer,.card.card-px-0 .card-header{padding-left:0;padding-right:0}.card.card-py-0 .card-body,.card.card-py-0 .card-footer,.card.card-py-0 .card-header{padding-top:0;padding-bottom:0}.card.card-p-0 .card-body,.card.card-p-0 .card-footer,.card.card-p-0 .card-header{padding:0}.card.card-dashed{box-shadow:none;border:1px dashed var(--bs-border-dashed-color)}.card.card-dashed>.card-header{border-bottom:1px dashed var(--bs-border-dashed-color)}.card.card-dashed>.card-footer{border-top:1px dashed var(--bs-border-dashed-color)}.card.card-bordered{box-shadow:none;border:1px solid #f1f1f4}.card.card-flush>.card-header{border-bottom:0!important}.card.card-flush>.card-footer{border-top:0!important}.card.card-shadow{box-shadow:var(--bs-card-box-shadow);border:0}.card.card-reset{border:0!important;box-shadow:none!important;background-color:transparent!important}.card.card-reset>.card-header{border-bottom:0!important}.card.card-reset>.card-footer{border-top:0!important}.card.card-borderless{border:0!important}.card.card-borderless>.card-header{border-bottom:0!important}.card.card-borderless>.card-footer{border-top:0!important}.card.card-border-0{border:0!important}.card.card-stretch{height:calc(100% - var(--bs-gutter-y))}.card.card-stretch-75{height:calc(75% - var(--bs-gutter-y))}.card.card-stretch-50{height:calc(50% - var(--bs-gutter-y))}.card.card-stretch-33{height:calc(33.333% - var(--bs-gutter-y))}.card.card-stretch-25{height:calc(25% - var(--bs-gutter-y))}.card .card-header-stretch{padding-top:0!important;padding-bottom:0!important;align-items:stretch}.card .card-header-stretch .card-toolbar{margin:0;align-items:stretch}@media (min-width:576px){.card.card-sm-stretch{height:calc(100% - var(--bs-gutter-y))}.card.card-sm-stretch-75{height:calc(75% - var(--bs-gutter-y))}.card.card-sm-stretch-50{height:calc(50% - var(--bs-gutter-y))}.card.card-sm-stretch-33{height:calc(33.333% - var(--bs-gutter-y))}.card.card-sm-stretch-25{height:calc(25% - var(--bs-gutter-y))}.card .card-header-sm-stretch{padding-top:0!important;padding-bottom:0!important;align-items:stretch}.card .card-header-sm-stretch .card-toolbar{margin:0;align-items:stretch}}@media (min-width:768px){.card.card-md-stretch{height:calc(100% - var(--bs-gutter-y))}.card.card-md-stretch-75{height:calc(75% - var(--bs-gutter-y))}.card.card-md-stretch-50{height:calc(50% - var(--bs-gutter-y))}.card.card-md-stretch-33{height:calc(33.333% - var(--bs-gutter-y))}.card.card-md-stretch-25{height:calc(25% - var(--bs-gutter-y))}.card .card-header-md-stretch{padding-top:0!important;padding-bottom:0!important;align-items:stretch}.card .card-header-md-stretch .card-toolbar{margin:0;align-items:stretch}}@media (min-width:992px){.card.card-lg-stretch{height:calc(100% - var(--bs-gutter-y))}.card.card-lg-stretch-75{height:calc(75% - var(--bs-gutter-y))}.card.card-lg-stretch-50{height:calc(50% - var(--bs-gutter-y))}.card.card-lg-stretch-33{height:calc(33.333% - var(--bs-gutter-y))}.card.card-lg-stretch-25{height:calc(25% - var(--bs-gutter-y))}.card .card-header-lg-stretch{padding-top:0!important;padding-bottom:0!important;align-items:stretch}.card .card-header-lg-stretch .card-toolbar{margin:0;align-items:stretch}}@media (min-width:1200px){.card.card-xl-stretch{height:calc(100% - var(--bs-gutter-y))}.card.card-xl-stretch-75{height:calc(75% - var(--bs-gutter-y))}.card.card-xl-stretch-50{height:calc(50% - var(--bs-gutter-y))}.card.card-xl-stretch-33{height:calc(33.333% - var(--bs-gutter-y))}.card.card-xl-stretch-25{height:calc(25% - var(--bs-gutter-y))}.card .card-header-xl-stretch{padding-top:0!important;padding-bottom:0!important;align-items:stretch}.card .card-header-xl-stretch .card-toolbar{margin:0;align-items:stretch}}@media (min-width:1400px){.card.card-xxl-stretch{height:calc(100% - var(--bs-gutter-y))}.card.card-xxl-stretch-75{height:calc(75% - var(--bs-gutter-y))}.card.card-xxl-stretch-50{height:calc(50% - var(--bs-gutter-y))}.card.card-xxl-stretch-33{height:calc(33.333% - var(--bs-gutter-y))}.card.card-xxl-stretch-25{height:calc(25% - var(--bs-gutter-y))}.card .card-header-xxl-stretch{padding-top:0!important;padding-bottom:0!important;align-items:stretch}.card .card-header-xxl-stretch .card-toolbar{margin:0;align-items:stretch}}.card-p{padding:2rem 2.25rem!important}.card-border{border:1px solid var(--bs-root-card-border-color)!important}.card-px{padding-left:2.25rem!important;padding-right:2.25rem!important}.card-shadow{box-shadow:var(--bs-card-box-shadow)}.card-py{padding-top:2rem!important;padding-bottom:2rem!important}.card-rounded{border-radius:.625rem}.card-rounded-start{border-top-left-radius:.625rem;border-bottom-left-radius:.625rem}.card-rounded-end{border-top-right-radius:.625rem;border-bottom-right-radius:.625rem}.card-rounded-top{border-top-left-radius:.625rem;border-top-right-radius:.625rem}.card-rounded-bottom{border-bottom-left-radius:.625rem;border-bottom-right-radius:.625rem}@media (max-width:767.98px){.card>.card-header:not(.flex-nowrap){padding-top:.5rem;padding-bottom:.5rem}}[data-bs-theme=dark] .card{--bs-card-box-shadow:none}.breadcrumb{display:flex;align-items:center;background-color:transparent;padding:0;margin:0}.breadcrumb .breadcrumb-item{display:flex;align-items:center;padding-left:.5rem}.breadcrumb .breadcrumb-item:last-child{padding-right:0}.breadcrumb .breadcrumb-item:after{padding-left:.5rem;content:"/"}.breadcrumb .breadcrumb-item:before{display:none}.breadcrumb .breadcrumb-item:first-child{padding-left:0}.breadcrumb .breadcrumb-item:last-child:after{display:none}.breadcrumb-line .breadcrumb-item:after{content:"-"}.breadcrumb-dot .breadcrumb-item:after{content:"•"}.breadcrumb-separatorless .breadcrumb-item:after{display:none}.btn{--bs-btn-color:var(--bs-body-color);outline:0!important}.btn:not(.btn-shadow):not(.shadow):not(.shadow-sm):not(.shadow-lg):not(.shadow-xs){box-shadow:none}.btn:not(.btn-outline):not(.btn-dashed):not(.btn-bordered):not(.border-hover):not(.border-active):not(.btn-flush):not(.btn-icon):not(.btn-hover-outline){border:0;padding:calc(.775rem + 1px) calc(1.5rem + 1px)}.btn-group-lg>.btn:not(.btn-outline):not(.btn-dashed):not(.btn-bordered):not(.border-hover):not(.border-active):not(.btn-flush):not(.btn-icon):not(.btn-hover-outline),.btn:not(.btn-outline):not(.btn-dashed):not(.btn-bordered):not(.border-hover):not(.border-active):not(.btn-flush):not(.btn-icon):not(.btn-hover-outline).btn-lg{padding:calc(.825rem + 1px) calc(1.75rem + 1px)}.btn-group-sm>.btn:not(.btn-outline):not(.btn-dashed):not(.btn-bordered):not(.border-hover):not(.border-active):not(.btn-flush):not(.btn-icon):not(.btn-hover-outline),.btn:not(.btn-outline):not(.btn-dashed):not(.btn-bordered):not(.border-hover):not(.border-active):not(.btn-flush):not(.btn-icon):not(.btn-hover-outline).btn-sm{padding:calc(.55rem + 1px) calc(1rem + 1px)}.btn.btn-link{border:0;border-radius:0;padding-left:0!important;padding-right:0!important;text-decoration:none;font-weight:500}.btn.btn-outline:not(.btn-outline-dashed){border:1px solid var(--bs-gray-300)}.btn.btn-outline-dashed{border:1px dashed var(--bs-gray-300)}.btn.btn-flush{appearance:none;box-shadow:none;border-radius:0;border:none;cursor:pointer;background-color:transparent;outline:0!important;margin:0;padding:0}.btn.btn-flex{display:inline-flex;align-items:center}.btn.btn-trim-start{justify-content:flex-start!important;padding-left:0!important}.btn.btn-trim-end{justify-content:flex-end!important;padding-right:0!important}.btn-reset{background-color:transparent;border:0;box-shadow:none;user-select:none;outline:0}.btn>i{display:inline-flex;font-size:1rem;padding-right:.35rem;vertical-align:middle}.btn.btn-icon{display:inline-flex;align-items:center;justify-content:center;padding:0;height:calc(1.5em + 1.55rem + 2px);width:calc(1.5em + 1.55rem + 2px);line-height:1}.btn.btn-icon i{padding-right:0}.btn.btn-icon:not(.btn-outline):not(.btn-dashed):not(.border-hover):not(.border-active):not(.btn-flush){border:0}.btn-group-sm>.btn.btn-icon,.btn.btn-icon.btn-sm{height:calc(1.5em + 1.1rem + 2px);width:calc(1.5em + 1.1rem + 2px)}.btn-group-lg>.btn.btn-icon,.btn.btn-icon.btn-lg{height:calc(1.5em + 1.65rem + 2px);width:calc(1.5em + 1.65rem + 2px)}.btn.btn-icon.btn-circle{border-radius:50%}.btn.btn-outline.btn-outline-dashed{border-width:1px;border-style:dashed}.btn-check:active+.btn.btn-outline.btn-outline-dashed,.btn-check:checked+.btn.btn-outline.btn-outline-dashed,.btn.btn-outline.btn-outline-dashed.active,.btn.btn-outline.btn-outline-dashed.show,.btn.btn-outline.btn-outline-dashed:active:not(.btn-active),.btn.btn-outline.btn-outline-dashed:focus:not(.btn-active),.btn.btn-outline.btn-outline-dashed:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-dashed{border-color:var(--bs-primary)}.btn.btn-hover-outline{border-width:1px;border-style:solid}.btn-check:active+.btn.btn-hover-outline,.btn-check:checked+.btn.btn-hover-outline,.btn.btn-hover-outline.active,.btn.btn-hover-outline.show,.btn.btn-hover-outline:active:not(.btn-active),.btn.btn-hover-outline:focus:not(.btn-active),.btn.btn-hover-outline:hover:not(.btn-active),.show>.btn.btn-hover-outline{border-color:var(--bs-gray-300)}.btn.btn-light{color:var(--bs-light-inverse);border-color:var(--bs-light);background-color:var(--bs-light)}.btn.btn-light .svg-icon,.btn.btn-light i{color:var(--bs-light-inverse)}.btn.btn-light.dropdown-toggle:after{color:var(--bs-light-inverse)}.btn-check:active+.btn.btn-light,.btn-check:checked+.btn.btn-light,.btn.btn-light.active,.btn.btn-light.show,.btn.btn-light:active:not(.btn-active),.btn.btn-light:focus:not(.btn-active),.btn.btn-light:hover:not(.btn-active),.show>.btn.btn-light{color:var(--bs-light-inverse);border-color:var(--bs-light-active);background-color:var(--bs-light-active)!important}.btn-check:active+.btn.btn-light .svg-icon,.btn-check:active+.btn.btn-light i,.btn-check:checked+.btn.btn-light .svg-icon,.btn-check:checked+.btn.btn-light i,.btn.btn-light.active .svg-icon,.btn.btn-light.active i,.btn.btn-light.show .svg-icon,.btn.btn-light.show i,.btn.btn-light:active:not(.btn-active) .svg-icon,.btn.btn-light:active:not(.btn-active) i,.btn.btn-light:focus:not(.btn-active) .svg-icon,.btn.btn-light:focus:not(.btn-active) i,.btn.btn-light:hover:not(.btn-active) .svg-icon,.btn.btn-light:hover:not(.btn-active) i,.show>.btn.btn-light .svg-icon,.show>.btn.btn-light i{color:var(--bs-light-inverse)}.btn-check:active+.btn.btn-light.dropdown-toggle:after,.btn-check:checked+.btn.btn-light.dropdown-toggle:after,.btn.btn-light.active.dropdown-toggle:after,.btn.btn-light.show.dropdown-toggle:after,.btn.btn-light:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light.dropdown-toggle:after{color:var(--bs-light-inverse)}.btn.btn-light-light{color:var(--bs-light);border-color:var(--bs-light-light);background-color:var(--bs-light-light)}.btn.btn-light-light .svg-icon,.btn.btn-light-light i{color:var(--bs-light)}.btn.btn-light-light.dropdown-toggle:after{color:var(--bs-light)}.btn-check:active+.btn.btn-light-light,.btn-check:checked+.btn.btn-light-light,.btn.btn-light-light.active,.btn.btn-light-light.show,.btn.btn-light-light:active:not(.btn-active),.btn.btn-light-light:focus:not(.btn-active),.btn.btn-light-light:hover:not(.btn-active),.show>.btn.btn-light-light{color:var(--bs-light-inverse);border-color:var(--bs-light);background-color:var(--bs-light)!important}.btn-check:active+.btn.btn-light-light .svg-icon,.btn-check:active+.btn.btn-light-light i,.btn-check:checked+.btn.btn-light-light .svg-icon,.btn-check:checked+.btn.btn-light-light i,.btn.btn-light-light.active .svg-icon,.btn.btn-light-light.active i,.btn.btn-light-light.show .svg-icon,.btn.btn-light-light.show i,.btn.btn-light-light:active:not(.btn-active) .svg-icon,.btn.btn-light-light:active:not(.btn-active) i,.btn.btn-light-light:focus:not(.btn-active) .svg-icon,.btn.btn-light-light:focus:not(.btn-active) i,.btn.btn-light-light:hover:not(.btn-active) .svg-icon,.btn.btn-light-light:hover:not(.btn-active) i,.show>.btn.btn-light-light .svg-icon,.show>.btn.btn-light-light i{color:var(--bs-light-inverse)}.btn-check:active+.btn.btn-light-light.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-light.dropdown-toggle:after,.btn.btn-light-light.active.dropdown-toggle:after,.btn.btn-light-light.show.dropdown-toggle:after,.btn.btn-light-light:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-light:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-light:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-light.dropdown-toggle:after{color:var(--bs-light-inverse)}.btn.btn-bg-light{border-color:var(--bs-light);background-color:var(--bs-light)}.btn-check:active+.btn.btn-active-light,.btn-check:checked+.btn.btn-active-light,.btn.btn-active-light.active,.btn.btn-active-light.show,.btn.btn-active-light:active:not(.btn-active),.btn.btn-active-light:focus:not(.btn-active),.btn.btn-active-light:hover:not(.btn-active),.show>.btn.btn-active-light{color:var(--bs-light-inverse);border-color:var(--bs-light);background-color:var(--bs-light)!important}.btn-check:active+.btn.btn-active-light .svg-icon,.btn-check:active+.btn.btn-active-light i,.btn-check:checked+.btn.btn-active-light .svg-icon,.btn-check:checked+.btn.btn-active-light i,.btn.btn-active-light.active .svg-icon,.btn.btn-active-light.active i,.btn.btn-active-light.show .svg-icon,.btn.btn-active-light.show i,.btn.btn-active-light:active:not(.btn-active) .svg-icon,.btn.btn-active-light:active:not(.btn-active) i,.btn.btn-active-light:focus:not(.btn-active) .svg-icon,.btn.btn-active-light:focus:not(.btn-active) i,.btn.btn-active-light:hover:not(.btn-active) .svg-icon,.btn.btn-active-light:hover:not(.btn-active) i,.show>.btn.btn-active-light .svg-icon,.show>.btn.btn-active-light i{color:var(--bs-light-inverse)}.btn-check:active+.btn.btn-active-light.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light.dropdown-toggle:after,.btn.btn-active-light.active.dropdown-toggle:after,.btn.btn-active-light.show.dropdown-toggle:after,.btn.btn-active-light:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light.dropdown-toggle:after{color:var(--bs-light-inverse)}.btn-check:active+.btn.btn-active-light-light,.btn-check:checked+.btn.btn-active-light-light,.btn.btn-active-light-light.active,.btn.btn-active-light-light.show,.btn.btn-active-light-light:active:not(.btn-active),.btn.btn-active-light-light:focus:not(.btn-active),.btn.btn-active-light-light:hover:not(.btn-active),.show>.btn.btn-active-light-light{color:var(--bs-light);border-color:var(--bs-light-light);background-color:var(--bs-light-light)!important}.btn-check:active+.btn.btn-active-light-light .svg-icon,.btn-check:active+.btn.btn-active-light-light i,.btn-check:checked+.btn.btn-active-light-light .svg-icon,.btn-check:checked+.btn.btn-active-light-light i,.btn.btn-active-light-light.active .svg-icon,.btn.btn-active-light-light.active i,.btn.btn-active-light-light.show .svg-icon,.btn.btn-active-light-light.show i,.btn.btn-active-light-light:active:not(.btn-active) .svg-icon,.btn.btn-active-light-light:active:not(.btn-active) i,.btn.btn-active-light-light:focus:not(.btn-active) .svg-icon,.btn.btn-active-light-light:focus:not(.btn-active) i,.btn.btn-active-light-light:hover:not(.btn-active) .svg-icon,.btn.btn-active-light-light:hover:not(.btn-active) i,.show>.btn.btn-active-light-light .svg-icon,.show>.btn.btn-active-light-light i{color:var(--bs-light)}.btn-check:active+.btn.btn-active-light-light.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light-light.dropdown-toggle:after,.btn.btn-active-light-light.active.dropdown-toggle:after,.btn.btn-active-light-light.show.dropdown-toggle:after,.btn.btn-active-light-light:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-light:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-light:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light-light.dropdown-toggle:after{color:var(--bs-light)}.btn.btn-outline.btn-outline-light{color:var(--bs-light);border-color:var(--bs-light);background-color:transparent}.btn.btn-outline.btn-outline-light .svg-icon,.btn.btn-outline.btn-outline-light i{color:var(--bs-light)}.btn.btn-outline.btn-outline-light.dropdown-toggle:after{color:var(--bs-light)}.btn-check:active+.btn.btn-outline.btn-outline-light,.btn-check:checked+.btn.btn-outline.btn-outline-light,.btn.btn-outline.btn-outline-light.active,.btn.btn-outline.btn-outline-light.show,.btn.btn-outline.btn-outline-light:active:not(.btn-active),.btn.btn-outline.btn-outline-light:focus:not(.btn-active),.btn.btn-outline.btn-outline-light:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-light{color:var(--bs-light-active);border-color:var(--bs-light);background-color:var(--bs-light-light)!important}.btn-check:active+.btn.btn-outline.btn-outline-light .svg-icon,.btn-check:active+.btn.btn-outline.btn-outline-light i,.btn-check:checked+.btn.btn-outline.btn-outline-light .svg-icon,.btn-check:checked+.btn.btn-outline.btn-outline-light i,.btn.btn-outline.btn-outline-light.active .svg-icon,.btn.btn-outline.btn-outline-light.active i,.btn.btn-outline.btn-outline-light.show .svg-icon,.btn.btn-outline.btn-outline-light.show i,.btn.btn-outline.btn-outline-light:active:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-light:active:not(.btn-active) i,.btn.btn-outline.btn-outline-light:focus:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-light:focus:not(.btn-active) i,.btn.btn-outline.btn-outline-light:hover:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-light:hover:not(.btn-active) i,.show>.btn.btn-outline.btn-outline-light .svg-icon,.show>.btn.btn-outline.btn-outline-light i{color:var(--bs-light-active)}.btn-check:active+.btn.btn-outline.btn-outline-light.dropdown-toggle:after,.btn-check:checked+.btn.btn-outline.btn-outline-light.dropdown-toggle:after,.btn.btn-outline.btn-outline-light.active.dropdown-toggle:after,.btn.btn-outline.btn-outline-light.show.dropdown-toggle:after,.btn.btn-outline.btn-outline-light:active:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-light:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-light:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-outline.btn-outline-light.dropdown-toggle:after{color:var(--bs-light-active)}.btn.btn-primary{color:var(--bs-primary-inverse);border-color:var(--bs-primary);background-color:var(--bs-primary)}.btn.btn-primary .svg-icon,.btn.btn-primary i{color:var(--bs-primary-inverse)}.btn.btn-primary.dropdown-toggle:after{color:var(--bs-primary-inverse)}.btn-check:active+.btn.btn-primary,.btn-check:checked+.btn.btn-primary,.btn.btn-primary.active,.btn.btn-primary.show,.btn.btn-primary:active:not(.btn-active),.btn.btn-primary:focus:not(.btn-active),.btn.btn-primary:hover:not(.btn-active),.show>.btn.btn-primary{color:var(--bs-primary-inverse);border-color:var(--bs-primary-active);background-color:var(--bs-primary-active)!important}.btn-check:active+.btn.btn-primary .svg-icon,.btn-check:active+.btn.btn-primary i,.btn-check:checked+.btn.btn-primary .svg-icon,.btn-check:checked+.btn.btn-primary i,.btn.btn-primary.active .svg-icon,.btn.btn-primary.active i,.btn.btn-primary.show .svg-icon,.btn.btn-primary.show i,.btn.btn-primary:active:not(.btn-active) .svg-icon,.btn.btn-primary:active:not(.btn-active) i,.btn.btn-primary:focus:not(.btn-active) .svg-icon,.btn.btn-primary:focus:not(.btn-active) i,.btn.btn-primary:hover:not(.btn-active) .svg-icon,.btn.btn-primary:hover:not(.btn-active) i,.show>.btn.btn-primary .svg-icon,.show>.btn.btn-primary i{color:var(--bs-primary-inverse)}.btn-check:active+.btn.btn-primary.dropdown-toggle:after,.btn-check:checked+.btn.btn-primary.dropdown-toggle:after,.btn.btn-primary.active.dropdown-toggle:after,.btn.btn-primary.show.dropdown-toggle:after,.btn.btn-primary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-primary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-primary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-primary.dropdown-toggle:after{color:var(--bs-primary-inverse)}.btn.btn-light-primary{color:var(--bs-primary);border-color:var(--bs-primary-light);background-color:var(--bs-primary-light)}.btn.btn-light-primary .svg-icon,.btn.btn-light-primary i{color:var(--bs-primary)}.btn.btn-light-primary.dropdown-toggle:after{color:var(--bs-primary)}.btn-check:active+.btn.btn-light-primary,.btn-check:checked+.btn.btn-light-primary,.btn.btn-light-primary.active,.btn.btn-light-primary.show,.btn.btn-light-primary:active:not(.btn-active),.btn.btn-light-primary:focus:not(.btn-active),.btn.btn-light-primary:hover:not(.btn-active),.show>.btn.btn-light-primary{color:var(--bs-primary-inverse);border-color:var(--bs-primary);background-color:var(--bs-primary)!important}.btn-check:active+.btn.btn-light-primary .svg-icon,.btn-check:active+.btn.btn-light-primary i,.btn-check:checked+.btn.btn-light-primary .svg-icon,.btn-check:checked+.btn.btn-light-primary i,.btn.btn-light-primary.active .svg-icon,.btn.btn-light-primary.active i,.btn.btn-light-primary.show .svg-icon,.btn.btn-light-primary.show i,.btn.btn-light-primary:active:not(.btn-active) .svg-icon,.btn.btn-light-primary:active:not(.btn-active) i,.btn.btn-light-primary:focus:not(.btn-active) .svg-icon,.btn.btn-light-primary:focus:not(.btn-active) i,.btn.btn-light-primary:hover:not(.btn-active) .svg-icon,.btn.btn-light-primary:hover:not(.btn-active) i,.show>.btn.btn-light-primary .svg-icon,.show>.btn.btn-light-primary i{color:var(--bs-primary-inverse)}.btn-check:active+.btn.btn-light-primary.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-primary.dropdown-toggle:after,.btn.btn-light-primary.active.dropdown-toggle:after,.btn.btn-light-primary.show.dropdown-toggle:after,.btn.btn-light-primary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-primary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-primary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-primary.dropdown-toggle:after{color:var(--bs-primary-inverse)}.btn.btn-bg-primary{border-color:var(--bs-primary);background-color:var(--bs-primary)}.btn-check:active+.btn.btn-active-primary,.btn-check:checked+.btn.btn-active-primary,.btn.btn-active-primary.active,.btn.btn-active-primary.show,.btn.btn-active-primary:active:not(.btn-active),.btn.btn-active-primary:focus:not(.btn-active),.btn.btn-active-primary:hover:not(.btn-active),.show>.btn.btn-active-primary{color:var(--bs-primary-inverse);border-color:var(--bs-primary);background-color:var(--bs-primary)!important}.btn-check:active+.btn.btn-active-primary .svg-icon,.btn-check:active+.btn.btn-active-primary i,.btn-check:checked+.btn.btn-active-primary .svg-icon,.btn-check:checked+.btn.btn-active-primary i,.btn.btn-active-primary.active .svg-icon,.btn.btn-active-primary.active i,.btn.btn-active-primary.show .svg-icon,.btn.btn-active-primary.show i,.btn.btn-active-primary:active:not(.btn-active) .svg-icon,.btn.btn-active-primary:active:not(.btn-active) i,.btn.btn-active-primary:focus:not(.btn-active) .svg-icon,.btn.btn-active-primary:focus:not(.btn-active) i,.btn.btn-active-primary:hover:not(.btn-active) .svg-icon,.btn.btn-active-primary:hover:not(.btn-active) i,.show>.btn.btn-active-primary .svg-icon,.show>.btn.btn-active-primary i{color:var(--bs-primary-inverse)}.btn-check:active+.btn.btn-active-primary.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-primary.dropdown-toggle:after,.btn.btn-active-primary.active.dropdown-toggle:after,.btn.btn-active-primary.show.dropdown-toggle:after,.btn.btn-active-primary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-primary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-primary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-primary.dropdown-toggle:after{color:var(--bs-primary-inverse)}.btn-check:active+.btn.btn-active-light-primary,.btn-check:checked+.btn.btn-active-light-primary,.btn.btn-active-light-primary.active,.btn.btn-active-light-primary.show,.btn.btn-active-light-primary:active:not(.btn-active),.btn.btn-active-light-primary:focus:not(.btn-active),.btn.btn-active-light-primary:hover:not(.btn-active),.show>.btn.btn-active-light-primary{color:var(--bs-primary);border-color:var(--bs-primary-light);background-color:var(--bs-primary-light)!important}.btn-check:active+.btn.btn-active-light-primary .svg-icon,.btn-check:active+.btn.btn-active-light-primary i,.btn-check:checked+.btn.btn-active-light-primary .svg-icon,.btn-check:checked+.btn.btn-active-light-primary i,.btn.btn-active-light-primary.active .svg-icon,.btn.btn-active-light-primary.active i,.btn.btn-active-light-primary.show .svg-icon,.btn.btn-active-light-primary.show i,.btn.btn-active-light-primary:active:not(.btn-active) .svg-icon,.btn.btn-active-light-primary:active:not(.btn-active) i,.btn.btn-active-light-primary:focus:not(.btn-active) .svg-icon,.btn.btn-active-light-primary:focus:not(.btn-active) i,.btn.btn-active-light-primary:hover:not(.btn-active) .svg-icon,.btn.btn-active-light-primary:hover:not(.btn-active) i,.show>.btn.btn-active-light-primary .svg-icon,.show>.btn.btn-active-light-primary i{color:var(--bs-primary)}.btn-check:active+.btn.btn-active-light-primary.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light-primary.dropdown-toggle:after,.btn.btn-active-light-primary.active.dropdown-toggle:after,.btn.btn-active-light-primary.show.dropdown-toggle:after,.btn.btn-active-light-primary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-primary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-primary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light-primary.dropdown-toggle:after{color:var(--bs-primary)}.btn.btn-outline.btn-outline-primary{color:var(--bs-primary);border-color:var(--bs-primary);background-color:transparent}.btn.btn-outline.btn-outline-primary .svg-icon,.btn.btn-outline.btn-outline-primary i{color:var(--bs-primary)}.btn.btn-outline.btn-outline-primary.dropdown-toggle:after{color:var(--bs-primary)}.btn-check:active+.btn.btn-outline.btn-outline-primary,.btn-check:checked+.btn.btn-outline.btn-outline-primary,.btn.btn-outline.btn-outline-primary.active,.btn.btn-outline.btn-outline-primary.show,.btn.btn-outline.btn-outline-primary:active:not(.btn-active),.btn.btn-outline.btn-outline-primary:focus:not(.btn-active),.btn.btn-outline.btn-outline-primary:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-primary{color:var(--bs-primary-active);border-color:var(--bs-primary);background-color:var(--bs-primary-light)!important}.btn-check:active+.btn.btn-outline.btn-outline-primary .svg-icon,.btn-check:active+.btn.btn-outline.btn-outline-primary i,.btn-check:checked+.btn.btn-outline.btn-outline-primary .svg-icon,.btn-check:checked+.btn.btn-outline.btn-outline-primary i,.btn.btn-outline.btn-outline-primary.active .svg-icon,.btn.btn-outline.btn-outline-primary.active i,.btn.btn-outline.btn-outline-primary.show .svg-icon,.btn.btn-outline.btn-outline-primary.show i,.btn.btn-outline.btn-outline-primary:active:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-primary:active:not(.btn-active) i,.btn.btn-outline.btn-outline-primary:focus:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-primary:focus:not(.btn-active) i,.btn.btn-outline.btn-outline-primary:hover:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-primary:hover:not(.btn-active) i,.show>.btn.btn-outline.btn-outline-primary .svg-icon,.show>.btn.btn-outline.btn-outline-primary i{color:var(--bs-primary-active)}.btn-check:active+.btn.btn-outline.btn-outline-primary.dropdown-toggle:after,.btn-check:checked+.btn.btn-outline.btn-outline-primary.dropdown-toggle:after,.btn.btn-outline.btn-outline-primary.active.dropdown-toggle:after,.btn.btn-outline.btn-outline-primary.show.dropdown-toggle:after,.btn.btn-outline.btn-outline-primary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-primary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-primary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-outline.btn-outline-primary.dropdown-toggle:after{color:var(--bs-primary-active)}.btn.btn-secondary{color:var(--bs-secondary-inverse);border-color:var(--bs-secondary);background-color:var(--bs-secondary)}.btn.btn-secondary .svg-icon,.btn.btn-secondary i{color:var(--bs-secondary-inverse)}.btn.btn-secondary.dropdown-toggle:after{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-secondary,.btn-check:checked+.btn.btn-secondary,.btn.btn-secondary.active,.btn.btn-secondary.show,.btn.btn-secondary:active:not(.btn-active),.btn.btn-secondary:focus:not(.btn-active),.btn.btn-secondary:hover:not(.btn-active),.show>.btn.btn-secondary{color:var(--bs-secondary-inverse);border-color:var(--bs-secondary-active);background-color:var(--bs-secondary-active)!important}.btn-check:active+.btn.btn-secondary .svg-icon,.btn-check:active+.btn.btn-secondary i,.btn-check:checked+.btn.btn-secondary .svg-icon,.btn-check:checked+.btn.btn-secondary i,.btn.btn-secondary.active .svg-icon,.btn.btn-secondary.active i,.btn.btn-secondary.show .svg-icon,.btn.btn-secondary.show i,.btn.btn-secondary:active:not(.btn-active) .svg-icon,.btn.btn-secondary:active:not(.btn-active) i,.btn.btn-secondary:focus:not(.btn-active) .svg-icon,.btn.btn-secondary:focus:not(.btn-active) i,.btn.btn-secondary:hover:not(.btn-active) .svg-icon,.btn.btn-secondary:hover:not(.btn-active) i,.show>.btn.btn-secondary .svg-icon,.show>.btn.btn-secondary i{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-secondary.dropdown-toggle:after,.btn-check:checked+.btn.btn-secondary.dropdown-toggle:after,.btn.btn-secondary.active.dropdown-toggle:after,.btn.btn-secondary.show.dropdown-toggle:after,.btn.btn-secondary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-secondary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-secondary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-secondary.dropdown-toggle:after{color:var(--bs-secondary-inverse)}.btn.btn-light-secondary{color:var(--bs-secondary-inverse);border-color:var(--bs-secondary-light);background-color:var(--bs-secondary-light)}.btn.btn-light-secondary .svg-icon,.btn.btn-light-secondary i{color:var(--bs-secondary-inverse)}.btn.btn-light-secondary.dropdown-toggle:after{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-light-secondary,.btn-check:checked+.btn.btn-light-secondary,.btn.btn-light-secondary.active,.btn.btn-light-secondary.show,.btn.btn-light-secondary:active:not(.btn-active),.btn.btn-light-secondary:focus:not(.btn-active),.btn.btn-light-secondary:hover:not(.btn-active),.show>.btn.btn-light-secondary{color:var(--bs-secondary-inverse);border-color:var(--bs-secondary);background-color:var(--bs-secondary)!important}.btn-check:active+.btn.btn-light-secondary .svg-icon,.btn-check:active+.btn.btn-light-secondary i,.btn-check:checked+.btn.btn-light-secondary .svg-icon,.btn-check:checked+.btn.btn-light-secondary i,.btn.btn-light-secondary.active .svg-icon,.btn.btn-light-secondary.active i,.btn.btn-light-secondary.show .svg-icon,.btn.btn-light-secondary.show i,.btn.btn-light-secondary:active:not(.btn-active) .svg-icon,.btn.btn-light-secondary:active:not(.btn-active) i,.btn.btn-light-secondary:focus:not(.btn-active) .svg-icon,.btn.btn-light-secondary:focus:not(.btn-active) i,.btn.btn-light-secondary:hover:not(.btn-active) .svg-icon,.btn.btn-light-secondary:hover:not(.btn-active) i,.show>.btn.btn-light-secondary .svg-icon,.show>.btn.btn-light-secondary i{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-light-secondary.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-secondary.dropdown-toggle:after,.btn.btn-light-secondary.active.dropdown-toggle:after,.btn.btn-light-secondary.show.dropdown-toggle:after,.btn.btn-light-secondary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-secondary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-secondary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-secondary.dropdown-toggle:after{color:var(--bs-secondary-inverse)}.btn.btn-bg-secondary{border-color:var(--bs-secondary);background-color:var(--bs-secondary)}.btn-check:active+.btn.btn-active-secondary,.btn-check:checked+.btn.btn-active-secondary,.btn.btn-active-secondary.active,.btn.btn-active-secondary.show,.btn.btn-active-secondary:active:not(.btn-active),.btn.btn-active-secondary:focus:not(.btn-active),.btn.btn-active-secondary:hover:not(.btn-active),.show>.btn.btn-active-secondary{color:var(--bs-secondary-inverse);border-color:var(--bs-secondary);background-color:var(--bs-secondary)!important}.btn-check:active+.btn.btn-active-secondary .svg-icon,.btn-check:active+.btn.btn-active-secondary i,.btn-check:checked+.btn.btn-active-secondary .svg-icon,.btn-check:checked+.btn.btn-active-secondary i,.btn.btn-active-secondary.active .svg-icon,.btn.btn-active-secondary.active i,.btn.btn-active-secondary.show .svg-icon,.btn.btn-active-secondary.show i,.btn.btn-active-secondary:active:not(.btn-active) .svg-icon,.btn.btn-active-secondary:active:not(.btn-active) i,.btn.btn-active-secondary:focus:not(.btn-active) .svg-icon,.btn.btn-active-secondary:focus:not(.btn-active) i,.btn.btn-active-secondary:hover:not(.btn-active) .svg-icon,.btn.btn-active-secondary:hover:not(.btn-active) i,.show>.btn.btn-active-secondary .svg-icon,.show>.btn.btn-active-secondary i{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-active-secondary.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-secondary.dropdown-toggle:after,.btn.btn-active-secondary.active.dropdown-toggle:after,.btn.btn-active-secondary.show.dropdown-toggle:after,.btn.btn-active-secondary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-secondary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-secondary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-secondary.dropdown-toggle:after{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-active-light-secondary,.btn-check:checked+.btn.btn-active-light-secondary,.btn.btn-active-light-secondary.active,.btn.btn-active-light-secondary.show,.btn.btn-active-light-secondary:active:not(.btn-active),.btn.btn-active-light-secondary:focus:not(.btn-active),.btn.btn-active-light-secondary:hover:not(.btn-active),.show>.btn.btn-active-light-secondary{color:var(--bs-secondary-inverse);border-color:var(--bs-secondary-light);background-color:var(--bs-secondary-light)!important}.btn-check:active+.btn.btn-active-light-secondary .svg-icon,.btn-check:active+.btn.btn-active-light-secondary i,.btn-check:checked+.btn.btn-active-light-secondary .svg-icon,.btn-check:checked+.btn.btn-active-light-secondary i,.btn.btn-active-light-secondary.active .svg-icon,.btn.btn-active-light-secondary.active i,.btn.btn-active-light-secondary.show .svg-icon,.btn.btn-active-light-secondary.show i,.btn.btn-active-light-secondary:active:not(.btn-active) .svg-icon,.btn.btn-active-light-secondary:active:not(.btn-active) i,.btn.btn-active-light-secondary:focus:not(.btn-active) .svg-icon,.btn.btn-active-light-secondary:focus:not(.btn-active) i,.btn.btn-active-light-secondary:hover:not(.btn-active) .svg-icon,.btn.btn-active-light-secondary:hover:not(.btn-active) i,.show>.btn.btn-active-light-secondary .svg-icon,.show>.btn.btn-active-light-secondary i{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-active-light-secondary.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light-secondary.dropdown-toggle:after,.btn.btn-active-light-secondary.active.dropdown-toggle:after,.btn.btn-active-light-secondary.show.dropdown-toggle:after,.btn.btn-active-light-secondary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-secondary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-secondary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light-secondary.dropdown-toggle:after{color:var(--bs-secondary-inverse)}.btn.btn-outline.btn-outline-secondary{color:var(--bs-secondary-inverse);border-color:var(--bs-secondary-inverse);background-color:transparent}.btn.btn-outline.btn-outline-secondary .svg-icon,.btn.btn-outline.btn-outline-secondary i{color:var(--bs-secondary-inverse)}.btn.btn-outline.btn-outline-secondary.dropdown-toggle:after{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-outline.btn-outline-secondary,.btn-check:checked+.btn.btn-outline.btn-outline-secondary,.btn.btn-outline.btn-outline-secondary.active,.btn.btn-outline.btn-outline-secondary.show,.btn.btn-outline.btn-outline-secondary:active:not(.btn-active),.btn.btn-outline.btn-outline-secondary:focus:not(.btn-active),.btn.btn-outline.btn-outline-secondary:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-secondary{color:var(--bs-secondary-inverse);border-color:var(--bs-secondary-inverse);background-color:var(--bs-secondary-light)!important}.btn-check:active+.btn.btn-outline.btn-outline-secondary .svg-icon,.btn-check:active+.btn.btn-outline.btn-outline-secondary i,.btn-check:checked+.btn.btn-outline.btn-outline-secondary .svg-icon,.btn-check:checked+.btn.btn-outline.btn-outline-secondary i,.btn.btn-outline.btn-outline-secondary.active .svg-icon,.btn.btn-outline.btn-outline-secondary.active i,.btn.btn-outline.btn-outline-secondary.show .svg-icon,.btn.btn-outline.btn-outline-secondary.show i,.btn.btn-outline.btn-outline-secondary:active:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-secondary:active:not(.btn-active) i,.btn.btn-outline.btn-outline-secondary:focus:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-secondary:focus:not(.btn-active) i,.btn.btn-outline.btn-outline-secondary:hover:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-secondary:hover:not(.btn-active) i,.show>.btn.btn-outline.btn-outline-secondary .svg-icon,.show>.btn.btn-outline.btn-outline-secondary i{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-outline.btn-outline-secondary.dropdown-toggle:after,.btn-check:checked+.btn.btn-outline.btn-outline-secondary.dropdown-toggle:after,.btn.btn-outline.btn-outline-secondary.active.dropdown-toggle:after,.btn.btn-outline.btn-outline-secondary.show.dropdown-toggle:after,.btn.btn-outline.btn-outline-secondary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-secondary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-secondary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-outline.btn-outline-secondary.dropdown-toggle:after{color:var(--bs-secondary-inverse)}.btn.btn-success{color:var(--bs-success-inverse);border-color:var(--bs-success);background-color:var(--bs-success)}.btn.btn-success .svg-icon,.btn.btn-success i{color:var(--bs-success-inverse)}.btn.btn-success.dropdown-toggle:after{color:var(--bs-success-inverse)}.btn-check:active+.btn.btn-success,.btn-check:checked+.btn.btn-success,.btn.btn-success.active,.btn.btn-success.show,.btn.btn-success:active:not(.btn-active),.btn.btn-success:focus:not(.btn-active),.btn.btn-success:hover:not(.btn-active),.show>.btn.btn-success{color:var(--bs-success-inverse);border-color:var(--bs-success-active);background-color:var(--bs-success-active)!important}.btn-check:active+.btn.btn-success .svg-icon,.btn-check:active+.btn.btn-success i,.btn-check:checked+.btn.btn-success .svg-icon,.btn-check:checked+.btn.btn-success i,.btn.btn-success.active .svg-icon,.btn.btn-success.active i,.btn.btn-success.show .svg-icon,.btn.btn-success.show i,.btn.btn-success:active:not(.btn-active) .svg-icon,.btn.btn-success:active:not(.btn-active) i,.btn.btn-success:focus:not(.btn-active) .svg-icon,.btn.btn-success:focus:not(.btn-active) i,.btn.btn-success:hover:not(.btn-active) .svg-icon,.btn.btn-success:hover:not(.btn-active) i,.show>.btn.btn-success .svg-icon,.show>.btn.btn-success i{color:var(--bs-success-inverse)}.btn-check:active+.btn.btn-success.dropdown-toggle:after,.btn-check:checked+.btn.btn-success.dropdown-toggle:after,.btn.btn-success.active.dropdown-toggle:after,.btn.btn-success.show.dropdown-toggle:after,.btn.btn-success:active:not(.btn-active).dropdown-toggle:after,.btn.btn-success:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-success:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-success.dropdown-toggle:after{color:var(--bs-success-inverse)}.btn.btn-light-success{color:var(--bs-success);border-color:var(--bs-success-light);background-color:var(--bs-success-light)}.btn.btn-light-success .svg-icon,.btn.btn-light-success i{color:var(--bs-success)}.btn.btn-light-success.dropdown-toggle:after{color:var(--bs-success)}.btn-check:active+.btn.btn-light-success,.btn-check:checked+.btn.btn-light-success,.btn.btn-light-success.active,.btn.btn-light-success.show,.btn.btn-light-success:active:not(.btn-active),.btn.btn-light-success:focus:not(.btn-active),.btn.btn-light-success:hover:not(.btn-active),.show>.btn.btn-light-success{color:var(--bs-success-inverse);border-color:var(--bs-success);background-color:var(--bs-success)!important}.btn-check:active+.btn.btn-light-success .svg-icon,.btn-check:active+.btn.btn-light-success i,.btn-check:checked+.btn.btn-light-success .svg-icon,.btn-check:checked+.btn.btn-light-success i,.btn.btn-light-success.active .svg-icon,.btn.btn-light-success.active i,.btn.btn-light-success.show .svg-icon,.btn.btn-light-success.show i,.btn.btn-light-success:active:not(.btn-active) .svg-icon,.btn.btn-light-success:active:not(.btn-active) i,.btn.btn-light-success:focus:not(.btn-active) .svg-icon,.btn.btn-light-success:focus:not(.btn-active) i,.btn.btn-light-success:hover:not(.btn-active) .svg-icon,.btn.btn-light-success:hover:not(.btn-active) i,.show>.btn.btn-light-success .svg-icon,.show>.btn.btn-light-success i{color:var(--bs-success-inverse)}.btn-check:active+.btn.btn-light-success.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-success.dropdown-toggle:after,.btn.btn-light-success.active.dropdown-toggle:after,.btn.btn-light-success.show.dropdown-toggle:after,.btn.btn-light-success:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-success:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-success:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-success.dropdown-toggle:after{color:var(--bs-success-inverse)}.btn.btn-bg-success{border-color:var(--bs-success);background-color:var(--bs-success)}.btn-check:active+.btn.btn-active-success,.btn-check:checked+.btn.btn-active-success,.btn.btn-active-success.active,.btn.btn-active-success.show,.btn.btn-active-success:active:not(.btn-active),.btn.btn-active-success:focus:not(.btn-active),.btn.btn-active-success:hover:not(.btn-active),.show>.btn.btn-active-success{color:var(--bs-success-inverse);border-color:var(--bs-success);background-color:var(--bs-success)!important}.btn-check:active+.btn.btn-active-success .svg-icon,.btn-check:active+.btn.btn-active-success i,.btn-check:checked+.btn.btn-active-success .svg-icon,.btn-check:checked+.btn.btn-active-success i,.btn.btn-active-success.active .svg-icon,.btn.btn-active-success.active i,.btn.btn-active-success.show .svg-icon,.btn.btn-active-success.show i,.btn.btn-active-success:active:not(.btn-active) .svg-icon,.btn.btn-active-success:active:not(.btn-active) i,.btn.btn-active-success:focus:not(.btn-active) .svg-icon,.btn.btn-active-success:focus:not(.btn-active) i,.btn.btn-active-success:hover:not(.btn-active) .svg-icon,.btn.btn-active-success:hover:not(.btn-active) i,.show>.btn.btn-active-success .svg-icon,.show>.btn.btn-active-success i{color:var(--bs-success-inverse)}.btn-check:active+.btn.btn-active-success.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-success.dropdown-toggle:after,.btn.btn-active-success.active.dropdown-toggle:after,.btn.btn-active-success.show.dropdown-toggle:after,.btn.btn-active-success:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-success:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-success:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-success.dropdown-toggle:after{color:var(--bs-success-inverse)}.btn-check:active+.btn.btn-active-light-success,.btn-check:checked+.btn.btn-active-light-success,.btn.btn-active-light-success.active,.btn.btn-active-light-success.show,.btn.btn-active-light-success:active:not(.btn-active),.btn.btn-active-light-success:focus:not(.btn-active),.btn.btn-active-light-success:hover:not(.btn-active),.show>.btn.btn-active-light-success{color:var(--bs-success);border-color:var(--bs-success-light);background-color:var(--bs-success-light)!important}.btn-check:active+.btn.btn-active-light-success .svg-icon,.btn-check:active+.btn.btn-active-light-success i,.btn-check:checked+.btn.btn-active-light-success .svg-icon,.btn-check:checked+.btn.btn-active-light-success i,.btn.btn-active-light-success.active .svg-icon,.btn.btn-active-light-success.active i,.btn.btn-active-light-success.show .svg-icon,.btn.btn-active-light-success.show i,.btn.btn-active-light-success:active:not(.btn-active) .svg-icon,.btn.btn-active-light-success:active:not(.btn-active) i,.btn.btn-active-light-success:focus:not(.btn-active) .svg-icon,.btn.btn-active-light-success:focus:not(.btn-active) i,.btn.btn-active-light-success:hover:not(.btn-active) .svg-icon,.btn.btn-active-light-success:hover:not(.btn-active) i,.show>.btn.btn-active-light-success .svg-icon,.show>.btn.btn-active-light-success i{color:var(--bs-success)}.btn-check:active+.btn.btn-active-light-success.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light-success.dropdown-toggle:after,.btn.btn-active-light-success.active.dropdown-toggle:after,.btn.btn-active-light-success.show.dropdown-toggle:after,.btn.btn-active-light-success:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-success:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-success:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light-success.dropdown-toggle:after{color:var(--bs-success)}.btn.btn-outline.btn-outline-success{color:var(--bs-success);border-color:var(--bs-success);background-color:transparent}.btn.btn-outline.btn-outline-success .svg-icon,.btn.btn-outline.btn-outline-success i{color:var(--bs-success)}.btn.btn-outline.btn-outline-success.dropdown-toggle:after{color:var(--bs-success)}.btn-check:active+.btn.btn-outline.btn-outline-success,.btn-check:checked+.btn.btn-outline.btn-outline-success,.btn.btn-outline.btn-outline-success.active,.btn.btn-outline.btn-outline-success.show,.btn.btn-outline.btn-outline-success:active:not(.btn-active),.btn.btn-outline.btn-outline-success:focus:not(.btn-active),.btn.btn-outline.btn-outline-success:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-success{color:var(--bs-success-active);border-color:var(--bs-success);background-color:var(--bs-success-light)!important}.btn-check:active+.btn.btn-outline.btn-outline-success .svg-icon,.btn-check:active+.btn.btn-outline.btn-outline-success i,.btn-check:checked+.btn.btn-outline.btn-outline-success .svg-icon,.btn-check:checked+.btn.btn-outline.btn-outline-success i,.btn.btn-outline.btn-outline-success.active .svg-icon,.btn.btn-outline.btn-outline-success.active i,.btn.btn-outline.btn-outline-success.show .svg-icon,.btn.btn-outline.btn-outline-success.show i,.btn.btn-outline.btn-outline-success:active:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-success:active:not(.btn-active) i,.btn.btn-outline.btn-outline-success:focus:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-success:focus:not(.btn-active) i,.btn.btn-outline.btn-outline-success:hover:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-success:hover:not(.btn-active) i,.show>.btn.btn-outline.btn-outline-success .svg-icon,.show>.btn.btn-outline.btn-outline-success i{color:var(--bs-success-active)}.btn-check:active+.btn.btn-outline.btn-outline-success.dropdown-toggle:after,.btn-check:checked+.btn.btn-outline.btn-outline-success.dropdown-toggle:after,.btn.btn-outline.btn-outline-success.active.dropdown-toggle:after,.btn.btn-outline.btn-outline-success.show.dropdown-toggle:after,.btn.btn-outline.btn-outline-success:active:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-success:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-success:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-outline.btn-outline-success.dropdown-toggle:after{color:var(--bs-success-active)}.btn.btn-info{color:var(--bs-info-inverse);border-color:var(--bs-info);background-color:var(--bs-info)}.btn.btn-info .svg-icon,.btn.btn-info i{color:var(--bs-info-inverse)}.btn.btn-info.dropdown-toggle:after{color:var(--bs-info-inverse)}.btn-check:active+.btn.btn-info,.btn-check:checked+.btn.btn-info,.btn.btn-info.active,.btn.btn-info.show,.btn.btn-info:active:not(.btn-active),.btn.btn-info:focus:not(.btn-active),.btn.btn-info:hover:not(.btn-active),.show>.btn.btn-info{color:var(--bs-info-inverse);border-color:var(--bs-info-active);background-color:var(--bs-info-active)!important}.btn-check:active+.btn.btn-info .svg-icon,.btn-check:active+.btn.btn-info i,.btn-check:checked+.btn.btn-info .svg-icon,.btn-check:checked+.btn.btn-info i,.btn.btn-info.active .svg-icon,.btn.btn-info.active i,.btn.btn-info.show .svg-icon,.btn.btn-info.show i,.btn.btn-info:active:not(.btn-active) .svg-icon,.btn.btn-info:active:not(.btn-active) i,.btn.btn-info:focus:not(.btn-active) .svg-icon,.btn.btn-info:focus:not(.btn-active) i,.btn.btn-info:hover:not(.btn-active) .svg-icon,.btn.btn-info:hover:not(.btn-active) i,.show>.btn.btn-info .svg-icon,.show>.btn.btn-info i{color:var(--bs-info-inverse)}.btn-check:active+.btn.btn-info.dropdown-toggle:after,.btn-check:checked+.btn.btn-info.dropdown-toggle:after,.btn.btn-info.active.dropdown-toggle:after,.btn.btn-info.show.dropdown-toggle:after,.btn.btn-info:active:not(.btn-active).dropdown-toggle:after,.btn.btn-info:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-info:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-info.dropdown-toggle:after{color:var(--bs-info-inverse)}.btn.btn-light-info{color:var(--bs-info);border-color:var(--bs-info-light);background-color:var(--bs-info-light)}.btn.btn-light-info .svg-icon,.btn.btn-light-info i{color:var(--bs-info)}.btn.btn-light-info.dropdown-toggle:after{color:var(--bs-info)}.btn-check:active+.btn.btn-light-info,.btn-check:checked+.btn.btn-light-info,.btn.btn-light-info.active,.btn.btn-light-info.show,.btn.btn-light-info:active:not(.btn-active),.btn.btn-light-info:focus:not(.btn-active),.btn.btn-light-info:hover:not(.btn-active),.show>.btn.btn-light-info{color:var(--bs-info-inverse);border-color:var(--bs-info);background-color:var(--bs-info)!important}.btn-check:active+.btn.btn-light-info .svg-icon,.btn-check:active+.btn.btn-light-info i,.btn-check:checked+.btn.btn-light-info .svg-icon,.btn-check:checked+.btn.btn-light-info i,.btn.btn-light-info.active .svg-icon,.btn.btn-light-info.active i,.btn.btn-light-info.show .svg-icon,.btn.btn-light-info.show i,.btn.btn-light-info:active:not(.btn-active) .svg-icon,.btn.btn-light-info:active:not(.btn-active) i,.btn.btn-light-info:focus:not(.btn-active) .svg-icon,.btn.btn-light-info:focus:not(.btn-active) i,.btn.btn-light-info:hover:not(.btn-active) .svg-icon,.btn.btn-light-info:hover:not(.btn-active) i,.show>.btn.btn-light-info .svg-icon,.show>.btn.btn-light-info i{color:var(--bs-info-inverse)}.btn-check:active+.btn.btn-light-info.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-info.dropdown-toggle:after,.btn.btn-light-info.active.dropdown-toggle:after,.btn.btn-light-info.show.dropdown-toggle:after,.btn.btn-light-info:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-info:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-info:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-info.dropdown-toggle:after{color:var(--bs-info-inverse)}.btn.btn-bg-info{border-color:var(--bs-info);background-color:var(--bs-info)}.btn-check:active+.btn.btn-active-info,.btn-check:checked+.btn.btn-active-info,.btn.btn-active-info.active,.btn.btn-active-info.show,.btn.btn-active-info:active:not(.btn-active),.btn.btn-active-info:focus:not(.btn-active),.btn.btn-active-info:hover:not(.btn-active),.show>.btn.btn-active-info{color:var(--bs-info-inverse);border-color:var(--bs-info);background-color:var(--bs-info)!important}.btn-check:active+.btn.btn-active-info .svg-icon,.btn-check:active+.btn.btn-active-info i,.btn-check:checked+.btn.btn-active-info .svg-icon,.btn-check:checked+.btn.btn-active-info i,.btn.btn-active-info.active .svg-icon,.btn.btn-active-info.active i,.btn.btn-active-info.show .svg-icon,.btn.btn-active-info.show i,.btn.btn-active-info:active:not(.btn-active) .svg-icon,.btn.btn-active-info:active:not(.btn-active) i,.btn.btn-active-info:focus:not(.btn-active) .svg-icon,.btn.btn-active-info:focus:not(.btn-active) i,.btn.btn-active-info:hover:not(.btn-active) .svg-icon,.btn.btn-active-info:hover:not(.btn-active) i,.show>.btn.btn-active-info .svg-icon,.show>.btn.btn-active-info i{color:var(--bs-info-inverse)}.btn-check:active+.btn.btn-active-info.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-info.dropdown-toggle:after,.btn.btn-active-info.active.dropdown-toggle:after,.btn.btn-active-info.show.dropdown-toggle:after,.btn.btn-active-info:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-info:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-info:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-info.dropdown-toggle:after{color:var(--bs-info-inverse)}.btn-check:active+.btn.btn-active-light-info,.btn-check:checked+.btn.btn-active-light-info,.btn.btn-active-light-info.active,.btn.btn-active-light-info.show,.btn.btn-active-light-info:active:not(.btn-active),.btn.btn-active-light-info:focus:not(.btn-active),.btn.btn-active-light-info:hover:not(.btn-active),.show>.btn.btn-active-light-info{color:var(--bs-info);border-color:var(--bs-info-light);background-color:var(--bs-info-light)!important}.btn-check:active+.btn.btn-active-light-info .svg-icon,.btn-check:active+.btn.btn-active-light-info i,.btn-check:checked+.btn.btn-active-light-info .svg-icon,.btn-check:checked+.btn.btn-active-light-info i,.btn.btn-active-light-info.active .svg-icon,.btn.btn-active-light-info.active i,.btn.btn-active-light-info.show .svg-icon,.btn.btn-active-light-info.show i,.btn.btn-active-light-info:active:not(.btn-active) .svg-icon,.btn.btn-active-light-info:active:not(.btn-active) i,.btn.btn-active-light-info:focus:not(.btn-active) .svg-icon,.btn.btn-active-light-info:focus:not(.btn-active) i,.btn.btn-active-light-info:hover:not(.btn-active) .svg-icon,.btn.btn-active-light-info:hover:not(.btn-active) i,.show>.btn.btn-active-light-info .svg-icon,.show>.btn.btn-active-light-info i{color:var(--bs-info)}.btn-check:active+.btn.btn-active-light-info.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light-info.dropdown-toggle:after,.btn.btn-active-light-info.active.dropdown-toggle:after,.btn.btn-active-light-info.show.dropdown-toggle:after,.btn.btn-active-light-info:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-info:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-info:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light-info.dropdown-toggle:after{color:var(--bs-info)}.btn.btn-outline.btn-outline-info{color:var(--bs-info);border-color:var(--bs-info);background-color:transparent}.btn.btn-outline.btn-outline-info .svg-icon,.btn.btn-outline.btn-outline-info i{color:var(--bs-info)}.btn.btn-outline.btn-outline-info.dropdown-toggle:after{color:var(--bs-info)}.btn-check:active+.btn.btn-outline.btn-outline-info,.btn-check:checked+.btn.btn-outline.btn-outline-info,.btn.btn-outline.btn-outline-info.active,.btn.btn-outline.btn-outline-info.show,.btn.btn-outline.btn-outline-info:active:not(.btn-active),.btn.btn-outline.btn-outline-info:focus:not(.btn-active),.btn.btn-outline.btn-outline-info:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-info{color:var(--bs-info-active);border-color:var(--bs-info);background-color:var(--bs-info-light)!important}.btn-check:active+.btn.btn-outline.btn-outline-info .svg-icon,.btn-check:active+.btn.btn-outline.btn-outline-info i,.btn-check:checked+.btn.btn-outline.btn-outline-info .svg-icon,.btn-check:checked+.btn.btn-outline.btn-outline-info i,.btn.btn-outline.btn-outline-info.active .svg-icon,.btn.btn-outline.btn-outline-info.active i,.btn.btn-outline.btn-outline-info.show .svg-icon,.btn.btn-outline.btn-outline-info.show i,.btn.btn-outline.btn-outline-info:active:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-info:active:not(.btn-active) i,.btn.btn-outline.btn-outline-info:focus:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-info:focus:not(.btn-active) i,.btn.btn-outline.btn-outline-info:hover:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-info:hover:not(.btn-active) i,.show>.btn.btn-outline.btn-outline-info .svg-icon,.show>.btn.btn-outline.btn-outline-info i{color:var(--bs-info-active)}.btn-check:active+.btn.btn-outline.btn-outline-info.dropdown-toggle:after,.btn-check:checked+.btn.btn-outline.btn-outline-info.dropdown-toggle:after,.btn.btn-outline.btn-outline-info.active.dropdown-toggle:after,.btn.btn-outline.btn-outline-info.show.dropdown-toggle:after,.btn.btn-outline.btn-outline-info:active:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-info:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-info:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-outline.btn-outline-info.dropdown-toggle:after{color:var(--bs-info-active)}.btn.btn-warning{color:var(--bs-warning-inverse);border-color:var(--bs-warning);background-color:var(--bs-warning)}.btn.btn-warning .svg-icon,.btn.btn-warning i{color:var(--bs-warning-inverse)}.btn.btn-warning.dropdown-toggle:after{color:var(--bs-warning-inverse)}.btn-check:active+.btn.btn-warning,.btn-check:checked+.btn.btn-warning,.btn.btn-warning.active,.btn.btn-warning.show,.btn.btn-warning:active:not(.btn-active),.btn.btn-warning:focus:not(.btn-active),.btn.btn-warning:hover:not(.btn-active),.show>.btn.btn-warning{color:var(--bs-warning-inverse);border-color:var(--bs-warning-active);background-color:var(--bs-warning-active)!important}.btn-check:active+.btn.btn-warning .svg-icon,.btn-check:active+.btn.btn-warning i,.btn-check:checked+.btn.btn-warning .svg-icon,.btn-check:checked+.btn.btn-warning i,.btn.btn-warning.active .svg-icon,.btn.btn-warning.active i,.btn.btn-warning.show .svg-icon,.btn.btn-warning.show i,.btn.btn-warning:active:not(.btn-active) .svg-icon,.btn.btn-warning:active:not(.btn-active) i,.btn.btn-warning:focus:not(.btn-active) .svg-icon,.btn.btn-warning:focus:not(.btn-active) i,.btn.btn-warning:hover:not(.btn-active) .svg-icon,.btn.btn-warning:hover:not(.btn-active) i,.show>.btn.btn-warning .svg-icon,.show>.btn.btn-warning i{color:var(--bs-warning-inverse)}.btn-check:active+.btn.btn-warning.dropdown-toggle:after,.btn-check:checked+.btn.btn-warning.dropdown-toggle:after,.btn.btn-warning.active.dropdown-toggle:after,.btn.btn-warning.show.dropdown-toggle:after,.btn.btn-warning:active:not(.btn-active).dropdown-toggle:after,.btn.btn-warning:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-warning:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-warning.dropdown-toggle:after{color:var(--bs-warning-inverse)}.btn.btn-light-warning{color:var(--bs-warning);border-color:var(--bs-warning-light);background-color:var(--bs-warning-light)}.btn.btn-light-warning .svg-icon,.btn.btn-light-warning i{color:var(--bs-warning)}.btn.btn-light-warning.dropdown-toggle:after{color:var(--bs-warning)}.btn-check:active+.btn.btn-light-warning,.btn-check:checked+.btn.btn-light-warning,.btn.btn-light-warning.active,.btn.btn-light-warning.show,.btn.btn-light-warning:active:not(.btn-active),.btn.btn-light-warning:focus:not(.btn-active),.btn.btn-light-warning:hover:not(.btn-active),.show>.btn.btn-light-warning{color:var(--bs-warning-inverse);border-color:var(--bs-warning);background-color:var(--bs-warning)!important}.btn-check:active+.btn.btn-light-warning .svg-icon,.btn-check:active+.btn.btn-light-warning i,.btn-check:checked+.btn.btn-light-warning .svg-icon,.btn-check:checked+.btn.btn-light-warning i,.btn.btn-light-warning.active .svg-icon,.btn.btn-light-warning.active i,.btn.btn-light-warning.show .svg-icon,.btn.btn-light-warning.show i,.btn.btn-light-warning:active:not(.btn-active) .svg-icon,.btn.btn-light-warning:active:not(.btn-active) i,.btn.btn-light-warning:focus:not(.btn-active) .svg-icon,.btn.btn-light-warning:focus:not(.btn-active) i,.btn.btn-light-warning:hover:not(.btn-active) .svg-icon,.btn.btn-light-warning:hover:not(.btn-active) i,.show>.btn.btn-light-warning .svg-icon,.show>.btn.btn-light-warning i{color:var(--bs-warning-inverse)}.btn-check:active+.btn.btn-light-warning.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-warning.dropdown-toggle:after,.btn.btn-light-warning.active.dropdown-toggle:after,.btn.btn-light-warning.show.dropdown-toggle:after,.btn.btn-light-warning:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-warning:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-warning:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-warning.dropdown-toggle:after{color:var(--bs-warning-inverse)}.btn.btn-bg-warning{border-color:var(--bs-warning);background-color:var(--bs-warning)}.btn-check:active+.btn.btn-active-warning,.btn-check:checked+.btn.btn-active-warning,.btn.btn-active-warning.active,.btn.btn-active-warning.show,.btn.btn-active-warning:active:not(.btn-active),.btn.btn-active-warning:focus:not(.btn-active),.btn.btn-active-warning:hover:not(.btn-active),.show>.btn.btn-active-warning{color:var(--bs-warning-inverse);border-color:var(--bs-warning);background-color:var(--bs-warning)!important}.btn-check:active+.btn.btn-active-warning .svg-icon,.btn-check:active+.btn.btn-active-warning i,.btn-check:checked+.btn.btn-active-warning .svg-icon,.btn-check:checked+.btn.btn-active-warning i,.btn.btn-active-warning.active .svg-icon,.btn.btn-active-warning.active i,.btn.btn-active-warning.show .svg-icon,.btn.btn-active-warning.show i,.btn.btn-active-warning:active:not(.btn-active) .svg-icon,.btn.btn-active-warning:active:not(.btn-active) i,.btn.btn-active-warning:focus:not(.btn-active) .svg-icon,.btn.btn-active-warning:focus:not(.btn-active) i,.btn.btn-active-warning:hover:not(.btn-active) .svg-icon,.btn.btn-active-warning:hover:not(.btn-active) i,.show>.btn.btn-active-warning .svg-icon,.show>.btn.btn-active-warning i{color:var(--bs-warning-inverse)}.btn-check:active+.btn.btn-active-warning.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-warning.dropdown-toggle:after,.btn.btn-active-warning.active.dropdown-toggle:after,.btn.btn-active-warning.show.dropdown-toggle:after,.btn.btn-active-warning:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-warning:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-warning:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-warning.dropdown-toggle:after{color:var(--bs-warning-inverse)}.btn-check:active+.btn.btn-active-light-warning,.btn-check:checked+.btn.btn-active-light-warning,.btn.btn-active-light-warning.active,.btn.btn-active-light-warning.show,.btn.btn-active-light-warning:active:not(.btn-active),.btn.btn-active-light-warning:focus:not(.btn-active),.btn.btn-active-light-warning:hover:not(.btn-active),.show>.btn.btn-active-light-warning{color:var(--bs-warning);border-color:var(--bs-warning-light);background-color:var(--bs-warning-light)!important}.btn-check:active+.btn.btn-active-light-warning .svg-icon,.btn-check:active+.btn.btn-active-light-warning i,.btn-check:checked+.btn.btn-active-light-warning .svg-icon,.btn-check:checked+.btn.btn-active-light-warning i,.btn.btn-active-light-warning.active .svg-icon,.btn.btn-active-light-warning.active i,.btn.btn-active-light-warning.show .svg-icon,.btn.btn-active-light-warning.show i,.btn.btn-active-light-warning:active:not(.btn-active) .svg-icon,.btn.btn-active-light-warning:active:not(.btn-active) i,.btn.btn-active-light-warning:focus:not(.btn-active) .svg-icon,.btn.btn-active-light-warning:focus:not(.btn-active) i,.btn.btn-active-light-warning:hover:not(.btn-active) .svg-icon,.btn.btn-active-light-warning:hover:not(.btn-active) i,.show>.btn.btn-active-light-warning .svg-icon,.show>.btn.btn-active-light-warning i{color:var(--bs-warning)}.btn-check:active+.btn.btn-active-light-warning.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light-warning.dropdown-toggle:after,.btn.btn-active-light-warning.active.dropdown-toggle:after,.btn.btn-active-light-warning.show.dropdown-toggle:after,.btn.btn-active-light-warning:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-warning:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-warning:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light-warning.dropdown-toggle:after{color:var(--bs-warning)}.btn.btn-outline.btn-outline-warning{color:var(--bs-warning);border-color:var(--bs-warning);background-color:transparent}.btn.btn-outline.btn-outline-warning .svg-icon,.btn.btn-outline.btn-outline-warning i{color:var(--bs-warning)}.btn.btn-outline.btn-outline-warning.dropdown-toggle:after{color:var(--bs-warning)}.btn-check:active+.btn.btn-outline.btn-outline-warning,.btn-check:checked+.btn.btn-outline.btn-outline-warning,.btn.btn-outline.btn-outline-warning.active,.btn.btn-outline.btn-outline-warning.show,.btn.btn-outline.btn-outline-warning:active:not(.btn-active),.btn.btn-outline.btn-outline-warning:focus:not(.btn-active),.btn.btn-outline.btn-outline-warning:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-warning{color:var(--bs-warning-active);border-color:var(--bs-warning);background-color:var(--bs-warning-light)!important}.btn-check:active+.btn.btn-outline.btn-outline-warning .svg-icon,.btn-check:active+.btn.btn-outline.btn-outline-warning i,.btn-check:checked+.btn.btn-outline.btn-outline-warning .svg-icon,.btn-check:checked+.btn.btn-outline.btn-outline-warning i,.btn.btn-outline.btn-outline-warning.active .svg-icon,.btn.btn-outline.btn-outline-warning.active i,.btn.btn-outline.btn-outline-warning.show .svg-icon,.btn.btn-outline.btn-outline-warning.show i,.btn.btn-outline.btn-outline-warning:active:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-warning:active:not(.btn-active) i,.btn.btn-outline.btn-outline-warning:focus:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-warning:focus:not(.btn-active) i,.btn.btn-outline.btn-outline-warning:hover:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-warning:hover:not(.btn-active) i,.show>.btn.btn-outline.btn-outline-warning .svg-icon,.show>.btn.btn-outline.btn-outline-warning i{color:var(--bs-warning-active)}.btn-check:active+.btn.btn-outline.btn-outline-warning.dropdown-toggle:after,.btn-check:checked+.btn.btn-outline.btn-outline-warning.dropdown-toggle:after,.btn.btn-outline.btn-outline-warning.active.dropdown-toggle:after,.btn.btn-outline.btn-outline-warning.show.dropdown-toggle:after,.btn.btn-outline.btn-outline-warning:active:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-warning:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-warning:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-outline.btn-outline-warning.dropdown-toggle:after{color:var(--bs-warning-active)}.btn.btn-danger{color:var(--bs-danger-inverse);border-color:var(--bs-danger);background-color:var(--bs-danger)}.btn.btn-danger .svg-icon,.btn.btn-danger i{color:var(--bs-danger-inverse)}.btn.btn-danger.dropdown-toggle:after{color:var(--bs-danger-inverse)}.btn-check:active+.btn.btn-danger,.btn-check:checked+.btn.btn-danger,.btn.btn-danger.active,.btn.btn-danger.show,.btn.btn-danger:active:not(.btn-active),.btn.btn-danger:focus:not(.btn-active),.btn.btn-danger:hover:not(.btn-active),.show>.btn.btn-danger{color:var(--bs-danger-inverse);border-color:var(--bs-danger-active);background-color:var(--bs-danger-active)!important}.btn-check:active+.btn.btn-danger .svg-icon,.btn-check:active+.btn.btn-danger i,.btn-check:checked+.btn.btn-danger .svg-icon,.btn-check:checked+.btn.btn-danger i,.btn.btn-danger.active .svg-icon,.btn.btn-danger.active i,.btn.btn-danger.show .svg-icon,.btn.btn-danger.show i,.btn.btn-danger:active:not(.btn-active) .svg-icon,.btn.btn-danger:active:not(.btn-active) i,.btn.btn-danger:focus:not(.btn-active) .svg-icon,.btn.btn-danger:focus:not(.btn-active) i,.btn.btn-danger:hover:not(.btn-active) .svg-icon,.btn.btn-danger:hover:not(.btn-active) i,.show>.btn.btn-danger .svg-icon,.show>.btn.btn-danger i{color:var(--bs-danger-inverse)}.btn-check:active+.btn.btn-danger.dropdown-toggle:after,.btn-check:checked+.btn.btn-danger.dropdown-toggle:after,.btn.btn-danger.active.dropdown-toggle:after,.btn.btn-danger.show.dropdown-toggle:after,.btn.btn-danger:active:not(.btn-active).dropdown-toggle:after,.btn.btn-danger:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-danger:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-danger.dropdown-toggle:after{color:var(--bs-danger-inverse)}.btn.btn-light-danger{color:var(--bs-danger);border-color:var(--bs-danger-light);background-color:var(--bs-danger-light)}.btn.btn-light-danger .svg-icon,.btn.btn-light-danger i{color:var(--bs-danger)}.btn.btn-light-danger.dropdown-toggle:after{color:var(--bs-danger)}.btn-check:active+.btn.btn-light-danger,.btn-check:checked+.btn.btn-light-danger,.btn.btn-light-danger.active,.btn.btn-light-danger.show,.btn.btn-light-danger:active:not(.btn-active),.btn.btn-light-danger:focus:not(.btn-active),.btn.btn-light-danger:hover:not(.btn-active),.show>.btn.btn-light-danger{color:var(--bs-danger-inverse);border-color:var(--bs-danger);background-color:var(--bs-danger)!important}.btn-check:active+.btn.btn-light-danger .svg-icon,.btn-check:active+.btn.btn-light-danger i,.btn-check:checked+.btn.btn-light-danger .svg-icon,.btn-check:checked+.btn.btn-light-danger i,.btn.btn-light-danger.active .svg-icon,.btn.btn-light-danger.active i,.btn.btn-light-danger.show .svg-icon,.btn.btn-light-danger.show i,.btn.btn-light-danger:active:not(.btn-active) .svg-icon,.btn.btn-light-danger:active:not(.btn-active) i,.btn.btn-light-danger:focus:not(.btn-active) .svg-icon,.btn.btn-light-danger:focus:not(.btn-active) i,.btn.btn-light-danger:hover:not(.btn-active) .svg-icon,.btn.btn-light-danger:hover:not(.btn-active) i,.show>.btn.btn-light-danger .svg-icon,.show>.btn.btn-light-danger i{color:var(--bs-danger-inverse)}.btn-check:active+.btn.btn-light-danger.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-danger.dropdown-toggle:after,.btn.btn-light-danger.active.dropdown-toggle:after,.btn.btn-light-danger.show.dropdown-toggle:after,.btn.btn-light-danger:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-danger:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-danger:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-danger.dropdown-toggle:after{color:var(--bs-danger-inverse)}.btn.btn-bg-danger{border-color:var(--bs-danger);background-color:var(--bs-danger)}.btn-check:active+.btn.btn-active-danger,.btn-check:checked+.btn.btn-active-danger,.btn.btn-active-danger.active,.btn.btn-active-danger.show,.btn.btn-active-danger:active:not(.btn-active),.btn.btn-active-danger:focus:not(.btn-active),.btn.btn-active-danger:hover:not(.btn-active),.show>.btn.btn-active-danger{color:var(--bs-danger-inverse);border-color:var(--bs-danger);background-color:var(--bs-danger)!important}.btn-check:active+.btn.btn-active-danger .svg-icon,.btn-check:active+.btn.btn-active-danger i,.btn-check:checked+.btn.btn-active-danger .svg-icon,.btn-check:checked+.btn.btn-active-danger i,.btn.btn-active-danger.active .svg-icon,.btn.btn-active-danger.active i,.btn.btn-active-danger.show .svg-icon,.btn.btn-active-danger.show i,.btn.btn-active-danger:active:not(.btn-active) .svg-icon,.btn.btn-active-danger:active:not(.btn-active) i,.btn.btn-active-danger:focus:not(.btn-active) .svg-icon,.btn.btn-active-danger:focus:not(.btn-active) i,.btn.btn-active-danger:hover:not(.btn-active) .svg-icon,.btn.btn-active-danger:hover:not(.btn-active) i,.show>.btn.btn-active-danger .svg-icon,.show>.btn.btn-active-danger i{color:var(--bs-danger-inverse)}.btn-check:active+.btn.btn-active-danger.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-danger.dropdown-toggle:after,.btn.btn-active-danger.active.dropdown-toggle:after,.btn.btn-active-danger.show.dropdown-toggle:after,.btn.btn-active-danger:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-danger:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-danger:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-danger.dropdown-toggle:after{color:var(--bs-danger-inverse)}.btn-check:active+.btn.btn-active-light-danger,.btn-check:checked+.btn.btn-active-light-danger,.btn.btn-active-light-danger.active,.btn.btn-active-light-danger.show,.btn.btn-active-light-danger:active:not(.btn-active),.btn.btn-active-light-danger:focus:not(.btn-active),.btn.btn-active-light-danger:hover:not(.btn-active),.show>.btn.btn-active-light-danger{color:var(--bs-danger);border-color:var(--bs-danger-light);background-color:var(--bs-danger-light)!important}.btn-check:active+.btn.btn-active-light-danger .svg-icon,.btn-check:active+.btn.btn-active-light-danger i,.btn-check:checked+.btn.btn-active-light-danger .svg-icon,.btn-check:checked+.btn.btn-active-light-danger i,.btn.btn-active-light-danger.active .svg-icon,.btn.btn-active-light-danger.active i,.btn.btn-active-light-danger.show .svg-icon,.btn.btn-active-light-danger.show i,.btn.btn-active-light-danger:active:not(.btn-active) .svg-icon,.btn.btn-active-light-danger:active:not(.btn-active) i,.btn.btn-active-light-danger:focus:not(.btn-active) .svg-icon,.btn.btn-active-light-danger:focus:not(.btn-active) i,.btn.btn-active-light-danger:hover:not(.btn-active) .svg-icon,.btn.btn-active-light-danger:hover:not(.btn-active) i,.show>.btn.btn-active-light-danger .svg-icon,.show>.btn.btn-active-light-danger i{color:var(--bs-danger)}.btn-check:active+.btn.btn-active-light-danger.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light-danger.dropdown-toggle:after,.btn.btn-active-light-danger.active.dropdown-toggle:after,.btn.btn-active-light-danger.show.dropdown-toggle:after,.btn.btn-active-light-danger:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-danger:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-danger:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light-danger.dropdown-toggle:after{color:var(--bs-danger)}.btn.btn-outline.btn-outline-danger{color:var(--bs-danger);border-color:var(--bs-danger);background-color:transparent}.btn.btn-outline.btn-outline-danger .svg-icon,.btn.btn-outline.btn-outline-danger i{color:var(--bs-danger)}.btn.btn-outline.btn-outline-danger.dropdown-toggle:after{color:var(--bs-danger)}.btn-check:active+.btn.btn-outline.btn-outline-danger,.btn-check:checked+.btn.btn-outline.btn-outline-danger,.btn.btn-outline.btn-outline-danger.active,.btn.btn-outline.btn-outline-danger.show,.btn.btn-outline.btn-outline-danger:active:not(.btn-active),.btn.btn-outline.btn-outline-danger:focus:not(.btn-active),.btn.btn-outline.btn-outline-danger:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-danger{color:var(--bs-danger-active);border-color:var(--bs-danger);background-color:var(--bs-danger-light)!important}.btn-check:active+.btn.btn-outline.btn-outline-danger .svg-icon,.btn-check:active+.btn.btn-outline.btn-outline-danger i,.btn-check:checked+.btn.btn-outline.btn-outline-danger .svg-icon,.btn-check:checked+.btn.btn-outline.btn-outline-danger i,.btn.btn-outline.btn-outline-danger.active .svg-icon,.btn.btn-outline.btn-outline-danger.active i,.btn.btn-outline.btn-outline-danger.show .svg-icon,.btn.btn-outline.btn-outline-danger.show i,.btn.btn-outline.btn-outline-danger:active:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-danger:active:not(.btn-active) i,.btn.btn-outline.btn-outline-danger:focus:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-danger:focus:not(.btn-active) i,.btn.btn-outline.btn-outline-danger:hover:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-danger:hover:not(.btn-active) i,.show>.btn.btn-outline.btn-outline-danger .svg-icon,.show>.btn.btn-outline.btn-outline-danger i{color:var(--bs-danger-active)}.btn-check:active+.btn.btn-outline.btn-outline-danger.dropdown-toggle:after,.btn-check:checked+.btn.btn-outline.btn-outline-danger.dropdown-toggle:after,.btn.btn-outline.btn-outline-danger.active.dropdown-toggle:after,.btn.btn-outline.btn-outline-danger.show.dropdown-toggle:after,.btn.btn-outline.btn-outline-danger:active:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-danger:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-danger:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-outline.btn-outline-danger.dropdown-toggle:after{color:var(--bs-danger-active)}.btn.btn-dark{color:var(--bs-dark-inverse);border-color:var(--bs-dark);background-color:var(--bs-dark)}.btn.btn-dark .svg-icon,.btn.btn-dark i{color:var(--bs-dark-inverse)}.btn.btn-dark.dropdown-toggle:after{color:var(--bs-dark-inverse)}.btn-check:active+.btn.btn-dark,.btn-check:checked+.btn.btn-dark,.btn.btn-dark.active,.btn.btn-dark.show,.btn.btn-dark:active:not(.btn-active),.btn.btn-dark:focus:not(.btn-active),.btn.btn-dark:hover:not(.btn-active),.show>.btn.btn-dark{color:var(--bs-dark-inverse);border-color:var(--bs-dark-active);background-color:var(--bs-dark-active)!important}.btn-check:active+.btn.btn-dark .svg-icon,.btn-check:active+.btn.btn-dark i,.btn-check:checked+.btn.btn-dark .svg-icon,.btn-check:checked+.btn.btn-dark i,.btn.btn-dark.active .svg-icon,.btn.btn-dark.active i,.btn.btn-dark.show .svg-icon,.btn.btn-dark.show i,.btn.btn-dark:active:not(.btn-active) .svg-icon,.btn.btn-dark:active:not(.btn-active) i,.btn.btn-dark:focus:not(.btn-active) .svg-icon,.btn.btn-dark:focus:not(.btn-active) i,.btn.btn-dark:hover:not(.btn-active) .svg-icon,.btn.btn-dark:hover:not(.btn-active) i,.show>.btn.btn-dark .svg-icon,.show>.btn.btn-dark i{color:var(--bs-dark-inverse)}.btn-check:active+.btn.btn-dark.dropdown-toggle:after,.btn-check:checked+.btn.btn-dark.dropdown-toggle:after,.btn.btn-dark.active.dropdown-toggle:after,.btn.btn-dark.show.dropdown-toggle:after,.btn.btn-dark:active:not(.btn-active).dropdown-toggle:after,.btn.btn-dark:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-dark:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-dark.dropdown-toggle:after{color:var(--bs-dark-inverse)}.btn.btn-light-dark{color:var(--bs-dark);border-color:var(--bs-dark-light);background-color:var(--bs-dark-light)}.btn.btn-light-dark .svg-icon,.btn.btn-light-dark i{color:var(--bs-dark)}.btn.btn-light-dark.dropdown-toggle:after{color:var(--bs-dark)}.btn-check:active+.btn.btn-light-dark,.btn-check:checked+.btn.btn-light-dark,.btn.btn-light-dark.active,.btn.btn-light-dark.show,.btn.btn-light-dark:active:not(.btn-active),.btn.btn-light-dark:focus:not(.btn-active),.btn.btn-light-dark:hover:not(.btn-active),.show>.btn.btn-light-dark{color:var(--bs-dark-inverse);border-color:var(--bs-dark);background-color:var(--bs-dark)!important}.btn-check:active+.btn.btn-light-dark .svg-icon,.btn-check:active+.btn.btn-light-dark i,.btn-check:checked+.btn.btn-light-dark .svg-icon,.btn-check:checked+.btn.btn-light-dark i,.btn.btn-light-dark.active .svg-icon,.btn.btn-light-dark.active i,.btn.btn-light-dark.show .svg-icon,.btn.btn-light-dark.show i,.btn.btn-light-dark:active:not(.btn-active) .svg-icon,.btn.btn-light-dark:active:not(.btn-active) i,.btn.btn-light-dark:focus:not(.btn-active) .svg-icon,.btn.btn-light-dark:focus:not(.btn-active) i,.btn.btn-light-dark:hover:not(.btn-active) .svg-icon,.btn.btn-light-dark:hover:not(.btn-active) i,.show>.btn.btn-light-dark .svg-icon,.show>.btn.btn-light-dark i{color:var(--bs-dark-inverse)}.btn-check:active+.btn.btn-light-dark.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-dark.dropdown-toggle:after,.btn.btn-light-dark.active.dropdown-toggle:after,.btn.btn-light-dark.show.dropdown-toggle:after,.btn.btn-light-dark:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-dark:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-dark:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-dark.dropdown-toggle:after{color:var(--bs-dark-inverse)}.btn.btn-bg-dark{border-color:var(--bs-dark);background-color:var(--bs-dark)}.btn-check:active+.btn.btn-active-dark,.btn-check:checked+.btn.btn-active-dark,.btn.btn-active-dark.active,.btn.btn-active-dark.show,.btn.btn-active-dark:active:not(.btn-active),.btn.btn-active-dark:focus:not(.btn-active),.btn.btn-active-dark:hover:not(.btn-active),.show>.btn.btn-active-dark{color:var(--bs-dark-inverse);border-color:var(--bs-dark);background-color:var(--bs-dark)!important}.btn-check:active+.btn.btn-active-dark .svg-icon,.btn-check:active+.btn.btn-active-dark i,.btn-check:checked+.btn.btn-active-dark .svg-icon,.btn-check:checked+.btn.btn-active-dark i,.btn.btn-active-dark.active .svg-icon,.btn.btn-active-dark.active i,.btn.btn-active-dark.show .svg-icon,.btn.btn-active-dark.show i,.btn.btn-active-dark:active:not(.btn-active) .svg-icon,.btn.btn-active-dark:active:not(.btn-active) i,.btn.btn-active-dark:focus:not(.btn-active) .svg-icon,.btn.btn-active-dark:focus:not(.btn-active) i,.btn.btn-active-dark:hover:not(.btn-active) .svg-icon,.btn.btn-active-dark:hover:not(.btn-active) i,.show>.btn.btn-active-dark .svg-icon,.show>.btn.btn-active-dark i{color:var(--bs-dark-inverse)}.btn-check:active+.btn.btn-active-dark.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-dark.dropdown-toggle:after,.btn.btn-active-dark.active.dropdown-toggle:after,.btn.btn-active-dark.show.dropdown-toggle:after,.btn.btn-active-dark:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-dark:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-dark:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-dark.dropdown-toggle:after{color:var(--bs-dark-inverse)}.btn-check:active+.btn.btn-active-light-dark,.btn-check:checked+.btn.btn-active-light-dark,.btn.btn-active-light-dark.active,.btn.btn-active-light-dark.show,.btn.btn-active-light-dark:active:not(.btn-active),.btn.btn-active-light-dark:focus:not(.btn-active),.btn.btn-active-light-dark:hover:not(.btn-active),.show>.btn.btn-active-light-dark{color:var(--bs-dark);border-color:var(--bs-dark-light);background-color:var(--bs-dark-light)!important}.btn-check:active+.btn.btn-active-light-dark .svg-icon,.btn-check:active+.btn.btn-active-light-dark i,.btn-check:checked+.btn.btn-active-light-dark .svg-icon,.btn-check:checked+.btn.btn-active-light-dark i,.btn.btn-active-light-dark.active .svg-icon,.btn.btn-active-light-dark.active i,.btn.btn-active-light-dark.show .svg-icon,.btn.btn-active-light-dark.show i,.btn.btn-active-light-dark:active:not(.btn-active) .svg-icon,.btn.btn-active-light-dark:active:not(.btn-active) i,.btn.btn-active-light-dark:focus:not(.btn-active) .svg-icon,.btn.btn-active-light-dark:focus:not(.btn-active) i,.btn.btn-active-light-dark:hover:not(.btn-active) .svg-icon,.btn.btn-active-light-dark:hover:not(.btn-active) i,.show>.btn.btn-active-light-dark .svg-icon,.show>.btn.btn-active-light-dark i{color:var(--bs-dark)}.btn-check:active+.btn.btn-active-light-dark.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light-dark.dropdown-toggle:after,.btn.btn-active-light-dark.active.dropdown-toggle:after,.btn.btn-active-light-dark.show.dropdown-toggle:after,.btn.btn-active-light-dark:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-dark:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-dark:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light-dark.dropdown-toggle:after{color:var(--bs-dark)}.btn.btn-outline.btn-outline-dark{color:var(--bs-dark);border-color:var(--bs-dark);background-color:transparent}.btn.btn-outline.btn-outline-dark .svg-icon,.btn.btn-outline.btn-outline-dark i{color:var(--bs-dark)}.btn.btn-outline.btn-outline-dark.dropdown-toggle:after{color:var(--bs-dark)}.btn-check:active+.btn.btn-outline.btn-outline-dark,.btn-check:checked+.btn.btn-outline.btn-outline-dark,.btn.btn-outline.btn-outline-dark.active,.btn.btn-outline.btn-outline-dark.show,.btn.btn-outline.btn-outline-dark:active:not(.btn-active),.btn.btn-outline.btn-outline-dark:focus:not(.btn-active),.btn.btn-outline.btn-outline-dark:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-dark{color:var(--bs-dark-active);border-color:var(--bs-dark);background-color:var(--bs-dark-light)!important}.btn-check:active+.btn.btn-outline.btn-outline-dark .svg-icon,.btn-check:active+.btn.btn-outline.btn-outline-dark i,.btn-check:checked+.btn.btn-outline.btn-outline-dark .svg-icon,.btn-check:checked+.btn.btn-outline.btn-outline-dark i,.btn.btn-outline.btn-outline-dark.active .svg-icon,.btn.btn-outline.btn-outline-dark.active i,.btn.btn-outline.btn-outline-dark.show .svg-icon,.btn.btn-outline.btn-outline-dark.show i,.btn.btn-outline.btn-outline-dark:active:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-dark:active:not(.btn-active) i,.btn.btn-outline.btn-outline-dark:focus:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-dark:focus:not(.btn-active) i,.btn.btn-outline.btn-outline-dark:hover:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-dark:hover:not(.btn-active) i,.show>.btn.btn-outline.btn-outline-dark .svg-icon,.show>.btn.btn-outline.btn-outline-dark i{color:var(--bs-dark-active)}.btn-check:active+.btn.btn-outline.btn-outline-dark.dropdown-toggle:after,.btn-check:checked+.btn.btn-outline.btn-outline-dark.dropdown-toggle:after,.btn.btn-outline.btn-outline-dark.active.dropdown-toggle:after,.btn.btn-outline.btn-outline-dark.show.dropdown-toggle:after,.btn.btn-outline.btn-outline-dark:active:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-dark:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-dark:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-outline.btn-outline-dark.dropdown-toggle:after{color:var(--bs-dark-active)}.btn.btn-color-white{color:var(--bs-text-white)}.btn.btn-color-white .svg-icon,.btn.btn-color-white i{color:var(--bs-text-white)}.btn.btn-color-white.dropdown-toggle:after{color:var(--bs-text-white)}.btn-check:active+.btn.btn-active-color-white,.btn-check:checked+.btn.btn-active-color-white,.btn.btn-active-color-white.active,.btn.btn-active-color-white.show,.btn.btn-active-color-white:active:not(.btn-active),.btn.btn-active-color-white:focus:not(.btn-active),.btn.btn-active-color-white:hover:not(.btn-active),.show>.btn.btn-active-color-white{color:var(--bs-text-white)}.btn-check:active+.btn.btn-active-color-white .svg-icon,.btn-check:active+.btn.btn-active-color-white i,.btn-check:checked+.btn.btn-active-color-white .svg-icon,.btn-check:checked+.btn.btn-active-color-white i,.btn.btn-active-color-white.active .svg-icon,.btn.btn-active-color-white.active i,.btn.btn-active-color-white.show .svg-icon,.btn.btn-active-color-white.show i,.btn.btn-active-color-white:active:not(.btn-active) .svg-icon,.btn.btn-active-color-white:active:not(.btn-active) i,.btn.btn-active-color-white:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-white:focus:not(.btn-active) i,.btn.btn-active-color-white:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-white:hover:not(.btn-active) i,.show>.btn.btn-active-color-white .svg-icon,.show>.btn.btn-active-color-white i{color:var(--bs-text-white)}.btn-check:active+.btn.btn-active-color-white.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-white.dropdown-toggle:after,.btn.btn-active-color-white.active.dropdown-toggle:after,.btn.btn-active-color-white.show.dropdown-toggle:after,.btn.btn-active-color-white:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-white:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-white:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-white.dropdown-toggle:after{color:var(--bs-text-white)}.btn.btn-icon-white .svg-icon,.btn.btn-icon-white i{color:var(--bs-text-white)}.btn.btn-icon-white.dropdown-toggle:after{color:var(--bs-text-white)}.btn-check:active+.btn.btn-active-icon-white .svg-icon,.btn-check:active+.btn.btn-active-icon-white i,.btn-check:checked+.btn.btn-active-icon-white .svg-icon,.btn-check:checked+.btn.btn-active-icon-white i,.btn.btn-active-icon-white.active .svg-icon,.btn.btn-active-icon-white.active i,.btn.btn-active-icon-white.show .svg-icon,.btn.btn-active-icon-white.show i,.btn.btn-active-icon-white:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-white:active:not(.btn-active) i,.btn.btn-active-icon-white:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-white:focus:not(.btn-active) i,.btn.btn-active-icon-white:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-white:hover:not(.btn-active) i,.show>.btn.btn-active-icon-white .svg-icon,.show>.btn.btn-active-icon-white i{color:var(--bs-text-white)}.btn-check:active+.btn.btn-active-icon-white.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-white.dropdown-toggle:after,.btn.btn-active-icon-white.active.dropdown-toggle:after,.btn.btn-active-icon-white.show.dropdown-toggle:after,.btn.btn-active-icon-white:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-white:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-white:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-white.dropdown-toggle:after{color:var(--bs-text-white)}.btn.btn-text-white{color:var(--bs-text-white)}.btn-check:active+.btn.btn-active-text-white,.btn-check:checked+.btn.btn-active-text-white,.btn.btn-active-text-white.active,.btn.btn-active-text-white.show,.btn.btn-active-text-white:active:not(.btn-active),.btn.btn-active-text-white:focus:not(.btn-active),.btn.btn-active-text-white:hover:not(.btn-active),.show>.btn.btn-active-text-white{color:var(--bs-text-white)}.btn.btn-color-primary{color:var(--bs-text-primary)}.btn.btn-color-primary .svg-icon,.btn.btn-color-primary i{color:var(--bs-text-primary)}.btn.btn-color-primary.dropdown-toggle:after{color:var(--bs-text-primary)}.btn-check:active+.btn.btn-active-color-primary,.btn-check:checked+.btn.btn-active-color-primary,.btn.btn-active-color-primary.active,.btn.btn-active-color-primary.show,.btn.btn-active-color-primary:active:not(.btn-active),.btn.btn-active-color-primary:focus:not(.btn-active),.btn.btn-active-color-primary:hover:not(.btn-active),.show>.btn.btn-active-color-primary{color:var(--bs-text-primary)}.btn-check:active+.btn.btn-active-color-primary .svg-icon,.btn-check:active+.btn.btn-active-color-primary i,.btn-check:checked+.btn.btn-active-color-primary .svg-icon,.btn-check:checked+.btn.btn-active-color-primary i,.btn.btn-active-color-primary.active .svg-icon,.btn.btn-active-color-primary.active i,.btn.btn-active-color-primary.show .svg-icon,.btn.btn-active-color-primary.show i,.btn.btn-active-color-primary:active:not(.btn-active) .svg-icon,.btn.btn-active-color-primary:active:not(.btn-active) i,.btn.btn-active-color-primary:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-primary:focus:not(.btn-active) i,.btn.btn-active-color-primary:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-primary:hover:not(.btn-active) i,.show>.btn.btn-active-color-primary .svg-icon,.show>.btn.btn-active-color-primary i{color:var(--bs-text-primary)}.btn-check:active+.btn.btn-active-color-primary.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-primary.dropdown-toggle:after,.btn.btn-active-color-primary.active.dropdown-toggle:after,.btn.btn-active-color-primary.show.dropdown-toggle:after,.btn.btn-active-color-primary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-primary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-primary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-primary.dropdown-toggle:after{color:var(--bs-text-primary)}.btn.btn-icon-primary .svg-icon,.btn.btn-icon-primary i{color:var(--bs-text-primary)}.btn.btn-icon-primary.dropdown-toggle:after{color:var(--bs-text-primary)}.btn-check:active+.btn.btn-active-icon-primary .svg-icon,.btn-check:active+.btn.btn-active-icon-primary i,.btn-check:checked+.btn.btn-active-icon-primary .svg-icon,.btn-check:checked+.btn.btn-active-icon-primary i,.btn.btn-active-icon-primary.active .svg-icon,.btn.btn-active-icon-primary.active i,.btn.btn-active-icon-primary.show .svg-icon,.btn.btn-active-icon-primary.show i,.btn.btn-active-icon-primary:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-primary:active:not(.btn-active) i,.btn.btn-active-icon-primary:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-primary:focus:not(.btn-active) i,.btn.btn-active-icon-primary:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-primary:hover:not(.btn-active) i,.show>.btn.btn-active-icon-primary .svg-icon,.show>.btn.btn-active-icon-primary i{color:var(--bs-text-primary)}.btn-check:active+.btn.btn-active-icon-primary.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-primary.dropdown-toggle:after,.btn.btn-active-icon-primary.active.dropdown-toggle:after,.btn.btn-active-icon-primary.show.dropdown-toggle:after,.btn.btn-active-icon-primary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-primary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-primary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-primary.dropdown-toggle:after{color:var(--bs-text-primary)}.btn.btn-text-primary{color:var(--bs-text-primary)}.btn-check:active+.btn.btn-active-text-primary,.btn-check:checked+.btn.btn-active-text-primary,.btn.btn-active-text-primary.active,.btn.btn-active-text-primary.show,.btn.btn-active-text-primary:active:not(.btn-active),.btn.btn-active-text-primary:focus:not(.btn-active),.btn.btn-active-text-primary:hover:not(.btn-active),.show>.btn.btn-active-text-primary{color:var(--bs-text-primary)}.btn.btn-color-secondary{color:var(--bs-text-secondary)}.btn.btn-color-secondary .svg-icon,.btn.btn-color-secondary i{color:var(--bs-text-secondary)}.btn.btn-color-secondary.dropdown-toggle:after{color:var(--bs-text-secondary)}.btn-check:active+.btn.btn-active-color-secondary,.btn-check:checked+.btn.btn-active-color-secondary,.btn.btn-active-color-secondary.active,.btn.btn-active-color-secondary.show,.btn.btn-active-color-secondary:active:not(.btn-active),.btn.btn-active-color-secondary:focus:not(.btn-active),.btn.btn-active-color-secondary:hover:not(.btn-active),.show>.btn.btn-active-color-secondary{color:var(--bs-text-secondary)}.btn-check:active+.btn.btn-active-color-secondary .svg-icon,.btn-check:active+.btn.btn-active-color-secondary i,.btn-check:checked+.btn.btn-active-color-secondary .svg-icon,.btn-check:checked+.btn.btn-active-color-secondary i,.btn.btn-active-color-secondary.active .svg-icon,.btn.btn-active-color-secondary.active i,.btn.btn-active-color-secondary.show .svg-icon,.btn.btn-active-color-secondary.show i,.btn.btn-active-color-secondary:active:not(.btn-active) .svg-icon,.btn.btn-active-color-secondary:active:not(.btn-active) i,.btn.btn-active-color-secondary:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-secondary:focus:not(.btn-active) i,.btn.btn-active-color-secondary:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-secondary:hover:not(.btn-active) i,.show>.btn.btn-active-color-secondary .svg-icon,.show>.btn.btn-active-color-secondary i{color:var(--bs-text-secondary)}.btn-check:active+.btn.btn-active-color-secondary.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-secondary.dropdown-toggle:after,.btn.btn-active-color-secondary.active.dropdown-toggle:after,.btn.btn-active-color-secondary.show.dropdown-toggle:after,.btn.btn-active-color-secondary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-secondary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-secondary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-secondary.dropdown-toggle:after{color:var(--bs-text-secondary)}.btn.btn-icon-secondary .svg-icon,.btn.btn-icon-secondary i{color:var(--bs-text-secondary)}.btn.btn-icon-secondary.dropdown-toggle:after{color:var(--bs-text-secondary)}.btn-check:active+.btn.btn-active-icon-secondary .svg-icon,.btn-check:active+.btn.btn-active-icon-secondary i,.btn-check:checked+.btn.btn-active-icon-secondary .svg-icon,.btn-check:checked+.btn.btn-active-icon-secondary i,.btn.btn-active-icon-secondary.active .svg-icon,.btn.btn-active-icon-secondary.active i,.btn.btn-active-icon-secondary.show .svg-icon,.btn.btn-active-icon-secondary.show i,.btn.btn-active-icon-secondary:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-secondary:active:not(.btn-active) i,.btn.btn-active-icon-secondary:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-secondary:focus:not(.btn-active) i,.btn.btn-active-icon-secondary:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-secondary:hover:not(.btn-active) i,.show>.btn.btn-active-icon-secondary .svg-icon,.show>.btn.btn-active-icon-secondary i{color:var(--bs-text-secondary)}.btn-check:active+.btn.btn-active-icon-secondary.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-secondary.dropdown-toggle:after,.btn.btn-active-icon-secondary.active.dropdown-toggle:after,.btn.btn-active-icon-secondary.show.dropdown-toggle:after,.btn.btn-active-icon-secondary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-secondary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-secondary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-secondary.dropdown-toggle:after{color:var(--bs-text-secondary)}.btn.btn-text-secondary{color:var(--bs-text-secondary)}.btn-check:active+.btn.btn-active-text-secondary,.btn-check:checked+.btn.btn-active-text-secondary,.btn.btn-active-text-secondary.active,.btn.btn-active-text-secondary.show,.btn.btn-active-text-secondary:active:not(.btn-active),.btn.btn-active-text-secondary:focus:not(.btn-active),.btn.btn-active-text-secondary:hover:not(.btn-active),.show>.btn.btn-active-text-secondary{color:var(--bs-text-secondary)}.btn.btn-color-light{color:var(--bs-text-light)}.btn.btn-color-light .svg-icon,.btn.btn-color-light i{color:var(--bs-text-light)}.btn.btn-color-light.dropdown-toggle:after{color:var(--bs-text-light)}.btn-check:active+.btn.btn-active-color-light,.btn-check:checked+.btn.btn-active-color-light,.btn.btn-active-color-light.active,.btn.btn-active-color-light.show,.btn.btn-active-color-light:active:not(.btn-active),.btn.btn-active-color-light:focus:not(.btn-active),.btn.btn-active-color-light:hover:not(.btn-active),.show>.btn.btn-active-color-light{color:var(--bs-text-light)}.btn-check:active+.btn.btn-active-color-light .svg-icon,.btn-check:active+.btn.btn-active-color-light i,.btn-check:checked+.btn.btn-active-color-light .svg-icon,.btn-check:checked+.btn.btn-active-color-light i,.btn.btn-active-color-light.active .svg-icon,.btn.btn-active-color-light.active i,.btn.btn-active-color-light.show .svg-icon,.btn.btn-active-color-light.show i,.btn.btn-active-color-light:active:not(.btn-active) .svg-icon,.btn.btn-active-color-light:active:not(.btn-active) i,.btn.btn-active-color-light:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-light:focus:not(.btn-active) i,.btn.btn-active-color-light:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-light:hover:not(.btn-active) i,.show>.btn.btn-active-color-light .svg-icon,.show>.btn.btn-active-color-light i{color:var(--bs-text-light)}.btn-check:active+.btn.btn-active-color-light.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-light.dropdown-toggle:after,.btn.btn-active-color-light.active.dropdown-toggle:after,.btn.btn-active-color-light.show.dropdown-toggle:after,.btn.btn-active-color-light:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-light:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-light:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-light.dropdown-toggle:after{color:var(--bs-text-light)}.btn.btn-icon-light .svg-icon,.btn.btn-icon-light i{color:var(--bs-text-light)}.btn.btn-icon-light.dropdown-toggle:after{color:var(--bs-text-light)}.btn-check:active+.btn.btn-active-icon-light .svg-icon,.btn-check:active+.btn.btn-active-icon-light i,.btn-check:checked+.btn.btn-active-icon-light .svg-icon,.btn-check:checked+.btn.btn-active-icon-light i,.btn.btn-active-icon-light.active .svg-icon,.btn.btn-active-icon-light.active i,.btn.btn-active-icon-light.show .svg-icon,.btn.btn-active-icon-light.show i,.btn.btn-active-icon-light:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-light:active:not(.btn-active) i,.btn.btn-active-icon-light:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-light:focus:not(.btn-active) i,.btn.btn-active-icon-light:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-light:hover:not(.btn-active) i,.show>.btn.btn-active-icon-light .svg-icon,.show>.btn.btn-active-icon-light i{color:var(--bs-text-light)}.btn-check:active+.btn.btn-active-icon-light.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-light.dropdown-toggle:after,.btn.btn-active-icon-light.active.dropdown-toggle:after,.btn.btn-active-icon-light.show.dropdown-toggle:after,.btn.btn-active-icon-light:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-light:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-light:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-light.dropdown-toggle:after{color:var(--bs-text-light)}.btn.btn-text-light{color:var(--bs-text-light)}.btn-check:active+.btn.btn-active-text-light,.btn-check:checked+.btn.btn-active-text-light,.btn.btn-active-text-light.active,.btn.btn-active-text-light.show,.btn.btn-active-text-light:active:not(.btn-active),.btn.btn-active-text-light:focus:not(.btn-active),.btn.btn-active-text-light:hover:not(.btn-active),.show>.btn.btn-active-text-light{color:var(--bs-text-light)}.btn.btn-color-success{color:var(--bs-text-success)}.btn.btn-color-success .svg-icon,.btn.btn-color-success i{color:var(--bs-text-success)}.btn.btn-color-success.dropdown-toggle:after{color:var(--bs-text-success)}.btn-check:active+.btn.btn-active-color-success,.btn-check:checked+.btn.btn-active-color-success,.btn.btn-active-color-success.active,.btn.btn-active-color-success.show,.btn.btn-active-color-success:active:not(.btn-active),.btn.btn-active-color-success:focus:not(.btn-active),.btn.btn-active-color-success:hover:not(.btn-active),.show>.btn.btn-active-color-success{color:var(--bs-text-success)}.btn-check:active+.btn.btn-active-color-success .svg-icon,.btn-check:active+.btn.btn-active-color-success i,.btn-check:checked+.btn.btn-active-color-success .svg-icon,.btn-check:checked+.btn.btn-active-color-success i,.btn.btn-active-color-success.active .svg-icon,.btn.btn-active-color-success.active i,.btn.btn-active-color-success.show .svg-icon,.btn.btn-active-color-success.show i,.btn.btn-active-color-success:active:not(.btn-active) .svg-icon,.btn.btn-active-color-success:active:not(.btn-active) i,.btn.btn-active-color-success:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-success:focus:not(.btn-active) i,.btn.btn-active-color-success:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-success:hover:not(.btn-active) i,.show>.btn.btn-active-color-success .svg-icon,.show>.btn.btn-active-color-success i{color:var(--bs-text-success)}.btn-check:active+.btn.btn-active-color-success.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-success.dropdown-toggle:after,.btn.btn-active-color-success.active.dropdown-toggle:after,.btn.btn-active-color-success.show.dropdown-toggle:after,.btn.btn-active-color-success:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-success:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-success:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-success.dropdown-toggle:after{color:var(--bs-text-success)}.btn.btn-icon-success .svg-icon,.btn.btn-icon-success i{color:var(--bs-text-success)}.btn.btn-icon-success.dropdown-toggle:after{color:var(--bs-text-success)}.btn-check:active+.btn.btn-active-icon-success .svg-icon,.btn-check:active+.btn.btn-active-icon-success i,.btn-check:checked+.btn.btn-active-icon-success .svg-icon,.btn-check:checked+.btn.btn-active-icon-success i,.btn.btn-active-icon-success.active .svg-icon,.btn.btn-active-icon-success.active i,.btn.btn-active-icon-success.show .svg-icon,.btn.btn-active-icon-success.show i,.btn.btn-active-icon-success:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-success:active:not(.btn-active) i,.btn.btn-active-icon-success:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-success:focus:not(.btn-active) i,.btn.btn-active-icon-success:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-success:hover:not(.btn-active) i,.show>.btn.btn-active-icon-success .svg-icon,.show>.btn.btn-active-icon-success i{color:var(--bs-text-success)}.btn-check:active+.btn.btn-active-icon-success.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-success.dropdown-toggle:after,.btn.btn-active-icon-success.active.dropdown-toggle:after,.btn.btn-active-icon-success.show.dropdown-toggle:after,.btn.btn-active-icon-success:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-success:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-success:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-success.dropdown-toggle:after{color:var(--bs-text-success)}.btn.btn-text-success{color:var(--bs-text-success)}.btn-check:active+.btn.btn-active-text-success,.btn-check:checked+.btn.btn-active-text-success,.btn.btn-active-text-success.active,.btn.btn-active-text-success.show,.btn.btn-active-text-success:active:not(.btn-active),.btn.btn-active-text-success:focus:not(.btn-active),.btn.btn-active-text-success:hover:not(.btn-active),.show>.btn.btn-active-text-success{color:var(--bs-text-success)}.btn.btn-color-info{color:var(--bs-text-info)}.btn.btn-color-info .svg-icon,.btn.btn-color-info i{color:var(--bs-text-info)}.btn.btn-color-info.dropdown-toggle:after{color:var(--bs-text-info)}.btn-check:active+.btn.btn-active-color-info,.btn-check:checked+.btn.btn-active-color-info,.btn.btn-active-color-info.active,.btn.btn-active-color-info.show,.btn.btn-active-color-info:active:not(.btn-active),.btn.btn-active-color-info:focus:not(.btn-active),.btn.btn-active-color-info:hover:not(.btn-active),.show>.btn.btn-active-color-info{color:var(--bs-text-info)}.btn-check:active+.btn.btn-active-color-info .svg-icon,.btn-check:active+.btn.btn-active-color-info i,.btn-check:checked+.btn.btn-active-color-info .svg-icon,.btn-check:checked+.btn.btn-active-color-info i,.btn.btn-active-color-info.active .svg-icon,.btn.btn-active-color-info.active i,.btn.btn-active-color-info.show .svg-icon,.btn.btn-active-color-info.show i,.btn.btn-active-color-info:active:not(.btn-active) .svg-icon,.btn.btn-active-color-info:active:not(.btn-active) i,.btn.btn-active-color-info:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-info:focus:not(.btn-active) i,.btn.btn-active-color-info:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-info:hover:not(.btn-active) i,.show>.btn.btn-active-color-info .svg-icon,.show>.btn.btn-active-color-info i{color:var(--bs-text-info)}.btn-check:active+.btn.btn-active-color-info.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-info.dropdown-toggle:after,.btn.btn-active-color-info.active.dropdown-toggle:after,.btn.btn-active-color-info.show.dropdown-toggle:after,.btn.btn-active-color-info:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-info:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-info:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-info.dropdown-toggle:after{color:var(--bs-text-info)}.btn.btn-icon-info .svg-icon,.btn.btn-icon-info i{color:var(--bs-text-info)}.btn.btn-icon-info.dropdown-toggle:after{color:var(--bs-text-info)}.btn-check:active+.btn.btn-active-icon-info .svg-icon,.btn-check:active+.btn.btn-active-icon-info i,.btn-check:checked+.btn.btn-active-icon-info .svg-icon,.btn-check:checked+.btn.btn-active-icon-info i,.btn.btn-active-icon-info.active .svg-icon,.btn.btn-active-icon-info.active i,.btn.btn-active-icon-info.show .svg-icon,.btn.btn-active-icon-info.show i,.btn.btn-active-icon-info:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-info:active:not(.btn-active) i,.btn.btn-active-icon-info:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-info:focus:not(.btn-active) i,.btn.btn-active-icon-info:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-info:hover:not(.btn-active) i,.show>.btn.btn-active-icon-info .svg-icon,.show>.btn.btn-active-icon-info i{color:var(--bs-text-info)}.btn-check:active+.btn.btn-active-icon-info.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-info.dropdown-toggle:after,.btn.btn-active-icon-info.active.dropdown-toggle:after,.btn.btn-active-icon-info.show.dropdown-toggle:after,.btn.btn-active-icon-info:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-info:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-info:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-info.dropdown-toggle:after{color:var(--bs-text-info)}.btn.btn-text-info{color:var(--bs-text-info)}.btn-check:active+.btn.btn-active-text-info,.btn-check:checked+.btn.btn-active-text-info,.btn.btn-active-text-info.active,.btn.btn-active-text-info.show,.btn.btn-active-text-info:active:not(.btn-active),.btn.btn-active-text-info:focus:not(.btn-active),.btn.btn-active-text-info:hover:not(.btn-active),.show>.btn.btn-active-text-info{color:var(--bs-text-info)}.btn.btn-color-warning{color:var(--bs-text-warning)}.btn.btn-color-warning .svg-icon,.btn.btn-color-warning i{color:var(--bs-text-warning)}.btn.btn-color-warning.dropdown-toggle:after{color:var(--bs-text-warning)}.btn-check:active+.btn.btn-active-color-warning,.btn-check:checked+.btn.btn-active-color-warning,.btn.btn-active-color-warning.active,.btn.btn-active-color-warning.show,.btn.btn-active-color-warning:active:not(.btn-active),.btn.btn-active-color-warning:focus:not(.btn-active),.btn.btn-active-color-warning:hover:not(.btn-active),.show>.btn.btn-active-color-warning{color:var(--bs-text-warning)}.btn-check:active+.btn.btn-active-color-warning .svg-icon,.btn-check:active+.btn.btn-active-color-warning i,.btn-check:checked+.btn.btn-active-color-warning .svg-icon,.btn-check:checked+.btn.btn-active-color-warning i,.btn.btn-active-color-warning.active .svg-icon,.btn.btn-active-color-warning.active i,.btn.btn-active-color-warning.show .svg-icon,.btn.btn-active-color-warning.show i,.btn.btn-active-color-warning:active:not(.btn-active) .svg-icon,.btn.btn-active-color-warning:active:not(.btn-active) i,.btn.btn-active-color-warning:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-warning:focus:not(.btn-active) i,.btn.btn-active-color-warning:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-warning:hover:not(.btn-active) i,.show>.btn.btn-active-color-warning .svg-icon,.show>.btn.btn-active-color-warning i{color:var(--bs-text-warning)}.btn-check:active+.btn.btn-active-color-warning.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-warning.dropdown-toggle:after,.btn.btn-active-color-warning.active.dropdown-toggle:after,.btn.btn-active-color-warning.show.dropdown-toggle:after,.btn.btn-active-color-warning:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-warning:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-warning:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-warning.dropdown-toggle:after{color:var(--bs-text-warning)}.btn.btn-icon-warning .svg-icon,.btn.btn-icon-warning i{color:var(--bs-text-warning)}.btn.btn-icon-warning.dropdown-toggle:after{color:var(--bs-text-warning)}.btn-check:active+.btn.btn-active-icon-warning .svg-icon,.btn-check:active+.btn.btn-active-icon-warning i,.btn-check:checked+.btn.btn-active-icon-warning .svg-icon,.btn-check:checked+.btn.btn-active-icon-warning i,.btn.btn-active-icon-warning.active .svg-icon,.btn.btn-active-icon-warning.active i,.btn.btn-active-icon-warning.show .svg-icon,.btn.btn-active-icon-warning.show i,.btn.btn-active-icon-warning:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-warning:active:not(.btn-active) i,.btn.btn-active-icon-warning:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-warning:focus:not(.btn-active) i,.btn.btn-active-icon-warning:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-warning:hover:not(.btn-active) i,.show>.btn.btn-active-icon-warning .svg-icon,.show>.btn.btn-active-icon-warning i{color:var(--bs-text-warning)}.btn-check:active+.btn.btn-active-icon-warning.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-warning.dropdown-toggle:after,.btn.btn-active-icon-warning.active.dropdown-toggle:after,.btn.btn-active-icon-warning.show.dropdown-toggle:after,.btn.btn-active-icon-warning:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-warning:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-warning:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-warning.dropdown-toggle:after{color:var(--bs-text-warning)}.btn.btn-text-warning{color:var(--bs-text-warning)}.btn-check:active+.btn.btn-active-text-warning,.btn-check:checked+.btn.btn-active-text-warning,.btn.btn-active-text-warning.active,.btn.btn-active-text-warning.show,.btn.btn-active-text-warning:active:not(.btn-active),.btn.btn-active-text-warning:focus:not(.btn-active),.btn.btn-active-text-warning:hover:not(.btn-active),.show>.btn.btn-active-text-warning{color:var(--bs-text-warning)}.btn.btn-color-danger{color:var(--bs-text-danger)}.btn.btn-color-danger .svg-icon,.btn.btn-color-danger i{color:var(--bs-text-danger)}.btn.btn-color-danger.dropdown-toggle:after{color:var(--bs-text-danger)}.btn-check:active+.btn.btn-active-color-danger,.btn-check:checked+.btn.btn-active-color-danger,.btn.btn-active-color-danger.active,.btn.btn-active-color-danger.show,.btn.btn-active-color-danger:active:not(.btn-active),.btn.btn-active-color-danger:focus:not(.btn-active),.btn.btn-active-color-danger:hover:not(.btn-active),.show>.btn.btn-active-color-danger{color:var(--bs-text-danger)}.btn-check:active+.btn.btn-active-color-danger .svg-icon,.btn-check:active+.btn.btn-active-color-danger i,.btn-check:checked+.btn.btn-active-color-danger .svg-icon,.btn-check:checked+.btn.btn-active-color-danger i,.btn.btn-active-color-danger.active .svg-icon,.btn.btn-active-color-danger.active i,.btn.btn-active-color-danger.show .svg-icon,.btn.btn-active-color-danger.show i,.btn.btn-active-color-danger:active:not(.btn-active) .svg-icon,.btn.btn-active-color-danger:active:not(.btn-active) i,.btn.btn-active-color-danger:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-danger:focus:not(.btn-active) i,.btn.btn-active-color-danger:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-danger:hover:not(.btn-active) i,.show>.btn.btn-active-color-danger .svg-icon,.show>.btn.btn-active-color-danger i{color:var(--bs-text-danger)}.btn-check:active+.btn.btn-active-color-danger.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-danger.dropdown-toggle:after,.btn.btn-active-color-danger.active.dropdown-toggle:after,.btn.btn-active-color-danger.show.dropdown-toggle:after,.btn.btn-active-color-danger:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-danger:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-danger:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-danger.dropdown-toggle:after{color:var(--bs-text-danger)}.btn.btn-icon-danger .svg-icon,.btn.btn-icon-danger i{color:var(--bs-text-danger)}.btn.btn-icon-danger.dropdown-toggle:after{color:var(--bs-text-danger)}.btn-check:active+.btn.btn-active-icon-danger .svg-icon,.btn-check:active+.btn.btn-active-icon-danger i,.btn-check:checked+.btn.btn-active-icon-danger .svg-icon,.btn-check:checked+.btn.btn-active-icon-danger i,.btn.btn-active-icon-danger.active .svg-icon,.btn.btn-active-icon-danger.active i,.btn.btn-active-icon-danger.show .svg-icon,.btn.btn-active-icon-danger.show i,.btn.btn-active-icon-danger:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-danger:active:not(.btn-active) i,.btn.btn-active-icon-danger:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-danger:focus:not(.btn-active) i,.btn.btn-active-icon-danger:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-danger:hover:not(.btn-active) i,.show>.btn.btn-active-icon-danger .svg-icon,.show>.btn.btn-active-icon-danger i{color:var(--bs-text-danger)}.btn-check:active+.btn.btn-active-icon-danger.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-danger.dropdown-toggle:after,.btn.btn-active-icon-danger.active.dropdown-toggle:after,.btn.btn-active-icon-danger.show.dropdown-toggle:after,.btn.btn-active-icon-danger:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-danger:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-danger:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-danger.dropdown-toggle:after{color:var(--bs-text-danger)}.btn.btn-text-danger{color:var(--bs-text-danger)}.btn-check:active+.btn.btn-active-text-danger,.btn-check:checked+.btn.btn-active-text-danger,.btn.btn-active-text-danger.active,.btn.btn-active-text-danger.show,.btn.btn-active-text-danger:active:not(.btn-active),.btn.btn-active-text-danger:focus:not(.btn-active),.btn.btn-active-text-danger:hover:not(.btn-active),.show>.btn.btn-active-text-danger{color:var(--bs-text-danger)}.btn.btn-color-dark{color:var(--bs-text-dark)}.btn.btn-color-dark .svg-icon,.btn.btn-color-dark i{color:var(--bs-text-dark)}.btn.btn-color-dark.dropdown-toggle:after{color:var(--bs-text-dark)}.btn-check:active+.btn.btn-active-color-dark,.btn-check:checked+.btn.btn-active-color-dark,.btn.btn-active-color-dark.active,.btn.btn-active-color-dark.show,.btn.btn-active-color-dark:active:not(.btn-active),.btn.btn-active-color-dark:focus:not(.btn-active),.btn.btn-active-color-dark:hover:not(.btn-active),.show>.btn.btn-active-color-dark{color:var(--bs-text-dark)}.btn-check:active+.btn.btn-active-color-dark .svg-icon,.btn-check:active+.btn.btn-active-color-dark i,.btn-check:checked+.btn.btn-active-color-dark .svg-icon,.btn-check:checked+.btn.btn-active-color-dark i,.btn.btn-active-color-dark.active .svg-icon,.btn.btn-active-color-dark.active i,.btn.btn-active-color-dark.show .svg-icon,.btn.btn-active-color-dark.show i,.btn.btn-active-color-dark:active:not(.btn-active) .svg-icon,.btn.btn-active-color-dark:active:not(.btn-active) i,.btn.btn-active-color-dark:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-dark:focus:not(.btn-active) i,.btn.btn-active-color-dark:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-dark:hover:not(.btn-active) i,.show>.btn.btn-active-color-dark .svg-icon,.show>.btn.btn-active-color-dark i{color:var(--bs-text-dark)}.btn-check:active+.btn.btn-active-color-dark.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-dark.dropdown-toggle:after,.btn.btn-active-color-dark.active.dropdown-toggle:after,.btn.btn-active-color-dark.show.dropdown-toggle:after,.btn.btn-active-color-dark:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-dark:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-dark:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-dark.dropdown-toggle:after{color:var(--bs-text-dark)}.btn.btn-icon-dark .svg-icon,.btn.btn-icon-dark i{color:var(--bs-text-dark)}.btn.btn-icon-dark.dropdown-toggle:after{color:var(--bs-text-dark)}.btn-check:active+.btn.btn-active-icon-dark .svg-icon,.btn-check:active+.btn.btn-active-icon-dark i,.btn-check:checked+.btn.btn-active-icon-dark .svg-icon,.btn-check:checked+.btn.btn-active-icon-dark i,.btn.btn-active-icon-dark.active .svg-icon,.btn.btn-active-icon-dark.active i,.btn.btn-active-icon-dark.show .svg-icon,.btn.btn-active-icon-dark.show i,.btn.btn-active-icon-dark:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-dark:active:not(.btn-active) i,.btn.btn-active-icon-dark:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-dark:focus:not(.btn-active) i,.btn.btn-active-icon-dark:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-dark:hover:not(.btn-active) i,.show>.btn.btn-active-icon-dark .svg-icon,.show>.btn.btn-active-icon-dark i{color:var(--bs-text-dark)}.btn-check:active+.btn.btn-active-icon-dark.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-dark.dropdown-toggle:after,.btn.btn-active-icon-dark.active.dropdown-toggle:after,.btn.btn-active-icon-dark.show.dropdown-toggle:after,.btn.btn-active-icon-dark:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-dark:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-dark:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-dark.dropdown-toggle:after{color:var(--bs-text-dark)}.btn.btn-text-dark{color:var(--bs-text-dark)}.btn-check:active+.btn.btn-active-text-dark,.btn-check:checked+.btn.btn-active-text-dark,.btn.btn-active-text-dark.active,.btn.btn-active-text-dark.show,.btn.btn-active-text-dark:active:not(.btn-active),.btn.btn-active-text-dark:focus:not(.btn-active),.btn.btn-active-text-dark:hover:not(.btn-active),.show>.btn.btn-active-text-dark{color:var(--bs-text-dark)}.btn.btn-color-muted{color:var(--bs-text-muted)}.btn.btn-color-muted .svg-icon,.btn.btn-color-muted i{color:var(--bs-text-muted)}.btn.btn-color-muted.dropdown-toggle:after{color:var(--bs-text-muted)}.btn-check:active+.btn.btn-active-color-muted,.btn-check:checked+.btn.btn-active-color-muted,.btn.btn-active-color-muted.active,.btn.btn-active-color-muted.show,.btn.btn-active-color-muted:active:not(.btn-active),.btn.btn-active-color-muted:focus:not(.btn-active),.btn.btn-active-color-muted:hover:not(.btn-active),.show>.btn.btn-active-color-muted{color:var(--bs-text-muted)}.btn-check:active+.btn.btn-active-color-muted .svg-icon,.btn-check:active+.btn.btn-active-color-muted i,.btn-check:checked+.btn.btn-active-color-muted .svg-icon,.btn-check:checked+.btn.btn-active-color-muted i,.btn.btn-active-color-muted.active .svg-icon,.btn.btn-active-color-muted.active i,.btn.btn-active-color-muted.show .svg-icon,.btn.btn-active-color-muted.show i,.btn.btn-active-color-muted:active:not(.btn-active) .svg-icon,.btn.btn-active-color-muted:active:not(.btn-active) i,.btn.btn-active-color-muted:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-muted:focus:not(.btn-active) i,.btn.btn-active-color-muted:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-muted:hover:not(.btn-active) i,.show>.btn.btn-active-color-muted .svg-icon,.show>.btn.btn-active-color-muted i{color:var(--bs-text-muted)}.btn-check:active+.btn.btn-active-color-muted.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-muted.dropdown-toggle:after,.btn.btn-active-color-muted.active.dropdown-toggle:after,.btn.btn-active-color-muted.show.dropdown-toggle:after,.btn.btn-active-color-muted:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-muted:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-muted:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-muted.dropdown-toggle:after{color:var(--bs-text-muted)}.btn.btn-icon-muted .svg-icon,.btn.btn-icon-muted i{color:var(--bs-text-muted)}.btn.btn-icon-muted.dropdown-toggle:after{color:var(--bs-text-muted)}.btn-check:active+.btn.btn-active-icon-muted .svg-icon,.btn-check:active+.btn.btn-active-icon-muted i,.btn-check:checked+.btn.btn-active-icon-muted .svg-icon,.btn-check:checked+.btn.btn-active-icon-muted i,.btn.btn-active-icon-muted.active .svg-icon,.btn.btn-active-icon-muted.active i,.btn.btn-active-icon-muted.show .svg-icon,.btn.btn-active-icon-muted.show i,.btn.btn-active-icon-muted:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-muted:active:not(.btn-active) i,.btn.btn-active-icon-muted:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-muted:focus:not(.btn-active) i,.btn.btn-active-icon-muted:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-muted:hover:not(.btn-active) i,.show>.btn.btn-active-icon-muted .svg-icon,.show>.btn.btn-active-icon-muted i{color:var(--bs-text-muted)}.btn-check:active+.btn.btn-active-icon-muted.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-muted.dropdown-toggle:after,.btn.btn-active-icon-muted.active.dropdown-toggle:after,.btn.btn-active-icon-muted.show.dropdown-toggle:after,.btn.btn-active-icon-muted:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-muted:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-muted:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-muted.dropdown-toggle:after{color:var(--bs-text-muted)}.btn.btn-text-muted{color:var(--bs-text-muted)}.btn-check:active+.btn.btn-active-text-muted,.btn-check:checked+.btn.btn-active-text-muted,.btn.btn-active-text-muted.active,.btn.btn-active-text-muted.show,.btn.btn-active-text-muted:active:not(.btn-active),.btn.btn-active-text-muted:focus:not(.btn-active),.btn.btn-active-text-muted:hover:not(.btn-active),.show>.btn.btn-active-text-muted{color:var(--bs-text-muted)}.btn.btn-color-gray-100{color:var(--bs-text-gray-100)}.btn.btn-color-gray-100 .svg-icon,.btn.btn-color-gray-100 i{color:var(--bs-text-gray-100)}.btn.btn-color-gray-100.dropdown-toggle:after{color:var(--bs-text-gray-100)}.btn-check:active+.btn.btn-active-color-gray-100,.btn-check:checked+.btn.btn-active-color-gray-100,.btn.btn-active-color-gray-100.active,.btn.btn-active-color-gray-100.show,.btn.btn-active-color-gray-100:active:not(.btn-active),.btn.btn-active-color-gray-100:focus:not(.btn-active),.btn.btn-active-color-gray-100:hover:not(.btn-active),.show>.btn.btn-active-color-gray-100{color:var(--bs-text-gray-100)}.btn-check:active+.btn.btn-active-color-gray-100 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-100 i,.btn-check:checked+.btn.btn-active-color-gray-100 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-100 i,.btn.btn-active-color-gray-100.active .svg-icon,.btn.btn-active-color-gray-100.active i,.btn.btn-active-color-gray-100.show .svg-icon,.btn.btn-active-color-gray-100.show i,.btn.btn-active-color-gray-100:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-100:active:not(.btn-active) i,.btn.btn-active-color-gray-100:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-100:focus:not(.btn-active) i,.btn.btn-active-color-gray-100:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-100:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-100 .svg-icon,.show>.btn.btn-active-color-gray-100 i{color:var(--bs-text-gray-100)}.btn-check:active+.btn.btn-active-color-gray-100.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-100.dropdown-toggle:after,.btn.btn-active-color-gray-100.active.dropdown-toggle:after,.btn.btn-active-color-gray-100.show.dropdown-toggle:after,.btn.btn-active-color-gray-100:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-100:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-100:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-100.dropdown-toggle:after{color:var(--bs-text-gray-100)}.btn.btn-icon-gray-100 .svg-icon,.btn.btn-icon-gray-100 i{color:var(--bs-text-gray-100)}.btn.btn-icon-gray-100.dropdown-toggle:after{color:var(--bs-text-gray-100)}.btn-check:active+.btn.btn-active-icon-gray-100 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-100 i,.btn-check:checked+.btn.btn-active-icon-gray-100 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-100 i,.btn.btn-active-icon-gray-100.active .svg-icon,.btn.btn-active-icon-gray-100.active i,.btn.btn-active-icon-gray-100.show .svg-icon,.btn.btn-active-icon-gray-100.show i,.btn.btn-active-icon-gray-100:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-100:active:not(.btn-active) i,.btn.btn-active-icon-gray-100:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-100:focus:not(.btn-active) i,.btn.btn-active-icon-gray-100:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-100:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-100 .svg-icon,.show>.btn.btn-active-icon-gray-100 i{color:var(--bs-text-gray-100)}.btn-check:active+.btn.btn-active-icon-gray-100.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-100.dropdown-toggle:after,.btn.btn-active-icon-gray-100.active.dropdown-toggle:after,.btn.btn-active-icon-gray-100.show.dropdown-toggle:after,.btn.btn-active-icon-gray-100:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-100:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-100:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-100.dropdown-toggle:after{color:var(--bs-text-gray-100)}.btn.btn-text-gray-100{color:var(--bs-text-gray-100)}.btn-check:active+.btn.btn-active-text-gray-100,.btn-check:checked+.btn.btn-active-text-gray-100,.btn.btn-active-text-gray-100.active,.btn.btn-active-text-gray-100.show,.btn.btn-active-text-gray-100:active:not(.btn-active),.btn.btn-active-text-gray-100:focus:not(.btn-active),.btn.btn-active-text-gray-100:hover:not(.btn-active),.show>.btn.btn-active-text-gray-100{color:var(--bs-text-gray-100)}.btn.btn-color-gray-200{color:var(--bs-text-gray-200)}.btn.btn-color-gray-200 .svg-icon,.btn.btn-color-gray-200 i{color:var(--bs-text-gray-200)}.btn.btn-color-gray-200.dropdown-toggle:after{color:var(--bs-text-gray-200)}.btn-check:active+.btn.btn-active-color-gray-200,.btn-check:checked+.btn.btn-active-color-gray-200,.btn.btn-active-color-gray-200.active,.btn.btn-active-color-gray-200.show,.btn.btn-active-color-gray-200:active:not(.btn-active),.btn.btn-active-color-gray-200:focus:not(.btn-active),.btn.btn-active-color-gray-200:hover:not(.btn-active),.show>.btn.btn-active-color-gray-200{color:var(--bs-text-gray-200)}.btn-check:active+.btn.btn-active-color-gray-200 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-200 i,.btn-check:checked+.btn.btn-active-color-gray-200 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-200 i,.btn.btn-active-color-gray-200.active .svg-icon,.btn.btn-active-color-gray-200.active i,.btn.btn-active-color-gray-200.show .svg-icon,.btn.btn-active-color-gray-200.show i,.btn.btn-active-color-gray-200:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-200:active:not(.btn-active) i,.btn.btn-active-color-gray-200:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-200:focus:not(.btn-active) i,.btn.btn-active-color-gray-200:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-200:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-200 .svg-icon,.show>.btn.btn-active-color-gray-200 i{color:var(--bs-text-gray-200)}.btn-check:active+.btn.btn-active-color-gray-200.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-200.dropdown-toggle:after,.btn.btn-active-color-gray-200.active.dropdown-toggle:after,.btn.btn-active-color-gray-200.show.dropdown-toggle:after,.btn.btn-active-color-gray-200:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-200:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-200:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-200.dropdown-toggle:after{color:var(--bs-text-gray-200)}.btn.btn-icon-gray-200 .svg-icon,.btn.btn-icon-gray-200 i{color:var(--bs-text-gray-200)}.btn.btn-icon-gray-200.dropdown-toggle:after{color:var(--bs-text-gray-200)}.btn-check:active+.btn.btn-active-icon-gray-200 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-200 i,.btn-check:checked+.btn.btn-active-icon-gray-200 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-200 i,.btn.btn-active-icon-gray-200.active .svg-icon,.btn.btn-active-icon-gray-200.active i,.btn.btn-active-icon-gray-200.show .svg-icon,.btn.btn-active-icon-gray-200.show i,.btn.btn-active-icon-gray-200:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-200:active:not(.btn-active) i,.btn.btn-active-icon-gray-200:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-200:focus:not(.btn-active) i,.btn.btn-active-icon-gray-200:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-200:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-200 .svg-icon,.show>.btn.btn-active-icon-gray-200 i{color:var(--bs-text-gray-200)}.btn-check:active+.btn.btn-active-icon-gray-200.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-200.dropdown-toggle:after,.btn.btn-active-icon-gray-200.active.dropdown-toggle:after,.btn.btn-active-icon-gray-200.show.dropdown-toggle:after,.btn.btn-active-icon-gray-200:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-200:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-200:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-200.dropdown-toggle:after{color:var(--bs-text-gray-200)}.btn.btn-text-gray-200{color:var(--bs-text-gray-200)}.btn-check:active+.btn.btn-active-text-gray-200,.btn-check:checked+.btn.btn-active-text-gray-200,.btn.btn-active-text-gray-200.active,.btn.btn-active-text-gray-200.show,.btn.btn-active-text-gray-200:active:not(.btn-active),.btn.btn-active-text-gray-200:focus:not(.btn-active),.btn.btn-active-text-gray-200:hover:not(.btn-active),.show>.btn.btn-active-text-gray-200{color:var(--bs-text-gray-200)}.btn.btn-color-gray-300{color:var(--bs-text-gray-300)}.btn.btn-color-gray-300 .svg-icon,.btn.btn-color-gray-300 i{color:var(--bs-text-gray-300)}.btn.btn-color-gray-300.dropdown-toggle:after{color:var(--bs-text-gray-300)}.btn-check:active+.btn.btn-active-color-gray-300,.btn-check:checked+.btn.btn-active-color-gray-300,.btn.btn-active-color-gray-300.active,.btn.btn-active-color-gray-300.show,.btn.btn-active-color-gray-300:active:not(.btn-active),.btn.btn-active-color-gray-300:focus:not(.btn-active),.btn.btn-active-color-gray-300:hover:not(.btn-active),.show>.btn.btn-active-color-gray-300{color:var(--bs-text-gray-300)}.btn-check:active+.btn.btn-active-color-gray-300 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-300 i,.btn-check:checked+.btn.btn-active-color-gray-300 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-300 i,.btn.btn-active-color-gray-300.active .svg-icon,.btn.btn-active-color-gray-300.active i,.btn.btn-active-color-gray-300.show .svg-icon,.btn.btn-active-color-gray-300.show i,.btn.btn-active-color-gray-300:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-300:active:not(.btn-active) i,.btn.btn-active-color-gray-300:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-300:focus:not(.btn-active) i,.btn.btn-active-color-gray-300:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-300:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-300 .svg-icon,.show>.btn.btn-active-color-gray-300 i{color:var(--bs-text-gray-300)}.btn-check:active+.btn.btn-active-color-gray-300.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-300.dropdown-toggle:after,.btn.btn-active-color-gray-300.active.dropdown-toggle:after,.btn.btn-active-color-gray-300.show.dropdown-toggle:after,.btn.btn-active-color-gray-300:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-300:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-300:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-300.dropdown-toggle:after{color:var(--bs-text-gray-300)}.btn.btn-icon-gray-300 .svg-icon,.btn.btn-icon-gray-300 i{color:var(--bs-text-gray-300)}.btn.btn-icon-gray-300.dropdown-toggle:after{color:var(--bs-text-gray-300)}.btn-check:active+.btn.btn-active-icon-gray-300 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-300 i,.btn-check:checked+.btn.btn-active-icon-gray-300 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-300 i,.btn.btn-active-icon-gray-300.active .svg-icon,.btn.btn-active-icon-gray-300.active i,.btn.btn-active-icon-gray-300.show .svg-icon,.btn.btn-active-icon-gray-300.show i,.btn.btn-active-icon-gray-300:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-300:active:not(.btn-active) i,.btn.btn-active-icon-gray-300:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-300:focus:not(.btn-active) i,.btn.btn-active-icon-gray-300:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-300:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-300 .svg-icon,.show>.btn.btn-active-icon-gray-300 i{color:var(--bs-text-gray-300)}.btn-check:active+.btn.btn-active-icon-gray-300.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-300.dropdown-toggle:after,.btn.btn-active-icon-gray-300.active.dropdown-toggle:after,.btn.btn-active-icon-gray-300.show.dropdown-toggle:after,.btn.btn-active-icon-gray-300:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-300:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-300:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-300.dropdown-toggle:after{color:var(--bs-text-gray-300)}.btn.btn-text-gray-300{color:var(--bs-text-gray-300)}.btn-check:active+.btn.btn-active-text-gray-300,.btn-check:checked+.btn.btn-active-text-gray-300,.btn.btn-active-text-gray-300.active,.btn.btn-active-text-gray-300.show,.btn.btn-active-text-gray-300:active:not(.btn-active),.btn.btn-active-text-gray-300:focus:not(.btn-active),.btn.btn-active-text-gray-300:hover:not(.btn-active),.show>.btn.btn-active-text-gray-300{color:var(--bs-text-gray-300)}.btn.btn-color-gray-400{color:var(--bs-text-gray-400)}.btn.btn-color-gray-400 .svg-icon,.btn.btn-color-gray-400 i{color:var(--bs-text-gray-400)}.btn.btn-color-gray-400.dropdown-toggle:after{color:var(--bs-text-gray-400)}.btn-check:active+.btn.btn-active-color-gray-400,.btn-check:checked+.btn.btn-active-color-gray-400,.btn.btn-active-color-gray-400.active,.btn.btn-active-color-gray-400.show,.btn.btn-active-color-gray-400:active:not(.btn-active),.btn.btn-active-color-gray-400:focus:not(.btn-active),.btn.btn-active-color-gray-400:hover:not(.btn-active),.show>.btn.btn-active-color-gray-400{color:var(--bs-text-gray-400)}.btn-check:active+.btn.btn-active-color-gray-400 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-400 i,.btn-check:checked+.btn.btn-active-color-gray-400 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-400 i,.btn.btn-active-color-gray-400.active .svg-icon,.btn.btn-active-color-gray-400.active i,.btn.btn-active-color-gray-400.show .svg-icon,.btn.btn-active-color-gray-400.show i,.btn.btn-active-color-gray-400:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-400:active:not(.btn-active) i,.btn.btn-active-color-gray-400:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-400:focus:not(.btn-active) i,.btn.btn-active-color-gray-400:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-400:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-400 .svg-icon,.show>.btn.btn-active-color-gray-400 i{color:var(--bs-text-gray-400)}.btn-check:active+.btn.btn-active-color-gray-400.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-400.dropdown-toggle:after,.btn.btn-active-color-gray-400.active.dropdown-toggle:after,.btn.btn-active-color-gray-400.show.dropdown-toggle:after,.btn.btn-active-color-gray-400:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-400:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-400:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-400.dropdown-toggle:after{color:var(--bs-text-gray-400)}.btn.btn-icon-gray-400 .svg-icon,.btn.btn-icon-gray-400 i{color:var(--bs-text-gray-400)}.btn.btn-icon-gray-400.dropdown-toggle:after{color:var(--bs-text-gray-400)}.btn-check:active+.btn.btn-active-icon-gray-400 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-400 i,.btn-check:checked+.btn.btn-active-icon-gray-400 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-400 i,.btn.btn-active-icon-gray-400.active .svg-icon,.btn.btn-active-icon-gray-400.active i,.btn.btn-active-icon-gray-400.show .svg-icon,.btn.btn-active-icon-gray-400.show i,.btn.btn-active-icon-gray-400:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-400:active:not(.btn-active) i,.btn.btn-active-icon-gray-400:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-400:focus:not(.btn-active) i,.btn.btn-active-icon-gray-400:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-400:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-400 .svg-icon,.show>.btn.btn-active-icon-gray-400 i{color:var(--bs-text-gray-400)}.btn-check:active+.btn.btn-active-icon-gray-400.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-400.dropdown-toggle:after,.btn.btn-active-icon-gray-400.active.dropdown-toggle:after,.btn.btn-active-icon-gray-400.show.dropdown-toggle:after,.btn.btn-active-icon-gray-400:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-400:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-400:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-400.dropdown-toggle:after{color:var(--bs-text-gray-400)}.btn.btn-text-gray-400{color:var(--bs-text-gray-400)}.btn-check:active+.btn.btn-active-text-gray-400,.btn-check:checked+.btn.btn-active-text-gray-400,.btn.btn-active-text-gray-400.active,.btn.btn-active-text-gray-400.show,.btn.btn-active-text-gray-400:active:not(.btn-active),.btn.btn-active-text-gray-400:focus:not(.btn-active),.btn.btn-active-text-gray-400:hover:not(.btn-active),.show>.btn.btn-active-text-gray-400{color:var(--bs-text-gray-400)}.btn.btn-color-gray-500{color:var(--bs-text-gray-500)}.btn.btn-color-gray-500 .svg-icon,.btn.btn-color-gray-500 i{color:var(--bs-text-gray-500)}.btn.btn-color-gray-500.dropdown-toggle:after{color:var(--bs-text-gray-500)}.btn-check:active+.btn.btn-active-color-gray-500,.btn-check:checked+.btn.btn-active-color-gray-500,.btn.btn-active-color-gray-500.active,.btn.btn-active-color-gray-500.show,.btn.btn-active-color-gray-500:active:not(.btn-active),.btn.btn-active-color-gray-500:focus:not(.btn-active),.btn.btn-active-color-gray-500:hover:not(.btn-active),.show>.btn.btn-active-color-gray-500{color:var(--bs-text-gray-500)}.btn-check:active+.btn.btn-active-color-gray-500 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-500 i,.btn-check:checked+.btn.btn-active-color-gray-500 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-500 i,.btn.btn-active-color-gray-500.active .svg-icon,.btn.btn-active-color-gray-500.active i,.btn.btn-active-color-gray-500.show .svg-icon,.btn.btn-active-color-gray-500.show i,.btn.btn-active-color-gray-500:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-500:active:not(.btn-active) i,.btn.btn-active-color-gray-500:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-500:focus:not(.btn-active) i,.btn.btn-active-color-gray-500:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-500:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-500 .svg-icon,.show>.btn.btn-active-color-gray-500 i{color:var(--bs-text-gray-500)}.btn-check:active+.btn.btn-active-color-gray-500.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-500.dropdown-toggle:after,.btn.btn-active-color-gray-500.active.dropdown-toggle:after,.btn.btn-active-color-gray-500.show.dropdown-toggle:after,.btn.btn-active-color-gray-500:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-500:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-500:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-500.dropdown-toggle:after{color:var(--bs-text-gray-500)}.btn.btn-icon-gray-500 .svg-icon,.btn.btn-icon-gray-500 i{color:var(--bs-text-gray-500)}.btn.btn-icon-gray-500.dropdown-toggle:after{color:var(--bs-text-gray-500)}.btn-check:active+.btn.btn-active-icon-gray-500 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-500 i,.btn-check:checked+.btn.btn-active-icon-gray-500 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-500 i,.btn.btn-active-icon-gray-500.active .svg-icon,.btn.btn-active-icon-gray-500.active i,.btn.btn-active-icon-gray-500.show .svg-icon,.btn.btn-active-icon-gray-500.show i,.btn.btn-active-icon-gray-500:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-500:active:not(.btn-active) i,.btn.btn-active-icon-gray-500:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-500:focus:not(.btn-active) i,.btn.btn-active-icon-gray-500:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-500:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-500 .svg-icon,.show>.btn.btn-active-icon-gray-500 i{color:var(--bs-text-gray-500)}.btn-check:active+.btn.btn-active-icon-gray-500.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-500.dropdown-toggle:after,.btn.btn-active-icon-gray-500.active.dropdown-toggle:after,.btn.btn-active-icon-gray-500.show.dropdown-toggle:after,.btn.btn-active-icon-gray-500:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-500:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-500:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-500.dropdown-toggle:after{color:var(--bs-text-gray-500)}.btn.btn-text-gray-500{color:var(--bs-text-gray-500)}.btn-check:active+.btn.btn-active-text-gray-500,.btn-check:checked+.btn.btn-active-text-gray-500,.btn.btn-active-text-gray-500.active,.btn.btn-active-text-gray-500.show,.btn.btn-active-text-gray-500:active:not(.btn-active),.btn.btn-active-text-gray-500:focus:not(.btn-active),.btn.btn-active-text-gray-500:hover:not(.btn-active),.show>.btn.btn-active-text-gray-500{color:var(--bs-text-gray-500)}.btn.btn-color-gray-600{color:var(--bs-text-gray-600)}.btn.btn-color-gray-600 .svg-icon,.btn.btn-color-gray-600 i{color:var(--bs-text-gray-600)}.btn.btn-color-gray-600.dropdown-toggle:after{color:var(--bs-text-gray-600)}.btn-check:active+.btn.btn-active-color-gray-600,.btn-check:checked+.btn.btn-active-color-gray-600,.btn.btn-active-color-gray-600.active,.btn.btn-active-color-gray-600.show,.btn.btn-active-color-gray-600:active:not(.btn-active),.btn.btn-active-color-gray-600:focus:not(.btn-active),.btn.btn-active-color-gray-600:hover:not(.btn-active),.show>.btn.btn-active-color-gray-600{color:var(--bs-text-gray-600)}.btn-check:active+.btn.btn-active-color-gray-600 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-600 i,.btn-check:checked+.btn.btn-active-color-gray-600 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-600 i,.btn.btn-active-color-gray-600.active .svg-icon,.btn.btn-active-color-gray-600.active i,.btn.btn-active-color-gray-600.show .svg-icon,.btn.btn-active-color-gray-600.show i,.btn.btn-active-color-gray-600:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-600:active:not(.btn-active) i,.btn.btn-active-color-gray-600:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-600:focus:not(.btn-active) i,.btn.btn-active-color-gray-600:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-600:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-600 .svg-icon,.show>.btn.btn-active-color-gray-600 i{color:var(--bs-text-gray-600)}.btn-check:active+.btn.btn-active-color-gray-600.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-600.dropdown-toggle:after,.btn.btn-active-color-gray-600.active.dropdown-toggle:after,.btn.btn-active-color-gray-600.show.dropdown-toggle:after,.btn.btn-active-color-gray-600:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-600:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-600:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-600.dropdown-toggle:after{color:var(--bs-text-gray-600)}.btn.btn-icon-gray-600 .svg-icon,.btn.btn-icon-gray-600 i{color:var(--bs-text-gray-600)}.btn.btn-icon-gray-600.dropdown-toggle:after{color:var(--bs-text-gray-600)}.btn-check:active+.btn.btn-active-icon-gray-600 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-600 i,.btn-check:checked+.btn.btn-active-icon-gray-600 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-600 i,.btn.btn-active-icon-gray-600.active .svg-icon,.btn.btn-active-icon-gray-600.active i,.btn.btn-active-icon-gray-600.show .svg-icon,.btn.btn-active-icon-gray-600.show i,.btn.btn-active-icon-gray-600:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-600:active:not(.btn-active) i,.btn.btn-active-icon-gray-600:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-600:focus:not(.btn-active) i,.btn.btn-active-icon-gray-600:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-600:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-600 .svg-icon,.show>.btn.btn-active-icon-gray-600 i{color:var(--bs-text-gray-600)}.btn-check:active+.btn.btn-active-icon-gray-600.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-600.dropdown-toggle:after,.btn.btn-active-icon-gray-600.active.dropdown-toggle:after,.btn.btn-active-icon-gray-600.show.dropdown-toggle:after,.btn.btn-active-icon-gray-600:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-600:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-600:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-600.dropdown-toggle:after{color:var(--bs-text-gray-600)}.btn.btn-text-gray-600{color:var(--bs-text-gray-600)}.btn-check:active+.btn.btn-active-text-gray-600,.btn-check:checked+.btn.btn-active-text-gray-600,.btn.btn-active-text-gray-600.active,.btn.btn-active-text-gray-600.show,.btn.btn-active-text-gray-600:active:not(.btn-active),.btn.btn-active-text-gray-600:focus:not(.btn-active),.btn.btn-active-text-gray-600:hover:not(.btn-active),.show>.btn.btn-active-text-gray-600{color:var(--bs-text-gray-600)}.btn.btn-color-gray-700{color:var(--bs-text-gray-700)}.btn.btn-color-gray-700 .svg-icon,.btn.btn-color-gray-700 i{color:var(--bs-text-gray-700)}.btn.btn-color-gray-700.dropdown-toggle:after{color:var(--bs-text-gray-700)}.btn-check:active+.btn.btn-active-color-gray-700,.btn-check:checked+.btn.btn-active-color-gray-700,.btn.btn-active-color-gray-700.active,.btn.btn-active-color-gray-700.show,.btn.btn-active-color-gray-700:active:not(.btn-active),.btn.btn-active-color-gray-700:focus:not(.btn-active),.btn.btn-active-color-gray-700:hover:not(.btn-active),.show>.btn.btn-active-color-gray-700{color:var(--bs-text-gray-700)}.btn-check:active+.btn.btn-active-color-gray-700 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-700 i,.btn-check:checked+.btn.btn-active-color-gray-700 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-700 i,.btn.btn-active-color-gray-700.active .svg-icon,.btn.btn-active-color-gray-700.active i,.btn.btn-active-color-gray-700.show .svg-icon,.btn.btn-active-color-gray-700.show i,.btn.btn-active-color-gray-700:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-700:active:not(.btn-active) i,.btn.btn-active-color-gray-700:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-700:focus:not(.btn-active) i,.btn.btn-active-color-gray-700:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-700:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-700 .svg-icon,.show>.btn.btn-active-color-gray-700 i{color:var(--bs-text-gray-700)}.btn-check:active+.btn.btn-active-color-gray-700.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-700.dropdown-toggle:after,.btn.btn-active-color-gray-700.active.dropdown-toggle:after,.btn.btn-active-color-gray-700.show.dropdown-toggle:after,.btn.btn-active-color-gray-700:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-700:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-700:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-700.dropdown-toggle:after{color:var(--bs-text-gray-700)}.btn.btn-icon-gray-700 .svg-icon,.btn.btn-icon-gray-700 i{color:var(--bs-text-gray-700)}.btn.btn-icon-gray-700.dropdown-toggle:after{color:var(--bs-text-gray-700)}.btn-check:active+.btn.btn-active-icon-gray-700 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-700 i,.btn-check:checked+.btn.btn-active-icon-gray-700 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-700 i,.btn.btn-active-icon-gray-700.active .svg-icon,.btn.btn-active-icon-gray-700.active i,.btn.btn-active-icon-gray-700.show .svg-icon,.btn.btn-active-icon-gray-700.show i,.btn.btn-active-icon-gray-700:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-700:active:not(.btn-active) i,.btn.btn-active-icon-gray-700:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-700:focus:not(.btn-active) i,.btn.btn-active-icon-gray-700:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-700:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-700 .svg-icon,.show>.btn.btn-active-icon-gray-700 i{color:var(--bs-text-gray-700)}.btn-check:active+.btn.btn-active-icon-gray-700.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-700.dropdown-toggle:after,.btn.btn-active-icon-gray-700.active.dropdown-toggle:after,.btn.btn-active-icon-gray-700.show.dropdown-toggle:after,.btn.btn-active-icon-gray-700:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-700:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-700:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-700.dropdown-toggle:after{color:var(--bs-text-gray-700)}.btn.btn-text-gray-700{color:var(--bs-text-gray-700)}.btn-check:active+.btn.btn-active-text-gray-700,.btn-check:checked+.btn.btn-active-text-gray-700,.btn.btn-active-text-gray-700.active,.btn.btn-active-text-gray-700.show,.btn.btn-active-text-gray-700:active:not(.btn-active),.btn.btn-active-text-gray-700:focus:not(.btn-active),.btn.btn-active-text-gray-700:hover:not(.btn-active),.show>.btn.btn-active-text-gray-700{color:var(--bs-text-gray-700)}.btn.btn-color-gray-800{color:var(--bs-text-gray-800)}.btn.btn-color-gray-800 .svg-icon,.btn.btn-color-gray-800 i{color:var(--bs-text-gray-800)}.btn.btn-color-gray-800.dropdown-toggle:after{color:var(--bs-text-gray-800)}.btn-check:active+.btn.btn-active-color-gray-800,.btn-check:checked+.btn.btn-active-color-gray-800,.btn.btn-active-color-gray-800.active,.btn.btn-active-color-gray-800.show,.btn.btn-active-color-gray-800:active:not(.btn-active),.btn.btn-active-color-gray-800:focus:not(.btn-active),.btn.btn-active-color-gray-800:hover:not(.btn-active),.show>.btn.btn-active-color-gray-800{color:var(--bs-text-gray-800)}.btn-check:active+.btn.btn-active-color-gray-800 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-800 i,.btn-check:checked+.btn.btn-active-color-gray-800 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-800 i,.btn.btn-active-color-gray-800.active .svg-icon,.btn.btn-active-color-gray-800.active i,.btn.btn-active-color-gray-800.show .svg-icon,.btn.btn-active-color-gray-800.show i,.btn.btn-active-color-gray-800:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-800:active:not(.btn-active) i,.btn.btn-active-color-gray-800:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-800:focus:not(.btn-active) i,.btn.btn-active-color-gray-800:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-800:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-800 .svg-icon,.show>.btn.btn-active-color-gray-800 i{color:var(--bs-text-gray-800)}.btn-check:active+.btn.btn-active-color-gray-800.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-800.dropdown-toggle:after,.btn.btn-active-color-gray-800.active.dropdown-toggle:after,.btn.btn-active-color-gray-800.show.dropdown-toggle:after,.btn.btn-active-color-gray-800:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-800:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-800:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-800.dropdown-toggle:after{color:var(--bs-text-gray-800)}.btn.btn-icon-gray-800 .svg-icon,.btn.btn-icon-gray-800 i{color:var(--bs-text-gray-800)}.btn.btn-icon-gray-800.dropdown-toggle:after{color:var(--bs-text-gray-800)}.btn-check:active+.btn.btn-active-icon-gray-800 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-800 i,.btn-check:checked+.btn.btn-active-icon-gray-800 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-800 i,.btn.btn-active-icon-gray-800.active .svg-icon,.btn.btn-active-icon-gray-800.active i,.btn.btn-active-icon-gray-800.show .svg-icon,.btn.btn-active-icon-gray-800.show i,.btn.btn-active-icon-gray-800:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-800:active:not(.btn-active) i,.btn.btn-active-icon-gray-800:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-800:focus:not(.btn-active) i,.btn.btn-active-icon-gray-800:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-800:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-800 .svg-icon,.show>.btn.btn-active-icon-gray-800 i{color:var(--bs-text-gray-800)}.btn-check:active+.btn.btn-active-icon-gray-800.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-800.dropdown-toggle:after,.btn.btn-active-icon-gray-800.active.dropdown-toggle:after,.btn.btn-active-icon-gray-800.show.dropdown-toggle:after,.btn.btn-active-icon-gray-800:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-800:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-800:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-800.dropdown-toggle:after{color:var(--bs-text-gray-800)}.btn.btn-text-gray-800{color:var(--bs-text-gray-800)}.btn-check:active+.btn.btn-active-text-gray-800,.btn-check:checked+.btn.btn-active-text-gray-800,.btn.btn-active-text-gray-800.active,.btn.btn-active-text-gray-800.show,.btn.btn-active-text-gray-800:active:not(.btn-active),.btn.btn-active-text-gray-800:focus:not(.btn-active),.btn.btn-active-text-gray-800:hover:not(.btn-active),.show>.btn.btn-active-text-gray-800{color:var(--bs-text-gray-800)}.btn.btn-color-gray-900{color:var(--bs-text-gray-900)}.btn.btn-color-gray-900 .svg-icon,.btn.btn-color-gray-900 i{color:var(--bs-text-gray-900)}.btn.btn-color-gray-900.dropdown-toggle:after{color:var(--bs-text-gray-900)}.btn-check:active+.btn.btn-active-color-gray-900,.btn-check:checked+.btn.btn-active-color-gray-900,.btn.btn-active-color-gray-900.active,.btn.btn-active-color-gray-900.show,.btn.btn-active-color-gray-900:active:not(.btn-active),.btn.btn-active-color-gray-900:focus:not(.btn-active),.btn.btn-active-color-gray-900:hover:not(.btn-active),.show>.btn.btn-active-color-gray-900{color:var(--bs-text-gray-900)}.btn-check:active+.btn.btn-active-color-gray-900 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-900 i,.btn-check:checked+.btn.btn-active-color-gray-900 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-900 i,.btn.btn-active-color-gray-900.active .svg-icon,.btn.btn-active-color-gray-900.active i,.btn.btn-active-color-gray-900.show .svg-icon,.btn.btn-active-color-gray-900.show i,.btn.btn-active-color-gray-900:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-900:active:not(.btn-active) i,.btn.btn-active-color-gray-900:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-900:focus:not(.btn-active) i,.btn.btn-active-color-gray-900:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-900:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-900 .svg-icon,.show>.btn.btn-active-color-gray-900 i{color:var(--bs-text-gray-900)}.btn-check:active+.btn.btn-active-color-gray-900.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-900.dropdown-toggle:after,.btn.btn-active-color-gray-900.active.dropdown-toggle:after,.btn.btn-active-color-gray-900.show.dropdown-toggle:after,.btn.btn-active-color-gray-900:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-900:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-900:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-900.dropdown-toggle:after{color:var(--bs-text-gray-900)}.btn.btn-icon-gray-900 .svg-icon,.btn.btn-icon-gray-900 i{color:var(--bs-text-gray-900)}.btn.btn-icon-gray-900.dropdown-toggle:after{color:var(--bs-text-gray-900)}.btn-check:active+.btn.btn-active-icon-gray-900 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-900 i,.btn-check:checked+.btn.btn-active-icon-gray-900 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-900 i,.btn.btn-active-icon-gray-900.active .svg-icon,.btn.btn-active-icon-gray-900.active i,.btn.btn-active-icon-gray-900.show .svg-icon,.btn.btn-active-icon-gray-900.show i,.btn.btn-active-icon-gray-900:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-900:active:not(.btn-active) i,.btn.btn-active-icon-gray-900:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-900:focus:not(.btn-active) i,.btn.btn-active-icon-gray-900:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-900:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-900 .svg-icon,.show>.btn.btn-active-icon-gray-900 i{color:var(--bs-text-gray-900)}.btn-check:active+.btn.btn-active-icon-gray-900.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-900.dropdown-toggle:after,.btn.btn-active-icon-gray-900.active.dropdown-toggle:after,.btn.btn-active-icon-gray-900.show.dropdown-toggle:after,.btn.btn-active-icon-gray-900:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-900:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-900:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-900.dropdown-toggle:after{color:var(--bs-text-gray-900)}.btn.btn-text-gray-900{color:var(--bs-text-gray-900)}.btn-check:active+.btn.btn-active-text-gray-900,.btn-check:checked+.btn.btn-active-text-gray-900,.btn.btn-active-text-gray-900.active,.btn.btn-active-text-gray-900.show,.btn.btn-active-text-gray-900:active:not(.btn-active),.btn.btn-active-text-gray-900:focus:not(.btn-active),.btn.btn-active-text-gray-900:hover:not(.btn-active),.show>.btn.btn-active-text-gray-900{color:var(--bs-text-gray-900)}.btn.btn-facebook{color:#fff;border-color:#3b5998;background-color:#3b5998}.btn.btn-facebook .svg-icon,.btn.btn-facebook i{color:#fff}.btn.btn-facebook.dropdown-toggle:after{color:#fff}.btn-check:active+.btn.btn-facebook,.btn-check:checked+.btn.btn-facebook,.btn.btn-facebook.active,.btn.btn-facebook.show,.btn.btn-facebook:active:not(.btn-active),.btn.btn-facebook:focus:not(.btn-active),.btn.btn-facebook:hover:not(.btn-active),.show>.btn.btn-facebook{border-color:#30497c;background-color:#30497c!important}.btn.btn-light-facebook{color:var(--bs-facebook);color:#3b5998;border-color:rgba(59,89,152,.1);background-color:rgba(59,89,152,.1)}.btn.btn-light-facebook .svg-icon,.btn.btn-light-facebook i{color:#3b5998}.btn.btn-light-facebook.dropdown-toggle:after{color:#3b5998}.btn-check:active+.btn.btn-light-facebook,.btn-check:checked+.btn.btn-light-facebook,.btn.btn-light-facebook.active,.btn.btn-light-facebook.show,.btn.btn-light-facebook:active:not(.btn-active),.btn.btn-light-facebook:focus:not(.btn-active),.btn.btn-light-facebook:hover:not(.btn-active),.show>.btn.btn-light-facebook{color:#fff;border-color:#3b5998;background-color:#3b5998!important}.btn-check:active+.btn.btn-light-facebook .svg-icon,.btn-check:active+.btn.btn-light-facebook i,.btn-check:checked+.btn.btn-light-facebook .svg-icon,.btn-check:checked+.btn.btn-light-facebook i,.btn.btn-light-facebook.active .svg-icon,.btn.btn-light-facebook.active i,.btn.btn-light-facebook.show .svg-icon,.btn.btn-light-facebook.show i,.btn.btn-light-facebook:active:not(.btn-active) .svg-icon,.btn.btn-light-facebook:active:not(.btn-active) i,.btn.btn-light-facebook:focus:not(.btn-active) .svg-icon,.btn.btn-light-facebook:focus:not(.btn-active) i,.btn.btn-light-facebook:hover:not(.btn-active) .svg-icon,.btn.btn-light-facebook:hover:not(.btn-active) i,.show>.btn.btn-light-facebook .svg-icon,.show>.btn.btn-light-facebook i{color:#fff}.btn-check:active+.btn.btn-light-facebook.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-facebook.dropdown-toggle:after,.btn.btn-light-facebook.active.dropdown-toggle:after,.btn.btn-light-facebook.show.dropdown-toggle:after,.btn.btn-light-facebook:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-facebook:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-facebook:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-facebook.dropdown-toggle:after{color:#fff}.btn.btn-google{color:#fff;border-color:#dd4b39;background-color:#dd4b39}.btn.btn-google .svg-icon,.btn.btn-google i{color:#fff}.btn.btn-google.dropdown-toggle:after{color:#fff}.btn-check:active+.btn.btn-google,.btn-check:checked+.btn.btn-google,.btn.btn-google.active,.btn.btn-google.show,.btn.btn-google:active:not(.btn-active),.btn.btn-google:focus:not(.btn-active),.btn.btn-google:hover:not(.btn-active),.show>.btn.btn-google{border-color:#cd3623;background-color:#cd3623!important}.btn.btn-light-google{color:var(--bs-google);color:#dd4b39;border-color:rgba(221,75,57,.1);background-color:rgba(221,75,57,.1)}.btn.btn-light-google .svg-icon,.btn.btn-light-google i{color:#dd4b39}.btn.btn-light-google.dropdown-toggle:after{color:#dd4b39}.btn-check:active+.btn.btn-light-google,.btn-check:checked+.btn.btn-light-google,.btn.btn-light-google.active,.btn.btn-light-google.show,.btn.btn-light-google:active:not(.btn-active),.btn.btn-light-google:focus:not(.btn-active),.btn.btn-light-google:hover:not(.btn-active),.show>.btn.btn-light-google{color:#fff;border-color:#dd4b39;background-color:#dd4b39!important}.btn-check:active+.btn.btn-light-google .svg-icon,.btn-check:active+.btn.btn-light-google i,.btn-check:checked+.btn.btn-light-google .svg-icon,.btn-check:checked+.btn.btn-light-google i,.btn.btn-light-google.active .svg-icon,.btn.btn-light-google.active i,.btn.btn-light-google.show .svg-icon,.btn.btn-light-google.show i,.btn.btn-light-google:active:not(.btn-active) .svg-icon,.btn.btn-light-google:active:not(.btn-active) i,.btn.btn-light-google:focus:not(.btn-active) .svg-icon,.btn.btn-light-google:focus:not(.btn-active) i,.btn.btn-light-google:hover:not(.btn-active) .svg-icon,.btn.btn-light-google:hover:not(.btn-active) i,.show>.btn.btn-light-google .svg-icon,.show>.btn.btn-light-google i{color:#fff}.btn-check:active+.btn.btn-light-google.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-google.dropdown-toggle:after,.btn.btn-light-google.active.dropdown-toggle:after,.btn.btn-light-google.show.dropdown-toggle:after,.btn.btn-light-google:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-google:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-google:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-google.dropdown-toggle:after{color:#fff}.btn.btn-twitter{color:#fff;border-color:#1da1f2;background-color:#1da1f2}.btn.btn-twitter .svg-icon,.btn.btn-twitter i{color:#fff}.btn.btn-twitter.dropdown-toggle:after{color:#fff}.btn-check:active+.btn.btn-twitter,.btn-check:checked+.btn.btn-twitter,.btn.btn-twitter.active,.btn.btn-twitter.show,.btn.btn-twitter:active:not(.btn-active),.btn.btn-twitter:focus:not(.btn-active),.btn.btn-twitter:hover:not(.btn-active),.show>.btn.btn-twitter{border-color:#0d8ddc;background-color:#0d8ddc!important}.btn.btn-light-twitter{color:var(--bs-twitter);color:#1da1f2;border-color:rgba(29,161,242,.1);background-color:rgba(29,161,242,.1)}.btn.btn-light-twitter .svg-icon,.btn.btn-light-twitter i{color:#1da1f2}.btn.btn-light-twitter.dropdown-toggle:after{color:#1da1f2}.btn-check:active+.btn.btn-light-twitter,.btn-check:checked+.btn.btn-light-twitter,.btn.btn-light-twitter.active,.btn.btn-light-twitter.show,.btn.btn-light-twitter:active:not(.btn-active),.btn.btn-light-twitter:focus:not(.btn-active),.btn.btn-light-twitter:hover:not(.btn-active),.show>.btn.btn-light-twitter{color:#fff;border-color:#1da1f2;background-color:#1da1f2!important}.btn-check:active+.btn.btn-light-twitter .svg-icon,.btn-check:active+.btn.btn-light-twitter i,.btn-check:checked+.btn.btn-light-twitter .svg-icon,.btn-check:checked+.btn.btn-light-twitter i,.btn.btn-light-twitter.active .svg-icon,.btn.btn-light-twitter.active i,.btn.btn-light-twitter.show .svg-icon,.btn.btn-light-twitter.show i,.btn.btn-light-twitter:active:not(.btn-active) .svg-icon,.btn.btn-light-twitter:active:not(.btn-active) i,.btn.btn-light-twitter:focus:not(.btn-active) .svg-icon,.btn.btn-light-twitter:focus:not(.btn-active) i,.btn.btn-light-twitter:hover:not(.btn-active) .svg-icon,.btn.btn-light-twitter:hover:not(.btn-active) i,.show>.btn.btn-light-twitter .svg-icon,.show>.btn.btn-light-twitter i{color:#fff}.btn-check:active+.btn.btn-light-twitter.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-twitter.dropdown-toggle:after,.btn.btn-light-twitter.active.dropdown-toggle:after,.btn.btn-light-twitter.show.dropdown-toggle:after,.btn.btn-light-twitter:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-twitter:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-twitter:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-twitter.dropdown-toggle:after{color:#fff}.btn.btn-instagram{color:#fff;border-color:#e1306c;background-color:#e1306c}.btn.btn-instagram .svg-icon,.btn.btn-instagram i{color:#fff}.btn.btn-instagram.dropdown-toggle:after{color:#fff}.btn-check:active+.btn.btn-instagram,.btn-check:checked+.btn.btn-instagram,.btn.btn-instagram.active,.btn.btn-instagram.show,.btn.btn-instagram:active:not(.btn-active),.btn.btn-instagram:focus:not(.btn-active),.btn.btn-instagram:hover:not(.btn-active),.show>.btn.btn-instagram{border-color:#cd1e59;background-color:#cd1e59!important}.btn.btn-light-instagram{color:var(--bs-instagram);color:#e1306c;border-color:rgba(225,48,108,.1);background-color:rgba(225,48,108,.1)}.btn.btn-light-instagram .svg-icon,.btn.btn-light-instagram i{color:#e1306c}.btn.btn-light-instagram.dropdown-toggle:after{color:#e1306c}.btn-check:active+.btn.btn-light-instagram,.btn-check:checked+.btn.btn-light-instagram,.btn.btn-light-instagram.active,.btn.btn-light-instagram.show,.btn.btn-light-instagram:active:not(.btn-active),.btn.btn-light-instagram:focus:not(.btn-active),.btn.btn-light-instagram:hover:not(.btn-active),.show>.btn.btn-light-instagram{color:#fff;border-color:#e1306c;background-color:#e1306c!important}.btn-check:active+.btn.btn-light-instagram .svg-icon,.btn-check:active+.btn.btn-light-instagram i,.btn-check:checked+.btn.btn-light-instagram .svg-icon,.btn-check:checked+.btn.btn-light-instagram i,.btn.btn-light-instagram.active .svg-icon,.btn.btn-light-instagram.active i,.btn.btn-light-instagram.show .svg-icon,.btn.btn-light-instagram.show i,.btn.btn-light-instagram:active:not(.btn-active) .svg-icon,.btn.btn-light-instagram:active:not(.btn-active) i,.btn.btn-light-instagram:focus:not(.btn-active) .svg-icon,.btn.btn-light-instagram:focus:not(.btn-active) i,.btn.btn-light-instagram:hover:not(.btn-active) .svg-icon,.btn.btn-light-instagram:hover:not(.btn-active) i,.show>.btn.btn-light-instagram .svg-icon,.show>.btn.btn-light-instagram i{color:#fff}.btn-check:active+.btn.btn-light-instagram.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-instagram.dropdown-toggle:after,.btn.btn-light-instagram.active.dropdown-toggle:after,.btn.btn-light-instagram.show.dropdown-toggle:after,.btn.btn-light-instagram:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-instagram:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-instagram:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-instagram.dropdown-toggle:after{color:#fff}.btn.btn-youtube{color:#fff;border-color:red;background-color:red}.btn.btn-youtube .svg-icon,.btn.btn-youtube i{color:#fff}.btn.btn-youtube.dropdown-toggle:after{color:#fff}.btn-check:active+.btn.btn-youtube,.btn-check:checked+.btn.btn-youtube,.btn.btn-youtube.active,.btn.btn-youtube.show,.btn.btn-youtube:active:not(.btn-active),.btn.btn-youtube:focus:not(.btn-active),.btn.btn-youtube:hover:not(.btn-active),.show>.btn.btn-youtube{border-color:#d90000;background-color:#d90000!important}.btn.btn-light-youtube{color:var(--bs-youtube);color:red;border-color:rgba(255,0,0,.1);background-color:rgba(255,0,0,.1)}.btn.btn-light-youtube .svg-icon,.btn.btn-light-youtube i{color:red}.btn.btn-light-youtube.dropdown-toggle:after{color:red}.btn-check:active+.btn.btn-light-youtube,.btn-check:checked+.btn.btn-light-youtube,.btn.btn-light-youtube.active,.btn.btn-light-youtube.show,.btn.btn-light-youtube:active:not(.btn-active),.btn.btn-light-youtube:focus:not(.btn-active),.btn.btn-light-youtube:hover:not(.btn-active),.show>.btn.btn-light-youtube{color:#fff;border-color:red;background-color:red!important}.btn-check:active+.btn.btn-light-youtube .svg-icon,.btn-check:active+.btn.btn-light-youtube i,.btn-check:checked+.btn.btn-light-youtube .svg-icon,.btn-check:checked+.btn.btn-light-youtube i,.btn.btn-light-youtube.active .svg-icon,.btn.btn-light-youtube.active i,.btn.btn-light-youtube.show .svg-icon,.btn.btn-light-youtube.show i,.btn.btn-light-youtube:active:not(.btn-active) .svg-icon,.btn.btn-light-youtube:active:not(.btn-active) i,.btn.btn-light-youtube:focus:not(.btn-active) .svg-icon,.btn.btn-light-youtube:focus:not(.btn-active) i,.btn.btn-light-youtube:hover:not(.btn-active) .svg-icon,.btn.btn-light-youtube:hover:not(.btn-active) i,.show>.btn.btn-light-youtube .svg-icon,.show>.btn.btn-light-youtube i{color:#fff}.btn-check:active+.btn.btn-light-youtube.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-youtube.dropdown-toggle:after,.btn.btn-light-youtube.active.dropdown-toggle:after,.btn.btn-light-youtube.show.dropdown-toggle:after,.btn.btn-light-youtube:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-youtube:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-youtube:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-youtube.dropdown-toggle:after{color:#fff}.btn.btn-linkedin{color:#fff;border-color:#0077b5;background-color:#0077b5}.btn.btn-linkedin .svg-icon,.btn.btn-linkedin i{color:#fff}.btn.btn-linkedin.dropdown-toggle:after{color:#fff}.btn-check:active+.btn.btn-linkedin,.btn-check:checked+.btn.btn-linkedin,.btn.btn-linkedin.active,.btn.btn-linkedin.show,.btn.btn-linkedin:active:not(.btn-active),.btn.btn-linkedin:focus:not(.btn-active),.btn.btn-linkedin:hover:not(.btn-active),.show>.btn.btn-linkedin{border-color:#005e8f;background-color:#005e8f!important}.btn.btn-light-linkedin{color:var(--bs-linkedin);color:#0077b5;border-color:rgba(0,119,181,.1);background-color:rgba(0,119,181,.1)}.btn.btn-light-linkedin .svg-icon,.btn.btn-light-linkedin i{color:#0077b5}.btn.btn-light-linkedin.dropdown-toggle:after{color:#0077b5}.btn-check:active+.btn.btn-light-linkedin,.btn-check:checked+.btn.btn-light-linkedin,.btn.btn-light-linkedin.active,.btn.btn-light-linkedin.show,.btn.btn-light-linkedin:active:not(.btn-active),.btn.btn-light-linkedin:focus:not(.btn-active),.btn.btn-light-linkedin:hover:not(.btn-active),.show>.btn.btn-light-linkedin{color:#fff;border-color:#0077b5;background-color:#0077b5!important}.btn-check:active+.btn.btn-light-linkedin .svg-icon,.btn-check:active+.btn.btn-light-linkedin i,.btn-check:checked+.btn.btn-light-linkedin .svg-icon,.btn-check:checked+.btn.btn-light-linkedin i,.btn.btn-light-linkedin.active .svg-icon,.btn.btn-light-linkedin.active i,.btn.btn-light-linkedin.show .svg-icon,.btn.btn-light-linkedin.show i,.btn.btn-light-linkedin:active:not(.btn-active) .svg-icon,.btn.btn-light-linkedin:active:not(.btn-active) i,.btn.btn-light-linkedin:focus:not(.btn-active) .svg-icon,.btn.btn-light-linkedin:focus:not(.btn-active) i,.btn.btn-light-linkedin:hover:not(.btn-active) .svg-icon,.btn.btn-light-linkedin:hover:not(.btn-active) i,.show>.btn.btn-light-linkedin .svg-icon,.show>.btn.btn-light-linkedin i{color:#fff}.btn-check:active+.btn.btn-light-linkedin.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-linkedin.dropdown-toggle:after,.btn.btn-light-linkedin.active.dropdown-toggle:after,.btn.btn-light-linkedin.show.dropdown-toggle:after,.btn.btn-light-linkedin:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-linkedin:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-linkedin:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-linkedin.dropdown-toggle:after{color:#fff}[data-bs-theme=dark] .btn.btn-dark{color:#b5b7c8;background-color:#464852}[data-bs-theme=dark] .btn.btn-dark .svg-icon,[data-bs-theme=dark] .btn.btn-dark i{color:#b5b7c8}[data-bs-theme=dark] .btn.btn-dark.dropdown-toggle:after{color:#b5b7c8}.btn-check:active+[data-bs-theme=dark] .btn.btn-dark,.btn-check:checked+[data-bs-theme=dark] .btn.btn-dark,.show>[data-bs-theme=dark] .btn.btn-dark,[data-bs-theme=dark] .btn.btn-dark.active,[data-bs-theme=dark] .btn.btn-dark.show,[data-bs-theme=dark] .btn.btn-dark:active:not(.btn-active),[data-bs-theme=dark] .btn.btn-dark:focus:not(.btn-active),[data-bs-theme=dark] .btn.btn-dark:hover:not(.btn-active){color:#bec0cf;background-color:#4d4f5a!important}.btn-check:active+[data-bs-theme=dark] .btn.btn-dark .svg-icon,.btn-check:active+[data-bs-theme=dark] .btn.btn-dark i,.btn-check:checked+[data-bs-theme=dark] .btn.btn-dark .svg-icon,.btn-check:checked+[data-bs-theme=dark] .btn.btn-dark i,.show>[data-bs-theme=dark] .btn.btn-dark .svg-icon,.show>[data-bs-theme=dark] .btn.btn-dark i,[data-bs-theme=dark] .btn.btn-dark.active .svg-icon,[data-bs-theme=dark] .btn.btn-dark.active i,[data-bs-theme=dark] .btn.btn-dark.show .svg-icon,[data-bs-theme=dark] .btn.btn-dark.show i,[data-bs-theme=dark] .btn.btn-dark:active:not(.btn-active) .svg-icon,[data-bs-theme=dark] .btn.btn-dark:active:not(.btn-active) i,[data-bs-theme=dark] .btn.btn-dark:focus:not(.btn-active) .svg-icon,[data-bs-theme=dark] .btn.btn-dark:focus:not(.btn-active) i,[data-bs-theme=dark] .btn.btn-dark:hover:not(.btn-active) .svg-icon,[data-bs-theme=dark] .btn.btn-dark:hover:not(.btn-active) i{color:#bec0cf}.btn-check:active+[data-bs-theme=dark] .btn.btn-dark.dropdown-toggle:after,.btn-check:checked+[data-bs-theme=dark] .btn.btn-dark.dropdown-toggle:after,.show>[data-bs-theme=dark] .btn.btn-dark.dropdown-toggle:after,[data-bs-theme=dark] .btn.btn-dark.active.dropdown-toggle:after,[data-bs-theme=dark] .btn.btn-dark.show.dropdown-toggle:after,[data-bs-theme=dark] .btn.btn-dark:active:not(.btn-active).dropdown-toggle:after,[data-bs-theme=dark] .btn.btn-dark:focus:not(.btn-active).dropdown-toggle:after,[data-bs-theme=dark] .btn.btn-dark:hover:not(.btn-active).dropdown-toggle:after{color:#bec0cf}.modal-rounded{border-radius:.475rem!important}.modal-header{justify-content:space-between}code:not([class*=language-]){font-weight:400;color:var(--bs-code-color);border:1px solid var(--bs-code-border-color);background-color:var(--bs-code-bg);border-radius:.3rem;line-height:inherit;font-size:1rem;padding:.1rem .4rem;margin:0 .5rem;box-shadow:0 3px 9px rgba(0,0,0,.08)}code:not([class*=language-]).code-light{color:var(--bs-light);background-color:var(--bs-light-light);border:1px solid var(--bs-light)}code:not([class*=language-]).code-primary{color:var(--bs-primary);background-color:var(--bs-primary-light);border:1px solid var(--bs-primary)}code:not([class*=language-]).code-secondary{color:var(--bs-secondary);background-color:var(--bs-secondary-light);border:1px solid var(--bs-secondary)}code:not([class*=language-]).code-success{color:var(--bs-success);background-color:var(--bs-success-light);border:1px solid var(--bs-success)}code:not([class*=language-]).code-info{color:var(--bs-info);background-color:var(--bs-info-light);border:1px solid var(--bs-info)}code:not([class*=language-]).code-warning{color:var(--bs-warning);background-color:var(--bs-warning-light);border:1px solid var(--bs-warning)}code:not([class*=language-]).code-danger{color:var(--bs-danger);background-color:var(--bs-danger-light);border:1px solid var(--bs-danger)}code:not([class*=language-]).code-dark{color:var(--bs-dark);background-color:var(--bs-dark-light);border:1px solid var(--bs-dark)}.col-form-label{font-size:1.05rem}.form-control.form-control-transparent{background-color:transparent;border-color:transparent}.dropdown.show>.form-control.form-control-transparent,.form-control.form-control-transparent.active,.form-control.form-control-transparent.focus,.form-control.form-control-transparent:active,.form-control.form-control-transparent:focus{background-color:transparent;border-color:transparent}.form-control.form-control-flush{border:0;background-color:transparent;outline:0!important;box-shadow:none;border-radius:0}.form-control.form-control-solid{background-color:var(--bs-gray-100);border-color:var(--bs-gray-100);color:var(--bs-gray-700);transition:color .2s ease}.form-control.form-control-solid::placeholder{color:var(--bs-gray-500)}.form-control.form-control-solid::-moz-placeholder{color:var(--bs-gray-500);opacity:1}.dropdown.show>.form-control.form-control-solid,.form-control.form-control-solid.active,.form-control.form-control-solid.focus,.form-control.form-control-solid:active,.form-control.form-control-solid:focus{background-color:var(--bs-gray-200);border-color:var(--bs-gray-200);color:var(--bs-gray-700);transition:color .2s ease}.form-control-solid-bg{background-color:var(--bs-gray-100)}.form-control-plaintext{color:var(--bs-gray-700)}.placeholder-gray-500::placeholder{color:var(--bs-gray-500)}.placeholder-gray-500::-moz-placeholder{color:var(--bs-gray-500);opacity:1}.placeholder-white::placeholder{color:#fff}.placeholder-white::-moz-placeholder{color:#fff;opacity:1}.resize-none{resize:none}.form-floating .form-control.form-control-solid::placeholder{color:transparent}.form-floating.form-control-solid-bg label::after,.form-floating>:disabled~label::after,.form-floating>:focus~label::after{background-color:transparent!important}.form-select{appearance:none}.form-select:focus{border-color:var(--bs-gray-400);box-shadow:false,0 0 0 .25rem rgba(var(--bs-component-active-bg),.25)}.form-select:disabled{color:var(--bs-gray-500);background-color:var(--bs-gray-200);border-color:var(--bs-gray-300)}.form-select:-moz-focusring{text-shadow:0 0 0 var(--bs-gray-700)}.form-select.form-select-solid{background-color:var(--bs-gray-100);border-color:var(--bs-gray-100);color:var(--bs-gray-700);transition:color .2s ease}.form-select.form-select-solid::placeholder{color:var(--bs-gray-500)}.form-select.form-select-solid::-moz-placeholder{color:var(--bs-gray-500);opacity:1}.dropdown.show>.form-select.form-select-solid,.form-select.form-select-solid.active,.form-select.form-select-solid.focus,.form-select.form-select-solid:active,.form-select.form-select-solid:focus{background-color:var(--bs-gray-200);border-color:var(--bs-gray-200)!important;color:var(--bs-gray-700);transition:color .2s ease}.form-select.form-select-transparent{background-color:transparent;border-color:transparent;color:var(--bs-gray-700)}.form-select.form-select-transparent::placeholder{color:var(--bs-gray-500)}.form-select.form-select-transparent::-moz-placeholder{color:var(--bs-gray-500);opacity:1}.dropdown.show>.form-select.form-select-transparent,.form-select.form-select-transparent.active,.form-select.form-select-transparent.focus,.form-select.form-select-transparent:active,.form-select.form-select-transparent:focus{background-color:transparent;border-color:transparent!important;color:var(--bs-gray-700)}.form-check:not(.form-switch) .form-check-input[type=checkbox]{background-size:60% 60%}.form-check.form-check-sm .form-check-input{height:1.55rem;width:1.55rem}.form-check.form-check-lg .form-check-input{height:2.25rem;width:2.25rem}.form-check.form-check-inline{display:inline-block;margin-right:1rem}.form-check.form-check-solid .form-check-input{border:0}.form-check.form-check-solid .form-check-input:not(:checked){background-color:var(--bs-gray-200)}.form-check.form-check-solid .form-check-input[type=checkbox]:indeterminate{background-color:#0069e0}.form-check.form-check-success .form-check-input:checked{background-color:var(--bs-success)}.form-check.form-check-danger .form-check-input:checked{background-color:var(--bs-danger)}.form-check.form-check-warning .form-check-input:checked{background-color:var(--bs-warning)}.form-check-custom{display:flex;align-items:center;padding-left:0;margin:0}.form-check-custom .form-check-input{margin:0;float:none;flex-shrink:0}.form-check-custom .form-check-label{margin-left:.55rem}.form-switch.form-check-custom .form-check-input{height:2.25rem}.form-switch.form-check-custom.form-switch-sm .form-check-input{height:1.5rem;width:2.5rem}.form-switch.form-check-custom.form-switch-lg .form-check-input{height:2.75rem;width:3.75rem}.form-switch.form-check-solid .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='%23ffffff'/%3e%3c/svg%3e")}.form-switch.form-check-solid .form-check-input:not(:checked){background-color:var(--bs-gray-200)}[data-bs-theme=dark] .form-switch .form-check-input:focus:not(:checked){--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-check-image{position:relative;overflow:hidden}.form-check-image img{max-width:100%}.form-check-image .form-check-wrapper{border-radius:.625rem;border:2px solid transparent;transition:all .2s ease-in-out;cursor:pointer;overflow:hidden;margin-bottom:.75rem}.form-check-image .form-check-rounded{border-radius:.625rem}.form-check-image .form-check-label{font-weight:600;margin-left:.5rem}.form-check-image.active:not(.form-check-success):not(.form-check-danger) .form-check-wrapper{border-color:var(--bs-primary)!important}.form-check-image.form-check-success.active .form-check-wrapper{border-color:var(--bs-success)!important}.form-check-image.form-check-danger.active .form-check-wrapper{border-color:var(--bs-danger)!important}.form-check-image.disabled{opacity:.65}.input-group.input-group-solid{border-radius:.475rem}.input-group.input-group-solid.input-group-sm{border-radius:.425rem}.input-group.input-group-solid.input-group-lg{border-radius:.625rem}.input-group.input-group-solid .input-group-text{background-color:var(--bs-gray-100);border-color:var(--bs-gray-100)}.input-group.input-group-solid .input-group-text+.form-control{border-left-color:var(--bs-gray-300)}.input-group.input-group-solid .form-control{background-color:var(--bs-gray-100);border-color:var(--bs-gray-100)}.input-group.input-group-solid .form-control+.input-group-text{border-left-color:var(--bs-gray-300)}.form-floating .form-control.form-control-solid::placeholder{color:transparent}.form-floating.form-control-solid-bg label::after,.form-floating>:disabled~label::after,.form-floating>:focus~label::after{background-color:transparent!important}.required:after{content:"*";position:relative;font-size:inherit;color:var(--bs-danger);padding-left:.25rem;font-weight:600}.progress-vertical{display:flex;align-items:stretch;justify-content:space-between}.progress-vertical .progress{height:100%;border-radius:.475rem;display:flex;align-items:flex-end;margin-right:1rem}.progress-vertical .progress:last-child{margin-right:0}.progress-vertical .progress .progress-bar{width:8px;border-radius:.475rem}.table:not(.table-bordered)>:not(:first-child){border-color:transparent;border-width:0;border-style:none}.table:not(.table-bordered)>:not(:last-child)>:last-child>*{border-bottom-color:inherit}.table:not(.table-bordered) td,.table:not(.table-bordered) th,.table:not(.table-bordered) tr{border-color:inherit;border-width:inherit;border-style:inherit;text-transform:inherit;font-weight:inherit;font-size:inherit;color:inherit;height:inherit;min-height:inherit}.table:not(.table-bordered) td:first-child,.table:not(.table-bordered) th:first-child,.table:not(.table-bordered) tr:first-child{padding-left:0}.table:not(.table-bordered) td:last-child,.table:not(.table-bordered) th:last-child,.table:not(.table-bordered) tr:last-child{padding-right:0}.table:not(.table-bordered) tbody tr:last-child,.table:not(.table-bordered) tfoot tr:last-child{border-bottom:0!important}.table:not(.table-bordered) tbody tr:last-child td,.table:not(.table-bordered) tbody tr:last-child th,.table:not(.table-bordered) tfoot tr:last-child td,.table:not(.table-bordered) tfoot tr:last-child th{border-bottom:0!important}.table:not(.table-bordered) tfoot td,.table:not(.table-bordered) tfoot th{border-top:inherit}.table:not(.table-bordered).table-rounded{border-radius:.475rem;border-spacing:0;border-collapse:separate}.table:not(.table-bordered).table-rows-rounded td:first-child,.table:not(.table-bordered).table-rows-rounded th:first-child{border-top-left-radius:6px;border-bottom-left-radius:6px}.table:not(.table-bordered).table-rows-rounded td:last-child,.table:not(.table-bordered).table-rows-rounded th:last-child{border-top-right-radius:6px;border-bottom-right-radius:6px}.table:not(.table-bordered).table-flush td,.table:not(.table-bordered).table-flush th,.table:not(.table-bordered).table-flush tr{padding:inherit}.table:not(.table-bordered).table-row-bordered tr{border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:var(--bs-border-color)}.table:not(.table-bordered).table-row-bordered tfoot td,.table:not(.table-bordered).table-row-bordered tfoot th{border-top-width:1px!important}.table:not(.table-bordered).table-row-dashed tr{border-bottom-width:1px;border-bottom-style:dashed;border-bottom-color:var(--bs-border-color)}.table:not(.table-bordered).table-row-dashed tfoot td,.table:not(.table-bordered).table-row-dashed tfoot th{border-top-width:1px!important}.table:not(.table-bordered).table-row-gray-100 tr{border-bottom-color:var(--bs-gray-100)}.table:not(.table-bordered).table-row-gray-200 tr{border-bottom-color:var(--bs-gray-200)}.table:not(.table-bordered).table-row-gray-300 tr{border-bottom-color:var(--bs-gray-300)}.table:not(.table-bordered).table-row-gray-400 tr{border-bottom-color:var(--bs-gray-400)}.table:not(.table-bordered).table-row-gray-500 tr{border-bottom-color:var(--bs-gray-500)}.table:not(.table-bordered).table-row-gray-600 tr{border-bottom-color:var(--bs-gray-600)}.table:not(.table-bordered).table-row-gray-700 tr{border-bottom-color:var(--bs-gray-700)}.table:not(.table-bordered).table-row-gray-800 tr{border-bottom-color:var(--bs-gray-800)}.table:not(.table-bordered).table-row-gray-900 tr{border-bottom-color:var(--bs-gray-900)}.table-layout-fixed{table-layout:fixed}.table-sort:after{opacity:0}.table-sort,.table-sort-asc,.table-sort-desc{vertical-align:middle}.table-sort-asc:after,.table-sort-desc:after,.table-sort:after{position:relative;display:inline-block;width:.75rem;height:.75rem;content:" ";bottom:auto;right:auto;left:auto;margin-left:.5rem}.table-sort-asc:after{opacity:1;mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-muted);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M3.23571 2.72011L4.97917 4.46358C5.15176 4.63618 5.43158 4.63617 5.60417 4.46358C5.77676 4.29099 5.77676 4.01118 5.60417 3.83861L3.29463 1.52904C3.13192 1.36629 2.86809 1.36629 2.70538 1.52904L0.395812 3.83861C0.22325 4.01117 0.22325 4.29099 0.395812 4.46358C0.568437 4.63617 0.84825 4.63617 1.02081 4.46358L2.76429 2.72011C2.89446 2.58994 3.10554 2.58994 3.23571 2.72011Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M3.23571 2.72011L4.97917 4.46358C5.15176 4.63618 5.43158 4.63617 5.60417 4.46358C5.77676 4.29099 5.77676 4.01118 5.60417 3.83861L3.29463 1.52904C3.13192 1.36629 2.86809 1.36629 2.70538 1.52904L0.395812 3.83861C0.22325 4.01117 0.22325 4.29099 0.395812 4.46358C0.568437 4.63617 0.84825 4.63617 1.02081 4.46358L2.76429 2.72011C2.89446 2.58994 3.10554 2.58994 3.23571 2.72011Z'/%3e%3c/svg%3e")}.table-sort-desc:after{opacity:1;mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-muted);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M2.76429 3.27989L1.02083 1.53642C0.848244 1.36382 0.568419 1.36383 0.395831 1.53642C0.223244 1.70901 0.223244 1.98882 0.395831 2.16139L2.70537 4.47096C2.86808 4.63371 3.13191 4.63371 3.29462 4.47096L5.60419 2.16139C5.77675 1.98883 5.77675 1.70901 5.60419 1.53642C5.43156 1.36383 5.15175 1.36383 4.97919 1.53642L3.23571 3.27989C3.10554 3.41006 2.89446 3.41006 2.76429 3.27989Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M2.76429 3.27989L1.02083 1.53642C0.848244 1.36382 0.568419 1.36383 0.395831 1.53642C0.223244 1.70901 0.223244 1.98882 0.395831 2.16139L2.70537 4.47096C2.86808 4.63371 3.13191 4.63371 3.29462 4.47096L5.60419 2.16139C5.77675 1.98883 5.77675 1.70901 5.60419 1.53642C5.43156 1.36383 5.15175 1.36383 4.97919 1.53642L3.23571 3.27989C3.10554 3.41006 2.89446 3.41006 2.76429 3.27989Z'/%3e%3c/svg%3e")}.table-loading-message{display:none;position:absolute;top:50%;left:50%;border-radius:.475rem;box-shadow:var(--bs-table-loading-message-box-shadow);background-color:var(--bs-body-bg);color:var(--bs-gray-700);font-weight:600;margin:0!important;width:auto;padding:.85rem 2rem!important;transform:translateX(-50%) translateY(-50%)}.table-loading{position:relative}.table-loading .table-loading-message{display:block}.table.g-0 td,.table.g-0 th{padding:0}.table.g-0 td.dtr-control,.table.g-0 th.dtr-control{padding-left:0!important}.table.gy-0 td,.table.gy-0 th{padding-top:0;padding-bottom:0}.table.gx-0 td,.table.gx-0 th{padding-left:0;padding-right:0}.table.gx-0 td.dtr-control,.table.gx-0 th.dtr-control{padding-left:0!important}.table.gs-0 td:first-child,.table.gs-0 th:first-child{padding-left:0}.table.gs-0 td:last-child,.table.gs-0 th:last-child{padding-right:0}.table.gs-0 td.dtr-control:first-child,.table.gs-0 th.dtr-control:first-child{padding-left:0!important}.table.g-1 td,.table.g-1 th{padding:.25rem}.table.g-1 td.dtr-control,.table.g-1 th.dtr-control{padding-left:.25rem!important}.table.gy-1 td,.table.gy-1 th{padding-top:.25rem;padding-bottom:.25rem}.table.gx-1 td,.table.gx-1 th{padding-left:.25rem;padding-right:.25rem}.table.gx-1 td.dtr-control,.table.gx-1 th.dtr-control{padding-left:.25rem!important}.table.gs-1 td:first-child,.table.gs-1 th:first-child{padding-left:.25rem}.table.gs-1 td:last-child,.table.gs-1 th:last-child{padding-right:.25rem}.table.gs-1 td.dtr-control:first-child,.table.gs-1 th.dtr-control:first-child{padding-left:.25rem!important}.table.g-2 td,.table.g-2 th{padding:.5rem}.table.g-2 td.dtr-control,.table.g-2 th.dtr-control{padding-left:.5rem!important}.table.gy-2 td,.table.gy-2 th{padding-top:.5rem;padding-bottom:.5rem}.table.gx-2 td,.table.gx-2 th{padding-left:.5rem;padding-right:.5rem}.table.gx-2 td.dtr-control,.table.gx-2 th.dtr-control{padding-left:.5rem!important}.table.gs-2 td:first-child,.table.gs-2 th:first-child{padding-left:.5rem}.table.gs-2 td:last-child,.table.gs-2 th:last-child{padding-right:.5rem}.table.gs-2 td.dtr-control:first-child,.table.gs-2 th.dtr-control:first-child{padding-left:.5rem!important}.table.g-3 td,.table.g-3 th{padding:.75rem}.table.g-3 td.dtr-control,.table.g-3 th.dtr-control{padding-left:.75rem!important}.table.gy-3 td,.table.gy-3 th{padding-top:.75rem;padding-bottom:.75rem}.table.gx-3 td,.table.gx-3 th{padding-left:.75rem;padding-right:.75rem}.table.gx-3 td.dtr-control,.table.gx-3 th.dtr-control{padding-left:.75rem!important}.table.gs-3 td:first-child,.table.gs-3 th:first-child{padding-left:.75rem}.table.gs-3 td:last-child,.table.gs-3 th:last-child{padding-right:.75rem}.table.gs-3 td.dtr-control:first-child,.table.gs-3 th.dtr-control:first-child{padding-left:.75rem!important}.table.g-4 td,.table.g-4 th{padding:1rem}.table.g-4 td.dtr-control,.table.g-4 th.dtr-control{padding-left:1rem!important}.table.gy-4 td,.table.gy-4 th{padding-top:1rem;padding-bottom:1rem}.table.gx-4 td,.table.gx-4 th{padding-left:1rem;padding-right:1rem}.table.gx-4 td.dtr-control,.table.gx-4 th.dtr-control{padding-left:1rem!important}.table.gs-4 td:first-child,.table.gs-4 th:first-child{padding-left:1rem}.table.gs-4 td:last-child,.table.gs-4 th:last-child{padding-right:1rem}.table.gs-4 td.dtr-control:first-child,.table.gs-4 th.dtr-control:first-child{padding-left:1rem!important}.table.g-5 td,.table.g-5 th{padding:1.25rem}.table.g-5 td.dtr-control,.table.g-5 th.dtr-control{padding-left:1.25rem!important}.table.gy-5 td,.table.gy-5 th{padding-top:1.25rem;padding-bottom:1.25rem}.table.gx-5 td,.table.gx-5 th{padding-left:1.25rem;padding-right:1.25rem}.table.gx-5 td.dtr-control,.table.gx-5 th.dtr-control{padding-left:1.25rem!important}.table.gs-5 td:first-child,.table.gs-5 th:first-child{padding-left:1.25rem}.table.gs-5 td:last-child,.table.gs-5 th:last-child{padding-right:1.25rem}.table.gs-5 td.dtr-control:first-child,.table.gs-5 th.dtr-control:first-child{padding-left:1.25rem!important}.table.g-6 td,.table.g-6 th{padding:1.5rem}.table.g-6 td.dtr-control,.table.g-6 th.dtr-control{padding-left:1.5rem!important}.table.gy-6 td,.table.gy-6 th{padding-top:1.5rem;padding-bottom:1.5rem}.table.gx-6 td,.table.gx-6 th{padding-left:1.5rem;padding-right:1.5rem}.table.gx-6 td.dtr-control,.table.gx-6 th.dtr-control{padding-left:1.5rem!important}.table.gs-6 td:first-child,.table.gs-6 th:first-child{padding-left:1.5rem}.table.gs-6 td:last-child,.table.gs-6 th:last-child{padding-right:1.5rem}.table.gs-6 td.dtr-control:first-child,.table.gs-6 th.dtr-control:first-child{padding-left:1.5rem!important}.table.g-7 td,.table.g-7 th{padding:1.75rem}.table.g-7 td.dtr-control,.table.g-7 th.dtr-control{padding-left:1.75rem!important}.table.gy-7 td,.table.gy-7 th{padding-top:1.75rem;padding-bottom:1.75rem}.table.gx-7 td,.table.gx-7 th{padding-left:1.75rem;padding-right:1.75rem}.table.gx-7 td.dtr-control,.table.gx-7 th.dtr-control{padding-left:1.75rem!important}.table.gs-7 td:first-child,.table.gs-7 th:first-child{padding-left:1.75rem}.table.gs-7 td:last-child,.table.gs-7 th:last-child{padding-right:1.75rem}.table.gs-7 td.dtr-control:first-child,.table.gs-7 th.dtr-control:first-child{padding-left:1.75rem!important}.table.g-8 td,.table.g-8 th{padding:2rem}.table.g-8 td.dtr-control,.table.g-8 th.dtr-control{padding-left:2rem!important}.table.gy-8 td,.table.gy-8 th{padding-top:2rem;padding-bottom:2rem}.table.gx-8 td,.table.gx-8 th{padding-left:2rem;padding-right:2rem}.table.gx-8 td.dtr-control,.table.gx-8 th.dtr-control{padding-left:2rem!important}.table.gs-8 td:first-child,.table.gs-8 th:first-child{padding-left:2rem}.table.gs-8 td:last-child,.table.gs-8 th:last-child{padding-right:2rem}.table.gs-8 td.dtr-control:first-child,.table.gs-8 th.dtr-control:first-child{padding-left:2rem!important}.table.g-9 td,.table.g-9 th{padding:2.25rem}.table.g-9 td.dtr-control,.table.g-9 th.dtr-control{padding-left:2.25rem!important}.table.gy-9 td,.table.gy-9 th{padding-top:2.25rem;padding-bottom:2.25rem}.table.gx-9 td,.table.gx-9 th{padding-left:2.25rem;padding-right:2.25rem}.table.gx-9 td.dtr-control,.table.gx-9 th.dtr-control{padding-left:2.25rem!important}.table.gs-9 td:first-child,.table.gs-9 th:first-child{padding-left:2.25rem}.table.gs-9 td:last-child,.table.gs-9 th:last-child{padding-right:2.25rem}.table.gs-9 td.dtr-control:first-child,.table.gs-9 th.dtr-control:first-child{padding-left:2.25rem!important}.table.g-10 td,.table.g-10 th{padding:2.5rem}.table.g-10 td.dtr-control,.table.g-10 th.dtr-control{padding-left:2.5rem!important}.table.gy-10 td,.table.gy-10 th{padding-top:2.5rem;padding-bottom:2.5rem}.table.gx-10 td,.table.gx-10 th{padding-left:2.5rem;padding-right:2.5rem}.table.gx-10 td.dtr-control,.table.gx-10 th.dtr-control{padding-left:2.5rem!important}.table.gs-10 td:first-child,.table.gs-10 th:first-child{padding-left:2.5rem}.table.gs-10 td:last-child,.table.gs-10 th:last-child{padding-right:2.5rem}.table.gs-10 td.dtr-control:first-child,.table.gs-10 th.dtr-control:first-child{padding-left:2.5rem!important}@media (min-width:576px){.table.g-sm-0 td,.table.g-sm-0 th{padding:0}.table.g-sm-0 td.dtr-control,.table.g-sm-0 th.dtr-control{padding-left:0!important}.table.gy-sm-0 td,.table.gy-sm-0 th{padding-top:0;padding-bottom:0}.table.gx-sm-0 td,.table.gx-sm-0 th{padding-left:0;padding-right:0}.table.gx-sm-0 td.dtr-control,.table.gx-sm-0 th.dtr-control{padding-left:0!important}.table.gs-sm-0 td:first-child,.table.gs-sm-0 th:first-child{padding-left:0}.table.gs-sm-0 td:last-child,.table.gs-sm-0 th:last-child{padding-right:0}.table.gs-sm-0 td.dtr-control:first-child,.table.gs-sm-0 th.dtr-control:first-child{padding-left:0!important}.table.g-sm-1 td,.table.g-sm-1 th{padding:.25rem}.table.g-sm-1 td.dtr-control,.table.g-sm-1 th.dtr-control{padding-left:.25rem!important}.table.gy-sm-1 td,.table.gy-sm-1 th{padding-top:.25rem;padding-bottom:.25rem}.table.gx-sm-1 td,.table.gx-sm-1 th{padding-left:.25rem;padding-right:.25rem}.table.gx-sm-1 td.dtr-control,.table.gx-sm-1 th.dtr-control{padding-left:.25rem!important}.table.gs-sm-1 td:first-child,.table.gs-sm-1 th:first-child{padding-left:.25rem}.table.gs-sm-1 td:last-child,.table.gs-sm-1 th:last-child{padding-right:.25rem}.table.gs-sm-1 td.dtr-control:first-child,.table.gs-sm-1 th.dtr-control:first-child{padding-left:.25rem!important}.table.g-sm-2 td,.table.g-sm-2 th{padding:.5rem}.table.g-sm-2 td.dtr-control,.table.g-sm-2 th.dtr-control{padding-left:.5rem!important}.table.gy-sm-2 td,.table.gy-sm-2 th{padding-top:.5rem;padding-bottom:.5rem}.table.gx-sm-2 td,.table.gx-sm-2 th{padding-left:.5rem;padding-right:.5rem}.table.gx-sm-2 td.dtr-control,.table.gx-sm-2 th.dtr-control{padding-left:.5rem!important}.table.gs-sm-2 td:first-child,.table.gs-sm-2 th:first-child{padding-left:.5rem}.table.gs-sm-2 td:last-child,.table.gs-sm-2 th:last-child{padding-right:.5rem}.table.gs-sm-2 td.dtr-control:first-child,.table.gs-sm-2 th.dtr-control:first-child{padding-left:.5rem!important}.table.g-sm-3 td,.table.g-sm-3 th{padding:.75rem}.table.g-sm-3 td.dtr-control,.table.g-sm-3 th.dtr-control{padding-left:.75rem!important}.table.gy-sm-3 td,.table.gy-sm-3 th{padding-top:.75rem;padding-bottom:.75rem}.table.gx-sm-3 td,.table.gx-sm-3 th{padding-left:.75rem;padding-right:.75rem}.table.gx-sm-3 td.dtr-control,.table.gx-sm-3 th.dtr-control{padding-left:.75rem!important}.table.gs-sm-3 td:first-child,.table.gs-sm-3 th:first-child{padding-left:.75rem}.table.gs-sm-3 td:last-child,.table.gs-sm-3 th:last-child{padding-right:.75rem}.table.gs-sm-3 td.dtr-control:first-child,.table.gs-sm-3 th.dtr-control:first-child{padding-left:.75rem!important}.table.g-sm-4 td,.table.g-sm-4 th{padding:1rem}.table.g-sm-4 td.dtr-control,.table.g-sm-4 th.dtr-control{padding-left:1rem!important}.table.gy-sm-4 td,.table.gy-sm-4 th{padding-top:1rem;padding-bottom:1rem}.table.gx-sm-4 td,.table.gx-sm-4 th{padding-left:1rem;padding-right:1rem}.table.gx-sm-4 td.dtr-control,.table.gx-sm-4 th.dtr-control{padding-left:1rem!important}.table.gs-sm-4 td:first-child,.table.gs-sm-4 th:first-child{padding-left:1rem}.table.gs-sm-4 td:last-child,.table.gs-sm-4 th:last-child{padding-right:1rem}.table.gs-sm-4 td.dtr-control:first-child,.table.gs-sm-4 th.dtr-control:first-child{padding-left:1rem!important}.table.g-sm-5 td,.table.g-sm-5 th{padding:1.25rem}.table.g-sm-5 td.dtr-control,.table.g-sm-5 th.dtr-control{padding-left:1.25rem!important}.table.gy-sm-5 td,.table.gy-sm-5 th{padding-top:1.25rem;padding-bottom:1.25rem}.table.gx-sm-5 td,.table.gx-sm-5 th{padding-left:1.25rem;padding-right:1.25rem}.table.gx-sm-5 td.dtr-control,.table.gx-sm-5 th.dtr-control{padding-left:1.25rem!important}.table.gs-sm-5 td:first-child,.table.gs-sm-5 th:first-child{padding-left:1.25rem}.table.gs-sm-5 td:last-child,.table.gs-sm-5 th:last-child{padding-right:1.25rem}.table.gs-sm-5 td.dtr-control:first-child,.table.gs-sm-5 th.dtr-control:first-child{padding-left:1.25rem!important}.table.g-sm-6 td,.table.g-sm-6 th{padding:1.5rem}.table.g-sm-6 td.dtr-control,.table.g-sm-6 th.dtr-control{padding-left:1.5rem!important}.table.gy-sm-6 td,.table.gy-sm-6 th{padding-top:1.5rem;padding-bottom:1.5rem}.table.gx-sm-6 td,.table.gx-sm-6 th{padding-left:1.5rem;padding-right:1.5rem}.table.gx-sm-6 td.dtr-control,.table.gx-sm-6 th.dtr-control{padding-left:1.5rem!important}.table.gs-sm-6 td:first-child,.table.gs-sm-6 th:first-child{padding-left:1.5rem}.table.gs-sm-6 td:last-child,.table.gs-sm-6 th:last-child{padding-right:1.5rem}.table.gs-sm-6 td.dtr-control:first-child,.table.gs-sm-6 th.dtr-control:first-child{padding-left:1.5rem!important}.table.g-sm-7 td,.table.g-sm-7 th{padding:1.75rem}.table.g-sm-7 td.dtr-control,.table.g-sm-7 th.dtr-control{padding-left:1.75rem!important}.table.gy-sm-7 td,.table.gy-sm-7 th{padding-top:1.75rem;padding-bottom:1.75rem}.table.gx-sm-7 td,.table.gx-sm-7 th{padding-left:1.75rem;padding-right:1.75rem}.table.gx-sm-7 td.dtr-control,.table.gx-sm-7 th.dtr-control{padding-left:1.75rem!important}.table.gs-sm-7 td:first-child,.table.gs-sm-7 th:first-child{padding-left:1.75rem}.table.gs-sm-7 td:last-child,.table.gs-sm-7 th:last-child{padding-right:1.75rem}.table.gs-sm-7 td.dtr-control:first-child,.table.gs-sm-7 th.dtr-control:first-child{padding-left:1.75rem!important}.table.g-sm-8 td,.table.g-sm-8 th{padding:2rem}.table.g-sm-8 td.dtr-control,.table.g-sm-8 th.dtr-control{padding-left:2rem!important}.table.gy-sm-8 td,.table.gy-sm-8 th{padding-top:2rem;padding-bottom:2rem}.table.gx-sm-8 td,.table.gx-sm-8 th{padding-left:2rem;padding-right:2rem}.table.gx-sm-8 td.dtr-control,.table.gx-sm-8 th.dtr-control{padding-left:2rem!important}.table.gs-sm-8 td:first-child,.table.gs-sm-8 th:first-child{padding-left:2rem}.table.gs-sm-8 td:last-child,.table.gs-sm-8 th:last-child{padding-right:2rem}.table.gs-sm-8 td.dtr-control:first-child,.table.gs-sm-8 th.dtr-control:first-child{padding-left:2rem!important}.table.g-sm-9 td,.table.g-sm-9 th{padding:2.25rem}.table.g-sm-9 td.dtr-control,.table.g-sm-9 th.dtr-control{padding-left:2.25rem!important}.table.gy-sm-9 td,.table.gy-sm-9 th{padding-top:2.25rem;padding-bottom:2.25rem}.table.gx-sm-9 td,.table.gx-sm-9 th{padding-left:2.25rem;padding-right:2.25rem}.table.gx-sm-9 td.dtr-control,.table.gx-sm-9 th.dtr-control{padding-left:2.25rem!important}.table.gs-sm-9 td:first-child,.table.gs-sm-9 th:first-child{padding-left:2.25rem}.table.gs-sm-9 td:last-child,.table.gs-sm-9 th:last-child{padding-right:2.25rem}.table.gs-sm-9 td.dtr-control:first-child,.table.gs-sm-9 th.dtr-control:first-child{padding-left:2.25rem!important}.table.g-sm-10 td,.table.g-sm-10 th{padding:2.5rem}.table.g-sm-10 td.dtr-control,.table.g-sm-10 th.dtr-control{padding-left:2.5rem!important}.table.gy-sm-10 td,.table.gy-sm-10 th{padding-top:2.5rem;padding-bottom:2.5rem}.table.gx-sm-10 td,.table.gx-sm-10 th{padding-left:2.5rem;padding-right:2.5rem}.table.gx-sm-10 td.dtr-control,.table.gx-sm-10 th.dtr-control{padding-left:2.5rem!important}.table.gs-sm-10 td:first-child,.table.gs-sm-10 th:first-child{padding-left:2.5rem}.table.gs-sm-10 td:last-child,.table.gs-sm-10 th:last-child{padding-right:2.5rem}.table.gs-sm-10 td.dtr-control:first-child,.table.gs-sm-10 th.dtr-control:first-child{padding-left:2.5rem!important}}@media (min-width:768px){.table.g-md-0 td,.table.g-md-0 th{padding:0}.table.g-md-0 td.dtr-control,.table.g-md-0 th.dtr-control{padding-left:0!important}.table.gy-md-0 td,.table.gy-md-0 th{padding-top:0;padding-bottom:0}.table.gx-md-0 td,.table.gx-md-0 th{padding-left:0;padding-right:0}.table.gx-md-0 td.dtr-control,.table.gx-md-0 th.dtr-control{padding-left:0!important}.table.gs-md-0 td:first-child,.table.gs-md-0 th:first-child{padding-left:0}.table.gs-md-0 td:last-child,.table.gs-md-0 th:last-child{padding-right:0}.table.gs-md-0 td.dtr-control:first-child,.table.gs-md-0 th.dtr-control:first-child{padding-left:0!important}.table.g-md-1 td,.table.g-md-1 th{padding:.25rem}.table.g-md-1 td.dtr-control,.table.g-md-1 th.dtr-control{padding-left:.25rem!important}.table.gy-md-1 td,.table.gy-md-1 th{padding-top:.25rem;padding-bottom:.25rem}.table.gx-md-1 td,.table.gx-md-1 th{padding-left:.25rem;padding-right:.25rem}.table.gx-md-1 td.dtr-control,.table.gx-md-1 th.dtr-control{padding-left:.25rem!important}.table.gs-md-1 td:first-child,.table.gs-md-1 th:first-child{padding-left:.25rem}.table.gs-md-1 td:last-child,.table.gs-md-1 th:last-child{padding-right:.25rem}.table.gs-md-1 td.dtr-control:first-child,.table.gs-md-1 th.dtr-control:first-child{padding-left:.25rem!important}.table.g-md-2 td,.table.g-md-2 th{padding:.5rem}.table.g-md-2 td.dtr-control,.table.g-md-2 th.dtr-control{padding-left:.5rem!important}.table.gy-md-2 td,.table.gy-md-2 th{padding-top:.5rem;padding-bottom:.5rem}.table.gx-md-2 td,.table.gx-md-2 th{padding-left:.5rem;padding-right:.5rem}.table.gx-md-2 td.dtr-control,.table.gx-md-2 th.dtr-control{padding-left:.5rem!important}.table.gs-md-2 td:first-child,.table.gs-md-2 th:first-child{padding-left:.5rem}.table.gs-md-2 td:last-child,.table.gs-md-2 th:last-child{padding-right:.5rem}.table.gs-md-2 td.dtr-control:first-child,.table.gs-md-2 th.dtr-control:first-child{padding-left:.5rem!important}.table.g-md-3 td,.table.g-md-3 th{padding:.75rem}.table.g-md-3 td.dtr-control,.table.g-md-3 th.dtr-control{padding-left:.75rem!important}.table.gy-md-3 td,.table.gy-md-3 th{padding-top:.75rem;padding-bottom:.75rem}.table.gx-md-3 td,.table.gx-md-3 th{padding-left:.75rem;padding-right:.75rem}.table.gx-md-3 td.dtr-control,.table.gx-md-3 th.dtr-control{padding-left:.75rem!important}.table.gs-md-3 td:first-child,.table.gs-md-3 th:first-child{padding-left:.75rem}.table.gs-md-3 td:last-child,.table.gs-md-3 th:last-child{padding-right:.75rem}.table.gs-md-3 td.dtr-control:first-child,.table.gs-md-3 th.dtr-control:first-child{padding-left:.75rem!important}.table.g-md-4 td,.table.g-md-4 th{padding:1rem}.table.g-md-4 td.dtr-control,.table.g-md-4 th.dtr-control{padding-left:1rem!important}.table.gy-md-4 td,.table.gy-md-4 th{padding-top:1rem;padding-bottom:1rem}.table.gx-md-4 td,.table.gx-md-4 th{padding-left:1rem;padding-right:1rem}.table.gx-md-4 td.dtr-control,.table.gx-md-4 th.dtr-control{padding-left:1rem!important}.table.gs-md-4 td:first-child,.table.gs-md-4 th:first-child{padding-left:1rem}.table.gs-md-4 td:last-child,.table.gs-md-4 th:last-child{padding-right:1rem}.table.gs-md-4 td.dtr-control:first-child,.table.gs-md-4 th.dtr-control:first-child{padding-left:1rem!important}.table.g-md-5 td,.table.g-md-5 th{padding:1.25rem}.table.g-md-5 td.dtr-control,.table.g-md-5 th.dtr-control{padding-left:1.25rem!important}.table.gy-md-5 td,.table.gy-md-5 th{padding-top:1.25rem;padding-bottom:1.25rem}.table.gx-md-5 td,.table.gx-md-5 th{padding-left:1.25rem;padding-right:1.25rem}.table.gx-md-5 td.dtr-control,.table.gx-md-5 th.dtr-control{padding-left:1.25rem!important}.table.gs-md-5 td:first-child,.table.gs-md-5 th:first-child{padding-left:1.25rem}.table.gs-md-5 td:last-child,.table.gs-md-5 th:last-child{padding-right:1.25rem}.table.gs-md-5 td.dtr-control:first-child,.table.gs-md-5 th.dtr-control:first-child{padding-left:1.25rem!important}.table.g-md-6 td,.table.g-md-6 th{padding:1.5rem}.table.g-md-6 td.dtr-control,.table.g-md-6 th.dtr-control{padding-left:1.5rem!important}.table.gy-md-6 td,.table.gy-md-6 th{padding-top:1.5rem;padding-bottom:1.5rem}.table.gx-md-6 td,.table.gx-md-6 th{padding-left:1.5rem;padding-right:1.5rem}.table.gx-md-6 td.dtr-control,.table.gx-md-6 th.dtr-control{padding-left:1.5rem!important}.table.gs-md-6 td:first-child,.table.gs-md-6 th:first-child{padding-left:1.5rem}.table.gs-md-6 td:last-child,.table.gs-md-6 th:last-child{padding-right:1.5rem}.table.gs-md-6 td.dtr-control:first-child,.table.gs-md-6 th.dtr-control:first-child{padding-left:1.5rem!important}.table.g-md-7 td,.table.g-md-7 th{padding:1.75rem}.table.g-md-7 td.dtr-control,.table.g-md-7 th.dtr-control{padding-left:1.75rem!important}.table.gy-md-7 td,.table.gy-md-7 th{padding-top:1.75rem;padding-bottom:1.75rem}.table.gx-md-7 td,.table.gx-md-7 th{padding-left:1.75rem;padding-right:1.75rem}.table.gx-md-7 td.dtr-control,.table.gx-md-7 th.dtr-control{padding-left:1.75rem!important}.table.gs-md-7 td:first-child,.table.gs-md-7 th:first-child{padding-left:1.75rem}.table.gs-md-7 td:last-child,.table.gs-md-7 th:last-child{padding-right:1.75rem}.table.gs-md-7 td.dtr-control:first-child,.table.gs-md-7 th.dtr-control:first-child{padding-left:1.75rem!important}.table.g-md-8 td,.table.g-md-8 th{padding:2rem}.table.g-md-8 td.dtr-control,.table.g-md-8 th.dtr-control{padding-left:2rem!important}.table.gy-md-8 td,.table.gy-md-8 th{padding-top:2rem;padding-bottom:2rem}.table.gx-md-8 td,.table.gx-md-8 th{padding-left:2rem;padding-right:2rem}.table.gx-md-8 td.dtr-control,.table.gx-md-8 th.dtr-control{padding-left:2rem!important}.table.gs-md-8 td:first-child,.table.gs-md-8 th:first-child{padding-left:2rem}.table.gs-md-8 td:last-child,.table.gs-md-8 th:last-child{padding-right:2rem}.table.gs-md-8 td.dtr-control:first-child,.table.gs-md-8 th.dtr-control:first-child{padding-left:2rem!important}.table.g-md-9 td,.table.g-md-9 th{padding:2.25rem}.table.g-md-9 td.dtr-control,.table.g-md-9 th.dtr-control{padding-left:2.25rem!important}.table.gy-md-9 td,.table.gy-md-9 th{padding-top:2.25rem;padding-bottom:2.25rem}.table.gx-md-9 td,.table.gx-md-9 th{padding-left:2.25rem;padding-right:2.25rem}.table.gx-md-9 td.dtr-control,.table.gx-md-9 th.dtr-control{padding-left:2.25rem!important}.table.gs-md-9 td:first-child,.table.gs-md-9 th:first-child{padding-left:2.25rem}.table.gs-md-9 td:last-child,.table.gs-md-9 th:last-child{padding-right:2.25rem}.table.gs-md-9 td.dtr-control:first-child,.table.gs-md-9 th.dtr-control:first-child{padding-left:2.25rem!important}.table.g-md-10 td,.table.g-md-10 th{padding:2.5rem}.table.g-md-10 td.dtr-control,.table.g-md-10 th.dtr-control{padding-left:2.5rem!important}.table.gy-md-10 td,.table.gy-md-10 th{padding-top:2.5rem;padding-bottom:2.5rem}.table.gx-md-10 td,.table.gx-md-10 th{padding-left:2.5rem;padding-right:2.5rem}.table.gx-md-10 td.dtr-control,.table.gx-md-10 th.dtr-control{padding-left:2.5rem!important}.table.gs-md-10 td:first-child,.table.gs-md-10 th:first-child{padding-left:2.5rem}.table.gs-md-10 td:last-child,.table.gs-md-10 th:last-child{padding-right:2.5rem}.table.gs-md-10 td.dtr-control:first-child,.table.gs-md-10 th.dtr-control:first-child{padding-left:2.5rem!important}}@media (min-width:992px){.table.g-lg-0 td,.table.g-lg-0 th{padding:0}.table.g-lg-0 td.dtr-control,.table.g-lg-0 th.dtr-control{padding-left:0!important}.table.gy-lg-0 td,.table.gy-lg-0 th{padding-top:0;padding-bottom:0}.table.gx-lg-0 td,.table.gx-lg-0 th{padding-left:0;padding-right:0}.table.gx-lg-0 td.dtr-control,.table.gx-lg-0 th.dtr-control{padding-left:0!important}.table.gs-lg-0 td:first-child,.table.gs-lg-0 th:first-child{padding-left:0}.table.gs-lg-0 td:last-child,.table.gs-lg-0 th:last-child{padding-right:0}.table.gs-lg-0 td.dtr-control:first-child,.table.gs-lg-0 th.dtr-control:first-child{padding-left:0!important}.table.g-lg-1 td,.table.g-lg-1 th{padding:.25rem}.table.g-lg-1 td.dtr-control,.table.g-lg-1 th.dtr-control{padding-left:.25rem!important}.table.gy-lg-1 td,.table.gy-lg-1 th{padding-top:.25rem;padding-bottom:.25rem}.table.gx-lg-1 td,.table.gx-lg-1 th{padding-left:.25rem;padding-right:.25rem}.table.gx-lg-1 td.dtr-control,.table.gx-lg-1 th.dtr-control{padding-left:.25rem!important}.table.gs-lg-1 td:first-child,.table.gs-lg-1 th:first-child{padding-left:.25rem}.table.gs-lg-1 td:last-child,.table.gs-lg-1 th:last-child{padding-right:.25rem}.table.gs-lg-1 td.dtr-control:first-child,.table.gs-lg-1 th.dtr-control:first-child{padding-left:.25rem!important}.table.g-lg-2 td,.table.g-lg-2 th{padding:.5rem}.table.g-lg-2 td.dtr-control,.table.g-lg-2 th.dtr-control{padding-left:.5rem!important}.table.gy-lg-2 td,.table.gy-lg-2 th{padding-top:.5rem;padding-bottom:.5rem}.table.gx-lg-2 td,.table.gx-lg-2 th{padding-left:.5rem;padding-right:.5rem}.table.gx-lg-2 td.dtr-control,.table.gx-lg-2 th.dtr-control{padding-left:.5rem!important}.table.gs-lg-2 td:first-child,.table.gs-lg-2 th:first-child{padding-left:.5rem}.table.gs-lg-2 td:last-child,.table.gs-lg-2 th:last-child{padding-right:.5rem}.table.gs-lg-2 td.dtr-control:first-child,.table.gs-lg-2 th.dtr-control:first-child{padding-left:.5rem!important}.table.g-lg-3 td,.table.g-lg-3 th{padding:.75rem}.table.g-lg-3 td.dtr-control,.table.g-lg-3 th.dtr-control{padding-left:.75rem!important}.table.gy-lg-3 td,.table.gy-lg-3 th{padding-top:.75rem;padding-bottom:.75rem}.table.gx-lg-3 td,.table.gx-lg-3 th{padding-left:.75rem;padding-right:.75rem}.table.gx-lg-3 td.dtr-control,.table.gx-lg-3 th.dtr-control{padding-left:.75rem!important}.table.gs-lg-3 td:first-child,.table.gs-lg-3 th:first-child{padding-left:.75rem}.table.gs-lg-3 td:last-child,.table.gs-lg-3 th:last-child{padding-right:.75rem}.table.gs-lg-3 td.dtr-control:first-child,.table.gs-lg-3 th.dtr-control:first-child{padding-left:.75rem!important}.table.g-lg-4 td,.table.g-lg-4 th{padding:1rem}.table.g-lg-4 td.dtr-control,.table.g-lg-4 th.dtr-control{padding-left:1rem!important}.table.gy-lg-4 td,.table.gy-lg-4 th{padding-top:1rem;padding-bottom:1rem}.table.gx-lg-4 td,.table.gx-lg-4 th{padding-left:1rem;padding-right:1rem}.table.gx-lg-4 td.dtr-control,.table.gx-lg-4 th.dtr-control{padding-left:1rem!important}.table.gs-lg-4 td:first-child,.table.gs-lg-4 th:first-child{padding-left:1rem}.table.gs-lg-4 td:last-child,.table.gs-lg-4 th:last-child{padding-right:1rem}.table.gs-lg-4 td.dtr-control:first-child,.table.gs-lg-4 th.dtr-control:first-child{padding-left:1rem!important}.table.g-lg-5 td,.table.g-lg-5 th{padding:1.25rem}.table.g-lg-5 td.dtr-control,.table.g-lg-5 th.dtr-control{padding-left:1.25rem!important}.table.gy-lg-5 td,.table.gy-lg-5 th{padding-top:1.25rem;padding-bottom:1.25rem}.table.gx-lg-5 td,.table.gx-lg-5 th{padding-left:1.25rem;padding-right:1.25rem}.table.gx-lg-5 td.dtr-control,.table.gx-lg-5 th.dtr-control{padding-left:1.25rem!important}.table.gs-lg-5 td:first-child,.table.gs-lg-5 th:first-child{padding-left:1.25rem}.table.gs-lg-5 td:last-child,.table.gs-lg-5 th:last-child{padding-right:1.25rem}.table.gs-lg-5 td.dtr-control:first-child,.table.gs-lg-5 th.dtr-control:first-child{padding-left:1.25rem!important}.table.g-lg-6 td,.table.g-lg-6 th{padding:1.5rem}.table.g-lg-6 td.dtr-control,.table.g-lg-6 th.dtr-control{padding-left:1.5rem!important}.table.gy-lg-6 td,.table.gy-lg-6 th{padding-top:1.5rem;padding-bottom:1.5rem}.table.gx-lg-6 td,.table.gx-lg-6 th{padding-left:1.5rem;padding-right:1.5rem}.table.gx-lg-6 td.dtr-control,.table.gx-lg-6 th.dtr-control{padding-left:1.5rem!important}.table.gs-lg-6 td:first-child,.table.gs-lg-6 th:first-child{padding-left:1.5rem}.table.gs-lg-6 td:last-child,.table.gs-lg-6 th:last-child{padding-right:1.5rem}.table.gs-lg-6 td.dtr-control:first-child,.table.gs-lg-6 th.dtr-control:first-child{padding-left:1.5rem!important}.table.g-lg-7 td,.table.g-lg-7 th{padding:1.75rem}.table.g-lg-7 td.dtr-control,.table.g-lg-7 th.dtr-control{padding-left:1.75rem!important}.table.gy-lg-7 td,.table.gy-lg-7 th{padding-top:1.75rem;padding-bottom:1.75rem}.table.gx-lg-7 td,.table.gx-lg-7 th{padding-left:1.75rem;padding-right:1.75rem}.table.gx-lg-7 td.dtr-control,.table.gx-lg-7 th.dtr-control{padding-left:1.75rem!important}.table.gs-lg-7 td:first-child,.table.gs-lg-7 th:first-child{padding-left:1.75rem}.table.gs-lg-7 td:last-child,.table.gs-lg-7 th:last-child{padding-right:1.75rem}.table.gs-lg-7 td.dtr-control:first-child,.table.gs-lg-7 th.dtr-control:first-child{padding-left:1.75rem!important}.table.g-lg-8 td,.table.g-lg-8 th{padding:2rem}.table.g-lg-8 td.dtr-control,.table.g-lg-8 th.dtr-control{padding-left:2rem!important}.table.gy-lg-8 td,.table.gy-lg-8 th{padding-top:2rem;padding-bottom:2rem}.table.gx-lg-8 td,.table.gx-lg-8 th{padding-left:2rem;padding-right:2rem}.table.gx-lg-8 td.dtr-control,.table.gx-lg-8 th.dtr-control{padding-left:2rem!important}.table.gs-lg-8 td:first-child,.table.gs-lg-8 th:first-child{padding-left:2rem}.table.gs-lg-8 td:last-child,.table.gs-lg-8 th:last-child{padding-right:2rem}.table.gs-lg-8 td.dtr-control:first-child,.table.gs-lg-8 th.dtr-control:first-child{padding-left:2rem!important}.table.g-lg-9 td,.table.g-lg-9 th{padding:2.25rem}.table.g-lg-9 td.dtr-control,.table.g-lg-9 th.dtr-control{padding-left:2.25rem!important}.table.gy-lg-9 td,.table.gy-lg-9 th{padding-top:2.25rem;padding-bottom:2.25rem}.table.gx-lg-9 td,.table.gx-lg-9 th{padding-left:2.25rem;padding-right:2.25rem}.table.gx-lg-9 td.dtr-control,.table.gx-lg-9 th.dtr-control{padding-left:2.25rem!important}.table.gs-lg-9 td:first-child,.table.gs-lg-9 th:first-child{padding-left:2.25rem}.table.gs-lg-9 td:last-child,.table.gs-lg-9 th:last-child{padding-right:2.25rem}.table.gs-lg-9 td.dtr-control:first-child,.table.gs-lg-9 th.dtr-control:first-child{padding-left:2.25rem!important}.table.g-lg-10 td,.table.g-lg-10 th{padding:2.5rem}.table.g-lg-10 td.dtr-control,.table.g-lg-10 th.dtr-control{padding-left:2.5rem!important}.table.gy-lg-10 td,.table.gy-lg-10 th{padding-top:2.5rem;padding-bottom:2.5rem}.table.gx-lg-10 td,.table.gx-lg-10 th{padding-left:2.5rem;padding-right:2.5rem}.table.gx-lg-10 td.dtr-control,.table.gx-lg-10 th.dtr-control{padding-left:2.5rem!important}.table.gs-lg-10 td:first-child,.table.gs-lg-10 th:first-child{padding-left:2.5rem}.table.gs-lg-10 td:last-child,.table.gs-lg-10 th:last-child{padding-right:2.5rem}.table.gs-lg-10 td.dtr-control:first-child,.table.gs-lg-10 th.dtr-control:first-child{padding-left:2.5rem!important}}@media (min-width:1200px){.table.g-xl-0 td,.table.g-xl-0 th{padding:0}.table.g-xl-0 td.dtr-control,.table.g-xl-0 th.dtr-control{padding-left:0!important}.table.gy-xl-0 td,.table.gy-xl-0 th{padding-top:0;padding-bottom:0}.table.gx-xl-0 td,.table.gx-xl-0 th{padding-left:0;padding-right:0}.table.gx-xl-0 td.dtr-control,.table.gx-xl-0 th.dtr-control{padding-left:0!important}.table.gs-xl-0 td:first-child,.table.gs-xl-0 th:first-child{padding-left:0}.table.gs-xl-0 td:last-child,.table.gs-xl-0 th:last-child{padding-right:0}.table.gs-xl-0 td.dtr-control:first-child,.table.gs-xl-0 th.dtr-control:first-child{padding-left:0!important}.table.g-xl-1 td,.table.g-xl-1 th{padding:.25rem}.table.g-xl-1 td.dtr-control,.table.g-xl-1 th.dtr-control{padding-left:.25rem!important}.table.gy-xl-1 td,.table.gy-xl-1 th{padding-top:.25rem;padding-bottom:.25rem}.table.gx-xl-1 td,.table.gx-xl-1 th{padding-left:.25rem;padding-right:.25rem}.table.gx-xl-1 td.dtr-control,.table.gx-xl-1 th.dtr-control{padding-left:.25rem!important}.table.gs-xl-1 td:first-child,.table.gs-xl-1 th:first-child{padding-left:.25rem}.table.gs-xl-1 td:last-child,.table.gs-xl-1 th:last-child{padding-right:.25rem}.table.gs-xl-1 td.dtr-control:first-child,.table.gs-xl-1 th.dtr-control:first-child{padding-left:.25rem!important}.table.g-xl-2 td,.table.g-xl-2 th{padding:.5rem}.table.g-xl-2 td.dtr-control,.table.g-xl-2 th.dtr-control{padding-left:.5rem!important}.table.gy-xl-2 td,.table.gy-xl-2 th{padding-top:.5rem;padding-bottom:.5rem}.table.gx-xl-2 td,.table.gx-xl-2 th{padding-left:.5rem;padding-right:.5rem}.table.gx-xl-2 td.dtr-control,.table.gx-xl-2 th.dtr-control{padding-left:.5rem!important}.table.gs-xl-2 td:first-child,.table.gs-xl-2 th:first-child{padding-left:.5rem}.table.gs-xl-2 td:last-child,.table.gs-xl-2 th:last-child{padding-right:.5rem}.table.gs-xl-2 td.dtr-control:first-child,.table.gs-xl-2 th.dtr-control:first-child{padding-left:.5rem!important}.table.g-xl-3 td,.table.g-xl-3 th{padding:.75rem}.table.g-xl-3 td.dtr-control,.table.g-xl-3 th.dtr-control{padding-left:.75rem!important}.table.gy-xl-3 td,.table.gy-xl-3 th{padding-top:.75rem;padding-bottom:.75rem}.table.gx-xl-3 td,.table.gx-xl-3 th{padding-left:.75rem;padding-right:.75rem}.table.gx-xl-3 td.dtr-control,.table.gx-xl-3 th.dtr-control{padding-left:.75rem!important}.table.gs-xl-3 td:first-child,.table.gs-xl-3 th:first-child{padding-left:.75rem}.table.gs-xl-3 td:last-child,.table.gs-xl-3 th:last-child{padding-right:.75rem}.table.gs-xl-3 td.dtr-control:first-child,.table.gs-xl-3 th.dtr-control:first-child{padding-left:.75rem!important}.table.g-xl-4 td,.table.g-xl-4 th{padding:1rem}.table.g-xl-4 td.dtr-control,.table.g-xl-4 th.dtr-control{padding-left:1rem!important}.table.gy-xl-4 td,.table.gy-xl-4 th{padding-top:1rem;padding-bottom:1rem}.table.gx-xl-4 td,.table.gx-xl-4 th{padding-left:1rem;padding-right:1rem}.table.gx-xl-4 td.dtr-control,.table.gx-xl-4 th.dtr-control{padding-left:1rem!important}.table.gs-xl-4 td:first-child,.table.gs-xl-4 th:first-child{padding-left:1rem}.table.gs-xl-4 td:last-child,.table.gs-xl-4 th:last-child{padding-right:1rem}.table.gs-xl-4 td.dtr-control:first-child,.table.gs-xl-4 th.dtr-control:first-child{padding-left:1rem!important}.table.g-xl-5 td,.table.g-xl-5 th{padding:1.25rem}.table.g-xl-5 td.dtr-control,.table.g-xl-5 th.dtr-control{padding-left:1.25rem!important}.table.gy-xl-5 td,.table.gy-xl-5 th{padding-top:1.25rem;padding-bottom:1.25rem}.table.gx-xl-5 td,.table.gx-xl-5 th{padding-left:1.25rem;padding-right:1.25rem}.table.gx-xl-5 td.dtr-control,.table.gx-xl-5 th.dtr-control{padding-left:1.25rem!important}.table.gs-xl-5 td:first-child,.table.gs-xl-5 th:first-child{padding-left:1.25rem}.table.gs-xl-5 td:last-child,.table.gs-xl-5 th:last-child{padding-right:1.25rem}.table.gs-xl-5 td.dtr-control:first-child,.table.gs-xl-5 th.dtr-control:first-child{padding-left:1.25rem!important}.table.g-xl-6 td,.table.g-xl-6 th{padding:1.5rem}.table.g-xl-6 td.dtr-control,.table.g-xl-6 th.dtr-control{padding-left:1.5rem!important}.table.gy-xl-6 td,.table.gy-xl-6 th{padding-top:1.5rem;padding-bottom:1.5rem}.table.gx-xl-6 td,.table.gx-xl-6 th{padding-left:1.5rem;padding-right:1.5rem}.table.gx-xl-6 td.dtr-control,.table.gx-xl-6 th.dtr-control{padding-left:1.5rem!important}.table.gs-xl-6 td:first-child,.table.gs-xl-6 th:first-child{padding-left:1.5rem}.table.gs-xl-6 td:last-child,.table.gs-xl-6 th:last-child{padding-right:1.5rem}.table.gs-xl-6 td.dtr-control:first-child,.table.gs-xl-6 th.dtr-control:first-child{padding-left:1.5rem!important}.table.g-xl-7 td,.table.g-xl-7 th{padding:1.75rem}.table.g-xl-7 td.dtr-control,.table.g-xl-7 th.dtr-control{padding-left:1.75rem!important}.table.gy-xl-7 td,.table.gy-xl-7 th{padding-top:1.75rem;padding-bottom:1.75rem}.table.gx-xl-7 td,.table.gx-xl-7 th{padding-left:1.75rem;padding-right:1.75rem}.table.gx-xl-7 td.dtr-control,.table.gx-xl-7 th.dtr-control{padding-left:1.75rem!important}.table.gs-xl-7 td:first-child,.table.gs-xl-7 th:first-child{padding-left:1.75rem}.table.gs-xl-7 td:last-child,.table.gs-xl-7 th:last-child{padding-right:1.75rem}.table.gs-xl-7 td.dtr-control:first-child,.table.gs-xl-7 th.dtr-control:first-child{padding-left:1.75rem!important}.table.g-xl-8 td,.table.g-xl-8 th{padding:2rem}.table.g-xl-8 td.dtr-control,.table.g-xl-8 th.dtr-control{padding-left:2rem!important}.table.gy-xl-8 td,.table.gy-xl-8 th{padding-top:2rem;padding-bottom:2rem}.table.gx-xl-8 td,.table.gx-xl-8 th{padding-left:2rem;padding-right:2rem}.table.gx-xl-8 td.dtr-control,.table.gx-xl-8 th.dtr-control{padding-left:2rem!important}.table.gs-xl-8 td:first-child,.table.gs-xl-8 th:first-child{padding-left:2rem}.table.gs-xl-8 td:last-child,.table.gs-xl-8 th:last-child{padding-right:2rem}.table.gs-xl-8 td.dtr-control:first-child,.table.gs-xl-8 th.dtr-control:first-child{padding-left:2rem!important}.table.g-xl-9 td,.table.g-xl-9 th{padding:2.25rem}.table.g-xl-9 td.dtr-control,.table.g-xl-9 th.dtr-control{padding-left:2.25rem!important}.table.gy-xl-9 td,.table.gy-xl-9 th{padding-top:2.25rem;padding-bottom:2.25rem}.table.gx-xl-9 td,.table.gx-xl-9 th{padding-left:2.25rem;padding-right:2.25rem}.table.gx-xl-9 td.dtr-control,.table.gx-xl-9 th.dtr-control{padding-left:2.25rem!important}.table.gs-xl-9 td:first-child,.table.gs-xl-9 th:first-child{padding-left:2.25rem}.table.gs-xl-9 td:last-child,.table.gs-xl-9 th:last-child{padding-right:2.25rem}.table.gs-xl-9 td.dtr-control:first-child,.table.gs-xl-9 th.dtr-control:first-child{padding-left:2.25rem!important}.table.g-xl-10 td,.table.g-xl-10 th{padding:2.5rem}.table.g-xl-10 td.dtr-control,.table.g-xl-10 th.dtr-control{padding-left:2.5rem!important}.table.gy-xl-10 td,.table.gy-xl-10 th{padding-top:2.5rem;padding-bottom:2.5rem}.table.gx-xl-10 td,.table.gx-xl-10 th{padding-left:2.5rem;padding-right:2.5rem}.table.gx-xl-10 td.dtr-control,.table.gx-xl-10 th.dtr-control{padding-left:2.5rem!important}.table.gs-xl-10 td:first-child,.table.gs-xl-10 th:first-child{padding-left:2.5rem}.table.gs-xl-10 td:last-child,.table.gs-xl-10 th:last-child{padding-right:2.5rem}.table.gs-xl-10 td.dtr-control:first-child,.table.gs-xl-10 th.dtr-control:first-child{padding-left:2.5rem!important}}@media (min-width:1400px){.table.g-xxl-0 td,.table.g-xxl-0 th{padding:0}.table.g-xxl-0 td.dtr-control,.table.g-xxl-0 th.dtr-control{padding-left:0!important}.table.gy-xxl-0 td,.table.gy-xxl-0 th{padding-top:0;padding-bottom:0}.table.gx-xxl-0 td,.table.gx-xxl-0 th{padding-left:0;padding-right:0}.table.gx-xxl-0 td.dtr-control,.table.gx-xxl-0 th.dtr-control{padding-left:0!important}.table.gs-xxl-0 td:first-child,.table.gs-xxl-0 th:first-child{padding-left:0}.table.gs-xxl-0 td:last-child,.table.gs-xxl-0 th:last-child{padding-right:0}.table.gs-xxl-0 td.dtr-control:first-child,.table.gs-xxl-0 th.dtr-control:first-child{padding-left:0!important}.table.g-xxl-1 td,.table.g-xxl-1 th{padding:.25rem}.table.g-xxl-1 td.dtr-control,.table.g-xxl-1 th.dtr-control{padding-left:.25rem!important}.table.gy-xxl-1 td,.table.gy-xxl-1 th{padding-top:.25rem;padding-bottom:.25rem}.table.gx-xxl-1 td,.table.gx-xxl-1 th{padding-left:.25rem;padding-right:.25rem}.table.gx-xxl-1 td.dtr-control,.table.gx-xxl-1 th.dtr-control{padding-left:.25rem!important}.table.gs-xxl-1 td:first-child,.table.gs-xxl-1 th:first-child{padding-left:.25rem}.table.gs-xxl-1 td:last-child,.table.gs-xxl-1 th:last-child{padding-right:.25rem}.table.gs-xxl-1 td.dtr-control:first-child,.table.gs-xxl-1 th.dtr-control:first-child{padding-left:.25rem!important}.table.g-xxl-2 td,.table.g-xxl-2 th{padding:.5rem}.table.g-xxl-2 td.dtr-control,.table.g-xxl-2 th.dtr-control{padding-left:.5rem!important}.table.gy-xxl-2 td,.table.gy-xxl-2 th{padding-top:.5rem;padding-bottom:.5rem}.table.gx-xxl-2 td,.table.gx-xxl-2 th{padding-left:.5rem;padding-right:.5rem}.table.gx-xxl-2 td.dtr-control,.table.gx-xxl-2 th.dtr-control{padding-left:.5rem!important}.table.gs-xxl-2 td:first-child,.table.gs-xxl-2 th:first-child{padding-left:.5rem}.table.gs-xxl-2 td:last-child,.table.gs-xxl-2 th:last-child{padding-right:.5rem}.table.gs-xxl-2 td.dtr-control:first-child,.table.gs-xxl-2 th.dtr-control:first-child{padding-left:.5rem!important}.table.g-xxl-3 td,.table.g-xxl-3 th{padding:.75rem}.table.g-xxl-3 td.dtr-control,.table.g-xxl-3 th.dtr-control{padding-left:.75rem!important}.table.gy-xxl-3 td,.table.gy-xxl-3 th{padding-top:.75rem;padding-bottom:.75rem}.table.gx-xxl-3 td,.table.gx-xxl-3 th{padding-left:.75rem;padding-right:.75rem}.table.gx-xxl-3 td.dtr-control,.table.gx-xxl-3 th.dtr-control{padding-left:.75rem!important}.table.gs-xxl-3 td:first-child,.table.gs-xxl-3 th:first-child{padding-left:.75rem}.table.gs-xxl-3 td:last-child,.table.gs-xxl-3 th:last-child{padding-right:.75rem}.table.gs-xxl-3 td.dtr-control:first-child,.table.gs-xxl-3 th.dtr-control:first-child{padding-left:.75rem!important}.table.g-xxl-4 td,.table.g-xxl-4 th{padding:1rem}.table.g-xxl-4 td.dtr-control,.table.g-xxl-4 th.dtr-control{padding-left:1rem!important}.table.gy-xxl-4 td,.table.gy-xxl-4 th{padding-top:1rem;padding-bottom:1rem}.table.gx-xxl-4 td,.table.gx-xxl-4 th{padding-left:1rem;padding-right:1rem}.table.gx-xxl-4 td.dtr-control,.table.gx-xxl-4 th.dtr-control{padding-left:1rem!important}.table.gs-xxl-4 td:first-child,.table.gs-xxl-4 th:first-child{padding-left:1rem}.table.gs-xxl-4 td:last-child,.table.gs-xxl-4 th:last-child{padding-right:1rem}.table.gs-xxl-4 td.dtr-control:first-child,.table.gs-xxl-4 th.dtr-control:first-child{padding-left:1rem!important}.table.g-xxl-5 td,.table.g-xxl-5 th{padding:1.25rem}.table.g-xxl-5 td.dtr-control,.table.g-xxl-5 th.dtr-control{padding-left:1.25rem!important}.table.gy-xxl-5 td,.table.gy-xxl-5 th{padding-top:1.25rem;padding-bottom:1.25rem}.table.gx-xxl-5 td,.table.gx-xxl-5 th{padding-left:1.25rem;padding-right:1.25rem}.table.gx-xxl-5 td.dtr-control,.table.gx-xxl-5 th.dtr-control{padding-left:1.25rem!important}.table.gs-xxl-5 td:first-child,.table.gs-xxl-5 th:first-child{padding-left:1.25rem}.table.gs-xxl-5 td:last-child,.table.gs-xxl-5 th:last-child{padding-right:1.25rem}.table.gs-xxl-5 td.dtr-control:first-child,.table.gs-xxl-5 th.dtr-control:first-child{padding-left:1.25rem!important}.table.g-xxl-6 td,.table.g-xxl-6 th{padding:1.5rem}.table.g-xxl-6 td.dtr-control,.table.g-xxl-6 th.dtr-control{padding-left:1.5rem!important}.table.gy-xxl-6 td,.table.gy-xxl-6 th{padding-top:1.5rem;padding-bottom:1.5rem}.table.gx-xxl-6 td,.table.gx-xxl-6 th{padding-left:1.5rem;padding-right:1.5rem}.table.gx-xxl-6 td.dtr-control,.table.gx-xxl-6 th.dtr-control{padding-left:1.5rem!important}.table.gs-xxl-6 td:first-child,.table.gs-xxl-6 th:first-child{padding-left:1.5rem}.table.gs-xxl-6 td:last-child,.table.gs-xxl-6 th:last-child{padding-right:1.5rem}.table.gs-xxl-6 td.dtr-control:first-child,.table.gs-xxl-6 th.dtr-control:first-child{padding-left:1.5rem!important}.table.g-xxl-7 td,.table.g-xxl-7 th{padding:1.75rem}.table.g-xxl-7 td.dtr-control,.table.g-xxl-7 th.dtr-control{padding-left:1.75rem!important}.table.gy-xxl-7 td,.table.gy-xxl-7 th{padding-top:1.75rem;padding-bottom:1.75rem}.table.gx-xxl-7 td,.table.gx-xxl-7 th{padding-left:1.75rem;padding-right:1.75rem}.table.gx-xxl-7 td.dtr-control,.table.gx-xxl-7 th.dtr-control{padding-left:1.75rem!important}.table.gs-xxl-7 td:first-child,.table.gs-xxl-7 th:first-child{padding-left:1.75rem}.table.gs-xxl-7 td:last-child,.table.gs-xxl-7 th:last-child{padding-right:1.75rem}.table.gs-xxl-7 td.dtr-control:first-child,.table.gs-xxl-7 th.dtr-control:first-child{padding-left:1.75rem!important}.table.g-xxl-8 td,.table.g-xxl-8 th{padding:2rem}.table.g-xxl-8 td.dtr-control,.table.g-xxl-8 th.dtr-control{padding-left:2rem!important}.table.gy-xxl-8 td,.table.gy-xxl-8 th{padding-top:2rem;padding-bottom:2rem}.table.gx-xxl-8 td,.table.gx-xxl-8 th{padding-left:2rem;padding-right:2rem}.table.gx-xxl-8 td.dtr-control,.table.gx-xxl-8 th.dtr-control{padding-left:2rem!important}.table.gs-xxl-8 td:first-child,.table.gs-xxl-8 th:first-child{padding-left:2rem}.table.gs-xxl-8 td:last-child,.table.gs-xxl-8 th:last-child{padding-right:2rem}.table.gs-xxl-8 td.dtr-control:first-child,.table.gs-xxl-8 th.dtr-control:first-child{padding-left:2rem!important}.table.g-xxl-9 td,.table.g-xxl-9 th{padding:2.25rem}.table.g-xxl-9 td.dtr-control,.table.g-xxl-9 th.dtr-control{padding-left:2.25rem!important}.table.gy-xxl-9 td,.table.gy-xxl-9 th{padding-top:2.25rem;padding-bottom:2.25rem}.table.gx-xxl-9 td,.table.gx-xxl-9 th{padding-left:2.25rem;padding-right:2.25rem}.table.gx-xxl-9 td.dtr-control,.table.gx-xxl-9 th.dtr-control{padding-left:2.25rem!important}.table.gs-xxl-9 td:first-child,.table.gs-xxl-9 th:first-child{padding-left:2.25rem}.table.gs-xxl-9 td:last-child,.table.gs-xxl-9 th:last-child{padding-right:2.25rem}.table.gs-xxl-9 td.dtr-control:first-child,.table.gs-xxl-9 th.dtr-control:first-child{padding-left:2.25rem!important}.table.g-xxl-10 td,.table.g-xxl-10 th{padding:2.5rem}.table.g-xxl-10 td.dtr-control,.table.g-xxl-10 th.dtr-control{padding-left:2.5rem!important}.table.gy-xxl-10 td,.table.gy-xxl-10 th{padding-top:2.5rem;padding-bottom:2.5rem}.table.gx-xxl-10 td,.table.gx-xxl-10 th{padding-left:2.5rem;padding-right:2.5rem}.table.gx-xxl-10 td.dtr-control,.table.gx-xxl-10 th.dtr-control{padding-left:2.5rem!important}.table.gs-xxl-10 td:first-child,.table.gs-xxl-10 th:first-child{padding-left:2.5rem}.table.gs-xxl-10 td:last-child,.table.gs-xxl-10 th:last-child{padding-right:2.5rem}.table.gs-xxl-10 td.dtr-control:first-child,.table.gs-xxl-10 th.dtr-control:first-child{padding-left:2.5rem!important}}.popover{--bs-popover-header-border-color:#F1F1F4}.popover .popover-header{font-size:1rem;font-weight:500;border-bottom:1px solid var(--bs-popover-header-border-color)}.popover .popover-dismiss{position:absolute;top:.85rem;right:.85rem;height:1.25rem;width:1.25rem;mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-500);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='var%28--bs-gray-500%29'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='var%28--bs-gray-500%29'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e");mask-size:50%;-webkit-mask-size:50%}.popover .popover-dismiss:hover{background-color:var(--bs-primary)}.popover .popover-dismiss+.popover-header{padding-right:2.5rem}.popover-inverse{--bs-popover-bg:var(--bs-gray-900);--bs-popover-border-color:var(--bs-gray-900);--bs-popover-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.3);--bs-popover-header-color:var(--bs-gray-200);--bs-popover-header-bg:var(--bs-gray-900);--bs-popover-body-color:var(--bs-gray-400);--bs-popover-arrow-border:transparent;--bs-popover-header-border-color:var(--bs-gray-800)}[data-bs-theme=dark] .popover:not(.popover-inverse){--bs-popover-bg:#26272F;--bs-popover-border-color:#26272F;--bs-popover-header-bg:#26272F;--bs-popover-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.3);--bs-popover-header-border-color:#363843}.tooltip .tooltip-inner{box-shadow:var(--bs-tooltip-box-shadow)}.tooltip.tooltop-auto-width .tooltip-inner{white-space:nowrap;max-width:none}.tooltip.tooltip-inverse{--bs-tooltip-color:var(--bs-dark-inverse);--bs-tooltip-bg:var(--bs-dark)}[data-bs-theme=dark] .tooltip:not(.tooltip-inverse){--bs-tooltip-bg:#26272F;--bs-tooltip-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.15)}.accordion .accordion-header{cursor:pointer}.accordion.accordion-icon-toggle .accordion-icon{display:flex;flex-shrink:0;transition:all .2s ease-in-out;transform:rotate(90deg);align-items:center;justify-content:center}.accordion.accordion-icon-toggle .accordion-icon .svg-icon,.accordion.accordion-icon-toggle .accordion-icon i{color:var(--bs-primary)}.accordion.accordion-icon-toggle .collapsed .accordion-icon{transition:all .2s ease-in-out;transform:rotate(0)}.accordion.accordion-icon-toggle .collapsed .accordion-icon .svg-icon,.accordion.accordion-icon-toggle .collapsed .accordion-icon i{color:var(--bs-text-muted)}.accordion.accordion-icon-collapse .accordion-icon{display:flex;flex-shrink:0;align-items:center;justify-content:center;transition:all .2s ease-in-out}.accordion.accordion-icon-collapse .accordion-icon .accordion-icon-on{display:inline-flex}.accordion.accordion-icon-collapse .accordion-icon .accordion-icon-off{display:none}.accordion.accordion-icon-collapse .accordion-icon .svg-icon,.accordion.accordion-icon-collapse .accordion-icon i{color:var(--bs-primary)}.accordion.accordion-icon-collapse .collapsed .accordion-icon{transition:all .2s ease-in-out}.accordion.accordion-icon-collapse .collapsed .accordion-icon .accordion-icon-on{display:none}.accordion.accordion-icon-collapse .collapsed .accordion-icon .accordion-icon-off{display:inline-flex}.accordion.accordion-icon-collapse .collapsed .accordion-icon .svg-icon,.accordion.accordion-icon-collapse .collapsed .accordion-icon i{color:var(--bs-text-muted)}.accordion.accordion-borderless .accordion-item{border:0}.accordion.accordion-flush .accordion-item{background-color:transparent;border:0;border-radius:0;padding-left:0;padding-right:0}.image-input{position:relative;display:inline-block;border-radius:.475rem;background-repeat:no-repeat;background-size:cover}.image-input:not(.image-input-empty){background-image:none!important}.image-input .image-input-wrapper{width:120px;height:120px;border-radius:.475rem;background-repeat:no-repeat;background-size:cover}.image-input [data-kt-image-input-action]{cursor:pointer;position:absolute;transform:translate(-50%,-50%)}.image-input [data-kt-image-input-action=change]{left:100%;top:0}.image-input [data-kt-image-input-action=change] input{width:0!important;height:0!important;overflow:hidden;opacity:0}.image-input [data-kt-image-input-action=cancel],.image-input [data-kt-image-input-action=remove]{position:absolute;left:100%;top:100%}.image-input [data-kt-image-input-action=cancel]{display:none}.image-input.image-input-changed [data-kt-image-input-action=cancel]{display:flex}.image-input.image-input-changed [data-kt-image-input-action=remove]{display:none}.image-input.image-input-empty [data-kt-image-input-action=cancel],.image-input.image-input-empty [data-kt-image-input-action=remove]{display:none}.image-input.image-input-circle{border-radius:50%}.image-input.image-input-circle .image-input-wrapper{border-radius:50%}.image-input.image-input-circle [data-kt-image-input-action=change]{left:100%;top:0;transform:translate(-100%,0)}.image-input.image-input-circle [data-kt-image-input-action=cancel],.image-input.image-input-circle [data-kt-image-input-action=remove]{left:100%;top:100%;transform:translate(-100%,-100%)}.image-input.image-input-outline .image-input-wrapper{border:3px solid var(--bs-body-bg);box-shadow:var(--bs-box-shadow)}.symbol{display:inline-block;flex-shrink:0;position:relative;border-radius:.475rem}.symbol .symbol-label{display:flex;align-items:center;justify-content:center;font-weight:500;color:var(--bs-symbol-label-color);background-color:var(--bs-symbol-label-bg);background-repeat:no-repeat;background-position:center center;background-size:cover;border-radius:.475rem}.symbol .symbol-label:after{border-radius:.475rem}.symbol .symbol-badge{position:absolute;border-radius:100%;top:0;left:50%;transform:translateX(-50%) translateY(-50%)!important}.symbol>img{width:100%;flex-shrink:0;display:inline-block;border-radius:.475rem}.symbol.symbol-square,.symbol.symbol-square .symbol-label,.symbol.symbol-square>img{border-radius:0!important}.symbol.symbol-circle,.symbol.symbol-circle .symbol-label,.symbol.symbol-circle>img{border-radius:50%}.symbol.symbol-circle .symbol-label:after,.symbol.symbol-circle:after,.symbol.symbol-circle>img:after{border-radius:50%}.symbol>img{width:50px;height:50px}.symbol .symbol-label{width:50px;height:50px}.symbol.symbol-fixed .symbol-label{width:50px;height:50px}.symbol.symbol-fixed>img{width:50px;height:50px;max-width:none}.symbol.symbol-2by3 .symbol-label{height:50px;width:75px}.symbol.symbol-2by3>img{height:50px;width:75px;max-width:none}.symbol.symbol-20px>img{width:20px;height:20px}.symbol.symbol-20px .symbol-label{width:20px;height:20px}.symbol.symbol-20px.symbol-fixed .symbol-label{width:20px;height:20px}.symbol.symbol-20px.symbol-fixed>img{width:20px;height:20px;max-width:none}.symbol.symbol-20px.symbol-2by3 .symbol-label{height:20px;width:30px}.symbol.symbol-20px.symbol-2by3>img{height:20px;width:30px;max-width:none}.symbol.symbol-25px>img{width:25px;height:25px}.symbol.symbol-25px .symbol-label{width:25px;height:25px}.symbol.symbol-25px.symbol-fixed .symbol-label{width:25px;height:25px}.symbol.symbol-25px.symbol-fixed>img{width:25px;height:25px;max-width:none}.symbol.symbol-25px.symbol-2by3 .symbol-label{height:25px;width:37.5px}.symbol.symbol-25px.symbol-2by3>img{height:25px;width:37.5px;max-width:none}.symbol.symbol-30px>img{width:30px;height:30px}.symbol.symbol-30px .symbol-label{width:30px;height:30px}.symbol.symbol-30px.symbol-fixed .symbol-label{width:30px;height:30px}.symbol.symbol-30px.symbol-fixed>img{width:30px;height:30px;max-width:none}.symbol.symbol-30px.symbol-2by3 .symbol-label{height:30px;width:45px}.symbol.symbol-30px.symbol-2by3>img{height:30px;width:45px;max-width:none}.symbol.symbol-35px>img{width:35px;height:35px}.symbol.symbol-35px .symbol-label{width:35px;height:35px}.symbol.symbol-35px.symbol-fixed .symbol-label{width:35px;height:35px}.symbol.symbol-35px.symbol-fixed>img{width:35px;height:35px;max-width:none}.symbol.symbol-35px.symbol-2by3 .symbol-label{height:35px;width:52.5px}.symbol.symbol-35px.symbol-2by3>img{height:35px;width:52.5px;max-width:none}.symbol.symbol-40px>img{width:40px;height:40px}.symbol.symbol-40px .symbol-label{width:40px;height:40px}.symbol.symbol-40px.symbol-fixed .symbol-label{width:40px;height:40px}.symbol.symbol-40px.symbol-fixed>img{width:40px;height:40px;max-width:none}.symbol.symbol-40px.symbol-2by3 .symbol-label{height:40px;width:60px}.symbol.symbol-40px.symbol-2by3>img{height:40px;width:60px;max-width:none}.symbol.symbol-45px>img{width:45px;height:45px}.symbol.symbol-45px .symbol-label{width:45px;height:45px}.symbol.symbol-45px.symbol-fixed .symbol-label{width:45px;height:45px}.symbol.symbol-45px.symbol-fixed>img{width:45px;height:45px;max-width:none}.symbol.symbol-45px.symbol-2by3 .symbol-label{height:45px;width:67.5px}.symbol.symbol-45px.symbol-2by3>img{height:45px;width:67.5px;max-width:none}.symbol.symbol-50px>img{width:50px;height:50px}.symbol.symbol-50px .symbol-label{width:50px;height:50px}.symbol.symbol-50px.symbol-fixed .symbol-label{width:50px;height:50px}.symbol.symbol-50px.symbol-fixed>img{width:50px;height:50px;max-width:none}.symbol.symbol-50px.symbol-2by3 .symbol-label{height:50px;width:75px}.symbol.symbol-50px.symbol-2by3>img{height:50px;width:75px;max-width:none}.symbol.symbol-55px>img{width:55px;height:55px}.symbol.symbol-55px .symbol-label{width:55px;height:55px}.symbol.symbol-55px.symbol-fixed .symbol-label{width:55px;height:55px}.symbol.symbol-55px.symbol-fixed>img{width:55px;height:55px;max-width:none}.symbol.symbol-55px.symbol-2by3 .symbol-label{height:55px;width:82.5px}.symbol.symbol-55px.symbol-2by3>img{height:55px;width:82.5px;max-width:none}.symbol.symbol-60px>img{width:60px;height:60px}.symbol.symbol-60px .symbol-label{width:60px;height:60px}.symbol.symbol-60px.symbol-fixed .symbol-label{width:60px;height:60px}.symbol.symbol-60px.symbol-fixed>img{width:60px;height:60px;max-width:none}.symbol.symbol-60px.symbol-2by3 .symbol-label{height:60px;width:90px}.symbol.symbol-60px.symbol-2by3>img{height:60px;width:90px;max-width:none}.symbol.symbol-65px>img{width:65px;height:65px}.symbol.symbol-65px .symbol-label{width:65px;height:65px}.symbol.symbol-65px.symbol-fixed .symbol-label{width:65px;height:65px}.symbol.symbol-65px.symbol-fixed>img{width:65px;height:65px;max-width:none}.symbol.symbol-65px.symbol-2by3 .symbol-label{height:65px;width:97.5px}.symbol.symbol-65px.symbol-2by3>img{height:65px;width:97.5px;max-width:none}.symbol.symbol-70px>img{width:70px;height:70px}.symbol.symbol-70px .symbol-label{width:70px;height:70px}.symbol.symbol-70px.symbol-fixed .symbol-label{width:70px;height:70px}.symbol.symbol-70px.symbol-fixed>img{width:70px;height:70px;max-width:none}.symbol.symbol-70px.symbol-2by3 .symbol-label{height:70px;width:105px}.symbol.symbol-70px.symbol-2by3>img{height:70px;width:105px;max-width:none}.symbol.symbol-75px>img{width:75px;height:75px}.symbol.symbol-75px .symbol-label{width:75px;height:75px}.symbol.symbol-75px.symbol-fixed .symbol-label{width:75px;height:75px}.symbol.symbol-75px.symbol-fixed>img{width:75px;height:75px;max-width:none}.symbol.symbol-75px.symbol-2by3 .symbol-label{height:75px;width:112.5px}.symbol.symbol-75px.symbol-2by3>img{height:75px;width:112.5px;max-width:none}.symbol.symbol-90px>img{width:90px;height:90px}.symbol.symbol-90px .symbol-label{width:90px;height:90px}.symbol.symbol-90px.symbol-fixed .symbol-label{width:90px;height:90px}.symbol.symbol-90px.symbol-fixed>img{width:90px;height:90px;max-width:none}.symbol.symbol-90px.symbol-2by3 .symbol-label{height:90px;width:135px}.symbol.symbol-90px.symbol-2by3>img{height:90px;width:135px;max-width:none}.symbol.symbol-100px>img{width:100px;height:100px}.symbol.symbol-100px .symbol-label{width:100px;height:100px}.symbol.symbol-100px.symbol-fixed .symbol-label{width:100px;height:100px}.symbol.symbol-100px.symbol-fixed>img{width:100px;height:100px;max-width:none}.symbol.symbol-100px.symbol-2by3 .symbol-label{height:100px;width:150px}.symbol.symbol-100px.symbol-2by3>img{height:100px;width:150px;max-width:none}.symbol.symbol-125px>img{width:125px;height:125px}.symbol.symbol-125px .symbol-label{width:125px;height:125px}.symbol.symbol-125px.symbol-fixed .symbol-label{width:125px;height:125px}.symbol.symbol-125px.symbol-fixed>img{width:125px;height:125px;max-width:none}.symbol.symbol-125px.symbol-2by3 .symbol-label{height:125px;width:187.5px}.symbol.symbol-125px.symbol-2by3>img{height:125px;width:187.5px;max-width:none}.symbol.symbol-150px>img{width:150px;height:150px}.symbol.symbol-150px .symbol-label{width:150px;height:150px}.symbol.symbol-150px.symbol-fixed .symbol-label{width:150px;height:150px}.symbol.symbol-150px.symbol-fixed>img{width:150px;height:150px;max-width:none}.symbol.symbol-150px.symbol-2by3 .symbol-label{height:150px;width:225px}.symbol.symbol-150px.symbol-2by3>img{height:150px;width:225px;max-width:none}.symbol.symbol-160px>img{width:160px;height:160px}.symbol.symbol-160px .symbol-label{width:160px;height:160px}.symbol.symbol-160px.symbol-fixed .symbol-label{width:160px;height:160px}.symbol.symbol-160px.symbol-fixed>img{width:160px;height:160px;max-width:none}.symbol.symbol-160px.symbol-2by3 .symbol-label{height:160px;width:240px}.symbol.symbol-160px.symbol-2by3>img{height:160px;width:240px;max-width:none}.symbol.symbol-175px>img{width:175px;height:175px}.symbol.symbol-175px .symbol-label{width:175px;height:175px}.symbol.symbol-175px.symbol-fixed .symbol-label{width:175px;height:175px}.symbol.symbol-175px.symbol-fixed>img{width:175px;height:175px;max-width:none}.symbol.symbol-175px.symbol-2by3 .symbol-label{height:175px;width:262.5px}.symbol.symbol-175px.symbol-2by3>img{height:175px;width:262.5px;max-width:none}.symbol.symbol-200px>img{width:200px;height:200px}.symbol.symbol-200px .symbol-label{width:200px;height:200px}.symbol.symbol-200px.symbol-fixed .symbol-label{width:200px;height:200px}.symbol.symbol-200px.symbol-fixed>img{width:200px;height:200px;max-width:none}.symbol.symbol-200px.symbol-2by3 .symbol-label{height:200px;width:300px}.symbol.symbol-200px.symbol-2by3>img{height:200px;width:300px;max-width:none}@media (min-width:576px){.symbol.symbol-sm-20px>img{width:20px;height:20px}.symbol.symbol-sm-20px .symbol-label{width:20px;height:20px}.symbol.symbol-sm-20px.symbol-fixed .symbol-label{width:20px;height:20px}.symbol.symbol-sm-20px.symbol-fixed>img{width:20px;height:20px;max-width:none}.symbol.symbol-sm-20px.symbol-2by3 .symbol-label{height:20px;width:30px}.symbol.symbol-sm-20px.symbol-2by3>img{height:20px;width:30px;max-width:none}.symbol.symbol-sm-25px>img{width:25px;height:25px}.symbol.symbol-sm-25px .symbol-label{width:25px;height:25px}.symbol.symbol-sm-25px.symbol-fixed .symbol-label{width:25px;height:25px}.symbol.symbol-sm-25px.symbol-fixed>img{width:25px;height:25px;max-width:none}.symbol.symbol-sm-25px.symbol-2by3 .symbol-label{height:25px;width:37.5px}.symbol.symbol-sm-25px.symbol-2by3>img{height:25px;width:37.5px;max-width:none}.symbol.symbol-sm-30px>img{width:30px;height:30px}.symbol.symbol-sm-30px .symbol-label{width:30px;height:30px}.symbol.symbol-sm-30px.symbol-fixed .symbol-label{width:30px;height:30px}.symbol.symbol-sm-30px.symbol-fixed>img{width:30px;height:30px;max-width:none}.symbol.symbol-sm-30px.symbol-2by3 .symbol-label{height:30px;width:45px}.symbol.symbol-sm-30px.symbol-2by3>img{height:30px;width:45px;max-width:none}.symbol.symbol-sm-35px>img{width:35px;height:35px}.symbol.symbol-sm-35px .symbol-label{width:35px;height:35px}.symbol.symbol-sm-35px.symbol-fixed .symbol-label{width:35px;height:35px}.symbol.symbol-sm-35px.symbol-fixed>img{width:35px;height:35px;max-width:none}.symbol.symbol-sm-35px.symbol-2by3 .symbol-label{height:35px;width:52.5px}.symbol.symbol-sm-35px.symbol-2by3>img{height:35px;width:52.5px;max-width:none}.symbol.symbol-sm-40px>img{width:40px;height:40px}.symbol.symbol-sm-40px .symbol-label{width:40px;height:40px}.symbol.symbol-sm-40px.symbol-fixed .symbol-label{width:40px;height:40px}.symbol.symbol-sm-40px.symbol-fixed>img{width:40px;height:40px;max-width:none}.symbol.symbol-sm-40px.symbol-2by3 .symbol-label{height:40px;width:60px}.symbol.symbol-sm-40px.symbol-2by3>img{height:40px;width:60px;max-width:none}.symbol.symbol-sm-45px>img{width:45px;height:45px}.symbol.symbol-sm-45px .symbol-label{width:45px;height:45px}.symbol.symbol-sm-45px.symbol-fixed .symbol-label{width:45px;height:45px}.symbol.symbol-sm-45px.symbol-fixed>img{width:45px;height:45px;max-width:none}.symbol.symbol-sm-45px.symbol-2by3 .symbol-label{height:45px;width:67.5px}.symbol.symbol-sm-45px.symbol-2by3>img{height:45px;width:67.5px;max-width:none}.symbol.symbol-sm-50px>img{width:50px;height:50px}.symbol.symbol-sm-50px .symbol-label{width:50px;height:50px}.symbol.symbol-sm-50px.symbol-fixed .symbol-label{width:50px;height:50px}.symbol.symbol-sm-50px.symbol-fixed>img{width:50px;height:50px;max-width:none}.symbol.symbol-sm-50px.symbol-2by3 .symbol-label{height:50px;width:75px}.symbol.symbol-sm-50px.symbol-2by3>img{height:50px;width:75px;max-width:none}.symbol.symbol-sm-55px>img{width:55px;height:55px}.symbol.symbol-sm-55px .symbol-label{width:55px;height:55px}.symbol.symbol-sm-55px.symbol-fixed .symbol-label{width:55px;height:55px}.symbol.symbol-sm-55px.symbol-fixed>img{width:55px;height:55px;max-width:none}.symbol.symbol-sm-55px.symbol-2by3 .symbol-label{height:55px;width:82.5px}.symbol.symbol-sm-55px.symbol-2by3>img{height:55px;width:82.5px;max-width:none}.symbol.symbol-sm-60px>img{width:60px;height:60px}.symbol.symbol-sm-60px .symbol-label{width:60px;height:60px}.symbol.symbol-sm-60px.symbol-fixed .symbol-label{width:60px;height:60px}.symbol.symbol-sm-60px.symbol-fixed>img{width:60px;height:60px;max-width:none}.symbol.symbol-sm-60px.symbol-2by3 .symbol-label{height:60px;width:90px}.symbol.symbol-sm-60px.symbol-2by3>img{height:60px;width:90px;max-width:none}.symbol.symbol-sm-65px>img{width:65px;height:65px}.symbol.symbol-sm-65px .symbol-label{width:65px;height:65px}.symbol.symbol-sm-65px.symbol-fixed .symbol-label{width:65px;height:65px}.symbol.symbol-sm-65px.symbol-fixed>img{width:65px;height:65px;max-width:none}.symbol.symbol-sm-65px.symbol-2by3 .symbol-label{height:65px;width:97.5px}.symbol.symbol-sm-65px.symbol-2by3>img{height:65px;width:97.5px;max-width:none}.symbol.symbol-sm-70px>img{width:70px;height:70px}.symbol.symbol-sm-70px .symbol-label{width:70px;height:70px}.symbol.symbol-sm-70px.symbol-fixed .symbol-label{width:70px;height:70px}.symbol.symbol-sm-70px.symbol-fixed>img{width:70px;height:70px;max-width:none}.symbol.symbol-sm-70px.symbol-2by3 .symbol-label{height:70px;width:105px}.symbol.symbol-sm-70px.symbol-2by3>img{height:70px;width:105px;max-width:none}.symbol.symbol-sm-75px>img{width:75px;height:75px}.symbol.symbol-sm-75px .symbol-label{width:75px;height:75px}.symbol.symbol-sm-75px.symbol-fixed .symbol-label{width:75px;height:75px}.symbol.symbol-sm-75px.symbol-fixed>img{width:75px;height:75px;max-width:none}.symbol.symbol-sm-75px.symbol-2by3 .symbol-label{height:75px;width:112.5px}.symbol.symbol-sm-75px.symbol-2by3>img{height:75px;width:112.5px;max-width:none}.symbol.symbol-sm-90px>img{width:90px;height:90px}.symbol.symbol-sm-90px .symbol-label{width:90px;height:90px}.symbol.symbol-sm-90px.symbol-fixed .symbol-label{width:90px;height:90px}.symbol.symbol-sm-90px.symbol-fixed>img{width:90px;height:90px;max-width:none}.symbol.symbol-sm-90px.symbol-2by3 .symbol-label{height:90px;width:135px}.symbol.symbol-sm-90px.symbol-2by3>img{height:90px;width:135px;max-width:none}.symbol.symbol-sm-100px>img{width:100px;height:100px}.symbol.symbol-sm-100px .symbol-label{width:100px;height:100px}.symbol.symbol-sm-100px.symbol-fixed .symbol-label{width:100px;height:100px}.symbol.symbol-sm-100px.symbol-fixed>img{width:100px;height:100px;max-width:none}.symbol.symbol-sm-100px.symbol-2by3 .symbol-label{height:100px;width:150px}.symbol.symbol-sm-100px.symbol-2by3>img{height:100px;width:150px;max-width:none}.symbol.symbol-sm-125px>img{width:125px;height:125px}.symbol.symbol-sm-125px .symbol-label{width:125px;height:125px}.symbol.symbol-sm-125px.symbol-fixed .symbol-label{width:125px;height:125px}.symbol.symbol-sm-125px.symbol-fixed>img{width:125px;height:125px;max-width:none}.symbol.symbol-sm-125px.symbol-2by3 .symbol-label{height:125px;width:187.5px}.symbol.symbol-sm-125px.symbol-2by3>img{height:125px;width:187.5px;max-width:none}.symbol.symbol-sm-150px>img{width:150px;height:150px}.symbol.symbol-sm-150px .symbol-label{width:150px;height:150px}.symbol.symbol-sm-150px.symbol-fixed .symbol-label{width:150px;height:150px}.symbol.symbol-sm-150px.symbol-fixed>img{width:150px;height:150px;max-width:none}.symbol.symbol-sm-150px.symbol-2by3 .symbol-label{height:150px;width:225px}.symbol.symbol-sm-150px.symbol-2by3>img{height:150px;width:225px;max-width:none}.symbol.symbol-sm-160px>img{width:160px;height:160px}.symbol.symbol-sm-160px .symbol-label{width:160px;height:160px}.symbol.symbol-sm-160px.symbol-fixed .symbol-label{width:160px;height:160px}.symbol.symbol-sm-160px.symbol-fixed>img{width:160px;height:160px;max-width:none}.symbol.symbol-sm-160px.symbol-2by3 .symbol-label{height:160px;width:240px}.symbol.symbol-sm-160px.symbol-2by3>img{height:160px;width:240px;max-width:none}.symbol.symbol-sm-175px>img{width:175px;height:175px}.symbol.symbol-sm-175px .symbol-label{width:175px;height:175px}.symbol.symbol-sm-175px.symbol-fixed .symbol-label{width:175px;height:175px}.symbol.symbol-sm-175px.symbol-fixed>img{width:175px;height:175px;max-width:none}.symbol.symbol-sm-175px.symbol-2by3 .symbol-label{height:175px;width:262.5px}.symbol.symbol-sm-175px.symbol-2by3>img{height:175px;width:262.5px;max-width:none}.symbol.symbol-sm-200px>img{width:200px;height:200px}.symbol.symbol-sm-200px .symbol-label{width:200px;height:200px}.symbol.symbol-sm-200px.symbol-fixed .symbol-label{width:200px;height:200px}.symbol.symbol-sm-200px.symbol-fixed>img{width:200px;height:200px;max-width:none}.symbol.symbol-sm-200px.symbol-2by3 .symbol-label{height:200px;width:300px}.symbol.symbol-sm-200px.symbol-2by3>img{height:200px;width:300px;max-width:none}}@media (min-width:768px){.symbol.symbol-md-20px>img{width:20px;height:20px}.symbol.symbol-md-20px .symbol-label{width:20px;height:20px}.symbol.symbol-md-20px.symbol-fixed .symbol-label{width:20px;height:20px}.symbol.symbol-md-20px.symbol-fixed>img{width:20px;height:20px;max-width:none}.symbol.symbol-md-20px.symbol-2by3 .symbol-label{height:20px;width:30px}.symbol.symbol-md-20px.symbol-2by3>img{height:20px;width:30px;max-width:none}.symbol.symbol-md-25px>img{width:25px;height:25px}.symbol.symbol-md-25px .symbol-label{width:25px;height:25px}.symbol.symbol-md-25px.symbol-fixed .symbol-label{width:25px;height:25px}.symbol.symbol-md-25px.symbol-fixed>img{width:25px;height:25px;max-width:none}.symbol.symbol-md-25px.symbol-2by3 .symbol-label{height:25px;width:37.5px}.symbol.symbol-md-25px.symbol-2by3>img{height:25px;width:37.5px;max-width:none}.symbol.symbol-md-30px>img{width:30px;height:30px}.symbol.symbol-md-30px .symbol-label{width:30px;height:30px}.symbol.symbol-md-30px.symbol-fixed .symbol-label{width:30px;height:30px}.symbol.symbol-md-30px.symbol-fixed>img{width:30px;height:30px;max-width:none}.symbol.symbol-md-30px.symbol-2by3 .symbol-label{height:30px;width:45px}.symbol.symbol-md-30px.symbol-2by3>img{height:30px;width:45px;max-width:none}.symbol.symbol-md-35px>img{width:35px;height:35px}.symbol.symbol-md-35px .symbol-label{width:35px;height:35px}.symbol.symbol-md-35px.symbol-fixed .symbol-label{width:35px;height:35px}.symbol.symbol-md-35px.symbol-fixed>img{width:35px;height:35px;max-width:none}.symbol.symbol-md-35px.symbol-2by3 .symbol-label{height:35px;width:52.5px}.symbol.symbol-md-35px.symbol-2by3>img{height:35px;width:52.5px;max-width:none}.symbol.symbol-md-40px>img{width:40px;height:40px}.symbol.symbol-md-40px .symbol-label{width:40px;height:40px}.symbol.symbol-md-40px.symbol-fixed .symbol-label{width:40px;height:40px}.symbol.symbol-md-40px.symbol-fixed>img{width:40px;height:40px;max-width:none}.symbol.symbol-md-40px.symbol-2by3 .symbol-label{height:40px;width:60px}.symbol.symbol-md-40px.symbol-2by3>img{height:40px;width:60px;max-width:none}.symbol.symbol-md-45px>img{width:45px;height:45px}.symbol.symbol-md-45px .symbol-label{width:45px;height:45px}.symbol.symbol-md-45px.symbol-fixed .symbol-label{width:45px;height:45px}.symbol.symbol-md-45px.symbol-fixed>img{width:45px;height:45px;max-width:none}.symbol.symbol-md-45px.symbol-2by3 .symbol-label{height:45px;width:67.5px}.symbol.symbol-md-45px.symbol-2by3>img{height:45px;width:67.5px;max-width:none}.symbol.symbol-md-50px>img{width:50px;height:50px}.symbol.symbol-md-50px .symbol-label{width:50px;height:50px}.symbol.symbol-md-50px.symbol-fixed .symbol-label{width:50px;height:50px}.symbol.symbol-md-50px.symbol-fixed>img{width:50px;height:50px;max-width:none}.symbol.symbol-md-50px.symbol-2by3 .symbol-label{height:50px;width:75px}.symbol.symbol-md-50px.symbol-2by3>img{height:50px;width:75px;max-width:none}.symbol.symbol-md-55px>img{width:55px;height:55px}.symbol.symbol-md-55px .symbol-label{width:55px;height:55px}.symbol.symbol-md-55px.symbol-fixed .symbol-label{width:55px;height:55px}.symbol.symbol-md-55px.symbol-fixed>img{width:55px;height:55px;max-width:none}.symbol.symbol-md-55px.symbol-2by3 .symbol-label{height:55px;width:82.5px}.symbol.symbol-md-55px.symbol-2by3>img{height:55px;width:82.5px;max-width:none}.symbol.symbol-md-60px>img{width:60px;height:60px}.symbol.symbol-md-60px .symbol-label{width:60px;height:60px}.symbol.symbol-md-60px.symbol-fixed .symbol-label{width:60px;height:60px}.symbol.symbol-md-60px.symbol-fixed>img{width:60px;height:60px;max-width:none}.symbol.symbol-md-60px.symbol-2by3 .symbol-label{height:60px;width:90px}.symbol.symbol-md-60px.symbol-2by3>img{height:60px;width:90px;max-width:none}.symbol.symbol-md-65px>img{width:65px;height:65px}.symbol.symbol-md-65px .symbol-label{width:65px;height:65px}.symbol.symbol-md-65px.symbol-fixed .symbol-label{width:65px;height:65px}.symbol.symbol-md-65px.symbol-fixed>img{width:65px;height:65px;max-width:none}.symbol.symbol-md-65px.symbol-2by3 .symbol-label{height:65px;width:97.5px}.symbol.symbol-md-65px.symbol-2by3>img{height:65px;width:97.5px;max-width:none}.symbol.symbol-md-70px>img{width:70px;height:70px}.symbol.symbol-md-70px .symbol-label{width:70px;height:70px}.symbol.symbol-md-70px.symbol-fixed .symbol-label{width:70px;height:70px}.symbol.symbol-md-70px.symbol-fixed>img{width:70px;height:70px;max-width:none}.symbol.symbol-md-70px.symbol-2by3 .symbol-label{height:70px;width:105px}.symbol.symbol-md-70px.symbol-2by3>img{height:70px;width:105px;max-width:none}.symbol.symbol-md-75px>img{width:75px;height:75px}.symbol.symbol-md-75px .symbol-label{width:75px;height:75px}.symbol.symbol-md-75px.symbol-fixed .symbol-label{width:75px;height:75px}.symbol.symbol-md-75px.symbol-fixed>img{width:75px;height:75px;max-width:none}.symbol.symbol-md-75px.symbol-2by3 .symbol-label{height:75px;width:112.5px}.symbol.symbol-md-75px.symbol-2by3>img{height:75px;width:112.5px;max-width:none}.symbol.symbol-md-90px>img{width:90px;height:90px}.symbol.symbol-md-90px .symbol-label{width:90px;height:90px}.symbol.symbol-md-90px.symbol-fixed .symbol-label{width:90px;height:90px}.symbol.symbol-md-90px.symbol-fixed>img{width:90px;height:90px;max-width:none}.symbol.symbol-md-90px.symbol-2by3 .symbol-label{height:90px;width:135px}.symbol.symbol-md-90px.symbol-2by3>img{height:90px;width:135px;max-width:none}.symbol.symbol-md-100px>img{width:100px;height:100px}.symbol.symbol-md-100px .symbol-label{width:100px;height:100px}.symbol.symbol-md-100px.symbol-fixed .symbol-label{width:100px;height:100px}.symbol.symbol-md-100px.symbol-fixed>img{width:100px;height:100px;max-width:none}.symbol.symbol-md-100px.symbol-2by3 .symbol-label{height:100px;width:150px}.symbol.symbol-md-100px.symbol-2by3>img{height:100px;width:150px;max-width:none}.symbol.symbol-md-125px>img{width:125px;height:125px}.symbol.symbol-md-125px .symbol-label{width:125px;height:125px}.symbol.symbol-md-125px.symbol-fixed .symbol-label{width:125px;height:125px}.symbol.symbol-md-125px.symbol-fixed>img{width:125px;height:125px;max-width:none}.symbol.symbol-md-125px.symbol-2by3 .symbol-label{height:125px;width:187.5px}.symbol.symbol-md-125px.symbol-2by3>img{height:125px;width:187.5px;max-width:none}.symbol.symbol-md-150px>img{width:150px;height:150px}.symbol.symbol-md-150px .symbol-label{width:150px;height:150px}.symbol.symbol-md-150px.symbol-fixed .symbol-label{width:150px;height:150px}.symbol.symbol-md-150px.symbol-fixed>img{width:150px;height:150px;max-width:none}.symbol.symbol-md-150px.symbol-2by3 .symbol-label{height:150px;width:225px}.symbol.symbol-md-150px.symbol-2by3>img{height:150px;width:225px;max-width:none}.symbol.symbol-md-160px>img{width:160px;height:160px}.symbol.symbol-md-160px .symbol-label{width:160px;height:160px}.symbol.symbol-md-160px.symbol-fixed .symbol-label{width:160px;height:160px}.symbol.symbol-md-160px.symbol-fixed>img{width:160px;height:160px;max-width:none}.symbol.symbol-md-160px.symbol-2by3 .symbol-label{height:160px;width:240px}.symbol.symbol-md-160px.symbol-2by3>img{height:160px;width:240px;max-width:none}.symbol.symbol-md-175px>img{width:175px;height:175px}.symbol.symbol-md-175px .symbol-label{width:175px;height:175px}.symbol.symbol-md-175px.symbol-fixed .symbol-label{width:175px;height:175px}.symbol.symbol-md-175px.symbol-fixed>img{width:175px;height:175px;max-width:none}.symbol.symbol-md-175px.symbol-2by3 .symbol-label{height:175px;width:262.5px}.symbol.symbol-md-175px.symbol-2by3>img{height:175px;width:262.5px;max-width:none}.symbol.symbol-md-200px>img{width:200px;height:200px}.symbol.symbol-md-200px .symbol-label{width:200px;height:200px}.symbol.symbol-md-200px.symbol-fixed .symbol-label{width:200px;height:200px}.symbol.symbol-md-200px.symbol-fixed>img{width:200px;height:200px;max-width:none}.symbol.symbol-md-200px.symbol-2by3 .symbol-label{height:200px;width:300px}.symbol.symbol-md-200px.symbol-2by3>img{height:200px;width:300px;max-width:none}}@media (min-width:992px){.symbol.symbol-lg-20px>img{width:20px;height:20px}.symbol.symbol-lg-20px .symbol-label{width:20px;height:20px}.symbol.symbol-lg-20px.symbol-fixed .symbol-label{width:20px;height:20px}.symbol.symbol-lg-20px.symbol-fixed>img{width:20px;height:20px;max-width:none}.symbol.symbol-lg-20px.symbol-2by3 .symbol-label{height:20px;width:30px}.symbol.symbol-lg-20px.symbol-2by3>img{height:20px;width:30px;max-width:none}.symbol.symbol-lg-25px>img{width:25px;height:25px}.symbol.symbol-lg-25px .symbol-label{width:25px;height:25px}.symbol.symbol-lg-25px.symbol-fixed .symbol-label{width:25px;height:25px}.symbol.symbol-lg-25px.symbol-fixed>img{width:25px;height:25px;max-width:none}.symbol.symbol-lg-25px.symbol-2by3 .symbol-label{height:25px;width:37.5px}.symbol.symbol-lg-25px.symbol-2by3>img{height:25px;width:37.5px;max-width:none}.symbol.symbol-lg-30px>img{width:30px;height:30px}.symbol.symbol-lg-30px .symbol-label{width:30px;height:30px}.symbol.symbol-lg-30px.symbol-fixed .symbol-label{width:30px;height:30px}.symbol.symbol-lg-30px.symbol-fixed>img{width:30px;height:30px;max-width:none}.symbol.symbol-lg-30px.symbol-2by3 .symbol-label{height:30px;width:45px}.symbol.symbol-lg-30px.symbol-2by3>img{height:30px;width:45px;max-width:none}.symbol.symbol-lg-35px>img{width:35px;height:35px}.symbol.symbol-lg-35px .symbol-label{width:35px;height:35px}.symbol.symbol-lg-35px.symbol-fixed .symbol-label{width:35px;height:35px}.symbol.symbol-lg-35px.symbol-fixed>img{width:35px;height:35px;max-width:none}.symbol.symbol-lg-35px.symbol-2by3 .symbol-label{height:35px;width:52.5px}.symbol.symbol-lg-35px.symbol-2by3>img{height:35px;width:52.5px;max-width:none}.symbol.symbol-lg-40px>img{width:40px;height:40px}.symbol.symbol-lg-40px .symbol-label{width:40px;height:40px}.symbol.symbol-lg-40px.symbol-fixed .symbol-label{width:40px;height:40px}.symbol.symbol-lg-40px.symbol-fixed>img{width:40px;height:40px;max-width:none}.symbol.symbol-lg-40px.symbol-2by3 .symbol-label{height:40px;width:60px}.symbol.symbol-lg-40px.symbol-2by3>img{height:40px;width:60px;max-width:none}.symbol.symbol-lg-45px>img{width:45px;height:45px}.symbol.symbol-lg-45px .symbol-label{width:45px;height:45px}.symbol.symbol-lg-45px.symbol-fixed .symbol-label{width:45px;height:45px}.symbol.symbol-lg-45px.symbol-fixed>img{width:45px;height:45px;max-width:none}.symbol.symbol-lg-45px.symbol-2by3 .symbol-label{height:45px;width:67.5px}.symbol.symbol-lg-45px.symbol-2by3>img{height:45px;width:67.5px;max-width:none}.symbol.symbol-lg-50px>img{width:50px;height:50px}.symbol.symbol-lg-50px .symbol-label{width:50px;height:50px}.symbol.symbol-lg-50px.symbol-fixed .symbol-label{width:50px;height:50px}.symbol.symbol-lg-50px.symbol-fixed>img{width:50px;height:50px;max-width:none}.symbol.symbol-lg-50px.symbol-2by3 .symbol-label{height:50px;width:75px}.symbol.symbol-lg-50px.symbol-2by3>img{height:50px;width:75px;max-width:none}.symbol.symbol-lg-55px>img{width:55px;height:55px}.symbol.symbol-lg-55px .symbol-label{width:55px;height:55px}.symbol.symbol-lg-55px.symbol-fixed .symbol-label{width:55px;height:55px}.symbol.symbol-lg-55px.symbol-fixed>img{width:55px;height:55px;max-width:none}.symbol.symbol-lg-55px.symbol-2by3 .symbol-label{height:55px;width:82.5px}.symbol.symbol-lg-55px.symbol-2by3>img{height:55px;width:82.5px;max-width:none}.symbol.symbol-lg-60px>img{width:60px;height:60px}.symbol.symbol-lg-60px .symbol-label{width:60px;height:60px}.symbol.symbol-lg-60px.symbol-fixed .symbol-label{width:60px;height:60px}.symbol.symbol-lg-60px.symbol-fixed>img{width:60px;height:60px;max-width:none}.symbol.symbol-lg-60px.symbol-2by3 .symbol-label{height:60px;width:90px}.symbol.symbol-lg-60px.symbol-2by3>img{height:60px;width:90px;max-width:none}.symbol.symbol-lg-65px>img{width:65px;height:65px}.symbol.symbol-lg-65px .symbol-label{width:65px;height:65px}.symbol.symbol-lg-65px.symbol-fixed .symbol-label{width:65px;height:65px}.symbol.symbol-lg-65px.symbol-fixed>img{width:65px;height:65px;max-width:none}.symbol.symbol-lg-65px.symbol-2by3 .symbol-label{height:65px;width:97.5px}.symbol.symbol-lg-65px.symbol-2by3>img{height:65px;width:97.5px;max-width:none}.symbol.symbol-lg-70px>img{width:70px;height:70px}.symbol.symbol-lg-70px .symbol-label{width:70px;height:70px}.symbol.symbol-lg-70px.symbol-fixed .symbol-label{width:70px;height:70px}.symbol.symbol-lg-70px.symbol-fixed>img{width:70px;height:70px;max-width:none}.symbol.symbol-lg-70px.symbol-2by3 .symbol-label{height:70px;width:105px}.symbol.symbol-lg-70px.symbol-2by3>img{height:70px;width:105px;max-width:none}.symbol.symbol-lg-75px>img{width:75px;height:75px}.symbol.symbol-lg-75px .symbol-label{width:75px;height:75px}.symbol.symbol-lg-75px.symbol-fixed .symbol-label{width:75px;height:75px}.symbol.symbol-lg-75px.symbol-fixed>img{width:75px;height:75px;max-width:none}.symbol.symbol-lg-75px.symbol-2by3 .symbol-label{height:75px;width:112.5px}.symbol.symbol-lg-75px.symbol-2by3>img{height:75px;width:112.5px;max-width:none}.symbol.symbol-lg-90px>img{width:90px;height:90px}.symbol.symbol-lg-90px .symbol-label{width:90px;height:90px}.symbol.symbol-lg-90px.symbol-fixed .symbol-label{width:90px;height:90px}.symbol.symbol-lg-90px.symbol-fixed>img{width:90px;height:90px;max-width:none}.symbol.symbol-lg-90px.symbol-2by3 .symbol-label{height:90px;width:135px}.symbol.symbol-lg-90px.symbol-2by3>img{height:90px;width:135px;max-width:none}.symbol.symbol-lg-100px>img{width:100px;height:100px}.symbol.symbol-lg-100px .symbol-label{width:100px;height:100px}.symbol.symbol-lg-100px.symbol-fixed .symbol-label{width:100px;height:100px}.symbol.symbol-lg-100px.symbol-fixed>img{width:100px;height:100px;max-width:none}.symbol.symbol-lg-100px.symbol-2by3 .symbol-label{height:100px;width:150px}.symbol.symbol-lg-100px.symbol-2by3>img{height:100px;width:150px;max-width:none}.symbol.symbol-lg-125px>img{width:125px;height:125px}.symbol.symbol-lg-125px .symbol-label{width:125px;height:125px}.symbol.symbol-lg-125px.symbol-fixed .symbol-label{width:125px;height:125px}.symbol.symbol-lg-125px.symbol-fixed>img{width:125px;height:125px;max-width:none}.symbol.symbol-lg-125px.symbol-2by3 .symbol-label{height:125px;width:187.5px}.symbol.symbol-lg-125px.symbol-2by3>img{height:125px;width:187.5px;max-width:none}.symbol.symbol-lg-150px>img{width:150px;height:150px}.symbol.symbol-lg-150px .symbol-label{width:150px;height:150px}.symbol.symbol-lg-150px.symbol-fixed .symbol-label{width:150px;height:150px}.symbol.symbol-lg-150px.symbol-fixed>img{width:150px;height:150px;max-width:none}.symbol.symbol-lg-150px.symbol-2by3 .symbol-label{height:150px;width:225px}.symbol.symbol-lg-150px.symbol-2by3>img{height:150px;width:225px;max-width:none}.symbol.symbol-lg-160px>img{width:160px;height:160px}.symbol.symbol-lg-160px .symbol-label{width:160px;height:160px}.symbol.symbol-lg-160px.symbol-fixed .symbol-label{width:160px;height:160px}.symbol.symbol-lg-160px.symbol-fixed>img{width:160px;height:160px;max-width:none}.symbol.symbol-lg-160px.symbol-2by3 .symbol-label{height:160px;width:240px}.symbol.symbol-lg-160px.symbol-2by3>img{height:160px;width:240px;max-width:none}.symbol.symbol-lg-175px>img{width:175px;height:175px}.symbol.symbol-lg-175px .symbol-label{width:175px;height:175px}.symbol.symbol-lg-175px.symbol-fixed .symbol-label{width:175px;height:175px}.symbol.symbol-lg-175px.symbol-fixed>img{width:175px;height:175px;max-width:none}.symbol.symbol-lg-175px.symbol-2by3 .symbol-label{height:175px;width:262.5px}.symbol.symbol-lg-175px.symbol-2by3>img{height:175px;width:262.5px;max-width:none}.symbol.symbol-lg-200px>img{width:200px;height:200px}.symbol.symbol-lg-200px .symbol-label{width:200px;height:200px}.symbol.symbol-lg-200px.symbol-fixed .symbol-label{width:200px;height:200px}.symbol.symbol-lg-200px.symbol-fixed>img{width:200px;height:200px;max-width:none}.symbol.symbol-lg-200px.symbol-2by3 .symbol-label{height:200px;width:300px}.symbol.symbol-lg-200px.symbol-2by3>img{height:200px;width:300px;max-width:none}}@media (min-width:1200px){.symbol.symbol-xl-20px>img{width:20px;height:20px}.symbol.symbol-xl-20px .symbol-label{width:20px;height:20px}.symbol.symbol-xl-20px.symbol-fixed .symbol-label{width:20px;height:20px}.symbol.symbol-xl-20px.symbol-fixed>img{width:20px;height:20px;max-width:none}.symbol.symbol-xl-20px.symbol-2by3 .symbol-label{height:20px;width:30px}.symbol.symbol-xl-20px.symbol-2by3>img{height:20px;width:30px;max-width:none}.symbol.symbol-xl-25px>img{width:25px;height:25px}.symbol.symbol-xl-25px .symbol-label{width:25px;height:25px}.symbol.symbol-xl-25px.symbol-fixed .symbol-label{width:25px;height:25px}.symbol.symbol-xl-25px.symbol-fixed>img{width:25px;height:25px;max-width:none}.symbol.symbol-xl-25px.symbol-2by3 .symbol-label{height:25px;width:37.5px}.symbol.symbol-xl-25px.symbol-2by3>img{height:25px;width:37.5px;max-width:none}.symbol.symbol-xl-30px>img{width:30px;height:30px}.symbol.symbol-xl-30px .symbol-label{width:30px;height:30px}.symbol.symbol-xl-30px.symbol-fixed .symbol-label{width:30px;height:30px}.symbol.symbol-xl-30px.symbol-fixed>img{width:30px;height:30px;max-width:none}.symbol.symbol-xl-30px.symbol-2by3 .symbol-label{height:30px;width:45px}.symbol.symbol-xl-30px.symbol-2by3>img{height:30px;width:45px;max-width:none}.symbol.symbol-xl-35px>img{width:35px;height:35px}.symbol.symbol-xl-35px .symbol-label{width:35px;height:35px}.symbol.symbol-xl-35px.symbol-fixed .symbol-label{width:35px;height:35px}.symbol.symbol-xl-35px.symbol-fixed>img{width:35px;height:35px;max-width:none}.symbol.symbol-xl-35px.symbol-2by3 .symbol-label{height:35px;width:52.5px}.symbol.symbol-xl-35px.symbol-2by3>img{height:35px;width:52.5px;max-width:none}.symbol.symbol-xl-40px>img{width:40px;height:40px}.symbol.symbol-xl-40px .symbol-label{width:40px;height:40px}.symbol.symbol-xl-40px.symbol-fixed .symbol-label{width:40px;height:40px}.symbol.symbol-xl-40px.symbol-fixed>img{width:40px;height:40px;max-width:none}.symbol.symbol-xl-40px.symbol-2by3 .symbol-label{height:40px;width:60px}.symbol.symbol-xl-40px.symbol-2by3>img{height:40px;width:60px;max-width:none}.symbol.symbol-xl-45px>img{width:45px;height:45px}.symbol.symbol-xl-45px .symbol-label{width:45px;height:45px}.symbol.symbol-xl-45px.symbol-fixed .symbol-label{width:45px;height:45px}.symbol.symbol-xl-45px.symbol-fixed>img{width:45px;height:45px;max-width:none}.symbol.symbol-xl-45px.symbol-2by3 .symbol-label{height:45px;width:67.5px}.symbol.symbol-xl-45px.symbol-2by3>img{height:45px;width:67.5px;max-width:none}.symbol.symbol-xl-50px>img{width:50px;height:50px}.symbol.symbol-xl-50px .symbol-label{width:50px;height:50px}.symbol.symbol-xl-50px.symbol-fixed .symbol-label{width:50px;height:50px}.symbol.symbol-xl-50px.symbol-fixed>img{width:50px;height:50px;max-width:none}.symbol.symbol-xl-50px.symbol-2by3 .symbol-label{height:50px;width:75px}.symbol.symbol-xl-50px.symbol-2by3>img{height:50px;width:75px;max-width:none}.symbol.symbol-xl-55px>img{width:55px;height:55px}.symbol.symbol-xl-55px .symbol-label{width:55px;height:55px}.symbol.symbol-xl-55px.symbol-fixed .symbol-label{width:55px;height:55px}.symbol.symbol-xl-55px.symbol-fixed>img{width:55px;height:55px;max-width:none}.symbol.symbol-xl-55px.symbol-2by3 .symbol-label{height:55px;width:82.5px}.symbol.symbol-xl-55px.symbol-2by3>img{height:55px;width:82.5px;max-width:none}.symbol.symbol-xl-60px>img{width:60px;height:60px}.symbol.symbol-xl-60px .symbol-label{width:60px;height:60px}.symbol.symbol-xl-60px.symbol-fixed .symbol-label{width:60px;height:60px}.symbol.symbol-xl-60px.symbol-fixed>img{width:60px;height:60px;max-width:none}.symbol.symbol-xl-60px.symbol-2by3 .symbol-label{height:60px;width:90px}.symbol.symbol-xl-60px.symbol-2by3>img{height:60px;width:90px;max-width:none}.symbol.symbol-xl-65px>img{width:65px;height:65px}.symbol.symbol-xl-65px .symbol-label{width:65px;height:65px}.symbol.symbol-xl-65px.symbol-fixed .symbol-label{width:65px;height:65px}.symbol.symbol-xl-65px.symbol-fixed>img{width:65px;height:65px;max-width:none}.symbol.symbol-xl-65px.symbol-2by3 .symbol-label{height:65px;width:97.5px}.symbol.symbol-xl-65px.symbol-2by3>img{height:65px;width:97.5px;max-width:none}.symbol.symbol-xl-70px>img{width:70px;height:70px}.symbol.symbol-xl-70px .symbol-label{width:70px;height:70px}.symbol.symbol-xl-70px.symbol-fixed .symbol-label{width:70px;height:70px}.symbol.symbol-xl-70px.symbol-fixed>img{width:70px;height:70px;max-width:none}.symbol.symbol-xl-70px.symbol-2by3 .symbol-label{height:70px;width:105px}.symbol.symbol-xl-70px.symbol-2by3>img{height:70px;width:105px;max-width:none}.symbol.symbol-xl-75px>img{width:75px;height:75px}.symbol.symbol-xl-75px .symbol-label{width:75px;height:75px}.symbol.symbol-xl-75px.symbol-fixed .symbol-label{width:75px;height:75px}.symbol.symbol-xl-75px.symbol-fixed>img{width:75px;height:75px;max-width:none}.symbol.symbol-xl-75px.symbol-2by3 .symbol-label{height:75px;width:112.5px}.symbol.symbol-xl-75px.symbol-2by3>img{height:75px;width:112.5px;max-width:none}.symbol.symbol-xl-90px>img{width:90px;height:90px}.symbol.symbol-xl-90px .symbol-label{width:90px;height:90px}.symbol.symbol-xl-90px.symbol-fixed .symbol-label{width:90px;height:90px}.symbol.symbol-xl-90px.symbol-fixed>img{width:90px;height:90px;max-width:none}.symbol.symbol-xl-90px.symbol-2by3 .symbol-label{height:90px;width:135px}.symbol.symbol-xl-90px.symbol-2by3>img{height:90px;width:135px;max-width:none}.symbol.symbol-xl-100px>img{width:100px;height:100px}.symbol.symbol-xl-100px .symbol-label{width:100px;height:100px}.symbol.symbol-xl-100px.symbol-fixed .symbol-label{width:100px;height:100px}.symbol.symbol-xl-100px.symbol-fixed>img{width:100px;height:100px;max-width:none}.symbol.symbol-xl-100px.symbol-2by3 .symbol-label{height:100px;width:150px}.symbol.symbol-xl-100px.symbol-2by3>img{height:100px;width:150px;max-width:none}.symbol.symbol-xl-125px>img{width:125px;height:125px}.symbol.symbol-xl-125px .symbol-label{width:125px;height:125px}.symbol.symbol-xl-125px.symbol-fixed .symbol-label{width:125px;height:125px}.symbol.symbol-xl-125px.symbol-fixed>img{width:125px;height:125px;max-width:none}.symbol.symbol-xl-125px.symbol-2by3 .symbol-label{height:125px;width:187.5px}.symbol.symbol-xl-125px.symbol-2by3>img{height:125px;width:187.5px;max-width:none}.symbol.symbol-xl-150px>img{width:150px;height:150px}.symbol.symbol-xl-150px .symbol-label{width:150px;height:150px}.symbol.symbol-xl-150px.symbol-fixed .symbol-label{width:150px;height:150px}.symbol.symbol-xl-150px.symbol-fixed>img{width:150px;height:150px;max-width:none}.symbol.symbol-xl-150px.symbol-2by3 .symbol-label{height:150px;width:225px}.symbol.symbol-xl-150px.symbol-2by3>img{height:150px;width:225px;max-width:none}.symbol.symbol-xl-160px>img{width:160px;height:160px}.symbol.symbol-xl-160px .symbol-label{width:160px;height:160px}.symbol.symbol-xl-160px.symbol-fixed .symbol-label{width:160px;height:160px}.symbol.symbol-xl-160px.symbol-fixed>img{width:160px;height:160px;max-width:none}.symbol.symbol-xl-160px.symbol-2by3 .symbol-label{height:160px;width:240px}.symbol.symbol-xl-160px.symbol-2by3>img{height:160px;width:240px;max-width:none}.symbol.symbol-xl-175px>img{width:175px;height:175px}.symbol.symbol-xl-175px .symbol-label{width:175px;height:175px}.symbol.symbol-xl-175px.symbol-fixed .symbol-label{width:175px;height:175px}.symbol.symbol-xl-175px.symbol-fixed>img{width:175px;height:175px;max-width:none}.symbol.symbol-xl-175px.symbol-2by3 .symbol-label{height:175px;width:262.5px}.symbol.symbol-xl-175px.symbol-2by3>img{height:175px;width:262.5px;max-width:none}.symbol.symbol-xl-200px>img{width:200px;height:200px}.symbol.symbol-xl-200px .symbol-label{width:200px;height:200px}.symbol.symbol-xl-200px.symbol-fixed .symbol-label{width:200px;height:200px}.symbol.symbol-xl-200px.symbol-fixed>img{width:200px;height:200px;max-width:none}.symbol.symbol-xl-200px.symbol-2by3 .symbol-label{height:200px;width:300px}.symbol.symbol-xl-200px.symbol-2by3>img{height:200px;width:300px;max-width:none}}@media (min-width:1400px){.symbol.symbol-xxl-20px>img{width:20px;height:20px}.symbol.symbol-xxl-20px .symbol-label{width:20px;height:20px}.symbol.symbol-xxl-20px.symbol-fixed .symbol-label{width:20px;height:20px}.symbol.symbol-xxl-20px.symbol-fixed>img{width:20px;height:20px;max-width:none}.symbol.symbol-xxl-20px.symbol-2by3 .symbol-label{height:20px;width:30px}.symbol.symbol-xxl-20px.symbol-2by3>img{height:20px;width:30px;max-width:none}.symbol.symbol-xxl-25px>img{width:25px;height:25px}.symbol.symbol-xxl-25px .symbol-label{width:25px;height:25px}.symbol.symbol-xxl-25px.symbol-fixed .symbol-label{width:25px;height:25px}.symbol.symbol-xxl-25px.symbol-fixed>img{width:25px;height:25px;max-width:none}.symbol.symbol-xxl-25px.symbol-2by3 .symbol-label{height:25px;width:37.5px}.symbol.symbol-xxl-25px.symbol-2by3>img{height:25px;width:37.5px;max-width:none}.symbol.symbol-xxl-30px>img{width:30px;height:30px}.symbol.symbol-xxl-30px .symbol-label{width:30px;height:30px}.symbol.symbol-xxl-30px.symbol-fixed .symbol-label{width:30px;height:30px}.symbol.symbol-xxl-30px.symbol-fixed>img{width:30px;height:30px;max-width:none}.symbol.symbol-xxl-30px.symbol-2by3 .symbol-label{height:30px;width:45px}.symbol.symbol-xxl-30px.symbol-2by3>img{height:30px;width:45px;max-width:none}.symbol.symbol-xxl-35px>img{width:35px;height:35px}.symbol.symbol-xxl-35px .symbol-label{width:35px;height:35px}.symbol.symbol-xxl-35px.symbol-fixed .symbol-label{width:35px;height:35px}.symbol.symbol-xxl-35px.symbol-fixed>img{width:35px;height:35px;max-width:none}.symbol.symbol-xxl-35px.symbol-2by3 .symbol-label{height:35px;width:52.5px}.symbol.symbol-xxl-35px.symbol-2by3>img{height:35px;width:52.5px;max-width:none}.symbol.symbol-xxl-40px>img{width:40px;height:40px}.symbol.symbol-xxl-40px .symbol-label{width:40px;height:40px}.symbol.symbol-xxl-40px.symbol-fixed .symbol-label{width:40px;height:40px}.symbol.symbol-xxl-40px.symbol-fixed>img{width:40px;height:40px;max-width:none}.symbol.symbol-xxl-40px.symbol-2by3 .symbol-label{height:40px;width:60px}.symbol.symbol-xxl-40px.symbol-2by3>img{height:40px;width:60px;max-width:none}.symbol.symbol-xxl-45px>img{width:45px;height:45px}.symbol.symbol-xxl-45px .symbol-label{width:45px;height:45px}.symbol.symbol-xxl-45px.symbol-fixed .symbol-label{width:45px;height:45px}.symbol.symbol-xxl-45px.symbol-fixed>img{width:45px;height:45px;max-width:none}.symbol.symbol-xxl-45px.symbol-2by3 .symbol-label{height:45px;width:67.5px}.symbol.symbol-xxl-45px.symbol-2by3>img{height:45px;width:67.5px;max-width:none}.symbol.symbol-xxl-50px>img{width:50px;height:50px}.symbol.symbol-xxl-50px .symbol-label{width:50px;height:50px}.symbol.symbol-xxl-50px.symbol-fixed .symbol-label{width:50px;height:50px}.symbol.symbol-xxl-50px.symbol-fixed>img{width:50px;height:50px;max-width:none}.symbol.symbol-xxl-50px.symbol-2by3 .symbol-label{height:50px;width:75px}.symbol.symbol-xxl-50px.symbol-2by3>img{height:50px;width:75px;max-width:none}.symbol.symbol-xxl-55px>img{width:55px;height:55px}.symbol.symbol-xxl-55px .symbol-label{width:55px;height:55px}.symbol.symbol-xxl-55px.symbol-fixed .symbol-label{width:55px;height:55px}.symbol.symbol-xxl-55px.symbol-fixed>img{width:55px;height:55px;max-width:none}.symbol.symbol-xxl-55px.symbol-2by3 .symbol-label{height:55px;width:82.5px}.symbol.symbol-xxl-55px.symbol-2by3>img{height:55px;width:82.5px;max-width:none}.symbol.symbol-xxl-60px>img{width:60px;height:60px}.symbol.symbol-xxl-60px .symbol-label{width:60px;height:60px}.symbol.symbol-xxl-60px.symbol-fixed .symbol-label{width:60px;height:60px}.symbol.symbol-xxl-60px.symbol-fixed>img{width:60px;height:60px;max-width:none}.symbol.symbol-xxl-60px.symbol-2by3 .symbol-label{height:60px;width:90px}.symbol.symbol-xxl-60px.symbol-2by3>img{height:60px;width:90px;max-width:none}.symbol.symbol-xxl-65px>img{width:65px;height:65px}.symbol.symbol-xxl-65px .symbol-label{width:65px;height:65px}.symbol.symbol-xxl-65px.symbol-fixed .symbol-label{width:65px;height:65px}.symbol.symbol-xxl-65px.symbol-fixed>img{width:65px;height:65px;max-width:none}.symbol.symbol-xxl-65px.symbol-2by3 .symbol-label{height:65px;width:97.5px}.symbol.symbol-xxl-65px.symbol-2by3>img{height:65px;width:97.5px;max-width:none}.symbol.symbol-xxl-70px>img{width:70px;height:70px}.symbol.symbol-xxl-70px .symbol-label{width:70px;height:70px}.symbol.symbol-xxl-70px.symbol-fixed .symbol-label{width:70px;height:70px}.symbol.symbol-xxl-70px.symbol-fixed>img{width:70px;height:70px;max-width:none}.symbol.symbol-xxl-70px.symbol-2by3 .symbol-label{height:70px;width:105px}.symbol.symbol-xxl-70px.symbol-2by3>img{height:70px;width:105px;max-width:none}.symbol.symbol-xxl-75px>img{width:75px;height:75px}.symbol.symbol-xxl-75px .symbol-label{width:75px;height:75px}.symbol.symbol-xxl-75px.symbol-fixed .symbol-label{width:75px;height:75px}.symbol.symbol-xxl-75px.symbol-fixed>img{width:75px;height:75px;max-width:none}.symbol.symbol-xxl-75px.symbol-2by3 .symbol-label{height:75px;width:112.5px}.symbol.symbol-xxl-75px.symbol-2by3>img{height:75px;width:112.5px;max-width:none}.symbol.symbol-xxl-90px>img{width:90px;height:90px}.symbol.symbol-xxl-90px .symbol-label{width:90px;height:90px}.symbol.symbol-xxl-90px.symbol-fixed .symbol-label{width:90px;height:90px}.symbol.symbol-xxl-90px.symbol-fixed>img{width:90px;height:90px;max-width:none}.symbol.symbol-xxl-90px.symbol-2by3 .symbol-label{height:90px;width:135px}.symbol.symbol-xxl-90px.symbol-2by3>img{height:90px;width:135px;max-width:none}.symbol.symbol-xxl-100px>img{width:100px;height:100px}.symbol.symbol-xxl-100px .symbol-label{width:100px;height:100px}.symbol.symbol-xxl-100px.symbol-fixed .symbol-label{width:100px;height:100px}.symbol.symbol-xxl-100px.symbol-fixed>img{width:100px;height:100px;max-width:none}.symbol.symbol-xxl-100px.symbol-2by3 .symbol-label{height:100px;width:150px}.symbol.symbol-xxl-100px.symbol-2by3>img{height:100px;width:150px;max-width:none}.symbol.symbol-xxl-125px>img{width:125px;height:125px}.symbol.symbol-xxl-125px .symbol-label{width:125px;height:125px}.symbol.symbol-xxl-125px.symbol-fixed .symbol-label{width:125px;height:125px}.symbol.symbol-xxl-125px.symbol-fixed>img{width:125px;height:125px;max-width:none}.symbol.symbol-xxl-125px.symbol-2by3 .symbol-label{height:125px;width:187.5px}.symbol.symbol-xxl-125px.symbol-2by3>img{height:125px;width:187.5px;max-width:none}.symbol.symbol-xxl-150px>img{width:150px;height:150px}.symbol.symbol-xxl-150px .symbol-label{width:150px;height:150px}.symbol.symbol-xxl-150px.symbol-fixed .symbol-label{width:150px;height:150px}.symbol.symbol-xxl-150px.symbol-fixed>img{width:150px;height:150px;max-width:none}.symbol.symbol-xxl-150px.symbol-2by3 .symbol-label{height:150px;width:225px}.symbol.symbol-xxl-150px.symbol-2by3>img{height:150px;width:225px;max-width:none}.symbol.symbol-xxl-160px>img{width:160px;height:160px}.symbol.symbol-xxl-160px .symbol-label{width:160px;height:160px}.symbol.symbol-xxl-160px.symbol-fixed .symbol-label{width:160px;height:160px}.symbol.symbol-xxl-160px.symbol-fixed>img{width:160px;height:160px;max-width:none}.symbol.symbol-xxl-160px.symbol-2by3 .symbol-label{height:160px;width:240px}.symbol.symbol-xxl-160px.symbol-2by3>img{height:160px;width:240px;max-width:none}.symbol.symbol-xxl-175px>img{width:175px;height:175px}.symbol.symbol-xxl-175px .symbol-label{width:175px;height:175px}.symbol.symbol-xxl-175px.symbol-fixed .symbol-label{width:175px;height:175px}.symbol.symbol-xxl-175px.symbol-fixed>img{width:175px;height:175px;max-width:none}.symbol.symbol-xxl-175px.symbol-2by3 .symbol-label{height:175px;width:262.5px}.symbol.symbol-xxl-175px.symbol-2by3>img{height:175px;width:262.5px;max-width:none}.symbol.symbol-xxl-200px>img{width:200px;height:200px}.symbol.symbol-xxl-200px .symbol-label{width:200px;height:200px}.symbol.symbol-xxl-200px.symbol-fixed .symbol-label{width:200px;height:200px}.symbol.symbol-xxl-200px.symbol-fixed>img{width:200px;height:200px;max-width:none}.symbol.symbol-xxl-200px.symbol-2by3 .symbol-label{height:200px;width:300px}.symbol.symbol-xxl-200px.symbol-2by3>img{height:200px;width:300px;max-width:none}}.symbol-group{display:flex;flex-wrap:wrap;align-items:center;margin-left:10px}.symbol-group .symbol{position:relative;z-index:0;margin-left:-10px;transition:all .3s ease}.symbol-group .symbol:hover{transition:all .3s ease;z-index:1}.symbol-group .symbol-badge{border:2px solid var(--bs-body-bg)}.symbol-group .symbol-label{position:relative}.symbol-group .symbol-label:after{display:block;content:" ";border-radius:inherit;position:absolute;top:0;right:0;left:0;bottom:0;border:2px solid var(--bs-symbol-border-color);-webkit-background-clip:padding-box;background-clip:padding-box}.symbol-group.symbol-hover .symbol{cursor:pointer}.pulse{position:relative}.pulse.pulse-light .pulse-ring{border-color:var(--bs-light)}.pulse.pulse-primary .pulse-ring{border-color:var(--bs-primary)}.pulse.pulse-secondary .pulse-ring{border-color:var(--bs-secondary)}.pulse.pulse-success .pulse-ring{border-color:var(--bs-success)}.pulse.pulse-info .pulse-ring{border-color:var(--bs-info)}.pulse.pulse-warning .pulse-ring{border-color:var(--bs-warning)}.pulse.pulse-danger .pulse-ring{border-color:var(--bs-danger)}.pulse.pulse-dark .pulse-ring{border-color:var(--bs-dark)}.pulse-ring{display:block;border-radius:40px;height:40px;width:40px;position:absolute;animation:animation-pulse 3.5s ease-out;animation-iteration-count:infinite;opacity:0;border-width:3px;border-style:solid;border-color:var(--bs-gray-500)}@keyframes animation-pulse{0%{-webkit-transform:scale(.1,.1);opacity:0}60%{-webkit-transform:scale(.1,.1);opacity:0}65%{opacity:1}100%{-webkit-transform:scale(1.2,1.2);opacity:0}}.page-loading *,[data-kt-app-page-loading=on] *{transition:none!important}.page-loader{background-color:var(--bs-body-bg);position:fixed;top:0;bottom:0;left:0;right:0;z-index:10000;display:none}.page-loading .page-loader,[data-kt-app-page-loading=on] .page-loader{display:flex;justify-content:center;align-items:center}.scrolltop{position:fixed;display:none;cursor:pointer;z-index:105;justify-content:center;align-items:center;width:36px;height:36px;bottom:43px;right:7px;background-color:var(--bs-scrolltop-bg-color);box-shadow:var(--bs-scrolltop-box-shadow);opacity:0;transition:color .2s ease;border-radius:.475rem}.scrolltop .svg-icon{color:var(--bs-scrolltop-icon-color)}.scrolltop .svg-icon svg{height:24px;width:24px}.scrolltop>i{font-size:1.3rem;color:var(--bs-scrolltop-icon-color)}.scrolltop:hover{background-color:var(--bs-scrolltop-bg-color-hover)}.scrolltop:hover .svg-icon,.scrolltop:hover i{color:var(--bs-scrolltop-icon-color-hover)}[data-kt-scrolltop=on] .scrolltop{opacity:var(--bs-scrolltop-opacity-on);animation:animation-scrolltop .4s ease-out 1;display:flex}[data-kt-scrolltop=on] .scrolltop:hover{transition:color .2s ease;opacity:var(--bs-scrolltop-opacity-hover)}@media (max-width:991.98px){.scrolltop{bottom:23px;right:5px;width:30px;height:30px}}@keyframes animation-scrolltop{from{margin-bottom:-15px}to{margin-bottom:0}}.svg-icon{line-height:1;color:var(--bs-text-muted)}.svg-icon svg{height:1.15rem;width:1.15rem}.svg-icon.svg-icon-white{color:var(--bs-text-white)}.svg-icon.svg-icon-primary{color:var(--bs-text-primary)}.svg-icon.svg-icon-secondary{color:var(--bs-text-secondary)}.svg-icon.svg-icon-light{color:var(--bs-text-light)}.svg-icon.svg-icon-success{color:var(--bs-text-success)}.svg-icon.svg-icon-info{color:var(--bs-text-info)}.svg-icon.svg-icon-warning{color:var(--bs-text-warning)}.svg-icon.svg-icon-danger{color:var(--bs-text-danger)}.svg-icon.svg-icon-dark{color:var(--bs-text-dark)}.svg-icon.svg-icon-muted{color:var(--bs-text-muted)}.svg-icon.svg-icon-gray-100{color:var(--bs-text-gray-100)}.svg-icon.svg-icon-gray-200{color:var(--bs-text-gray-200)}.svg-icon.svg-icon-gray-300{color:var(--bs-text-gray-300)}.svg-icon.svg-icon-gray-400{color:var(--bs-text-gray-400)}.svg-icon.svg-icon-gray-500{color:var(--bs-text-gray-500)}.svg-icon.svg-icon-gray-600{color:var(--bs-text-gray-600)}.svg-icon.svg-icon-gray-700{color:var(--bs-text-gray-700)}.svg-icon.svg-icon-gray-800{color:var(--bs-text-gray-800)}.svg-icon.svg-icon-gray-900{color:var(--bs-text-gray-900)}.svg-icon.svg-icon-1 svg{height:1.75rem!important;width:1.75rem!important}.svg-icon.svg-icon-2 svg{height:1.5rem!important;width:1.5rem!important}.svg-icon.svg-icon-3 svg{height:1.35rem!important;width:1.35rem!important}.svg-icon.svg-icon-4 svg{height:1.25rem!important;width:1.25rem!important}.svg-icon.svg-icon-5 svg{height:1.15rem!important;width:1.15rem!important}.svg-icon.svg-icon-6 svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-7 svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-8 svg{height:.85rem!important;width:.85rem!important}.svg-icon.svg-icon-9 svg{height:.75rem!important;width:.75rem!important}.svg-icon.svg-icon-10 svg{height:.5rem!important;width:.5rem!important}.svg-icon.svg-icon-sm svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-base svg{height:1rem!important;width:1rem!important}.svg-icon.svg-icon-lg svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-xl svg{height:1.21rem!important;width:1.21rem!important}.svg-icon.svg-icon-fluid svg{height:100%!important;width:100%!important}.svg-icon.svg-icon-2x svg{height:2rem!important;width:2rem!important}.svg-icon.svg-icon-2qx svg{height:2.25rem!important;width:2.25rem!important}.svg-icon.svg-icon-2hx svg{height:2.5rem!important;width:2.5rem!important}.svg-icon.svg-icon-2tx svg{height:2.75rem!important;width:2.75rem!important}.svg-icon.svg-icon-3x svg{height:3rem!important;width:3rem!important}.svg-icon.svg-icon-3qx svg{height:3.25rem!important;width:3.25rem!important}.svg-icon.svg-icon-3hx svg{height:3.5rem!important;width:3.5rem!important}.svg-icon.svg-icon-3tx svg{height:3.75rem!important;width:3.75rem!important}.svg-icon.svg-icon-4x svg{height:4rem!important;width:4rem!important}.svg-icon.svg-icon-4qx svg{height:4.25rem!important;width:4.25rem!important}.svg-icon.svg-icon-4hx svg{height:4.5rem!important;width:4.5rem!important}.svg-icon.svg-icon-4tx svg{height:4.75rem!important;width:4.75rem!important}.svg-icon.svg-icon-5x svg{height:5rem!important;width:5rem!important}.svg-icon.svg-icon-5qx svg{height:5.25rem!important;width:5.25rem!important}.svg-icon.svg-icon-5hx svg{height:5.5rem!important;width:5.5rem!important}.svg-icon.svg-icon-5tx svg{height:5.75rem!important;width:5.75rem!important}.svg-icon.svg-icon-6x svg{height:6rem!important;width:6rem!important}.svg-icon.svg-icon-6qx svg{height:6.25rem!important;width:6.25rem!important}.svg-icon.svg-icon-6hx svg{height:6.5rem!important;width:6.5rem!important}.svg-icon.svg-icon-6tx svg{height:6.75rem!important;width:6.75rem!important}.svg-icon.svg-icon-7x svg{height:7rem!important;width:7rem!important}.svg-icon.svg-icon-7qx svg{height:7.25rem!important;width:7.25rem!important}.svg-icon.svg-icon-7hx svg{height:7.5rem!important;width:7.5rem!important}.svg-icon.svg-icon-7tx svg{height:7.75rem!important;width:7.75rem!important}@media (min-width:576px){.svg-icon.svg-icon-sm-1 svg{height:1.75rem!important;width:1.75rem!important}.svg-icon.svg-icon-sm-2 svg{height:1.5rem!important;width:1.5rem!important}.svg-icon.svg-icon-sm-3 svg{height:1.35rem!important;width:1.35rem!important}.svg-icon.svg-icon-sm-4 svg{height:1.25rem!important;width:1.25rem!important}.svg-icon.svg-icon-sm-5 svg{height:1.15rem!important;width:1.15rem!important}.svg-icon.svg-icon-sm-6 svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-sm-7 svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-sm-8 svg{height:.85rem!important;width:.85rem!important}.svg-icon.svg-icon-sm-9 svg{height:.75rem!important;width:.75rem!important}.svg-icon.svg-icon-sm-10 svg{height:.5rem!important;width:.5rem!important}.svg-icon.svg-icon-sm-sm svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-sm-base svg{height:1rem!important;width:1rem!important}.svg-icon.svg-icon-sm-lg svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-sm-xl svg{height:1.21rem!important;width:1.21rem!important}.svg-icon.svg-icon-sm-fluid svg{height:100%!important;width:100%!important}.svg-icon.svg-icon-sm-2x svg{height:2rem!important;width:2rem!important}.svg-icon.svg-icon-sm-2qx svg{height:2.25rem!important;width:2.25rem!important}.svg-icon.svg-icon-sm-2hx svg{height:2.5rem!important;width:2.5rem!important}.svg-icon.svg-icon-sm-2tx svg{height:2.75rem!important;width:2.75rem!important}.svg-icon.svg-icon-sm-3x svg{height:3rem!important;width:3rem!important}.svg-icon.svg-icon-sm-3qx svg{height:3.25rem!important;width:3.25rem!important}.svg-icon.svg-icon-sm-3hx svg{height:3.5rem!important;width:3.5rem!important}.svg-icon.svg-icon-sm-3tx svg{height:3.75rem!important;width:3.75rem!important}.svg-icon.svg-icon-sm-4x svg{height:4rem!important;width:4rem!important}.svg-icon.svg-icon-sm-4qx svg{height:4.25rem!important;width:4.25rem!important}.svg-icon.svg-icon-sm-4hx svg{height:4.5rem!important;width:4.5rem!important}.svg-icon.svg-icon-sm-4tx svg{height:4.75rem!important;width:4.75rem!important}.svg-icon.svg-icon-sm-5x svg{height:5rem!important;width:5rem!important}.svg-icon.svg-icon-sm-5qx svg{height:5.25rem!important;width:5.25rem!important}.svg-icon.svg-icon-sm-5hx svg{height:5.5rem!important;width:5.5rem!important}.svg-icon.svg-icon-sm-5tx svg{height:5.75rem!important;width:5.75rem!important}.svg-icon.svg-icon-sm-6x svg{height:6rem!important;width:6rem!important}.svg-icon.svg-icon-sm-6qx svg{height:6.25rem!important;width:6.25rem!important}.svg-icon.svg-icon-sm-6hx svg{height:6.5rem!important;width:6.5rem!important}.svg-icon.svg-icon-sm-6tx svg{height:6.75rem!important;width:6.75rem!important}.svg-icon.svg-icon-sm-7x svg{height:7rem!important;width:7rem!important}.svg-icon.svg-icon-sm-7qx svg{height:7.25rem!important;width:7.25rem!important}.svg-icon.svg-icon-sm-7hx svg{height:7.5rem!important;width:7.5rem!important}.svg-icon.svg-icon-sm-7tx svg{height:7.75rem!important;width:7.75rem!important}}@media (min-width:768px){.svg-icon.svg-icon-md-1 svg{height:1.75rem!important;width:1.75rem!important}.svg-icon.svg-icon-md-2 svg{height:1.5rem!important;width:1.5rem!important}.svg-icon.svg-icon-md-3 svg{height:1.35rem!important;width:1.35rem!important}.svg-icon.svg-icon-md-4 svg{height:1.25rem!important;width:1.25rem!important}.svg-icon.svg-icon-md-5 svg{height:1.15rem!important;width:1.15rem!important}.svg-icon.svg-icon-md-6 svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-md-7 svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-md-8 svg{height:.85rem!important;width:.85rem!important}.svg-icon.svg-icon-md-9 svg{height:.75rem!important;width:.75rem!important}.svg-icon.svg-icon-md-10 svg{height:.5rem!important;width:.5rem!important}.svg-icon.svg-icon-md-sm svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-md-base svg{height:1rem!important;width:1rem!important}.svg-icon.svg-icon-md-lg svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-md-xl svg{height:1.21rem!important;width:1.21rem!important}.svg-icon.svg-icon-md-fluid svg{height:100%!important;width:100%!important}.svg-icon.svg-icon-md-2x svg{height:2rem!important;width:2rem!important}.svg-icon.svg-icon-md-2qx svg{height:2.25rem!important;width:2.25rem!important}.svg-icon.svg-icon-md-2hx svg{height:2.5rem!important;width:2.5rem!important}.svg-icon.svg-icon-md-2tx svg{height:2.75rem!important;width:2.75rem!important}.svg-icon.svg-icon-md-3x svg{height:3rem!important;width:3rem!important}.svg-icon.svg-icon-md-3qx svg{height:3.25rem!important;width:3.25rem!important}.svg-icon.svg-icon-md-3hx svg{height:3.5rem!important;width:3.5rem!important}.svg-icon.svg-icon-md-3tx svg{height:3.75rem!important;width:3.75rem!important}.svg-icon.svg-icon-md-4x svg{height:4rem!important;width:4rem!important}.svg-icon.svg-icon-md-4qx svg{height:4.25rem!important;width:4.25rem!important}.svg-icon.svg-icon-md-4hx svg{height:4.5rem!important;width:4.5rem!important}.svg-icon.svg-icon-md-4tx svg{height:4.75rem!important;width:4.75rem!important}.svg-icon.svg-icon-md-5x svg{height:5rem!important;width:5rem!important}.svg-icon.svg-icon-md-5qx svg{height:5.25rem!important;width:5.25rem!important}.svg-icon.svg-icon-md-5hx svg{height:5.5rem!important;width:5.5rem!important}.svg-icon.svg-icon-md-5tx svg{height:5.75rem!important;width:5.75rem!important}.svg-icon.svg-icon-md-6x svg{height:6rem!important;width:6rem!important}.svg-icon.svg-icon-md-6qx svg{height:6.25rem!important;width:6.25rem!important}.svg-icon.svg-icon-md-6hx svg{height:6.5rem!important;width:6.5rem!important}.svg-icon.svg-icon-md-6tx svg{height:6.75rem!important;width:6.75rem!important}.svg-icon.svg-icon-md-7x svg{height:7rem!important;width:7rem!important}.svg-icon.svg-icon-md-7qx svg{height:7.25rem!important;width:7.25rem!important}.svg-icon.svg-icon-md-7hx svg{height:7.5rem!important;width:7.5rem!important}.svg-icon.svg-icon-md-7tx svg{height:7.75rem!important;width:7.75rem!important}}@media (min-width:992px){.svg-icon.svg-icon-lg-1 svg{height:1.75rem!important;width:1.75rem!important}.svg-icon.svg-icon-lg-2 svg{height:1.5rem!important;width:1.5rem!important}.svg-icon.svg-icon-lg-3 svg{height:1.35rem!important;width:1.35rem!important}.svg-icon.svg-icon-lg-4 svg{height:1.25rem!important;width:1.25rem!important}.svg-icon.svg-icon-lg-5 svg{height:1.15rem!important;width:1.15rem!important}.svg-icon.svg-icon-lg-6 svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-lg-7 svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-lg-8 svg{height:.85rem!important;width:.85rem!important}.svg-icon.svg-icon-lg-9 svg{height:.75rem!important;width:.75rem!important}.svg-icon.svg-icon-lg-10 svg{height:.5rem!important;width:.5rem!important}.svg-icon.svg-icon-lg-sm svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-lg-base svg{height:1rem!important;width:1rem!important}.svg-icon.svg-icon-lg-lg svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-lg-xl svg{height:1.21rem!important;width:1.21rem!important}.svg-icon.svg-icon-lg-fluid svg{height:100%!important;width:100%!important}.svg-icon.svg-icon-lg-2x svg{height:2rem!important;width:2rem!important}.svg-icon.svg-icon-lg-2qx svg{height:2.25rem!important;width:2.25rem!important}.svg-icon.svg-icon-lg-2hx svg{height:2.5rem!important;width:2.5rem!important}.svg-icon.svg-icon-lg-2tx svg{height:2.75rem!important;width:2.75rem!important}.svg-icon.svg-icon-lg-3x svg{height:3rem!important;width:3rem!important}.svg-icon.svg-icon-lg-3qx svg{height:3.25rem!important;width:3.25rem!important}.svg-icon.svg-icon-lg-3hx svg{height:3.5rem!important;width:3.5rem!important}.svg-icon.svg-icon-lg-3tx svg{height:3.75rem!important;width:3.75rem!important}.svg-icon.svg-icon-lg-4x svg{height:4rem!important;width:4rem!important}.svg-icon.svg-icon-lg-4qx svg{height:4.25rem!important;width:4.25rem!important}.svg-icon.svg-icon-lg-4hx svg{height:4.5rem!important;width:4.5rem!important}.svg-icon.svg-icon-lg-4tx svg{height:4.75rem!important;width:4.75rem!important}.svg-icon.svg-icon-lg-5x svg{height:5rem!important;width:5rem!important}.svg-icon.svg-icon-lg-5qx svg{height:5.25rem!important;width:5.25rem!important}.svg-icon.svg-icon-lg-5hx svg{height:5.5rem!important;width:5.5rem!important}.svg-icon.svg-icon-lg-5tx svg{height:5.75rem!important;width:5.75rem!important}.svg-icon.svg-icon-lg-6x svg{height:6rem!important;width:6rem!important}.svg-icon.svg-icon-lg-6qx svg{height:6.25rem!important;width:6.25rem!important}.svg-icon.svg-icon-lg-6hx svg{height:6.5rem!important;width:6.5rem!important}.svg-icon.svg-icon-lg-6tx svg{height:6.75rem!important;width:6.75rem!important}.svg-icon.svg-icon-lg-7x svg{height:7rem!important;width:7rem!important}.svg-icon.svg-icon-lg-7qx svg{height:7.25rem!important;width:7.25rem!important}.svg-icon.svg-icon-lg-7hx svg{height:7.5rem!important;width:7.5rem!important}.svg-icon.svg-icon-lg-7tx svg{height:7.75rem!important;width:7.75rem!important}}@media (min-width:1200px){.svg-icon.svg-icon-xl-1 svg{height:1.75rem!important;width:1.75rem!important}.svg-icon.svg-icon-xl-2 svg{height:1.5rem!important;width:1.5rem!important}.svg-icon.svg-icon-xl-3 svg{height:1.35rem!important;width:1.35rem!important}.svg-icon.svg-icon-xl-4 svg{height:1.25rem!important;width:1.25rem!important}.svg-icon.svg-icon-xl-5 svg{height:1.15rem!important;width:1.15rem!important}.svg-icon.svg-icon-xl-6 svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-xl-7 svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-xl-8 svg{height:.85rem!important;width:.85rem!important}.svg-icon.svg-icon-xl-9 svg{height:.75rem!important;width:.75rem!important}.svg-icon.svg-icon-xl-10 svg{height:.5rem!important;width:.5rem!important}.svg-icon.svg-icon-xl-sm svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-xl-base svg{height:1rem!important;width:1rem!important}.svg-icon.svg-icon-xl-lg svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-xl-xl svg{height:1.21rem!important;width:1.21rem!important}.svg-icon.svg-icon-xl-fluid svg{height:100%!important;width:100%!important}.svg-icon.svg-icon-xl-2x svg{height:2rem!important;width:2rem!important}.svg-icon.svg-icon-xl-2qx svg{height:2.25rem!important;width:2.25rem!important}.svg-icon.svg-icon-xl-2hx svg{height:2.5rem!important;width:2.5rem!important}.svg-icon.svg-icon-xl-2tx svg{height:2.75rem!important;width:2.75rem!important}.svg-icon.svg-icon-xl-3x svg{height:3rem!important;width:3rem!important}.svg-icon.svg-icon-xl-3qx svg{height:3.25rem!important;width:3.25rem!important}.svg-icon.svg-icon-xl-3hx svg{height:3.5rem!important;width:3.5rem!important}.svg-icon.svg-icon-xl-3tx svg{height:3.75rem!important;width:3.75rem!important}.svg-icon.svg-icon-xl-4x svg{height:4rem!important;width:4rem!important}.svg-icon.svg-icon-xl-4qx svg{height:4.25rem!important;width:4.25rem!important}.svg-icon.svg-icon-xl-4hx svg{height:4.5rem!important;width:4.5rem!important}.svg-icon.svg-icon-xl-4tx svg{height:4.75rem!important;width:4.75rem!important}.svg-icon.svg-icon-xl-5x svg{height:5rem!important;width:5rem!important}.svg-icon.svg-icon-xl-5qx svg{height:5.25rem!important;width:5.25rem!important}.svg-icon.svg-icon-xl-5hx svg{height:5.5rem!important;width:5.5rem!important}.svg-icon.svg-icon-xl-5tx svg{height:5.75rem!important;width:5.75rem!important}.svg-icon.svg-icon-xl-6x svg{height:6rem!important;width:6rem!important}.svg-icon.svg-icon-xl-6qx svg{height:6.25rem!important;width:6.25rem!important}.svg-icon.svg-icon-xl-6hx svg{height:6.5rem!important;width:6.5rem!important}.svg-icon.svg-icon-xl-6tx svg{height:6.75rem!important;width:6.75rem!important}.svg-icon.svg-icon-xl-7x svg{height:7rem!important;width:7rem!important}.svg-icon.svg-icon-xl-7qx svg{height:7.25rem!important;width:7.25rem!important}.svg-icon.svg-icon-xl-7hx svg{height:7.5rem!important;width:7.5rem!important}.svg-icon.svg-icon-xl-7tx svg{height:7.75rem!important;width:7.75rem!important}}@media (min-width:1400px){.svg-icon.svg-icon-xxl-1 svg{height:1.75rem!important;width:1.75rem!important}.svg-icon.svg-icon-xxl-2 svg{height:1.5rem!important;width:1.5rem!important}.svg-icon.svg-icon-xxl-3 svg{height:1.35rem!important;width:1.35rem!important}.svg-icon.svg-icon-xxl-4 svg{height:1.25rem!important;width:1.25rem!important}.svg-icon.svg-icon-xxl-5 svg{height:1.15rem!important;width:1.15rem!important}.svg-icon.svg-icon-xxl-6 svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-xxl-7 svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-xxl-8 svg{height:.85rem!important;width:.85rem!important}.svg-icon.svg-icon-xxl-9 svg{height:.75rem!important;width:.75rem!important}.svg-icon.svg-icon-xxl-10 svg{height:.5rem!important;width:.5rem!important}.svg-icon.svg-icon-xxl-sm svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-xxl-base svg{height:1rem!important;width:1rem!important}.svg-icon.svg-icon-xxl-lg svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-xxl-xl svg{height:1.21rem!important;width:1.21rem!important}.svg-icon.svg-icon-xxl-fluid svg{height:100%!important;width:100%!important}.svg-icon.svg-icon-xxl-2x svg{height:2rem!important;width:2rem!important}.svg-icon.svg-icon-xxl-2qx svg{height:2.25rem!important;width:2.25rem!important}.svg-icon.svg-icon-xxl-2hx svg{height:2.5rem!important;width:2.5rem!important}.svg-icon.svg-icon-xxl-2tx svg{height:2.75rem!important;width:2.75rem!important}.svg-icon.svg-icon-xxl-3x svg{height:3rem!important;width:3rem!important}.svg-icon.svg-icon-xxl-3qx svg{height:3.25rem!important;width:3.25rem!important}.svg-icon.svg-icon-xxl-3hx svg{height:3.5rem!important;width:3.5rem!important}.svg-icon.svg-icon-xxl-3tx svg{height:3.75rem!important;width:3.75rem!important}.svg-icon.svg-icon-xxl-4x svg{height:4rem!important;width:4rem!important}.svg-icon.svg-icon-xxl-4qx svg{height:4.25rem!important;width:4.25rem!important}.svg-icon.svg-icon-xxl-4hx svg{height:4.5rem!important;width:4.5rem!important}.svg-icon.svg-icon-xxl-4tx svg{height:4.75rem!important;width:4.75rem!important}.svg-icon.svg-icon-xxl-5x svg{height:5rem!important;width:5rem!important}.svg-icon.svg-icon-xxl-5qx svg{height:5.25rem!important;width:5.25rem!important}.svg-icon.svg-icon-xxl-5hx svg{height:5.5rem!important;width:5.5rem!important}.svg-icon.svg-icon-xxl-5tx svg{height:5.75rem!important;width:5.75rem!important}.svg-icon.svg-icon-xxl-6x svg{height:6rem!important;width:6rem!important}.svg-icon.svg-icon-xxl-6qx svg{height:6.25rem!important;width:6.25rem!important}.svg-icon.svg-icon-xxl-6hx svg{height:6.5rem!important;width:6.5rem!important}.svg-icon.svg-icon-xxl-6tx svg{height:6.75rem!important;width:6.75rem!important}.svg-icon.svg-icon-xxl-7x svg{height:7rem!important;width:7rem!important}.svg-icon.svg-icon-xxl-7qx svg{height:7.25rem!important;width:7.25rem!important}.svg-icon.svg-icon-xxl-7hx svg{height:7.5rem!important;width:7.5rem!important}.svg-icon.svg-icon-xxl-7tx svg{height:7.75rem!important;width:7.75rem!important}}.fixed-top{position:fixed;z-index:101;top:0;left:0;right:0}@media (min-width:576px){.fixed-top-sm{position:fixed;z-index:101;top:0;left:0;right:0}}@media (min-width:768px){.fixed-top-md{position:fixed;z-index:101;top:0;left:0;right:0}}@media (min-width:992px){.fixed-top-lg{position:fixed;z-index:101;top:0;left:0;right:0}}@media (min-width:1200px){.fixed-top-xl{position:fixed;z-index:101;top:0;left:0;right:0}}@media (min-width:1400px){.fixed-top-xxl{position:fixed;z-index:101;top:0;left:0;right:0}}.timeline{--bs-timeline-icon-size:38px;--bs-timeline-icon-space:0.35rem}.timeline .timeline-item{position:relative;padding:0;margin:0;display:flex;align-items:flex-start}.timeline .timeline-item:last-child .timeline-line{bottom:100%}.timeline .timeline-line{display:block;content:" ";justify-content:center;position:absolute;z-index:0;left:0;top:var(--bs-timeline-icon-size);bottom:0;transform:translate(50%);border-left-width:1px;border-left-style:solid;border-left-color:var(--bs-gray-300);width:var(--bs-timeline-icon-size);margin-top:var(--bs-timeline-icon-space);margin-bottom:var(--bs-timeline-icon-space)}.timeline .timeline-icon{z-index:1;flex-shrink:0;margin-right:1rem;width:var(--bs-timeline-icon-size);height:var(--bs-timeline-icon-size);display:flex;text-align:center;align-items:center;justify-content:center;border:1px solid var(--bs-gray-300);border-radius:50%}.timeline .timeline-content{width:100%;overflow:auto;margin-bottom:1.5rem}.timeline.timeline-center .timeline-item{align-items:center}.timeline.timeline-center .timeline-item:first-child .timeline-line{top:50%}.timeline.timeline-center .timeline-item:last-child .timeline-line{bottom:50%}.timeline.timeline-border-dashed .timeline-line{border-left-style:dashed!important}.timeline.timeline-border-dashed .timeline-icon{border-style:dashed!important}.timeline-label{position:relative}.timeline-label:before{content:"";position:absolute;left:51px;width:3px;top:0;bottom:0;background-color:var(--bs-gray-200)}.timeline-label .timeline-item{display:flex;align-items:flex-start;position:relative;margin-bottom:1.7rem}.timeline-label .timeline-item:last-child{margin-bottom:0}.timeline-label .timeline-label{width:50px;flex-shrink:0;position:relative;color:var(--bs-gray-800)}.timeline-label .timeline-badge{flex-shrink:0;background-color:var(--bs-body-bg);width:1rem;height:1rem;display:flex;justify-content:center;align-items:center;z-index:1;position:relative;margin-top:1px;margin-left:-.5rem;padding:3px!important;border:6px solid var(--bs-body-bg)!important}.timeline-label .timeline-content{flex-grow:1}.overlay{position:relative}.overlay .overlay-layer{position:absolute;top:0;bottom:0;left:0;right:0;display:flex;justify-content:center;align-items:center;background-color:var(--bs-overlay-bg);transition:all .3s ease;opacity:0}.overlay.overlay-block .overlay-layer,.overlay.overlay-show .overlay-layer,.overlay:hover .overlay-layer{transition:all .3s ease;opacity:1}.overlay.overlay-block{cursor:wait}.bullet{display:inline-block;background-color:var(--bs-bullet-bg-color);border-radius:6px;width:8px;height:4px;flex-shrink:0}.bullet-dot{width:4px;height:4px;border-radius:100%!important}.bullet-vertical{width:4px;height:8px}.bullet-line{width:5px;height:1px;border-radius:0}.drawer{display:flex!important;overflow:auto;z-index:110;position:fixed;top:0;bottom:0;background-color:var(--bs-drawer-bg-color);transition:transform .3s ease-in-out!important}.drawer.drawer-start{left:0;transform:translateX(-100%)}.drawer.drawer-end{right:0;transform:translateX(100%)}.drawer.drawer-bottom{bottom:0;top:auto;left:0;right:0;transform:translateY(100%)}.drawer.drawer-top{top:0;bottom:auto;left:0;right:0;transform:translateY(-100%)}.drawer.drawer-on{transform:none;box-shadow:var(--bs-drawer-box-shadow);transition:transform .3s ease-in-out!important}.drawer-overlay{position:fixed;top:0;left:0;bottom:0;right:0;overflow:hidden;z-index:109;background-color:var(--bs-drawer-overlay-bg-color);animation:animation-drawer-fade-in .3s ease-in-out 1}[data-kt-drawer=true]{display:none}@keyframes animation-drawer-fade-in{from{opacity:0}to{opacity:1}}@media (max-width:991.98px){body[data-kt-drawer=on]{overflow:hidden}}.badge{display:inline-flex;align-items:center}.badge.badge-circle,.badge.badge-square{display:inline-flex;align-items:center;justify-content:center;height:1.75rem;min-width:1.75rem;padding:0 .1rem;line-height:0}.badge.badge-circle{border-radius:50%;padding:0;min-width:unset;width:1.75rem}.badge.badge-sm{min-width:1.5rem;font-size:.8rem}.badge.badge-sm.badge-square{height:1.5rem}.badge.badge-sm.badge-circle{width:1.5rem;height:1.5rem}.badge.badge-lg{min-width:2rem;font-size:1rem}.badge.badge-lg.badge-square{height:2rem}.badge.badge-lg.badge-circle{width:2rem;height:2rem}.badge-light{color:var(--bs-light-inverse);background-color:var(--bs-light)}.badge-light.badge-outline{border:1px solid var(--bs-light);background-color:transparent;color:var(--bs-light)}.badge-light-light{background-color:var(--bs-light-light);color:var(--bs-light)}.badge-primary{color:var(--bs-primary-inverse);background-color:var(--bs-primary)}.badge-primary.badge-outline{border:1px solid var(--bs-primary);background-color:transparent;color:var(--bs-primary)}.badge-light-primary{background-color:var(--bs-primary-light);color:var(--bs-primary)}.badge-secondary{color:var(--bs-secondary-inverse);background-color:var(--bs-secondary)}.badge-secondary.badge-outline{border:1px solid var(--bs-secondary);background-color:transparent;color:var(--bs-secondary-inverse)}.badge-light-secondary{background-color:var(--bs-secondary-light);color:var(--bs-secondary-inverse)}.badge-success{color:var(--bs-success-inverse);background-color:var(--bs-success)}.badge-success.badge-outline{border:1px solid var(--bs-success);background-color:transparent;color:var(--bs-success)}.badge-light-success{background-color:var(--bs-success-light);color:var(--bs-success)}.badge-info{color:var(--bs-info-inverse);background-color:var(--bs-info)}.badge-info.badge-outline{border:1px solid var(--bs-info);background-color:transparent;color:var(--bs-info)}.badge-light-info{background-color:var(--bs-info-light);color:var(--bs-info)}.badge-warning{color:var(--bs-warning-inverse);background-color:var(--bs-warning)}.badge-warning.badge-outline{border:1px solid var(--bs-warning);background-color:transparent;color:var(--bs-warning)}.badge-light-warning{background-color:var(--bs-warning-light);color:var(--bs-warning)}.badge-danger{color:var(--bs-danger-inverse);background-color:var(--bs-danger)}.badge-danger.badge-outline{border:1px solid var(--bs-danger);background-color:transparent;color:var(--bs-danger)}.badge-light-danger{background-color:var(--bs-danger-light);color:var(--bs-danger)}.badge-dark{color:var(--bs-dark-inverse);background-color:var(--bs-dark)}.badge-dark.badge-outline{border:1px solid var(--bs-dark);background-color:transparent;color:var(--bs-dark)}.badge-light-dark{background-color:var(--bs-dark-light);color:var(--bs-dark)}.indicator-progress{display:none}[data-kt-indicator=on]>.indicator-progress{display:inline-block}[data-kt-indicator=on]>.indicator-label{display:none}.hover-elevate-up{transition:transform .3s ease}.hover-elevate-up:hover{transform:translateY(-2.5%);transition:transform .3s ease;will-change:transform}.hover-elevate-down{transition:transform .3s ease}.hover-elevate-down:hover{transform:translateY(2.5%);transition:transform .3s ease;will-change:transform}.hover-scale{transition:transform .3s ease}.hover-scale:hover{transform:scale(1.1);transition:transform .3s ease;will-change:transform}.hover-rotate-end{transition:transform .3s ease}.hover-rotate-end:hover{transform:rotate(4deg);transition:transform .3s ease;will-change:transform}.hover-rotate-start{transition:transform .3s ease}.hover-rotate-start:hover{transform:rotate(-4deg);transition:transform .3s ease;will-change:transform}.rotate{display:inline-flex;align-items:center}.rotate-90{transition:transform .3s ease;backface-visibility:hidden;will-change:transform}.active>.rotate-90,.collapsible:not(.collapsed)>.rotate-90,.show>.rotate-90{transform:rotateZ(90deg);transition:transform .3s ease}[direction=rtl] .active>.rotate-90,[direction=rtl] .collapsible:not(.collapsed)>.rotate-90,[direction=rtl] .show>.rotate-90{transform:rotateZ(-90deg)}.rotate-n90{transition:transform .3s ease;backface-visibility:hidden;will-change:transform}.active>.rotate-n90,.collapsible:not(.collapsed)>.rotate-n90,.show>.rotate-n90{transform:rotateZ(-90deg);transition:transform .3s ease}[direction=rtl] .active>.rotate-n90,[direction=rtl] .collapsible:not(.collapsed)>.rotate-n90,[direction=rtl] .show>.rotate-n90{transform:rotateZ(90deg)}.rotate-180{transition:transform .3s ease;backface-visibility:hidden;will-change:transform}.active>.rotate-180,.collapsible:not(.collapsed)>.rotate-180,.show>.rotate-180{transform:rotateZ(180deg);transition:transform .3s ease}[direction=rtl] .active>.rotate-180,[direction=rtl] .collapsible:not(.collapsed)>.rotate-180,[direction=rtl] .show>.rotate-180{transform:rotateZ(-180deg)}.rotate-n180{transition:transform .3s ease;backface-visibility:hidden;will-change:transform}.active>.rotate-n180,.collapsible:not(.collapsed)>.rotate-n180,.show>.rotate-n180{transform:rotateZ(-180deg);transition:transform .3s ease}[direction=rtl] .active>.rotate-n180,[direction=rtl] .collapsible:not(.collapsed)>.rotate-n180,[direction=rtl] .show>.rotate-n180{transform:rotateZ(180deg)}.rotate-270{transition:transform .3s ease;backface-visibility:hidden;will-change:transform}.active>.rotate-270,.collapsible:not(.collapsed)>.rotate-270,.show>.rotate-270{transform:rotateZ(270deg);transition:transform .3s ease}[direction=rtl] .active>.rotate-270,[direction=rtl] .collapsible:not(.collapsed)>.rotate-270,[direction=rtl] .show>.rotate-270{transform:rotateZ(-270deg)}.rotate-n270{transition:transform .3s ease;backface-visibility:hidden;will-change:transform}.active>.rotate-n270,.collapsible:not(.collapsed)>.rotate-n270,.show>.rotate-n270{transform:rotateZ(-270deg);transition:transform .3s ease}[direction=rtl] .active>.rotate-n270,[direction=rtl] .collapsible:not(.collapsed)>.rotate-n270,[direction=rtl] .show>.rotate-n270{transform:rotateZ(270deg)}@media (min-width:992px){div,main,ol,pre,span,ul{scrollbar-width:thin;scrollbar-color:var(--bs-scrollbar-color) transparent}div::-webkit-scrollbar,main::-webkit-scrollbar,ol::-webkit-scrollbar,pre::-webkit-scrollbar,span::-webkit-scrollbar,ul::-webkit-scrollbar{width:var(--bs-scrollbar-size);height:var(--bs-scrollbar-size)}div ::-webkit-scrollbar-track,main ::-webkit-scrollbar-track,ol ::-webkit-scrollbar-track,pre ::-webkit-scrollbar-track,span ::-webkit-scrollbar-track,ul ::-webkit-scrollbar-track{background-color:transparent}div ::-webkit-scrollbar-thumb,main ::-webkit-scrollbar-thumb,ol ::-webkit-scrollbar-thumb,pre ::-webkit-scrollbar-thumb,span ::-webkit-scrollbar-thumb,ul ::-webkit-scrollbar-thumb{border-radius:var(--bs-scrollbar-size)}div::-webkit-scrollbar-thumb,main::-webkit-scrollbar-thumb,ol::-webkit-scrollbar-thumb,pre::-webkit-scrollbar-thumb,span::-webkit-scrollbar-thumb,ul::-webkit-scrollbar-thumb{background-color:var(--bs-scrollbar-color)}div::-webkit-scrollbar-corner,main::-webkit-scrollbar-corner,ol::-webkit-scrollbar-corner,pre::-webkit-scrollbar-corner,span::-webkit-scrollbar-corner,ul::-webkit-scrollbar-corner{background-color:transparent}div:hover,main:hover,ol:hover,pre:hover,span:hover,ul:hover{scrollbar-color:var(--bs-scrollbar-hover-color) transparent}div:hover::-webkit-scrollbar-thumb,main:hover::-webkit-scrollbar-thumb,ol:hover::-webkit-scrollbar-thumb,pre:hover::-webkit-scrollbar-thumb,span:hover::-webkit-scrollbar-thumb,ul:hover::-webkit-scrollbar-thumb{background-color:var(--bs-scrollbar-hover-color)}div:hover::-webkit-scrollbar-corner,main:hover::-webkit-scrollbar-corner,ol:hover::-webkit-scrollbar-corner,pre:hover::-webkit-scrollbar-corner,span:hover::-webkit-scrollbar-corner,ul:hover::-webkit-scrollbar-corner{background-color:transparent}}.hover-scroll,.hover-scroll-overlay,.scroll{overflow:scroll;position:relative}@media (max-width:991.98px){.hover-scroll,.hover-scroll-overlay,.scroll{overflow:auto}}.hover-scroll-overlay-x,.hover-scroll-x,.scroll-x{overflow-x:scroll;position:relative}@media (max-width:991.98px){.hover-scroll-overlay-x,.hover-scroll-x,.scroll-x{overflow-x:auto}}.hover-scroll-overlay-y,.hover-scroll-y,.scroll-y{overflow-y:scroll;position:relative}@media (max-width:991.98px){.hover-scroll-overlay-y,.hover-scroll-y,.scroll-y{overflow-y:auto}}.hover-scroll,.hover-scroll-overlay,.hover-scroll-overlay-x,.hover-scroll-overlay-y,.hover-scroll-x,.hover-scroll-y{scrollbar-color:transparent transparent}.hover-scroll-overlay-x::-webkit-scrollbar-thumb,.hover-scroll-overlay-y::-webkit-scrollbar-thumb,.hover-scroll-overlay::-webkit-scrollbar-thumb,.hover-scroll-x::-webkit-scrollbar-thumb,.hover-scroll-y::-webkit-scrollbar-thumb,.hover-scroll::-webkit-scrollbar-thumb{background-color:transparent}.hover-scroll-overlay-x::-webkit-scrollbar-corner,.hover-scroll-overlay-y::-webkit-scrollbar-corner,.hover-scroll-overlay::-webkit-scrollbar-corner,.hover-scroll-x::-webkit-scrollbar-corner,.hover-scroll-y::-webkit-scrollbar-corner,.hover-scroll::-webkit-scrollbar-corner{background-color:transparent}.hover-scroll-overlay-x:hover,.hover-scroll-overlay-y:hover,.hover-scroll-overlay:hover,.hover-scroll-x:hover,.hover-scroll-y:hover,.hover-scroll:hover{scrollbar-color:var(--bs-scrollbar-color) transparent}.hover-scroll-overlay-x:hover::-webkit-scrollbar-thumb,.hover-scroll-overlay-y:hover::-webkit-scrollbar-thumb,.hover-scroll-overlay:hover::-webkit-scrollbar-thumb,.hover-scroll-x:hover::-webkit-scrollbar-thumb,.hover-scroll-y:hover::-webkit-scrollbar-thumb,.hover-scroll:hover::-webkit-scrollbar-thumb{background-color:var(--bs-scrollbar-color)}.hover-scroll-overlay-x:hover::-webkit-scrollbar-corner,.hover-scroll-overlay-y:hover::-webkit-scrollbar-corner,.hover-scroll-overlay:hover::-webkit-scrollbar-corner,.hover-scroll-x:hover::-webkit-scrollbar-corner,.hover-scroll-y:hover::-webkit-scrollbar-corner,.hover-scroll:hover::-webkit-scrollbar-corner{background-color:transparent}.scroll-ps{padding-left:var(--bs-scrollbar-size)!important}.scroll-ms{margin-left:var(--bs-scrollbar-size)!important}.scroll-mb{margin-bottom:var(--bs-scrollbar-size)!important}.scroll-pe{padding-right:var(--bs-scrollbar-size)!important}.scroll-me{margin-right:var(--bs-scrollbar-size)!important}.scroll-px{padding-left:var(--bs-scrollbar-size)!important;padding-right:var(--bs-scrollbar-size)!important}.scroll-mx{margin-left:var(--bs-scrollbar-size)!important;margin-right:var(--bs-scrollbar-size)!important}@media (min-width:576px){.scroll-sm-ps{padding-left:var(--bs-scrollbar-size)!important}.scroll-sm-ms{margin-left:var(--bs-scrollbar-size)!important}.scroll-sm-mb{margin-bottom:var(--bs-scrollbar-size)!important}.scroll-sm-pe{padding-right:var(--bs-scrollbar-size)!important}.scroll-sm-me{margin-right:var(--bs-scrollbar-size)!important}.scroll-sm-px{padding-left:var(--bs-scrollbar-size)!important;padding-right:var(--bs-scrollbar-size)!important}.scroll-sm-mx{margin-left:var(--bs-scrollbar-size)!important;margin-right:var(--bs-scrollbar-size)!important}}@media (min-width:768px){.scroll-md-ps{padding-left:var(--bs-scrollbar-size)!important}.scroll-md-ms{margin-left:var(--bs-scrollbar-size)!important}.scroll-md-mb{margin-bottom:var(--bs-scrollbar-size)!important}.scroll-md-pe{padding-right:var(--bs-scrollbar-size)!important}.scroll-md-me{margin-right:var(--bs-scrollbar-size)!important}.scroll-md-px{padding-left:var(--bs-scrollbar-size)!important;padding-right:var(--bs-scrollbar-size)!important}.scroll-md-mx{margin-left:var(--bs-scrollbar-size)!important;margin-right:var(--bs-scrollbar-size)!important}}@media (min-width:992px){.scroll-lg-ps{padding-left:var(--bs-scrollbar-size)!important}.scroll-lg-ms{margin-left:var(--bs-scrollbar-size)!important}.scroll-lg-mb{margin-bottom:var(--bs-scrollbar-size)!important}.scroll-lg-pe{padding-right:var(--bs-scrollbar-size)!important}.scroll-lg-me{margin-right:var(--bs-scrollbar-size)!important}.scroll-lg-px{padding-left:var(--bs-scrollbar-size)!important;padding-right:var(--bs-scrollbar-size)!important}.scroll-lg-mx{margin-left:var(--bs-scrollbar-size)!important;margin-right:var(--bs-scrollbar-size)!important}}@media (min-width:1200px){.scroll-xl-ps{padding-left:var(--bs-scrollbar-size)!important}.scroll-xl-ms{margin-left:var(--bs-scrollbar-size)!important}.scroll-xl-mb{margin-bottom:var(--bs-scrollbar-size)!important}.scroll-xl-pe{padding-right:var(--bs-scrollbar-size)!important}.scroll-xl-me{margin-right:var(--bs-scrollbar-size)!important}.scroll-xl-px{padding-left:var(--bs-scrollbar-size)!important;padding-right:var(--bs-scrollbar-size)!important}.scroll-xl-mx{margin-left:var(--bs-scrollbar-size)!important;margin-right:var(--bs-scrollbar-size)!important}}@media (min-width:1400px){.scroll-xxl-ps{padding-left:var(--bs-scrollbar-size)!important}.scroll-xxl-ms{margin-left:var(--bs-scrollbar-size)!important}.scroll-xxl-mb{margin-bottom:var(--bs-scrollbar-size)!important}.scroll-xxl-pe{padding-right:var(--bs-scrollbar-size)!important}.scroll-xxl-me{margin-right:var(--bs-scrollbar-size)!important}.scroll-xxl-px{padding-left:var(--bs-scrollbar-size)!important;padding-right:var(--bs-scrollbar-size)!important}.scroll-xxl-mx{margin-left:var(--bs-scrollbar-size)!important;margin-right:var(--bs-scrollbar-size)!important}}.rating{display:flex;align-items:center}.rating-input{position:absolute!important;left:-9999px!important}.rating-input[disabled]{display:none}.rating-label{padding:0;margin:0}.rating-label>.svg-icon,.rating-label>i{line-height:1;color:var(--bs-rating-color-default)}label.rating-label{cursor:pointer}div.rating-label.checked>.svg-icon,div.rating-label.checked>i,label.rating-label>.svg-icon,label.rating-label>i{color:var(--bs-rating-color-active)}.rating-input:checked~.rating-label>.svg-icon,.rating-input:checked~.rating-label>i{color:var(--bs-rating-color-default)}.rating:hover label.rating-label>.svg-icon,.rating:hover label.rating-label>i{color:var(--bs-rating-color-active)}label.rating-label:hover~.rating-label{color:var(--bs-rating-color-default)}label.rating-label:hover~.rating-label>.svg-icon,label.rating-label:hover~.rating-label>i{color:var(--bs-rating-color-default)}.stepper [data-kt-stepper-element=content],.stepper [data-kt-stepper-element=info]{display:none}.stepper [data-kt-stepper-element=content].current,.stepper [data-kt-stepper-element=info].current{display:flex}.stepper .stepper-item[data-kt-stepper-action=step]{cursor:pointer}.stepper [data-kt-stepper-action=final]{display:none}.stepper [data-kt-stepper-action=previous]{display:none}.stepper [data-kt-stepper-action=next]{display:inline-block}.stepper [data-kt-stepper-action=submit]{display:none}.stepper.first [data-kt-stepper-action=previous]{display:none}.stepper.first [data-kt-stepper-action=next]{display:inline-block}.stepper.first [data-kt-stepper-action=submit]{display:none}.stepper.between [data-kt-stepper-action=previous]{display:inline-block}.stepper.between [data-kt-stepper-action=next]{display:inline-block}.stepper.between [data-kt-stepper-action=submit]{display:none}.stepper.last [data-kt-stepper-action=final]{display:inline-block}.stepper.last [data-kt-stepper-action=final].btn-flex{display:flex}.stepper.last [data-kt-stepper-action=previous]{display:inline-block}.stepper.last [data-kt-stepper-action=previous].btn-flex{display:flex}.stepper.last [data-kt-stepper-action=previous][data-kt-stepper-state=hide-on-last-step]{display:none!important}.stepper.last [data-kt-stepper-action=next]{display:none}.stepper.last [data-kt-stepper-action=next].btn-flex{display:flex}.stepper.last [data-kt-stepper-action=submit]{display:inline-block}.stepper.last [data-kt-stepper-action=submit].btn-flex{display:flex}.stepper.stepper-pills{--bs-stepper-pills-size:40px;--bs-stepper-icon-border-radius:9px;--bs-stepper-icon-check-size:1rem;--bs-stepper-icon-bg-color:var(--bs-primary-light);--bs-stepper-icon-bg-color-current:var(--bs-primary);--bs-stepper-icon-bg-color-completed:var(--bs-primary-light);--bs-stepper-icon-border:0;--bs-stepper-icon-border-current:0;--bs-stepper-icon-border-completed:0;--bs-stepper-icon-number-color:var(--bs-primary);--bs-stepper-icon-number-color-current:var(--bs-white);--bs-stepper-icon-check-color-completed:var(--bs-primary);--bs-stepper-label-title-opacity:1;--bs-stepper-label-title-opacity-current:1;--bs-stepper-label-title-opacity-completed:1;--bs-stepper-label-title-color:var(--bs-gray-800);--bs-stepper-label-title-color-current:var(--bs-gray-600);--bs-stepper-label-title-color-completed:var(--bs-text-muted);--bs-stepper-label-desc-opacity:1;--bs-stepper-label-desc-opacity-current:1;--bs-stepper-label-desc-opacity-completed:1;--bs-stepper-label-desc-color:var(--bs-text-muted);--bs-stepper-label-desc-color-current:var(--bs-gray-500);--bs-stepper-label-desc-color-completed:var(--bs-gray-500);--bs-stepper-line-border:1px dashed var(--bs-gray-300)}.stepper.stepper-pills .stepper-nav{display:flex}.stepper.stepper-pills .stepper-item{display:flex;align-items:center;transition:color .2s ease}.stepper.stepper-pills .stepper-item .stepper-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:color .2s ease;width:var(--bs-stepper-pills-size);height:var(--bs-stepper-pills-size);border-radius:var(--bs-stepper-icon-border-radius);background-color:var(--bs-stepper-icon-bg-color);border:var(--bs-stepper-icon-border);margin-right:1.5rem}.stepper.stepper-pills .stepper-item .stepper-icon .stepper-check{display:none;font-size:var(--bs-stepper-icon-check-size)}.stepper.stepper-pills .stepper-item .stepper-icon .stepper-number{font-weight:600;color:var(--bs-stepper-icon-number-color);font-size:1.25rem}.stepper.stepper-pills .stepper-item .stepper-label{display:flex;flex-direction:column;justify-content:center}.stepper.stepper-pills .stepper-item .stepper-label .stepper-title{color:var(--bs-stepper-label-title-color);opacity:var(--bs-stepper-label-title-opacity);font-weight:600;font-size:1.25rem;margin-bottom:.3rem}.stepper.stepper-pills .stepper-item .stepper-label .stepper-desc{opacity:var(--bs-stepper-label-desc-opacity);color:var(--bs-stepper-label-desc-color)}.stepper.stepper-pills .stepper-item.current{transition:color .2s ease}.stepper.stepper-pills .stepper-item.current .stepper-icon{transition:color .2s ease;background-color:var(--bs-stepper-icon-bg-color-current);border:var(--bs-stepper-icon-border-current)}.stepper.stepper-pills .stepper-item.current .stepper-icon .stepper-check{display:none}.stepper.stepper-pills .stepper-item.current .stepper-icon .stepper-number{color:var(--bs-stepper-icon-number-color-current);font-size:1.35rem}.stepper.stepper-pills .stepper-item.current .stepper-label .stepper-title{opacity:var(--bs-stepper-label-title-opacity-current);color:var(--bs-stepper-label-title-color-current)}.stepper.stepper-pills .stepper-item.current .stepper-label .stepper-desc{opacity:var(--bs-stepper-label-desc-opacity-current);color:var(--bs-stepper-label-desc-color-current)}.stepper.stepper-pills .stepper-item.completed .stepper-icon,.stepper.stepper-pills .stepper-item.current.mark-completed:last-child .stepper-icon{transition:color .2s ease;background-color:var(--bs-stepper-icon-bg-color-completed);border:var(--bs-stepper-icon-border-completed)}.stepper.stepper-pills .stepper-item.completed .stepper-icon .stepper-check,.stepper.stepper-pills .stepper-item.current.mark-completed:last-child .stepper-icon .stepper-check{color:var(--bs-stepper-icon-check-color-completed);display:inline-block}.stepper.stepper-pills .stepper-item.completed .stepper-icon .stepper-number,.stepper.stepper-pills .stepper-item.current.mark-completed:last-child .stepper-icon .stepper-number{display:none}.stepper.stepper-pills .stepper-item.completed .stepper-label .stepper-title,.stepper.stepper-pills .stepper-item.current.mark-completed:last-child .stepper-label .stepper-title{opacity:var(--bs-stepper-label-title-opacity-completed);color:var(--bs-stepper-label-title-color-completed)}.stepper.stepper-pills .stepper-item.completed .stepper-label .stepper-desc,.stepper.stepper-pills .stepper-item.current.mark-completed:last-child .stepper-label .stepper-desc{opacity:var(--bs-stepper-label-desc-opacity-completed);color:var(--bs-stepper-label-desc-color-completed)}.stepper.stepper-pills.stepper-column .stepper-nav{flex-direction:column;align-items:start}.stepper.stepper-pills.stepper-column .stepper-item{flex-direction:column;justify-content:start;align-items:stretch;padding:0;margin:0}.stepper.stepper-pills.stepper-column .stepper-wrapper{display:flex;align-items:center}.stepper.stepper-pills.stepper-column .stepper-icon{z-index:1}.stepper.stepper-pills.stepper-column .stepper-line{display:block;flex-grow:1;margin-left:calc(var(--bs-stepper-pills-size)/ 2);border-left:var(--bs-stepper-line-border);margin-top:2px;margin-bottom:2px}.stepper.stepper-links .stepper-nav{display:flex;margin:0 auto;justify-content:center;align-items:center;flex-wrap:wrap}.stepper.stepper-links .stepper-nav .stepper-item{position:relative;flex-shrink:0;margin:1rem 1.5rem}.stepper.stepper-links .stepper-nav .stepper-item:after{content:" ";position:absolute;top:2.3rem;left:0;height:2px;width:100%;background-color:transparent;transition:color .2s ease}.stepper.stepper-links .stepper-nav .stepper-item .stepper-title{color:var(--bs-gray-900);font-weight:600;font-size:1.25rem}.stepper.stepper-links .stepper-nav .stepper-item.current{transition:color .2s ease}.stepper.stepper-links .stepper-nav .stepper-item.current .stepper-title{color:var(--bs-primary)}.stepper.stepper-links .stepper-nav .stepper-item.current:after{background-color:var(--bs-primary)}.stepper.stepper-links .stepper-nav .stepper-item.completed .stepper-title,.stepper.stepper-links .stepper-nav .stepper-item.current.mark-completed:last-child .stepper-title{color:var(--bs-gray-500)}.toggle.active .toggle-off,.toggle.collapsible:not(.collapsed) .toggle-off{display:none}.toggle.collapsible.collapsed .toggle-on,.toggle:not(.collapsible):not(.active) .toggle-on{display:none}.xehagon{clip-path:polygon(45% 1.3397459622%,46.5797985667% .6030737921%,48.2635182233% .1519224699%,50% 0,51.7364817767% .1519224699%,53.4202014333% .6030737921%,55% 1.3397459622%,89.6410161514% 21.3397459622%,91.0688922482% 22.3395555688%,92.3014605826% 23.5721239031%,93.3012701892% 25%,94.0379423592% 26.5797985667%,94.4890936815% 28.2635182233%,94.6410161514% 30%,94.6410161514% 70%,94.4890936815% 71.7364817767%,94.0379423592% 73.4202014333%,93.3012701892% 75%,92.3014605826% 76.4278760969%,91.0688922482% 77.6604444312%,89.6410161514% 78.6602540378%,55% 98.6602540378%,53.4202014333% 99.3969262079%,51.7364817767% 99.8480775301%,50% 100%,48.2635182233% 99.8480775301%,46.5797985667% 99.3969262079%,45% 98.6602540378%,10.3589838486% 78.6602540378%,8.9311077518% 77.6604444312%,7.6985394174% 76.4278760969%,6.6987298108% 75%,5.9620576408% 73.4202014333%,5.5109063185% 71.7364817767%,5.3589838486% 70%,5.3589838486% 30%,5.5109063185% 28.2635182233%,5.9620576408% 26.5797985667%,6.6987298108% 25%,7.6985394174% 23.5721239031%,8.9311077518% 22.3395555688%,10.3589838486% 21.3397459622%)}.octagon{clip-path:polygon(46.1731656763% .7612046749%,47.411809549% .3407417371%,48.6947380778% .0855513863%,50% 0,51.3052619222% .0855513863%,52.588190451% .3407417371%,53.8268343237% .7612046749%,82.1111055711% 12.4769334274%,83.2842712475% 13.0554747147%,84.3718855375% 13.7821953496%,85.3553390593% 14.6446609407%,86.2178046504% 15.6281144625%,86.9445252853% 16.7157287525%,87.5230665726% 17.8888944289%,99.2387953251% 46.1731656763%,99.6592582629% 47.411809549%,99.9144486137% 48.6947380778%,100% 50%,99.9144486137% 51.3052619222%,99.6592582629% 52.588190451%,99.2387953251% 53.8268343237%,87.5230665726% 82.1111055711%,86.9445252853% 83.2842712475%,86.2178046504% 84.3718855375%,85.3553390593% 85.3553390593%,84.3718855375% 86.2178046504%,83.2842712475% 86.9445252853%,82.1111055711% 87.5230665726%,53.8268343237% 99.2387953251%,52.588190451% 99.6592582629%,51.3052619222% 99.9144486137%,50% 100%,48.6947380778% 99.9144486137%,47.411809549% 99.6592582629%,46.1731656763% 99.2387953251%,17.8888944289% 87.5230665726%,16.7157287525% 86.9445252853%,15.6281144625% 86.2178046504%,14.6446609407% 85.3553390593%,13.7821953496% 84.3718855375%,13.0554747147% 83.2842712475%,12.4769334274% 82.1111055711%,.7612046749% 53.8268343237%,.3407417371% 52.588190451%,.0855513863% 51.3052619222%,0 50%,.0855513863% 48.6947380778%,.3407417371% 47.411809549%,.7612046749% 46.1731656763%,12.4769334274% 17.8888944289%,13.0554747147% 16.7157287525%,13.7821953496% 15.6281144625%,14.6446609407% 14.6446609407%,15.6281144625% 13.7821953496%,16.7157287525% 13.0554747147%,17.8888944289% 12.4769334274%)}.ribbon{position:relative}.ribbon .ribbon-label{display:flex;justify-content:center;align-items:center;padding:5px 10px;position:absolute;z-index:1;background-color:var(--bs-ribbon-label-bg);box-shadow:var(--bs-ribbon-label-box-shadow);color:var(--bs-primary-inverse);top:50%;right:0;transform:translateX(5px) translateY(-50%)}.ribbon .ribbon-label>.ribbon-inner{z-index:-1;position:absolute;padding:0;width:100%;height:100%;top:0;left:0}.ribbon .ribbon-label:after{border-color:var(--bs-ribbon-label-border-color)}.ribbon-vertical .ribbon-label{padding:5px 10px;min-width:36px;min-height:46px;text-align:center}.ribbon.ribbon-top .ribbon-label{top:0;transform:translateX(-15px) translateY(-4px);border-bottom-right-radius:.475rem;border-bottom-left-radius:.475rem}.ribbon.ribbon-bottom .ribbon-label{border-top-right-radius:.475rem;border-top-left-radius:.475rem}.ribbon.ribbon-start .ribbon-label{top:50%;left:0;right:auto;transform:translateX(-5px) translateY(-50%);border-top-right-radius:.475rem;border-bottom-right-radius:.475rem}.ribbon.ribbon-end .ribbon-label{border-top-left-radius:.475rem;border-bottom-left-radius:.475rem}.ribbon.ribbon-clip.ribbon-start .ribbon-label{left:-5px}.ribbon.ribbon-clip.ribbon-start .ribbon-label .ribbon-inner{border-top-right-radius:.475rem;border-bottom-right-radius:.475rem}.ribbon.ribbon-clip.ribbon-start .ribbon-label .ribbon-inner:after,.ribbon.ribbon-clip.ribbon-start .ribbon-label .ribbon-inner:before{content:"";position:absolute;border-style:solid;border-color:transparent!important;bottom:-10px}.ribbon.ribbon-clip.ribbon-start .ribbon-label .ribbon-inner:before{border-width:0 10px 10px 0;border-right-color:var(--bs-ribbon-clip-bg)!important;left:0}.ribbon.ribbon-clip.ribbon-end .ribbon-label{right:-5px}.ribbon.ribbon-clip.ribbon-end .ribbon-label .ribbon-inner{border-top-left-radius:.475rem;border-bottom-left-radius:.475rem}.ribbon.ribbon-clip.ribbon-end .ribbon-label .ribbon-inner:after,.ribbon.ribbon-clip.ribbon-end .ribbon-label .ribbon-inner:before{content:"";position:absolute;border-style:solid;border-color:transparent!important;bottom:-10px}.ribbon.ribbon-clip.ribbon-end .ribbon-label .ribbon-inner:before{border-width:0 0 10px 10px;border-left-color:var(--bs-ribbon-clip-bg)!important;right:0}.ribbon.ribbon-triangle{position:absolute;z-index:1;display:flex;align-items:flex-start;justify-content:flex-start}.ribbon.ribbon-triangle.ribbon-top-start{top:0;left:0;width:4rem;height:4rem;border-bottom:solid 2rem transparent!important;border-left:solid 2rem transparent;border-right:solid 2rem transparent!important;border-top:solid 2rem transparent}.ribbon.ribbon-triangle.ribbon-top-end{top:0;right:0;width:4rem;height:4rem;border-bottom:solid 2rem transparent!important;border-left:solid 2rem transparent!important;border-right:solid 2rem transparent;border-top:solid 2rem transparent}.ribbon.ribbon-triangle.ribbon-bottom-start{bottom:0;left:0;width:4rem;height:4rem;border-bottom:solid 2rem transparent;border-left:solid 2rem transparent;border-right:solid 2rem transparent!important;border-top:solid 2rem transparent!important}.ribbon.ribbon-triangle.ribbon-bottom-end{bottom:0;right:0;width:4rem;height:4rem;border-bottom:solid 2rem transparent;border-right:solid 2rem transparent;border-left:solid 2rem transparent!important;border-top:solid 2rem transparent!important}.blockui{position:relative}.blockui .blockui-overlay{transition:all .3s ease;position:absolute;top:0;bottom:0;left:0;right:0;display:flex;justify-content:center;align-items:center;background-color:var(--bs-blockui-overlay-bg)}.blockui .blockui-overlay .spinner-border{height:1.35rem;width:1.35rem}.blockui .blockui-message{display:flex;align-items:center;border-radius:.475rem;box-shadow:var(--bs-blockui-message-box-shadow);background-color:var(--bs-blockui-message-bg);color:var(--bs-gray-700);font-weight:600;margin:0!important;width:auto;padding:.85rem 1.75rem!important}.blockui .blockui-message .spinner-border{margin-right:.65rem}[data-bs-theme=dark] .blockui{--bs-blockui-overlay-bg:rgba(255, 255, 255, 0.05);--bs-blockui-message-bg:#26272F;--bs-blockui-message-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.15)}.explore-btn-toggle{color:var(--bs-gray-600);background-color:#fff}.explore-btn-toggle:active,.explore-btn-toggle:focus,.explore-btn-toggle:hover{color:#fff;background-color:#00b2ff}.explore-btn-dismiss{border:0}.explore-btn-dismiss:hover .svg-icon,.explore-btn-dismiss:hover i{color:#00b2ff}.explore-btn-primary{border:0;color:#fff;background-color:#00b2ff}.explore-btn-primary:hover{color:#fff;background-color:#0098da}.explore-btn-secondary{border:0;color:var(--bs-gray-600);background-color:var(--bs-gray-100)}.explore-btn-secondary:hover{color:var(--bs-gray-800);background-color:var(--bs-gray-200)}.explore-btn-outline{border:1px dashed var(--bs-gray-300)!important}.explore-btn-outline.active,.explore-btn-outline:hover{border:1px dashed #50cd89!important;background-color:#e8fff3}.explore-link{color:#00b2ff}.explore-link:hover{color:#0098da}.explore-link-hover:hover{color:#00b2ff!important}.explore-icon-success{color:#50cd89}.explore-icon-danger{color:#f1416c}.explore-label-free{color:#fff;background-color:#ffc700}.explore-label-pro{color:#fff;background-color:#50cd89}.app-engage{position:fixed;right:0;top:50%;transform:translateY(-50%);display:flex;flex-direction:column;align-items:flex-end;z-index:5;padding-right:12px}.app-engage .app-engage-btn{display:flex;align-items:center;justify-content:center;flex-direction:column;box-shadow:var(--bs-engage-btn-box-shadow);border-width:1px;border-style:solid;font-size:12px;font-weight:600;margin-bottom:8px;border-radius:6px;width:66px;height:70px;color:var(--bs-engage-btn-color);border-color:var(--bs-engage-btn-border-color);background-color:var(--bs-engage-btn-bg)}.app-engage .app-engage-btn .svg-icon,.app-engage .app-engage-btn i{color:var(--bs-engage-btn-icon-color)}.app-engage .app-engage-btn.dropdown-toggle:after{color:var(--bs-engage-btn-icon-color)}.app-engage .app-engage-btn.hover-dark:hover{color:var(--bs-dark-inverse);border-color:var(--bs-dark);background-color:var(--bs-dark)}.app-engage .app-engage-btn.hover-dark:hover .svg-icon,.app-engage .app-engage-btn.hover-dark:hover i{color:var(--bs-dark-inverse)}.app-engage .app-engage-btn.hover-primary:hover{color:var(--bs-primary-inverse);border-color:var(--bs-primary);background-color:var(--bs-primary)}.app-engage .app-engage-btn.hover-primary:hover .svg-icon,.app-engage .app-engage-btn.hover-primary:hover i{color:var(--bs-primary-inverse)}.app-engage .app-engage-btn.hover-success:hover{color:var(--bs-success-inverse);border-color:var(--bs-success);background-color:var(--bs-success)}.app-engage .app-engage-btn.hover-success:hover .svg-icon,.app-engage .app-engage-btn.hover-success:hover i{color:var(--bs-success-inverse)}.app-engage .app-engage-btn.app-engage-btn-toggle-off{width:35px;height:35px}.app-engage .app-engage-btn.app-engage-btn-toggle-on{width:35px;height:35px;display:none}.app-engage.app-engage-hide .app-engage-btn{visibility:hidden}.app-engage.app-engage-hide .app-engage-btn.app-engage-btn-toggle-off{display:none}.app-engage.app-engage-hide .app-engage-btn.app-engage-btn-toggle-on{visibility:visible;display:flex}.engage-btn{display:flex;align-items:center;height:35px!important;color:var(--bs-engage-btn-color);border-color:var(--bs-engage-btn-bg);background-color:var(--bs-engage-btn-bg)}.engage-btn .svg-icon,.engage-btn i{color:var(--bs-engage-btn-color)}.engage-btn.dropdown-toggle:after{color:var(--bs-engage-btn-color)}.btn-check:active+.engage-btn,.btn-check:checked+.engage-btn,.engage-btn.active,.engage-btn.show,.engage-btn:active:not(.btn-active),.engage-btn:focus:not(.btn-active),.engage-btn:hover:not(.btn-active),.show>.engage-btn{color:var(--bs-engage-btn-color-active);border-color:var(--bs-engage-btn-bg);background-color:var(--bs-engage-btn-bg)!important}.btn-check:active+.engage-btn .svg-icon,.btn-check:active+.engage-btn i,.btn-check:checked+.engage-btn .svg-icon,.btn-check:checked+.engage-btn i,.engage-btn.active .svg-icon,.engage-btn.active i,.engage-btn.show .svg-icon,.engage-btn.show i,.engage-btn:active:not(.btn-active) .svg-icon,.engage-btn:active:not(.btn-active) i,.engage-btn:focus:not(.btn-active) .svg-icon,.engage-btn:focus:not(.btn-active) i,.engage-btn:hover:not(.btn-active) .svg-icon,.engage-btn:hover:not(.btn-active) i,.show>.engage-btn .svg-icon,.show>.engage-btn i{color:var(--bs-engage-btn-color-active)}.btn-check:active+.engage-btn.dropdown-toggle:after,.btn-check:checked+.engage-btn.dropdown-toggle:after,.engage-btn.active.dropdown-toggle:after,.engage-btn.show.dropdown-toggle:after,.engage-btn:active:not(.btn-active).dropdown-toggle:after,.engage-btn:focus:not(.btn-active).dropdown-toggle:after,.engage-btn:hover:not(.btn-active).dropdown-toggle:after,.show>.engage-btn.dropdown-toggle:after{color:var(--bs-engage-btn-color-active)}.cookiealert{background:inherit;color:inherit}@media print{.print-content-only{padding:0!important;background:0 0!important}.print-content-only .container,.print-content-only .container-fluid,.print-content-only .container-lg,.print-content-only .container-md,.print-content-only .container-sm,.print-content-only .container-xl,.print-content-only .container-xxl,.print-content-only .page,.print-content-only .page-title .content,.print-content-only .wrapper{background:0 0!important;padding:0!important;margin:0!important}.print-content-only .aside,.print-content-only .btn,.print-content-only .drawer,.print-content-only .footer,.print-content-only .header,.print-content-only .scrolltop,.print-content-only .sidebar,.print-content-only .toolbar{display:none!important}}.bg-white{--bs-bg-rgb-color:var(--bs-white-bg-rgb);background-color:#fff!important}.bg-black{--bs-bg-rgb-color:var(--bs-black-bg-rgb);background-color:#000!important}.bg-body{--bs-bg-rgb-color:var(--bs-body-bg-rgb);background-color:var(--bs-body-bg)!important}.bg-hover-body{cursor:pointer}.bg-hover-body:hover{background-color:var(--bs-body-bg)!important}.bg-active-body.active{background-color:var(--bs-body-bg)!important}.bg-state-body{cursor:pointer}.bg-state-body.active,.bg-state-body:hover{background-color:var(--bs-body-bg)!important}.bg-hover-white{cursor:pointer}.bg-hover-white:hover{--bs-bg-rgb-color:var(--bs-white-bg-rgb);background-color:#fff!important}.bg-active-white.active{--bs-bg-rgb-color:var(--bs-white-bg-rgb);background-color:#fff!important}.bg-state-white{cursor:pointer}.bg-state-white.active,.bg-state-white:hover{--bs-bg-rgb-color:var(--bs-white-bg-rgb);background-color:#fff!important}.bg-light-light{background-color:var(--bs-light-light)!important}.bg-light{--bs-bg-rgb-color:var(--bs-light-rgb);background-color:var(--bs-light)!important}.bg-light-active{--bs-bg-rgb-color:var(--bs-light-active-rgb);background-color:var(--bs-light-active)!important}.bg-hover-light-light{cursor:pointer}.bg-hover-light-light:hover{background-color:var(--bs-light-light)!important}.bg-state-light-light{cursor:pointer}.bg-state-light-light.active,.bg-state-light-light:hover{background-color:var(--bs-light-light)!important}.bg-hover-light{cursor:pointer}.bg-hover-light:hover{background-color:var(--bs-light)!important}.bg-active-light.active{background-color:var(--bs-light)!important}.bg-state-light{cursor:pointer}.bg-state-light.active,.bg-state-light:hover{background-color:var(--bs-light)!important}.bg-light-primary{background-color:var(--bs-primary-light)!important}.bg-primary{--bs-bg-rgb-color:var(--bs-primary-rgb);background-color:var(--bs-primary)!important}.bg-primary-active{--bs-bg-rgb-color:var(--bs-primary-active-rgb);background-color:var(--bs-primary-active)!important}.bg-hover-light-primary{cursor:pointer}.bg-hover-light-primary:hover{background-color:var(--bs-primary-light)!important}.bg-state-light-primary{cursor:pointer}.bg-state-light-primary.active,.bg-state-light-primary:hover{background-color:var(--bs-primary-light)!important}.bg-hover-primary{cursor:pointer}.bg-hover-primary:hover{background-color:var(--bs-primary)!important}.bg-active-primary.active{background-color:var(--bs-primary)!important}.bg-state-primary{cursor:pointer}.bg-state-primary.active,.bg-state-primary:hover{background-color:var(--bs-primary)!important}.bg-light-secondary{background-color:var(--bs-secondary-light)!important}.bg-secondary{--bs-bg-rgb-color:var(--bs-secondary-rgb);background-color:var(--bs-secondary)!important}.bg-secondary-active{--bs-bg-rgb-color:var(--bs-secondary-active-rgb);background-color:var(--bs-secondary-active)!important}.bg-hover-light-secondary{cursor:pointer}.bg-hover-light-secondary:hover{background-color:var(--bs-secondary-light)!important}.bg-state-light-secondary{cursor:pointer}.bg-state-light-secondary.active,.bg-state-light-secondary:hover{background-color:var(--bs-secondary-light)!important}.bg-hover-secondary{cursor:pointer}.bg-hover-secondary:hover{background-color:var(--bs-secondary)!important}.bg-active-secondary.active{background-color:var(--bs-secondary)!important}.bg-state-secondary{cursor:pointer}.bg-state-secondary.active,.bg-state-secondary:hover{background-color:var(--bs-secondary)!important}.bg-light-success{background-color:var(--bs-success-light)!important}.bg-success{--bs-bg-rgb-color:var(--bs-success-rgb);background-color:var(--bs-success)!important}.bg-success-active{--bs-bg-rgb-color:var(--bs-success-active-rgb);background-color:var(--bs-success-active)!important}.bg-hover-light-success{cursor:pointer}.bg-hover-light-success:hover{background-color:var(--bs-success-light)!important}.bg-state-light-success{cursor:pointer}.bg-state-light-success.active,.bg-state-light-success:hover{background-color:var(--bs-success-light)!important}.bg-hover-success{cursor:pointer}.bg-hover-success:hover{background-color:var(--bs-success)!important}.bg-active-success.active{background-color:var(--bs-success)!important}.bg-state-success{cursor:pointer}.bg-state-success.active,.bg-state-success:hover{background-color:var(--bs-success)!important}.bg-light-info{background-color:var(--bs-info-light)!important}.bg-info{--bs-bg-rgb-color:var(--bs-info-rgb);background-color:var(--bs-info)!important}.bg-info-active{--bs-bg-rgb-color:var(--bs-info-active-rgb);background-color:var(--bs-info-active)!important}.bg-hover-light-info{cursor:pointer}.bg-hover-light-info:hover{background-color:var(--bs-info-light)!important}.bg-state-light-info{cursor:pointer}.bg-state-light-info.active,.bg-state-light-info:hover{background-color:var(--bs-info-light)!important}.bg-hover-info{cursor:pointer}.bg-hover-info:hover{background-color:var(--bs-info)!important}.bg-active-info.active{background-color:var(--bs-info)!important}.bg-state-info{cursor:pointer}.bg-state-info.active,.bg-state-info:hover{background-color:var(--bs-info)!important}.bg-light-warning{background-color:var(--bs-warning-light)!important}.bg-warning{--bs-bg-rgb-color:var(--bs-warning-rgb);background-color:var(--bs-warning)!important}.bg-warning-active{--bs-bg-rgb-color:var(--bs-warning-active-rgb);background-color:var(--bs-warning-active)!important}.bg-hover-light-warning{cursor:pointer}.bg-hover-light-warning:hover{background-color:var(--bs-warning-light)!important}.bg-state-light-warning{cursor:pointer}.bg-state-light-warning.active,.bg-state-light-warning:hover{background-color:var(--bs-warning-light)!important}.bg-hover-warning{cursor:pointer}.bg-hover-warning:hover{background-color:var(--bs-warning)!important}.bg-active-warning.active{background-color:var(--bs-warning)!important}.bg-state-warning{cursor:pointer}.bg-state-warning.active,.bg-state-warning:hover{background-color:var(--bs-warning)!important}.bg-light-danger{background-color:var(--bs-danger-light)!important}.bg-danger{--bs-bg-rgb-color:var(--bs-danger-rgb);background-color:var(--bs-danger)!important}.bg-danger-active{--bs-bg-rgb-color:var(--bs-danger-active-rgb);background-color:var(--bs-danger-active)!important}.bg-hover-light-danger{cursor:pointer}.bg-hover-light-danger:hover{background-color:var(--bs-danger-light)!important}.bg-state-light-danger{cursor:pointer}.bg-state-light-danger.active,.bg-state-light-danger:hover{background-color:var(--bs-danger-light)!important}.bg-hover-danger{cursor:pointer}.bg-hover-danger:hover{background-color:var(--bs-danger)!important}.bg-active-danger.active{background-color:var(--bs-danger)!important}.bg-state-danger{cursor:pointer}.bg-state-danger.active,.bg-state-danger:hover{background-color:var(--bs-danger)!important}.bg-light-dark{background-color:var(--bs-dark-light)!important}.bg-dark{--bs-bg-rgb-color:var(--bs-dark-rgb);background-color:var(--bs-dark)!important}.bg-dark-active{--bs-bg-rgb-color:var(--bs-dark-active-rgb);background-color:var(--bs-dark-active)!important}.bg-hover-light-dark{cursor:pointer}.bg-hover-light-dark:hover{background-color:var(--bs-dark-light)!important}.bg-state-light-dark{cursor:pointer}.bg-state-light-dark.active,.bg-state-light-dark:hover{background-color:var(--bs-dark-light)!important}.bg-hover-dark{cursor:pointer}.bg-hover-dark:hover{background-color:var(--bs-dark)!important}.bg-active-dark.active{background-color:var(--bs-dark)!important}.bg-state-dark{cursor:pointer}.bg-state-dark.active,.bg-state-dark:hover{background-color:var(--bs-dark)!important}.bg-gray-100{--bs-bg-rgb-color:var(--bs-gray-100-rgb);background-color:var(--bs-gray-100)}.bg-hover-gray-100:hover{--bs-bg-rgb-color:var(--bs-gray-100-rgb);background-color:var(--bs-gray-100)}.bg-gray-100i{--bs-bg-rgb-color:var(--bs-gray-100-rgb);background-color:var(--bs-gray-100)!important}.bg-gray-200{--bs-bg-rgb-color:var(--bs-gray-200-rgb);background-color:var(--bs-gray-200)}.bg-hover-gray-200:hover{--bs-bg-rgb-color:var(--bs-gray-200-rgb);background-color:var(--bs-gray-200)}.bg-gray-200i{--bs-bg-rgb-color:var(--bs-gray-200-rgb);background-color:var(--bs-gray-200)!important}.bg-gray-300{--bs-bg-rgb-color:var(--bs-gray-300-rgb);background-color:var(--bs-gray-300)}.bg-hover-gray-300:hover{--bs-bg-rgb-color:var(--bs-gray-300-rgb);background-color:var(--bs-gray-300)}.bg-gray-300i{--bs-bg-rgb-color:var(--bs-gray-300-rgb);background-color:var(--bs-gray-300)!important}.bg-gray-400{--bs-bg-rgb-color:var(--bs-gray-400-rgb);background-color:var(--bs-gray-400)}.bg-hover-gray-400:hover{--bs-bg-rgb-color:var(--bs-gray-400-rgb);background-color:var(--bs-gray-400)}.bg-gray-400i{--bs-bg-rgb-color:var(--bs-gray-400-rgb);background-color:var(--bs-gray-400)!important}.bg-gray-500{--bs-bg-rgb-color:var(--bs-gray-500-rgb);background-color:var(--bs-gray-500)}.bg-hover-gray-500:hover{--bs-bg-rgb-color:var(--bs-gray-500-rgb);background-color:var(--bs-gray-500)}.bg-gray-500i{--bs-bg-rgb-color:var(--bs-gray-500-rgb);background-color:var(--bs-gray-500)!important}.bg-gray-600{--bs-bg-rgb-color:var(--bs-gray-600-rgb);background-color:var(--bs-gray-600)}.bg-hover-gray-600:hover{--bs-bg-rgb-color:var(--bs-gray-600-rgb);background-color:var(--bs-gray-600)}.bg-gray-600i{--bs-bg-rgb-color:var(--bs-gray-600-rgb);background-color:var(--bs-gray-600)!important}.bg-gray-700{--bs-bg-rgb-color:var(--bs-gray-700-rgb);background-color:var(--bs-gray-700)}.bg-hover-gray-700:hover{--bs-bg-rgb-color:var(--bs-gray-700-rgb);background-color:var(--bs-gray-700)}.bg-gray-700i{--bs-bg-rgb-color:var(--bs-gray-700-rgb);background-color:var(--bs-gray-700)!important}.bg-gray-800{--bs-bg-rgb-color:var(--bs-gray-800-rgb);background-color:var(--bs-gray-800)}.bg-hover-gray-800:hover{--bs-bg-rgb-color:var(--bs-gray-800-rgb);background-color:var(--bs-gray-800)}.bg-gray-800i{--bs-bg-rgb-color:var(--bs-gray-800-rgb);background-color:var(--bs-gray-800)!important}.bg-gray-900{--bs-bg-rgb-color:var(--bs-gray-900-rgb);background-color:var(--bs-gray-900)}.bg-hover-gray-900:hover{--bs-bg-rgb-color:var(--bs-gray-900-rgb);background-color:var(--bs-gray-900)}.bg-gray-900i{--bs-bg-rgb-color:var(--bs-gray-900-rgb);background-color:var(--bs-gray-900)!important}.bg-opacity-0{background-color:rgba(var(--bs-bg-rgb-color),0)!important}.bg-hover-opacity-0:hover{background-color:rgba(var(--bs-bg-rgb-color),0)!important}.bg-active-opacity-0.active{background-color:rgba(var(--bs-bg-rgb-color),0)!important}.bg-state-opacity-0 .active,.bg-state-opacity-0:hover{background-color:rgba(var(--bs-bg-rgb-color),0)!important}.bg-opacity-5{background-color:rgba(var(--bs-bg-rgb-color),.05)!important}.bg-hover-opacity-5:hover{background-color:rgba(var(--bs-bg-rgb-color),.05)!important}.bg-active-opacity-5.active{background-color:rgba(var(--bs-bg-rgb-color),.05)!important}.bg-state-opacity-5 .active,.bg-state-opacity-5:hover{background-color:rgba(var(--bs-bg-rgb-color),.05)!important}.bg-opacity-10{background-color:rgba(var(--bs-bg-rgb-color),.1)!important}.bg-hover-opacity-10:hover{background-color:rgba(var(--bs-bg-rgb-color),.1)!important}.bg-active-opacity-10.active{background-color:rgba(var(--bs-bg-rgb-color),.1)!important}.bg-state-opacity-10 .active,.bg-state-opacity-10:hover{background-color:rgba(var(--bs-bg-rgb-color),.1)!important}.bg-opacity-15{background-color:rgba(var(--bs-bg-rgb-color),.15)!important}.bg-hover-opacity-15:hover{background-color:rgba(var(--bs-bg-rgb-color),.15)!important}.bg-active-opacity-15.active{background-color:rgba(var(--bs-bg-rgb-color),.15)!important}.bg-state-opacity-15 .active,.bg-state-opacity-15:hover{background-color:rgba(var(--bs-bg-rgb-color),.15)!important}.bg-opacity-20{background-color:rgba(var(--bs-bg-rgb-color),.2)!important}.bg-hover-opacity-20:hover{background-color:rgba(var(--bs-bg-rgb-color),.2)!important}.bg-active-opacity-20.active{background-color:rgba(var(--bs-bg-rgb-color),.2)!important}.bg-state-opacity-20 .active,.bg-state-opacity-20:hover{background-color:rgba(var(--bs-bg-rgb-color),.2)!important}.bg-opacity-25{background-color:rgba(var(--bs-bg-rgb-color),.25)!important}.bg-hover-opacity-25:hover{background-color:rgba(var(--bs-bg-rgb-color),.25)!important}.bg-active-opacity-25.active{background-color:rgba(var(--bs-bg-rgb-color),.25)!important}.bg-state-opacity-25 .active,.bg-state-opacity-25:hover{background-color:rgba(var(--bs-bg-rgb-color),.25)!important}.bg-opacity-50{background-color:rgba(var(--bs-bg-rgb-color),.5)!important}.bg-hover-opacity-50:hover{background-color:rgba(var(--bs-bg-rgb-color),.5)!important}.bg-active-opacity-50.active{background-color:rgba(var(--bs-bg-rgb-color),.5)!important}.bg-state-opacity-50 .active,.bg-state-opacity-50:hover{background-color:rgba(var(--bs-bg-rgb-color),.5)!important}.bg-opacity-75{background-color:rgba(var(--bs-bg-rgb-color),.75)!important}.bg-hover-opacity-75:hover{background-color:rgba(var(--bs-bg-rgb-color),.75)!important}.bg-active-opacity-75.active{background-color:rgba(var(--bs-bg-rgb-color),.75)!important}.bg-state-opacity-75 .active,.bg-state-opacity-75:hover{background-color:rgba(var(--bs-bg-rgb-color),.75)!important}.bg-opacity-100{background-color:rgba(var(--bs-bg-rgb-color),1)!important}.bg-hover-opacity-100:hover{background-color:rgba(var(--bs-bg-rgb-color),1)!important}.bg-active-opacity-100.active{background-color:rgba(var(--bs-bg-rgb-color),1)!important}.bg-state-opacity-100 .active,.bg-state-opacity-100:hover{background-color:rgba(var(--bs-bg-rgb-color),1)!important}.bgi-no-repeat{background-repeat:no-repeat}.bgi-position-y-top{background-position-y:top}.bgi-position-y-bottom{background-position-y:bottom}.bgi-position-y-center{background-position-y:center}.bgi-position-x-start{background-position-x:left}.bgi-position-x-end{background-position-x:right}.bgi-position-x-center{background-position-x:center}.bgi-position-top{background-position:0 top}.bgi-position-bottom{background-position:0 bottom}.bgi-position-center{background-position:center}.bgi-size-auto{background-size:auto}.bgi-size-cover{background-size:cover}.bgi-size-contain{background-size:contain}.bgi-attachment-fixed{background-attachment:fixed}.bgi-attachment-scroll{background-attachment:scroll}@media (min-width:576px){.bgi-size-sm-auto{background-size:auto}.bgi-size-sm-cover{background-size:cover}.bgi-size-sm-contain{background-size:contain}.bgi-attachment-sm-fixed{background-attachment:fixed}.bgi-attachment-sm-scroll{background-attachment:scroll}}@media (min-width:768px){.bgi-size-md-auto{background-size:auto}.bgi-size-md-cover{background-size:cover}.bgi-size-md-contain{background-size:contain}.bgi-attachment-md-fixed{background-attachment:fixed}.bgi-attachment-md-scroll{background-attachment:scroll}}@media (min-width:992px){.bgi-size-lg-auto{background-size:auto}.bgi-size-lg-cover{background-size:cover}.bgi-size-lg-contain{background-size:contain}.bgi-attachment-lg-fixed{background-attachment:fixed}.bgi-attachment-lg-scroll{background-attachment:scroll}}@media (min-width:1200px){.bgi-size-xl-auto{background-size:auto}.bgi-size-xl-cover{background-size:cover}.bgi-size-xl-contain{background-size:contain}.bgi-attachment-xl-fixed{background-attachment:fixed}.bgi-attachment-xl-scroll{background-attachment:scroll}}@media (min-width:1400px){.bgi-size-xxl-auto{background-size:auto}.bgi-size-xxl-cover{background-size:cover}.bgi-size-xxl-contain{background-size:contain}.bgi-attachment-xxl-fixed{background-attachment:fixed}.bgi-attachment-xxl-scroll{background-attachment:scroll}}.border-active:not(.active):not(:active):not(:hover):not(:focus){border-color:transparent!important}.border-hover:not(:hover):not(:focus):not(.active):not(:active){cursor:pointer;border-color:transparent!important}.border-gray-100{border-color:var(--bs-gray-100)!important}.border-gray-200{border-color:var(--bs-gray-200)!important}.border-gray-300{border-color:var(--bs-gray-300)!important}.border-gray-400{border-color:var(--bs-gray-400)!important}.border-gray-500{border-color:var(--bs-gray-500)!important}.border-gray-600{border-color:var(--bs-gray-600)!important}.border-gray-700{border-color:var(--bs-gray-700)!important}.border-gray-800{border-color:var(--bs-gray-800)!important}.border-gray-900{border-color:var(--bs-gray-900)!important}.border-light-clarity{border-color:var(--bs-light-clarity)!important}.border-hover-light:hover{border-color:var(--bs-light)!important}.border-active-light.active{border-color:var(--bs-light)!important}.border-primary-clarity{border-color:var(--bs-primary-clarity)!important}.border-hover-primary:hover{border-color:var(--bs-primary)!important}.border-active-primary.active{border-color:var(--bs-primary)!important}.border-secondary-clarity{border-color:var(--bs-secondary-clarity)!important}.border-hover-secondary:hover{border-color:var(--bs-secondary)!important}.border-active-secondary.active{border-color:var(--bs-secondary)!important}.border-success-clarity{border-color:var(--bs-success-clarity)!important}.border-hover-success:hover{border-color:var(--bs-success)!important}.border-active-success.active{border-color:var(--bs-success)!important}.border-info-clarity{border-color:var(--bs-info-clarity)!important}.border-hover-info:hover{border-color:var(--bs-info)!important}.border-active-info.active{border-color:var(--bs-info)!important}.border-warning-clarity{border-color:var(--bs-warning-clarity)!important}.border-hover-warning:hover{border-color:var(--bs-warning)!important}.border-active-warning.active{border-color:var(--bs-warning)!important}.border-danger-clarity{border-color:var(--bs-danger-clarity)!important}.border-hover-danger:hover{border-color:var(--bs-danger)!important}.border-active-danger.active{border-color:var(--bs-danger)!important}.border-dark-clarity{border-color:var(--bs-dark-clarity)!important}.border-hover-dark:hover{border-color:var(--bs-dark)!important}.border-active-dark.active{border-color:var(--bs-dark)!important}.border-active-primary-clarity.active,.border-hover-primary-clarity:hover{border-color:var(--bs-primary-clarity)!important}.border-hover-transparent:hover{border-color:transparent!important}.border-dashed{border-style:dashed!important;border-color:var(--bs-border-dashed-color)}.border-top-dashed{border-top-style:dashed!important}.border-bottom-dashed{border-bottom-style:dashed!important}.border-start-dashed{border-left-style:dashed!important}.border-end-dashed{border-right-style:dashed!important}.border-dotted{border-style:dotted!important}.border-top-dotted{border-top-style:dotted!important}.border-bottom-dotted{border-bottom-style:dotted!important}.border-start-dotted{border-left-style:dotted!important}.border-end-dotted{border-right-style:dotted!important}.border-transparent{border-color:transparent!important}.border-body{border-color:var(--bs-body-bg)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-bottom-0{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.rounded-start-0{border-top-left-radius:0!important;border-bottom-left-radius:0!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-circle{border-radius:50%!important}.flex-root{flex:1}.flex-column-auto{flex:none}.flex-column-fluid{flex:1 0 auto}.flex-row-auto{flex:0 0 auto}.flex-row-fluid{flex:1 auto;min-width:0}.flex-center{justify-content:center;align-items:center}.flex-start{justify-content:start;align-items:start}.flex-end{justify-content:flex-end;align-items:flex-end}.flex-stack{justify-content:space-between;align-items:center}@media (min-width:576px){.flex-sm-root{flex:1}.flex-sm-column-auto{flex:none}.flex-sm-column-fluid{flex:1 0 auto}.flex-sm-row-auto{flex:0 0 auto}.flex-sm-row-fluid{flex:1 auto;min-width:0}.flex-sm-center{justify-content:center;align-items:center}.flex-sm-start{justify-content:start;align-items:start}.flex-sm-end{justify-content:flex-end;align-items:flex-end}.flex-sm-stack{justify-content:space-between;align-items:center}}@media (min-width:768px){.flex-md-root{flex:1}.flex-md-column-auto{flex:none}.flex-md-column-fluid{flex:1 0 auto}.flex-md-row-auto{flex:0 0 auto}.flex-md-row-fluid{flex:1 auto;min-width:0}.flex-md-center{justify-content:center;align-items:center}.flex-md-start{justify-content:start;align-items:start}.flex-md-end{justify-content:flex-end;align-items:flex-end}.flex-md-stack{justify-content:space-between;align-items:center}}@media (min-width:992px){.flex-lg-root{flex:1}.flex-lg-column-auto{flex:none}.flex-lg-column-fluid{flex:1 0 auto}.flex-lg-row-auto{flex:0 0 auto}.flex-lg-row-fluid{flex:1 auto;min-width:0}.flex-lg-center{justify-content:center;align-items:center}.flex-lg-start{justify-content:start;align-items:start}.flex-lg-end{justify-content:flex-end;align-items:flex-end}.flex-lg-stack{justify-content:space-between;align-items:center}}@media (min-width:1200px){.flex-xl-root{flex:1}.flex-xl-column-auto{flex:none}.flex-xl-column-fluid{flex:1 0 auto}.flex-xl-row-auto{flex:0 0 auto}.flex-xl-row-fluid{flex:1 auto;min-width:0}.flex-xl-center{justify-content:center;align-items:center}.flex-xl-start{justify-content:start;align-items:start}.flex-xl-end{justify-content:flex-end;align-items:flex-end}.flex-xl-stack{justify-content:space-between;align-items:center}}@media (min-width:1400px){.flex-xxl-root{flex:1}.flex-xxl-column-auto{flex:none}.flex-xxl-column-fluid{flex:1 0 auto}.flex-xxl-row-auto{flex:0 0 auto}.flex-xxl-row-fluid{flex:1 auto;min-width:0}.flex-xxl-center{justify-content:center;align-items:center}.flex-xxl-start{justify-content:start;align-items:start}.flex-xxl-end{justify-content:flex-end;align-items:flex-end}.flex-xxl-stack{justify-content:space-between;align-items:center}}.flex-equal{flex-grow:1;flex-basis:0;flex-shrink:0}.shadow-xs{box-shadow:var(--bs-box-shadow-xs)}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)}.shadow{box-shadow:var(--bs-box-shadow)}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)}.text-white{color:var(--bs-text-white)!important}.text-hover-white{transition:color .2s ease}.text-hover-white i{transition:color .2s ease}.text-hover-white:hover{transition:color .2s ease;color:var(--bs-text-white)!important}.text-hover-white:hover i{transition:color .2s ease;color:var(--bs-text-white)!important}.text-hover-white:hover .svg-icon{color:var(--bs-text-white)!important}.text-active-white{transition:color .2s ease}.text-active-white i{transition:color .2s ease}.text-active-white.active{transition:color .2s ease;color:var(--bs-text-white)!important}.text-active-white.active i{transition:color .2s ease;color:var(--bs-text-white)!important}.text-active-white.active .svg-icon{color:var(--bs-text-white)!important}.text-primary{color:var(--bs-text-primary)!important}.text-inverse-primary{color:var(--bs-primary-inverse)!important}.text-light-primary{color:var(--bs-primary-light)!important}.text-hover-primary{transition:color .2s ease}.text-hover-primary i{transition:color .2s ease}.text-hover-primary:hover{transition:color .2s ease;color:var(--bs-text-primary)!important}.text-hover-primary:hover i{transition:color .2s ease;color:var(--bs-text-primary)!important}.text-hover-primary:hover .svg-icon{color:var(--bs-text-primary)!important}.text-active-primary{transition:color .2s ease}.text-active-primary i{transition:color .2s ease}.text-active-primary.active{transition:color .2s ease;color:var(--bs-text-primary)!important}.text-active-primary.active i{transition:color .2s ease;color:var(--bs-text-primary)!important}.text-active-primary.active .svg-icon{color:var(--bs-text-primary)!important}.text-secondary{color:var(--bs-text-secondary)!important}.text-inverse-secondary{color:var(--bs-secondary-inverse)!important}.text-light-secondary{color:var(--bs-secondary-light)!important}.text-hover-secondary{transition:color .2s ease}.text-hover-secondary i{transition:color .2s ease}.text-hover-secondary:hover{transition:color .2s ease;color:var(--bs-text-secondary)!important}.text-hover-secondary:hover i{transition:color .2s ease;color:var(--bs-text-secondary)!important}.text-hover-secondary:hover .svg-icon{color:var(--bs-text-secondary)!important}.text-active-secondary{transition:color .2s ease}.text-active-secondary i{transition:color .2s ease}.text-active-secondary.active{transition:color .2s ease;color:var(--bs-text-secondary)!important}.text-active-secondary.active i{transition:color .2s ease;color:var(--bs-text-secondary)!important}.text-active-secondary.active .svg-icon{color:var(--bs-text-secondary)!important}.text-light{color:var(--bs-text-light)!important}.text-inverse-light{color:var(--bs-light-inverse)!important}.text-light-light{color:var(--bs-light-light)!important}.text-hover-light{transition:color .2s ease}.text-hover-light i{transition:color .2s ease}.text-hover-light:hover{transition:color .2s ease;color:var(--bs-text-light)!important}.text-hover-light:hover i{transition:color .2s ease;color:var(--bs-text-light)!important}.text-hover-light:hover .svg-icon{color:var(--bs-text-light)!important}.text-active-light{transition:color .2s ease}.text-active-light i{transition:color .2s ease}.text-active-light.active{transition:color .2s ease;color:var(--bs-text-light)!important}.text-active-light.active i{transition:color .2s ease;color:var(--bs-text-light)!important}.text-active-light.active .svg-icon{color:var(--bs-text-light)!important}.text-success{color:var(--bs-text-success)!important}.text-inverse-success{color:var(--bs-success-inverse)!important}.text-light-success{color:var(--bs-success-light)!important}.text-hover-success{transition:color .2s ease}.text-hover-success i{transition:color .2s ease}.text-hover-success:hover{transition:color .2s ease;color:var(--bs-text-success)!important}.text-hover-success:hover i{transition:color .2s ease;color:var(--bs-text-success)!important}.text-hover-success:hover .svg-icon{color:var(--bs-text-success)!important}.text-active-success{transition:color .2s ease}.text-active-success i{transition:color .2s ease}.text-active-success.active{transition:color .2s ease;color:var(--bs-text-success)!important}.text-active-success.active i{transition:color .2s ease;color:var(--bs-text-success)!important}.text-active-success.active .svg-icon{color:var(--bs-text-success)!important}.text-info{color:var(--bs-text-info)!important}.text-inverse-info{color:var(--bs-info-inverse)!important}.text-light-info{color:var(--bs-info-light)!important}.text-hover-info{transition:color .2s ease}.text-hover-info i{transition:color .2s ease}.text-hover-info:hover{transition:color .2s ease;color:var(--bs-text-info)!important}.text-hover-info:hover i{transition:color .2s ease;color:var(--bs-text-info)!important}.text-hover-info:hover .svg-icon{color:var(--bs-text-info)!important}.text-active-info{transition:color .2s ease}.text-active-info i{transition:color .2s ease}.text-active-info.active{transition:color .2s ease;color:var(--bs-text-info)!important}.text-active-info.active i{transition:color .2s ease;color:var(--bs-text-info)!important}.text-active-info.active .svg-icon{color:var(--bs-text-info)!important}.text-warning{color:var(--bs-text-warning)!important}.text-inverse-warning{color:var(--bs-warning-inverse)!important}.text-light-warning{color:var(--bs-warning-light)!important}.text-hover-warning{transition:color .2s ease}.text-hover-warning i{transition:color .2s ease}.text-hover-warning:hover{transition:color .2s ease;color:var(--bs-text-warning)!important}.text-hover-warning:hover i{transition:color .2s ease;color:var(--bs-text-warning)!important}.text-hover-warning:hover .svg-icon{color:var(--bs-text-warning)!important}.text-active-warning{transition:color .2s ease}.text-active-warning i{transition:color .2s ease}.text-active-warning.active{transition:color .2s ease;color:var(--bs-text-warning)!important}.text-active-warning.active i{transition:color .2s ease;color:var(--bs-text-warning)!important}.text-active-warning.active .svg-icon{color:var(--bs-text-warning)!important}.text-danger{color:var(--bs-text-danger)!important}.text-inverse-danger{color:var(--bs-danger-inverse)!important}.text-light-danger{color:var(--bs-danger-light)!important}.text-hover-danger{transition:color .2s ease}.text-hover-danger i{transition:color .2s ease}.text-hover-danger:hover{transition:color .2s ease;color:var(--bs-text-danger)!important}.text-hover-danger:hover i{transition:color .2s ease;color:var(--bs-text-danger)!important}.text-hover-danger:hover .svg-icon{color:var(--bs-text-danger)!important}.text-active-danger{transition:color .2s ease}.text-active-danger i{transition:color .2s ease}.text-active-danger.active{transition:color .2s ease;color:var(--bs-text-danger)!important}.text-active-danger.active i{transition:color .2s ease;color:var(--bs-text-danger)!important}.text-active-danger.active .svg-icon{color:var(--bs-text-danger)!important}.text-dark{color:var(--bs-text-dark)!important}.text-inverse-dark{color:var(--bs-dark-inverse)!important}.text-light-dark{color:var(--bs-dark-light)!important}.text-hover-dark{transition:color .2s ease}.text-hover-dark i{transition:color .2s ease}.text-hover-dark:hover{transition:color .2s ease;color:var(--bs-text-dark)!important}.text-hover-dark:hover i{transition:color .2s ease;color:var(--bs-text-dark)!important}.text-hover-dark:hover .svg-icon{color:var(--bs-text-dark)!important}.text-active-dark{transition:color .2s ease}.text-active-dark i{transition:color .2s ease}.text-active-dark.active{transition:color .2s ease;color:var(--bs-text-dark)!important}.text-active-dark.active i{transition:color .2s ease;color:var(--bs-text-dark)!important}.text-active-dark.active .svg-icon{color:var(--bs-text-dark)!important}.text-muted{color:var(--bs-text-muted)!important}.text-hover-muted{transition:color .2s ease}.text-hover-muted i{transition:color .2s ease}.text-hover-muted:hover{transition:color .2s ease;color:var(--bs-text-muted)!important}.text-hover-muted:hover i{transition:color .2s ease;color:var(--bs-text-muted)!important}.text-hover-muted:hover .svg-icon{color:var(--bs-text-muted)!important}.text-active-muted{transition:color .2s ease}.text-active-muted i{transition:color .2s ease}.text-active-muted.active{transition:color .2s ease;color:var(--bs-text-muted)!important}.text-active-muted.active i{transition:color .2s ease;color:var(--bs-text-muted)!important}.text-active-muted.active .svg-icon{color:var(--bs-text-muted)!important}.text-gray-100{color:var(--bs-text-gray-100)!important}.text-hover-gray-100{transition:color .2s ease}.text-hover-gray-100 i{transition:color .2s ease}.text-hover-gray-100:hover{transition:color .2s ease;color:var(--bs-text-gray-100)!important}.text-hover-gray-100:hover i{transition:color .2s ease;color:var(--bs-text-gray-100)!important}.text-hover-gray-100:hover .svg-icon{color:var(--bs-text-gray-100)!important}.text-active-gray-100{transition:color .2s ease}.text-active-gray-100 i{transition:color .2s ease}.text-active-gray-100.active{transition:color .2s ease;color:var(--bs-text-gray-100)!important}.text-active-gray-100.active i{transition:color .2s ease;color:var(--bs-text-gray-100)!important}.text-active-gray-100.active .svg-icon{color:var(--bs-text-gray-100)!important}.text-gray-200{color:var(--bs-text-gray-200)!important}.text-hover-gray-200{transition:color .2s ease}.text-hover-gray-200 i{transition:color .2s ease}.text-hover-gray-200:hover{transition:color .2s ease;color:var(--bs-text-gray-200)!important}.text-hover-gray-200:hover i{transition:color .2s ease;color:var(--bs-text-gray-200)!important}.text-hover-gray-200:hover .svg-icon{color:var(--bs-text-gray-200)!important}.text-active-gray-200{transition:color .2s ease}.text-active-gray-200 i{transition:color .2s ease}.text-active-gray-200.active{transition:color .2s ease;color:var(--bs-text-gray-200)!important}.text-active-gray-200.active i{transition:color .2s ease;color:var(--bs-text-gray-200)!important}.text-active-gray-200.active .svg-icon{color:var(--bs-text-gray-200)!important}.text-gray-300{color:var(--bs-text-gray-300)!important}.text-hover-gray-300{transition:color .2s ease}.text-hover-gray-300 i{transition:color .2s ease}.text-hover-gray-300:hover{transition:color .2s ease;color:var(--bs-text-gray-300)!important}.text-hover-gray-300:hover i{transition:color .2s ease;color:var(--bs-text-gray-300)!important}.text-hover-gray-300:hover .svg-icon{color:var(--bs-text-gray-300)!important}.text-active-gray-300{transition:color .2s ease}.text-active-gray-300 i{transition:color .2s ease}.text-active-gray-300.active{transition:color .2s ease;color:var(--bs-text-gray-300)!important}.text-active-gray-300.active i{transition:color .2s ease;color:var(--bs-text-gray-300)!important}.text-active-gray-300.active .svg-icon{color:var(--bs-text-gray-300)!important}.text-gray-400{color:var(--bs-text-gray-400)!important}.text-hover-gray-400{transition:color .2s ease}.text-hover-gray-400 i{transition:color .2s ease}.text-hover-gray-400:hover{transition:color .2s ease;color:var(--bs-text-gray-400)!important}.text-hover-gray-400:hover i{transition:color .2s ease;color:var(--bs-text-gray-400)!important}.text-hover-gray-400:hover .svg-icon{color:var(--bs-text-gray-400)!important}.text-active-gray-400{transition:color .2s ease}.text-active-gray-400 i{transition:color .2s ease}.text-active-gray-400.active{transition:color .2s ease;color:var(--bs-text-gray-400)!important}.text-active-gray-400.active i{transition:color .2s ease;color:var(--bs-text-gray-400)!important}.text-active-gray-400.active .svg-icon{color:var(--bs-text-gray-400)!important}.text-gray-500{color:var(--bs-text-gray-500)!important}.text-hover-gray-500{transition:color .2s ease}.text-hover-gray-500 i{transition:color .2s ease}.text-hover-gray-500:hover{transition:color .2s ease;color:var(--bs-text-gray-500)!important}.text-hover-gray-500:hover i{transition:color .2s ease;color:var(--bs-text-gray-500)!important}.text-hover-gray-500:hover .svg-icon{color:var(--bs-text-gray-500)!important}.text-active-gray-500{transition:color .2s ease}.text-active-gray-500 i{transition:color .2s ease}.text-active-gray-500.active{transition:color .2s ease;color:var(--bs-text-gray-500)!important}.text-active-gray-500.active i{transition:color .2s ease;color:var(--bs-text-gray-500)!important}.text-active-gray-500.active .svg-icon{color:var(--bs-text-gray-500)!important}.text-gray-600{color:var(--bs-text-gray-600)!important}.text-hover-gray-600{transition:color .2s ease}.text-hover-gray-600 i{transition:color .2s ease}.text-hover-gray-600:hover{transition:color .2s ease;color:var(--bs-text-gray-600)!important}.text-hover-gray-600:hover i{transition:color .2s ease;color:var(--bs-text-gray-600)!important}.text-hover-gray-600:hover .svg-icon{color:var(--bs-text-gray-600)!important}.text-active-gray-600{transition:color .2s ease}.text-active-gray-600 i{transition:color .2s ease}.text-active-gray-600.active{transition:color .2s ease;color:var(--bs-text-gray-600)!important}.text-active-gray-600.active i{transition:color .2s ease;color:var(--bs-text-gray-600)!important}.text-active-gray-600.active .svg-icon{color:var(--bs-text-gray-600)!important}.text-gray-700{color:var(--bs-text-gray-700)!important}.text-hover-gray-700{transition:color .2s ease}.text-hover-gray-700 i{transition:color .2s ease}.text-hover-gray-700:hover{transition:color .2s ease;color:var(--bs-text-gray-700)!important}.text-hover-gray-700:hover i{transition:color .2s ease;color:var(--bs-text-gray-700)!important}.text-hover-gray-700:hover .svg-icon{color:var(--bs-text-gray-700)!important}.text-active-gray-700{transition:color .2s ease}.text-active-gray-700 i{transition:color .2s ease}.text-active-gray-700.active{transition:color .2s ease;color:var(--bs-text-gray-700)!important}.text-active-gray-700.active i{transition:color .2s ease;color:var(--bs-text-gray-700)!important}.text-active-gray-700.active .svg-icon{color:var(--bs-text-gray-700)!important}.text-gray-800{color:var(--bs-text-gray-800)!important}.text-hover-gray-800{transition:color .2s ease}.text-hover-gray-800 i{transition:color .2s ease}.text-hover-gray-800:hover{transition:color .2s ease;color:var(--bs-text-gray-800)!important}.text-hover-gray-800:hover i{transition:color .2s ease;color:var(--bs-text-gray-800)!important}.text-hover-gray-800:hover .svg-icon{color:var(--bs-text-gray-800)!important}.text-active-gray-800{transition:color .2s ease}.text-active-gray-800 i{transition:color .2s ease}.text-active-gray-800.active{transition:color .2s ease;color:var(--bs-text-gray-800)!important}.text-active-gray-800.active i{transition:color .2s ease;color:var(--bs-text-gray-800)!important}.text-active-gray-800.active .svg-icon{color:var(--bs-text-gray-800)!important}.text-gray-900{color:var(--bs-text-gray-900)!important}.text-hover-gray-900{transition:color .2s ease}.text-hover-gray-900 i{transition:color .2s ease}.text-hover-gray-900:hover{transition:color .2s ease;color:var(--bs-text-gray-900)!important}.text-hover-gray-900:hover i{transition:color .2s ease;color:var(--bs-text-gray-900)!important}.text-hover-gray-900:hover .svg-icon{color:var(--bs-text-gray-900)!important}.text-active-gray-900{transition:color .2s ease}.text-active-gray-900 i{transition:color .2s ease}.text-active-gray-900.active{transition:color .2s ease;color:var(--bs-text-gray-900)!important}.text-active-gray-900.active i{transition:color .2s ease;color:var(--bs-text-gray-900)!important}.text-active-gray-900.active .svg-icon{color:var(--bs-text-gray-900)!important}.parent-hover .parent-hover-white{transition:color .2s ease}.parent-hover:hover .parent-hover-white{transition:color .2s ease;color:var(--bs-text-white)!important}.parent-hover .parent-hover-primary{transition:color .2s ease}.parent-hover:hover .parent-hover-primary{transition:color .2s ease;color:var(--bs-text-primary)!important}.parent-hover .parent-hover-secondary{transition:color .2s ease}.parent-hover:hover .parent-hover-secondary{transition:color .2s ease;color:var(--bs-text-secondary)!important}.parent-hover .parent-hover-light{transition:color .2s ease}.parent-hover:hover .parent-hover-light{transition:color .2s ease;color:var(--bs-text-light)!important}.parent-hover .parent-hover-success{transition:color .2s ease}.parent-hover:hover .parent-hover-success{transition:color .2s ease;color:var(--bs-text-success)!important}.parent-hover .parent-hover-info{transition:color .2s ease}.parent-hover:hover .parent-hover-info{transition:color .2s ease;color:var(--bs-text-info)!important}.parent-hover .parent-hover-warning{transition:color .2s ease}.parent-hover:hover .parent-hover-warning{transition:color .2s ease;color:var(--bs-text-warning)!important}.parent-hover .parent-hover-danger{transition:color .2s ease}.parent-hover:hover .parent-hover-danger{transition:color .2s ease;color:var(--bs-text-danger)!important}.parent-hover .parent-hover-dark{transition:color .2s ease}.parent-hover:hover .parent-hover-dark{transition:color .2s ease;color:var(--bs-text-dark)!important}.parent-hover .parent-hover-muted{transition:color .2s ease}.parent-hover:hover .parent-hover-muted{transition:color .2s ease;color:var(--bs-text-muted)!important}.parent-hover .parent-hover-gray-100{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-100{transition:color .2s ease;color:var(--bs-text-gray-100)!important}.parent-hover .parent-hover-gray-200{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-200{transition:color .2s ease;color:var(--bs-text-gray-200)!important}.parent-hover .parent-hover-gray-300{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-300{transition:color .2s ease;color:var(--bs-text-gray-300)!important}.parent-hover .parent-hover-gray-400{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-400{transition:color .2s ease;color:var(--bs-text-gray-400)!important}.parent-hover .parent-hover-gray-500{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-500{transition:color .2s ease;color:var(--bs-text-gray-500)!important}.parent-hover .parent-hover-gray-600{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-600{transition:color .2s ease;color:var(--bs-text-gray-600)!important}.parent-hover .parent-hover-gray-700{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-700{transition:color .2s ease;color:var(--bs-text-gray-700)!important}.parent-hover .parent-hover-gray-800{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-800{transition:color .2s ease;color:var(--bs-text-gray-800)!important}.parent-hover .parent-hover-gray-900{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-900{transition:color .2s ease;color:var(--bs-text-gray-900)!important}.parent-active .parent-active-white{transition:color .2s ease}.parent-active.active .parent-active-white{transition:color .2s ease;color:var(--bs-text-white)!important}.parent-active .parent-active-primary{transition:color .2s ease}.parent-active.active .parent-active-primary{transition:color .2s ease;color:var(--bs-text-primary)!important}.parent-active .parent-active-secondary{transition:color .2s ease}.parent-active.active .parent-active-secondary{transition:color .2s ease;color:var(--bs-text-secondary)!important}.parent-active .parent-active-light{transition:color .2s ease}.parent-active.active .parent-active-light{transition:color .2s ease;color:var(--bs-text-light)!important}.parent-active .parent-active-success{transition:color .2s ease}.parent-active.active .parent-active-success{transition:color .2s ease;color:var(--bs-text-success)!important}.parent-active .parent-active-info{transition:color .2s ease}.parent-active.active .parent-active-info{transition:color .2s ease;color:var(--bs-text-info)!important}.parent-active .parent-active-warning{transition:color .2s ease}.parent-active.active .parent-active-warning{transition:color .2s ease;color:var(--bs-text-warning)!important}.parent-active .parent-active-danger{transition:color .2s ease}.parent-active.active .parent-active-danger{transition:color .2s ease;color:var(--bs-text-danger)!important}.parent-active .parent-active-dark{transition:color .2s ease}.parent-active.active .parent-active-dark{transition:color .2s ease;color:var(--bs-text-dark)!important}.parent-active .parent-active-muted{transition:color .2s ease}.parent-active.active .parent-active-muted{transition:color .2s ease;color:var(--bs-text-muted)!important}.parent-active .parent-active-gray-100{transition:color .2s ease}.parent-active.active .parent-active-gray-100{transition:color .2s ease;color:var(--bs-text-gray-100)!important}.parent-active .parent-active-gray-200{transition:color .2s ease}.parent-active.active .parent-active-gray-200{transition:color .2s ease;color:var(--bs-text-gray-200)!important}.parent-active .parent-active-gray-300{transition:color .2s ease}.parent-active.active .parent-active-gray-300{transition:color .2s ease;color:var(--bs-text-gray-300)!important}.parent-active .parent-active-gray-400{transition:color .2s ease}.parent-active.active .parent-active-gray-400{transition:color .2s ease;color:var(--bs-text-gray-400)!important}.parent-active .parent-active-gray-500{transition:color .2s ease}.parent-active.active .parent-active-gray-500{transition:color .2s ease;color:var(--bs-text-gray-500)!important}.parent-active .parent-active-gray-600{transition:color .2s ease}.parent-active.active .parent-active-gray-600{transition:color .2s ease;color:var(--bs-text-gray-600)!important}.parent-active .parent-active-gray-700{transition:color .2s ease}.parent-active.active .parent-active-gray-700{transition:color .2s ease;color:var(--bs-text-gray-700)!important}.parent-active .parent-active-gray-800{transition:color .2s ease}.parent-active.active .parent-active-gray-800{transition:color .2s ease;color:var(--bs-text-gray-800)!important}.parent-active .parent-active-gray-900{transition:color .2s ease}.parent-active.active .parent-active-gray-900{transition:color .2s ease;color:var(--bs-text-gray-900)!important}.text-transparent{color:transparent}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.cursor-move{cursor:move}i.bi,i[class*=" fa-"],i[class*=" fonticon-"],i[class*=" la-"],i[class^=fa-],i[class^=fonticon-],i[class^=la-]{line-height:1;font-size:1rem;color:var(--bs-text-muted)}a{transition:color .2s ease}a:hover{transition:color .2s ease}.opacity-active-0.active{opacity:0!important}.opacity-state-0.active,.opacity-state-0:hover{opacity:0!important}.opacity-active-5.active{opacity:.05!important}.opacity-state-5.active,.opacity-state-5:hover{opacity:.05!important}.opacity-active-10.active{opacity:.1!important}.opacity-state-10.active,.opacity-state-10:hover{opacity:.1!important}.opacity-active-15.active{opacity:.15!important}.opacity-state-15.active,.opacity-state-15:hover{opacity:.15!important}.opacity-active-20.active{opacity:.2!important}.opacity-state-20.active,.opacity-state-20:hover{opacity:.2!important}.opacity-active-25.active{opacity:.25!important}.opacity-state-25.active,.opacity-state-25:hover{opacity:.25!important}.opacity-active-50.active{opacity:.5!important}.opacity-state-50.active,.opacity-state-50:hover{opacity:.5!important}.opacity-active-75.active{opacity:.75!important}.opacity-state-75.active,.opacity-state-75:hover{opacity:.75!important}.opacity-active-100.active{opacity:1!important}.opacity-state-100.active,.opacity-state-100:hover{opacity:1!important}.transform-90{transform:rotate(90deg);transform-origin:right top}.tree{--bs-tree-icon-size:16px;--bs-tree-icon-gap:14px;--bs-tree-icon-color-open:var(--bs-success);--bs-tree-icon-color-default:var(--bs-gray-500);--bs-tree-icon-color-close:var(--bs-gray-500);--bs-tree-line-color:var(--bs-gray-200)}.tree .tree-node{padding-left:1.25rem;display:flex;flex-direction:column;align-items:start}.tree .tree-sub{padding:.35rem 0}.tree .tree-content{display:flex;align-items:center;padding:.35rem 0}.tree .tree-wrapper{padding-left:calc(var(--bs-tree-icon-size) + var(--bs-tree-icon-size))}.tree .tree-section{display:flex;align-items:baseline;padding-left:var(--bs-tree-icon-gap)}.tree .tree-toggle{display:flex;align-items:center;width:var(--bs-tree-icon-size)}.tree .tree-toggle .tree-icon-default{font-size:1.5rem;color:var(--bs-tree-icon-color-default)}.tree .tree-toggle .tree-icon-open{font-size:1.5rem;color:var(--bs-tree-icon-color-open)}.tree .tree-toggle .tree-icon-close{font-size:1.5rem;color:var(--bs-tree-icon-color-close)}.tree .tree-toggle.collapsed .tree-icon-close{display:flex}.tree .tree-toggle.collapsed .tree-icon-open{display:none}.tree .tree-toggle:not(.collapsed) .tree-icon-close{display:none}.tree .tree-toggle:not(.collapsed) .tree-icon-open{display:flex}.tree>.tree-node{padding-left:0!important}.tree.tree-line .tree-sub{border-left:1px solid var(--bs-tree-line-color);margin-left:calc(var(--bs-tree-icon-size)/ 2)}@media (min-width:992px){.testimonials-slider-highlight{transition:all ease .3}.testimonials-slider-highlight .testimonials-author,.testimonials-slider-highlight .testimonials-body,.testimonials-slider-highlight .testimonials-photo,.testimonials-slider-highlight .testimonials-positon,.testimonials-slider-highlight .testimonials-title{transition:all ease .3s}.testimonials-slider-highlight .tns-item:not(.tns-slide-active)+.tns-item.tns-slide-active .testimonials-photo{height:200px;width:200px;transition:all ease .3s}.testimonials-slider-highlight .tns-item:not(.tns-slide-active)+.tns-item.tns-slide-active .testimonials-title{color:var(--bs-gray-900)!important;font-size:1.54rem!important;transition:all ease .3s;margin-bottom:1.3rem!important}.testimonials-slider-highlight .tns-item:not(.tns-slide-active)+.tns-item.tns-slide-active .testimonials-description{color:var(--bs-gray-700)!important;font-size:1.38rem!important;transition:all ease .3s;margin-bottom:1.7rem!important}.testimonials-slider-highlight .tns-item:not(.tns-slide-active)+.tns-item.tns-slide-active .testimonials-author{color:var(--bs-primary)!important;font-size:1.1rem!important;transition:all ease .3s}.testimonials-slider-highlight .tns-item:not(.tns-slide-active)+.tns-item.tns-slide-active .testimonials-positon{color:var(--bs-gray-500)!important;font-size:.9rem!important;transition:all ease .3s}}.testimonials-slider-quote .testimonials-quote{opacity:.2}.testimonials-slider-quote .tns-item:not(.tns-slide-active)+.tns-slide-active+.tns-slide-active .testimonials-quote{opacity:.5;color:var(--bs-primary)!important}@media (min-width:992px){.btn.btn-secondary{color:var(--bs-body-bg);background-color:var(--bs-gray-800)}.btn.btn-secondary .svg-icon,.btn.btn-secondary i{color:var(--bs-body-bg)}.btn.btn-secondary.dropdown-toggle:after{color:var(--bs-body-bg)}.btn-check:active+.btn.btn-secondary,.btn-check:checked+.btn.btn-secondary,.btn.btn-secondary.active,.btn.btn-secondary.show,.btn.btn-secondary:active:not(.btn-active),.btn.btn-secondary:focus:not(.btn-active),.btn.btn-secondary:hover:not(.btn-active),.show>.btn.btn-secondary{color:var(--bs-body-bg);background-color:var(--bs-gray-700)!important}.btn-check:active+.btn.btn-secondary .svg-icon,.btn-check:active+.btn.btn-secondary i,.btn-check:checked+.btn.btn-secondary .svg-icon,.btn-check:checked+.btn.btn-secondary i,.btn.btn-secondary.active .svg-icon,.btn.btn-secondary.active i,.btn.btn-secondary.show .svg-icon,.btn.btn-secondary.show i,.btn.btn-secondary:active:not(.btn-active) .svg-icon,.btn.btn-secondary:active:not(.btn-active) i,.btn.btn-secondary:focus:not(.btn-active) .svg-icon,.btn.btn-secondary:focus:not(.btn-active) i,.btn.btn-secondary:hover:not(.btn-active) .svg-icon,.btn.btn-secondary:hover:not(.btn-active) i,.show>.btn.btn-secondary .svg-icon,.show>.btn.btn-secondary i{color:var(--bs-body-bg)}.btn-check:active+.btn.btn-secondary.dropdown-toggle:after,.btn-check:checked+.btn.btn-secondary.dropdown-toggle:after,.btn.btn-secondary.active.dropdown-toggle:after,.btn.btn-secondary.show.dropdown-toggle:after,.btn.btn-secondary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-secondary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-secondary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-secondary.dropdown-toggle:after{color:var(--bs-body-bg)}}[data-bs-theme=dark] .btn.btn-secondary{color:var(--bs-gray-700);background-color:#2a2a3c}[data-bs-theme=dark] .btn.btn-secondary .svg-icon,[data-bs-theme=dark] .btn.btn-secondary i{color:#fff}[data-bs-theme=dark] .btn.btn-secondary.dropdown-toggle:after{color:#fff}.btn-check:active+[data-bs-theme=dark] .btn.btn-secondary,.btn-check:checked+[data-bs-theme=dark] .btn.btn-secondary,.show>[data-bs-theme=dark] .btn.btn-secondary,[data-bs-theme=dark] .btn.btn-secondary.active,[data-bs-theme=dark] .btn.btn-secondary.show,[data-bs-theme=dark] .btn.btn-secondary:active:not(.btn-active),[data-bs-theme=dark] .btn.btn-secondary:focus:not(.btn-active),[data-bs-theme=dark] .btn.btn-secondary:hover:not(.btn-active){color:var(--bs-gray-700);background-color:#282838!important}[data-bs-theme=light]{--bs-app-bg-color:#ffffff;--bs-app-blank-bg-color:#ffffff;--bs-app-header-base-bg-color:#ffffff;--bs-app-header-minimize-bg-color:rgba(255, 255, 255, 0.5);--bs-app-sidebar-base-bg-color:#0B0C10;--bs-app-sidebar-base-box-shadow:none}[data-bs-theme=dark]{--bs-app-bg-color:#0F1014;--bs-app-blank-bg-color:#151521;--bs-app-header-base-bg-color:#0F1014;--bs-app-header-minimize-bg-color:rgba(21, 23, 28, 0.5);--bs-app-sidebar-base-bg-color:#0B0C10;--bs-app-sidebar-base-box-shadow:none;--bs-app-sidebar-base-border-end:1px solid #1B1C22}html{font-family:sans-serif;text-size-adjust:100%}body,html{height:100%;margin:0;padding:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:13px!important;font-weight:400;font-family:Inter,Helvetica,sans-serif}@media (max-width:991.98px){body,html{font-size:12px!important}}@media (max-width:767.98px){body,html{font-size:12px!important}}body{display:flex;flex-direction:column}body a:active,body a:focus,body a:hover{text-decoration:none!important}canvas{user-select:none}router-outlet{display:none}.app-default,body{background-color:var(--bs-app-bg-color)}.app-blank{background-color:var(--bs-app-blank-bg-color)}[data-kt-app-reset-transition=true] *{transition:none!important}.app-page{display:flex}[data-kt-app-page-loading=on]{overflow:hidden}[data-kt-app-page-loading=on] *{transition:none!important}.app-page-loader{background:var(--bs-body-bg);color:var(--bs-body-color);position:fixed;top:0;bottom:0;left:0;right:0;z-index:10000;display:none}[data-kt-app-page-loading=on] .app-page-loader{display:flex;justify-content:center;align-items:center}@media (min-width:992px){.app-container{padding-left:30px!important;padding-right:30px!important}.app-container-fit-desktop{padding-left:0!important;padding-right:0!important}}@media (max-width:991.98px){.app-container{max-width:none;padding-left:20px!important;padding-right:20px!important}.app-container-fit-mobile{padding-left:0!important;padding-right:0!important}}@media print{.app-print-content-only{padding:0!important;background:0 0!important}.app-print-content-only .app-container,.app-print-content-only .app-content,.app-print-content-only .app-page,.app-print-content-only .app-page-title,.app-print-content-only .app-wrapper{background:0 0!important;padding:0!important;margin:0!important}.app-print-content-only .app-aside,.app-print-content-only .app-aside-panel,.app-print-content-only .app-footer,.app-print-content-only .app-header,.app-print-content-only .app-sidebar,.app-print-content-only .app-sidebar-panel,.app-print-content-only .app-toolbar,.app-print-content-only .btn,.app-print-content-only .drawer,.app-print-content-only .scrolltop{display:none!important}}.app-navbar{display:flex;align-items:stretch}.app-navbar .app-navbar-item{display:flex;align-items:center}.app-navbar.app-navbar-stretch .app-navbar-item{align-items:stretch}.app-header{transition:none;display:flex;align-items:stretch;background-color:var(--bs-app-header-base-bg-color);box-shadow:var(--bs-app-header-base-box-shadow);border-bottom:var(--bs-app-header-base-border-bottom)}@media (min-width:992px){:root{--bs-app-header-height:90px;--bs-app-header-height-actual:90px}[data-kt-app-header-fixed=true][data-kt-app-header-stacked=true]{--bs-app-header-height:calc(var(--bs-app-header-primary-height, 0px) + var(--bs-app-header-secondary-height, 0px) + var(--bs-app-header-tertiary-height, 0px));--bs-app-header-height-actual:calc(70px + 70px + 70px)}[data-kt-app-header-sticky=on]{--bs-app-header-height:70px;--bs-app-header-height-actual:90px}[data-kt-app-header-sticky=on][data-kt-app-header-stacked=true]{--bs-app-header-height:calc(var(--bs-app-header-primary-height, 0px) + var(--bs-app-header-secondary-height, 0px) + var(--bs-app-header-tertiary-height, 0px));--bs-app-header-height-actual:calc(70px + 70px + 70px)}[data-kt-app-header-minimize=on]{--bs-app-header-height:90px}.app-header{height:var(--bs-app-header-height)}[data-kt-app-header-fixed=true] .app-header{z-index:100;position:fixed;left:0;right:0;top:0}[data-kt-app-header-static=true] .app-header{position:relative}[data-kt-app-header-stacked=true] .app-header{flex-direction:column;height:calc(var(--bs-app-header-primary-height) + var(--bs-app-header-secondary-height,0px) + var(--bs-app-header-tertiary-height,0px))}[data-kt-app-header-sticky=on] .app-header{position:fixed;left:0;right:0;top:0;z-index:100;background-color:var(--bs-app-header-sticky-bg-color);box-shadow:var(--bs-app-header-sticky-box-shadow);border-bottom:var(--bs-app-header-sticky-border-bottom)}[data-kt-app-header-minimize=on] .app-header{transition:none;z-index:100;backdrop-filter:blur(6px);background-color:var(--bs-app-header-minimize-bg-color);box-shadow:var(--bs-app-header-minimize-box-shadow);border-bottom:var(--bs-app-header-minimize-border-bottom)}.app-header .app-header-mobile-drawer{display:flex}[data-kt-app-header-fixed=true][data-kt-app-sidebar-fixed=true][data-kt-app-sidebar-push-header=true] .app-header,[data-kt-app-header-fixed=true][data-kt-app-sidebar-sticky=on][data-kt-app-sidebar-push-header=true] .app-header{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px))}body:not([data-kt-app-header-fixed=true])[data-kt-app-sidebar-fixed=true][data-kt-app-sidebar-push-header=true] .app-header,body:not([data-kt-app-header-fixed=true])[data-kt-app-sidebar-sticky=on][data-kt-app-sidebar-push-header=true] .app-header{margin-left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px))}[data-kt-app-header-fixed=true][data-kt-app-sidebar-panel-fixed=true][data-kt-app-sidebar-panel-push-header=true] .app-header,[data-kt-app-header-fixed=true][data-kt-app-sidebar-panel-sticky=on][data-kt-app-sidebar-panel-push-header=true] .app-header{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px) + var(--bs-app-sidebar-panel-width) + var(--bs-app-sidebar-panel-gap-start,0px) + var(--bs-app-sidebar-panel-gap-end,0px))}body:not([data-kt-app-header-fixed=true])[data-kt-app-sidebar-panel-fixed=true][data-kt-app-sidebar-panel-push-header=true] .app-header,body:not([data-kt-app-header-fixed=true])[data-kt-app-sidebar-panel-sticky=on][data-kt-app-sidebar-panel-push-header=true] .app-header{margin-left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px) + var(--bs-app-sidebar-panel-width) + var(--bs-app-sidebar-panel-gap-start,0px) + var(--bs-app-sidebar-panel-gap-end,0px))}[data-kt-app-header-fixed=true][data-kt-app-aside-fixed=true][data-kt-app-aside-push-header=true] .app-header,[data-kt-app-header-fixed=true][data-kt-app-aside-sticky=on][data-kt-app-aside-push-header=true] .app-header{right:calc(var(--bs-app-aside-width) + var(--bs-app-aside-gap-start,0px) + var(--bs-app-aside-gap-end,0px))}[data-kt-app-header-fixed=true][data-kt-app-toolbar-fixed=true] .app-header{box-shadow:none}}@media (max-width:991.98px){:root{--bs-app-header-height:60px}[data-kt-app-header-sticky=on]{--bs-app-header-height:70px;--bs-app-header-height-actual:70px}[data-kt-app-header-minimize=on]{--bs-app-header-height:60px;--bs-app-header-height-actual:60px}.app-header{height:var(--bs-app-header-height);align-items:stretch}.app-header .app-header-mobile-drawer{display:none}[data-kt-app-header-stacked=true] .app-header{flex-direction:column;height:calc(var(--bs-app-header-primary-height) + var(--bs-app-header-secondary-height,0px) + var(--bs-app-header-tertiary-height,0px))}[data-kt-app-header-fixed-mobile=true] .app-header{z-index:100;transition:none;position:fixed;left:0;right:0;top:0}[data-kt-app-header-sticky=on] .app-header{position:fixed;left:0;right:0;top:0;z-index:100;background-color:var(--bs-app-header-sticky-bg-color);box-shadow:var(--bs-app-header-sticky-box-shadow);border-bottom:var(--bs-app-header-sticky-border-bottom)}[data-kt-app-header-minimize=on] .app-header{z-index:100;backdrop-filter:blur(6px);transition:none;background-color:var(--bs-app-header-minimize-bg-color);box-shadow:var(--bs-app-header-minimize-box-shadow);border-bottom:var(--bs-app-header-minimize-border-bottom)}[data-kt-app-header-fixed-mobile=true][data-kt-app-toolbar-fixed-mobile=true] .app-header{box-shadow:none}[data-kt-app-header-fixed-mobile=true][data-kt-app-toolbar-sticky=on] .app-header{box-shadow:none}}.app-header-primary{transition:none;display:flex;align-items:stretch}@media (min-width:992px){.app-header-primary{background-color:var(--bs-app-header-primary-base-bg-color);box-shadow:var(--bs-app-header-primary-base-box-shadow);border-bottom:var(--bs-app-header-primary-base-border-bottom)}[data-kt-app-header-primary-enabled=true]{--bs-app-header-primary-height:70px}[data-kt-app-header-primary-enabled=true][data-kt-app-header-sticky=on]{--bs-app-header-primary-height:70px}[data-kt-app-header-primary-enabled=true][data-kt-app-header-minimize=on]{--bs-app-header-primary-height:70px}[data-kt-app-header-primary-enabled=true][data-kt-app-header-sticky=on][data-kt-app-header-primary-sticky-hide=true]{--bs-app-header-primary-height:0}.app-header-primary{height:var(--bs-app-header-primary-height)}[data-kt-app-header-primary-fixed=true] .app-header-primary{z-index:100;position:fixed;left:0;right:0;top:0}[data-kt-app-header-primary-static=true] .app-header-primary{position:relative}[data-kt-app-header-primary-sticky=on] .app-header-primary{position:fixed;left:0;right:0;top:0;height:70px;z-index:100;background-color:var(--bs-app-header-primary-sticky-bg-color);box-shadow:var(--bs-app-header-primary-sticky-box-shadow);border-bottom:var(--bs-app-header-primary-sticky-border-bottom)}[data-kt-app-header-primary-minimize=on] .app-header-primary{transition:none;height:70px;z-index:100;background-color:var(--bs-app-header-primary-minimize-bg-color);box-shadow:var(--bs-app-header-primary-minimize-box-shadow);border-bottom:var(--bs-app-header-primary-minimize-border-bottom)}[data-kt-app-header-sticky=on][data-kt-app-header-primary-sticky-hide=true] .app-header-primary{display:none!important}[data-kt-app-header-primary-enabled=true][data-kt-app-sidebar-fixed=true][data-kt-app-sidebar-push-header=true] .app-header-primary{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px))}[data-kt-app-header-primary-enabled=true][data-kt-app-sidebar-panel-fixed=true][data-kt-app-sidebar-panel-push-header=true] .app-header-primary{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px) + var(--bs-app-sidebar-panel-width) + var(--bs-app-sidebar-panel-gap-start,0px) + var(--bs-app-sidebar-panel-gap-end,0px))}}@media (max-width:991.98px){.app-header .app-header-primary{flex-grow:1;height:var(--bs-app-header-primary-height);border-bottom:var(--bs-app-header-primary-base-border-bottom);box-shadow:var(--bs-app-header-primary-base-box-shadow)}.app-header-primary{background-color:var(--bs-app-header-primary-base-bg-color)}[data-kt-app-header-primary-enabled=true]{--bs-app-header-primary-height:60px}[data-kt-app-header-primary-enabled=true][data-kt-app-header-sticky=on]{--bs-app-header-primary-height:60px}[data-kt-app-header-primary-enabled=true][data-kt-app-header-minimize=on]{--bs-app-header-primary-height:60px}}.app-header-secondary{transition:none;display:flex;align-items:stretch}@media (min-width:992px){.app-header-secondary{background-color:var(--bs-app-header-secondary-base-bg-color);box-shadow:var(--bs-app-header-secondary-base-box-shadow);border-top:var(--bs-app-header-secondary-base-border-top);border-bottom:var(--bs-app-header-secondary-base-border-bottom)}[data-kt-app-header-secondary-enabled=true]{--bs-app-header-secondary-height:70px}[data-kt-app-header-secondary-enabled=true][data-kt-app-header-sticky=on]{--bs-app-header-secondary-height:70px}[data-kt-app-header-secondary-enabled=true][data-kt-app-header-minimize=on]{--bs-app-header-secondary-height:70px}[data-kt-app-header-secondary-enabled=true][data-kt-app-header-sticky=on][data-kt-app-header-secondary-sticky-hide=true]{--bs-app-header-secondary-height:0}.app-header-secondary{height:var(--bs-app-header-secondary-height)}[data-kt-app-header-secondary-fixed=true] .app-header-secondary{z-index:100;position:fixed;left:0;right:0;top:0}[data-kt-app-header-secondary-static=true] .app-header-secondary{position:static}[data-kt-app-header-secondary-sticky=on] .app-header-secondary{transition:none;position:fixed;left:0;right:0;top:0;height:70px;z-index:100;background-color:var(--bs-app-header-secondary-sticky-bg-color);box-shadow:var(--bs-app-header-secondary-sticky-box-shadow);border-bottom:var(--bs-app-header-secondary-sticky-border-bottom)}[data-kt-app-header-secondary-minimize=on] .app-header-secondary{transition:none;height:70px;z-index:100;background-color:var(--bs-app-header-secondary-minimize-bg-color);box-shadow:var(--bs-app-header-secondary-minimize-box-shadow);border-bottom:var(--bs-app-header-secondary-minimize-border-bottom)}[data-kt-app-header-sticky=on][data-kt-app-header-secondary-sticky-hide=true] .app-header-secondary{display:none!important}[data-kt-app-header-secondary-enabled=true][data-kt-app-sidebar-fixed=true][data-kt-app-sidebar-push-header=true] .app-header-secondary{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px))}[data-kt-app-header-secondary-enabled=true][data-kt-app-sidebar-panel-fixed=true][data-kt-app-sidebar-panel-push-header=true] .app-header-secondary{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px) + var(--bs-app-sidebar-panel-width) + var(--bs-app-sidebar-panel-gap-start,0px) + var(--bs-app-sidebar-panel-gap-end,0px))}}@media (max-width:991.98px){.app-header .app-header-secondary{flex-grow:1;height:var(--bs-app-header-secondary-height);box-shadow:var(--bs-app-header-secondary-base-box-shadow);border-top:var(--bs-app-header-secondary-base-border-top);border-bottom:var(--bs-app-header-secondary-base-border-bottom)}.app-header-secondary{background-color:var(--bs-app-header-secondary-base-bg-color)}[data-kt-app-header-secondary-enabled=true]{--bs-app-header-secondary-height:60px}[data-kt-app-header-secondary-enabled=true][data-kt-app-header-sticky=on]{--bs-app-header-secondary-height:60px}[data-kt-app-header-secondary-enabled=true][data-kt-app-header-minimize=on]{--bs-app-header-secondary-height:60px}}.app-header-tertiary{transition:none;display:flex;align-items:stretch}@media (min-width:992px){.app-header-tertiary{background-color:var(--bs-app-header-tertiary-base-bg-color);box-shadow:var(--bs-app-header-tertiary-base-box-shadow);border-top:var(--bs-app-header-tertiary-base-border-top);border-bottom:var(--bs-app-header-tertiary-base-border-bottom)}[data-kt-app-header-tertiary-enabled=true]{--bs-app-header-tertiary-height:70px}[data-kt-app-header-tertiary-enabled=true][data-kt-app-header-sticky=on]{--bs-app-header-tertiary-height:70px}[data-kt-app-header-tertiary-enabled=true][data-kt-app-header-minimize=on]{--bs-app-header-tertiary-height:70px}[data-kt-app-header-tertiary-enabled=true][data-kt-app-header-sticky=on][data-kt-app-header-tertiary-sticky-hide=true]{--bs-app-header-tertiary-height:0}.app-header-tertiary{height:var(--bs-app-header-tertiary-height)}[data-kt-app-header-tertiary-fixed=true] .app-header-tertiary{z-index:100;position:fixed;left:0;right:0;top:0}[data-kt-app-header-tertiary-static=true] .app-header-tertiary{position:static}[data-kt-app-header-tertiary-sticky=on] .app-header-tertiary{transition:none;position:fixed;left:0;right:0;top:0;height:70px;z-index:100;background-color:var(--bs-app-header-tertiary-sticky-bg-color);box-shadow:var(--bs-app-header-tertiary-sticky-box-shadow);border-bottom:var(--bs-app-header-tertiary-sticky-border-bottom)}[data-kt-app-header-tertiary-minimize=on] .app-header-tertiary{transition:none;height:70px;z-index:100;background-color:var(--bs-app-header-tertiary-minimize-bg-color);box-shadow:var(--bs-app-header-tertiary-minimize-box-shadow);border-bottom:var(--bs-app-header-tertiary-minimize-border-bottom)}[data-kt-app-header-sticky=on][data-kt-app-header-tertiary-sticky-hide=true] .app-header-tertiary{display:none!important}[data-kt-app-header-tertiary-enabled=true][data-kt-app-sidebar-fixed=true][data-kt-app-sidebar-push-header=true] .app-header-tertiary{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px))}[data-kt-app-header-tertiary-enabled=true][data-kt-app-sidebar-panel-fixed=true][data-kt-app-sidebar-panel-push-header=true] .app-header-tertiary{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px) + var(--bs-app-sidebar-panel-width) + var(--bs-app-sidebar-panel-gap-start,0px) + var(--bs-app-sidebar-panel-gap-end,0px))}}@media (max-width:991.98px){.app-header .app-header-tertiary{flex-grow:1;height:var(--bs-app-header-tertiary-height);border-top:var(--bs-app-header-tertiary-base-border-top);box-shadow:var(--bs-app-header-tertiary-base-box-shadow)}.app-header-tertiary{background-color:var(--bs-app-header-tertiary-base-bg-color)}[data-kt-app-header-tertiary-enabled=true]{--bs-app-header-tertiary-height:70px}[data-kt-app-header-tertiary-enabled=true][data-kt-app-header-sticky=on]{--bs-app-header-tertiary-height:60px}[data-kt-app-header-secondary-enabled=true][data-kt-app-header-minimize=on]{--bs-app-header-tertiary-height:60px}}.app-toolbar{display:flex;align-items:stretch;background-color:var(--bs-app-toolbar-base-bg-color);box-shadow:var(--bs-app-toolbar-base-box-shadow);border-top:var(--bs-app-toolbar-base-border-top);border-bottom:var(--bs-app-toolbar-base-border-bottom)}.app-toolbar.app-toolbar-minimize{transition:none}@media (min-width:992px){:root{--bs-app-toolbar-height:auto;--bs-app-toolbar-height-actual:auto}[data-kt-app-toolbar-sticky=on]{--bs-app-toolbar-height:70px}[data-kt-app-toolbar-minimize=on]{--bs-app-toolbar-height:70px}.app-toolbar{height:var(--bs-app-toolbar-height)}[data-kt-app-header-fixed=true][data-kt-app-toolbar-fixed=true] .app-toolbar{z-index:99;position:fixed;left:0;right:0;top:0}[data-kt-app-toolbar-sticky=on] .app-toolbar{position:fixed;left:0;right:0;top:0;box-shadow:var(--bs-app-toolbar-sticky-box-shadow);background-color:var(--bs-app-toolbar-sticky-bg-color);border-top:var(--bs-app-toolbar-sticky-border-top);border-bottom:var(--bs-app-toolbar-sticky-border-bottom);z-index:99}[data-kt-app-toolbar-minimize=on] .app-toolbar{transition:none;box-shadow:var(--bs-app-toolbar-minimize-box-shadow);background-color:var(--bs-app-toolbar-minimize-bg-color);border-top:var(--bs-app-toolbar-minimize-border-top);border-bottom:var(--bs-app-toolbar-minimize-border-bottom);z-index:99}[data-kt-app-toolbar-fixed=true][data-kt-app-header-fixed=true] .app-toolbar{top:var(--bs-app-header-height)}[data-kt-app-toolbar-fixed=true][data-kt-app-sidebar-fixed=true][data-kt-app-sidebar-push-toolbar=true] .app-toolbar,[data-kt-app-toolbar-sticky=on][data-kt-app-sidebar-fixed=true][data-kt-app-sidebar-push-toolbar=true] .app-toolbar{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px))}[data-kt-app-toolbar-fixed=true][data-kt-app-sidebar-panel-fixed=true][data-kt-app-sidebar-panel-push-toolbar=true] .app-toolbar,[data-kt-app-toolbar-sticky=on][data-kt-app-sidebar-panel-fixed=true][data-kt-app-sidebar-panel-push-toolbar=true] .app-toolbar{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px) + var(--bs-app-sidebar-panel-width) + var(--bs-app-sidebar-panel-gap-start,0px) + var(--bs-app-sidebar-panel-gap-end,0px))}[data-kt-app-toolbar-fixed=true][data-kt-app-aside-fixed=true][data-kt-app-aside-push-toolbar=true] .app-toolbar,[data-kt-app-toolbar-sticky=on][data-kt-app-aside-fixed=true][data-kt-app-aside-push-toolbar=true] .app-toolbar{right:calc(var(--bs-app-aside-width) + var(--bs-app-aside-gap-start,0px) + var(--bs-app-aside-gap-end,0px))}}@media (max-width:991.98px){:root{--bs-app-toolbar-height:auto}[data-kt-app-toolbar-sticky=on]{--bs-app-toolbar-height:70px}[data-kt-app-toolbar-minimize=on]{--bs-app-toolbar-height:70px}.app-toolbar{height:var(--bs-app-toolbar-height)}[data-kt-app-header-fixed-mobile=true][data-kt-app-toolbar-fixed-mobile=true] .app-toolbar{z-index:99;position:fixed;top:calc(var(--bs-app-header-height,0px) + var(--bs-app-header-mobile-height,0px));left:0;right:0}[data-kt-app-toolbar-sticky=on] .app-toolbar{position:fixed;left:0;right:0;top:var(--bs-app-header-height,0);box-shadow:var(--bs-app-toolbar-sticky-box-shadow);background-color:var(--bs-app-toolbar-sticky-bg-color);border-top:var(--bs-app-toolbar-sticky-border-top);border-bottom:var(--bs-app-toolbar-sticky-border-bottom);z-index:99}[data-kt-app-toolbar-minimize=on] .app-toolbar{transition:none;box-shadow:var(--bs-app-toolbar-minimize-box-shadow);background-color:var(--bs-app-toolbar-minimize-bg-color);border-top:var(--bs-app-toolbar-minimize-border-top);border-bottom:var(--bs-app-toolbar-minimize-border-bottom);z-index:99}}.app-hero{display:flex;align-items:stretch;background-color:var(--bs-app-hero-bg-color);box-shadow:var(--bs-app-hero-box-shadow);border-top:var(--bs-app-hero-border-top);border-bottom:var(--bs-app-hero-border-bottom)}.app-sidebar{transition:width .3s ease;background-color:var(--bs-app-sidebar-base-bg-color);box-shadow:var(--bs-app-sidebar-base-box-shadow);border-left:var(--bs-app-sidebar-base-border-start);border-right:var(--bs-app-sidebar-base-border-end)}.app-sidebar-collapse-d-flex,.app-sidebar-collapse-mobile-d-flex,.app-sidebar-minimize-d-flex,.app-sidebar-minimize-mobile-d-flex,.app-sidebar-sticky-d-flex{display:none}@media (min-width:992px){.app-sidebar{display:flex;flex-shrink:0;width:var(--bs-app-sidebar-width);margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}:root{--bs-app-sidebar-width:300px;--bs-app-sidebar-width-actual:300px;--bs-app-sidebar-gap-start:0px;--bs-app-sidebar-gap-end:0px;--bs-app-sidebar-gap-top:0px;--bs-app-sidebar-gap-bottom:0px}[data-kt-app-sidebar-stacked=true]{--bs-app-sidebar-width:calc(var(--bs-app-sidebar-primary-width) + var(--bs-app-sidebar-secondary-width, 0px))}[data-kt-app-sidebar-minimize=on]{--bs-app-sidebar-width:75px;--bs-app-sidebar-gap-start:0px;--bs-app-sidebar-gap-end:0px;--bs-app-sidebar-gap-top:0px;--bs-app-sidebar-gap-bottom:0px}[data-kt-app-sidebar-sticky=on]{--bs-app-sidebar-width:300px;--bs-app-sidebar-gap-start:0px;--bs-app-sidebar-gap-end:0px;--bs-app-sidebar-gap-top:0px;--bs-app-sidebar-gap-bottom:0px}[data-kt-app-sidebar-collapse=on]{--bs-app-sidebar-width:0px}[data-kt-app-sidebar-static=true] .app-sidebar{position:relative}[data-kt-app-sidebar-offcanvas=true] .app-sidebar{display:none}[data-kt-app-sidebar-fixed=true] .app-sidebar{position:fixed;z-index:105;top:0;bottom:0;left:0}[data-kt-app-sidebar-stacked=true] .app-sidebar{align-items:stretch}[data-kt-app-sidebar-sticky=on] .app-sidebar{position:fixed;transition:width .3s ease;top:auto;bottom:auto;left:auto;z-index:105;box-shadow:var(--bs-app-sidebar-sticky-box-shadow);border-left:var(--bs-app-sidebar-sticky-border-start);border-right:var(--bs-app-sidebar-sticky-border-end);margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}[data-kt-app-sidebar-minimize=on] .app-sidebar{transition:width .3s ease;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}[data-kt-app-sidebar-hoverable=true] .app-sidebar .app-sidebar-wrapper{width:var(--bs-app-sidebar-width-actual)}[data-kt-app-sidebar-hoverable=true][data-kt-app-sidebar-minimize=on] .app-sidebar:hover:not(.animating){transition:width .3s ease;width:var(--bs-app-sidebar-width-actual)}[data-kt-app-sidebar-collapse=on] .app-sidebar{transition:width .3s ease;width:var(--bs-app-sidebar-width-actual);margin-left:calc(-1 * var(--bs-app-sidebar-width-actual))}[data-kt-app-sidebar-minimize=on] .app-sidebar-minimize-d-none{display:none!important}[data-kt-app-sidebar-minimize=on] .app-sidebar-minimize-d-flex{display:flex!important}[data-kt-app-sidebar-sticky=on] .app-sidebar-sticky-d-none{display:none!important}[data-kt-app-sidebar-sticky=on] .app-sidebar-sticky-d-flex{display:flex!important}[data-kt-app-sidebar-collapse=on] .app-sidebar-collapse-d-none{display:none!important}[data-kt-app-sidebar-collapse=on] .app-sidebar-collapse-d-flex{display:flex!important}[data-kt-app-sidebar-fixed=true][data-kt-app-header-fixed=true]:not([data-kt-app-sidebar-push-header=true]) .app-sidebar{top:var(--bs-app-header-height)}[data-kt-app-sidebar-fixed=true][data-kt-app-header-fixed=true][data-kt-app-toolbar-fixed=true]:not([data-kt-app-sidebar-push-toolbar=true]) .app-sidebar{top:calc(var(--bs-app-header-height) + var(--bs-app-toolbar-height,0px))}}@media (max-width:991.98px){.app-sidebar{display:none;width:var(--bs-app-sidebar-width);z-index:106;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}:root{--bs-app-sidebar-width:275px;--bs-app-sidebar-width-actual:275px;--bs-app-sidebar-gap-start:0px;--bs-app-sidebar-gap-end:0px;--bs-app-sidebar-gap-top:0px;--bs-app-sidebar-gap-bottom:0px}[data-kt-app-sidebar-stacked=true]{--bs-app-sidebar-width:calc(var(--bs-app-sidebar-primary-width) + var(--bs-app-sidebar-secondary-width, 0))}[data-kt-app-sidebar-minimize-mobile=on]{--bs-app-sidebar-width:75px;--bs-app-sidebar-gap-start:0px;--bs-app-sidebar-gap-end:0px;--bs-app-sidebar-gap-top:0px;--bs-app-sidebar-gap-bottom:0px}[data-kt-app-sidebar-collapse-mobile=on]{--bs-app-sidebar-width:0px}[data-kt-app-sidebar-stacked=true] .app-sidebar{align-items:stretch}[data-kt-app-sidebar-minimize-mobile=on] .app-sidebar{transition:width .3s ease;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}[data-kt-app-sidebar-hoverable-mobile=true] .app-sidebar .app-sidebar-wrapper{width:var(--bs-app-sidebar-width-actual)}[data-kt-app-sidebar-hoverable-mobile=true][data-kt-app-sidebar-minimize-mobile=on] .app-sidebar:hover:not(.animating){transition:width .3s ease;width:var(--bs-app-sidebar-width-actual);box-shadow:var(--bs-app-sidebar-minimize-hover-box-shadow-mobile)}[data-kt-app-sidebar-collapse-mobile=on] .app-sidebar{transition:width .3s ease;width:var(--bs-app-sidebar-width-actual);margin-left:calc(-1 * var(--bs-app-sidebar-width-actual))}[data-kt-app-sidebar-minimize-mobile=on] .app-sidebar-minimize-mobile-d-none{display:none!important}[data-kt-app-sidebar-minimize-mobile=on] .app-sidebar-minimize-mobile-d-flex{display:flex!important}[data-kt-app-sidebar-collapse-mobile=on] .app-sidebar-collapse-mobile-d-none{display:none!important}[data-kt-app-sidebar-collapse-mobile=on] .app-sidebar-collapse-mobile-d-flex{display:flex!important}}.app-sidebar-primary{transition:none;position:relative;flex-shrink:0;background-color:var(--bs-app-sidebar-primary-base-bg-color);box-shadow:var(--bs-app-sidebar-primary-base-box-shadow);border-left:var(--bs-app-sidebar-primary-base-border-start);border-right:var(--bs-app-sidebar-primary-base-border-end)}.app-sidebar-primary-collapse-d-flex,.app-sidebar-primary-collapse-mobile-d-flex,.app-sidebar-primary-minimize-d-flex,.app-sidebar-primary-minimize-mobile-d-flex{display:none}@media (min-width:992px){.app-sidebar-primary{z-index:1;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}:root{--bs-app-sidebar-primary-width-actual:100px}[data-kt-app-sidebar-stacked=true]{--bs-app-sidebar-primary-width:100px;--bs-app-sidebar-primary-gap-start:0px;--bs-app-sidebar-primary-gap-end:0px;--bs-app-sidebar-primary-gap-top:0px;--bs-app-sidebar-primary-gap-bottom:0px}[data-kt-app-sidebar-primary-minimize=on]{--bs-app-sidebar-primary-width:75px;--bs-app-sidebar-primary-gap-start:0px;--bs-app-sidebar-primary-gap-end:0px;--bs-app-sidebar-primary-gap-top:0px;--bs-app-sidebar-primary-gap-bottom:0px}[data-kt-app-sidebar-primary-collapse=on]{--bs-app-sidebar-primary-width:0px}.app-sidebar-primary{width:var(--bs-app-sidebar-primary-width)}[data-kt-app-sidebar-primary-collapse=on] .app-sidebar-primary{transition:none;width:var(--bs-app-sidebar-primary-width-actual);margin-left:calc(-1 * var(--bs-app-sidebar-primary-width-actual))}[data-kt-app-sidebar-primary-minimize=on] .app-sidebar-primary{transition:none;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}[data-kt-app-sidebar-primary-hoverable=true] .app-sidebar-primary .app-sidebar-primary-hoverable{width:var(--bs-app-sidebar-primary-width-actual)}[data-kt-app-sidebar-primary-hoverable=true][data-kt-app-sidebar-primary-minimize=on] .app-sidebar-primary:hover:not(.animating){transition:none;width:var(--bs-app-sidebar-primary-width-actual);box-shadow:var(--bs-app-sidebar-primary-minimize-hover-box-shadow)}[data-kt-app-sidebar-fixed=true][data-kt-app-header-fixed=true][data-kt-app-sidebar-primary-below-header=true] .app-sidebar-primary{top:var(--bs-app-header-height)}[data-kt-app-sidebar-fixed=true][data-kt-app-header-fixed=true][data-kt-app-toolbar-fixed=true][data-kt-app-sidebar-primary-below-toolbar=true] .app-sidebar-primary{top:calc(var(--bs-app-header-height) + var(--bs-app-toolbar-height,0))}[data-kt-app-sidebar-primary-minimize=on] .app-sidebar-primary-minimize-d-none{display:none!important}[data-kt-app-sidebar-primary-minimize=on] .app-sidebar-primary-minimize-d-flex{display:flex!important}[data-kt-app-sidebar-primary-collapse=on] .app-sidebar-primary-collapse-d-none{display:none!important}[data-kt-app-sidebar-primary-collapse=on] .app-sidebar-primary-collapse-d-flex{display:flex!important}}@media (max-width:991.98px){.app-sidebar-primary{z-index:1;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}:root{--bs-app-sidebar-primary-width-actual:100px}[data-kt-app-sidebar-stacked=true]{--bs-app-sidebar-primary-width:100px;--bs-app-sidebar-primary-gap-start:0px;--bs-app-sidebar-primary-gap-end:0px;--bs-app-sidebar-primary-gap-top:0px;--bs-app-sidebar-primary-gap-bottom:0px}[data-kt-app-sidebar-primary-minimize-mobile=on]{--bs-app-sidebar-primary-width:75px;--bs-app-sidebar-primary-gap-start:0px;--bs-app-sidebar-primary-gap-end:0px;--bs-app-sidebar-primary-gap-top:0px;--bs-app-sidebar-primary-gap-bottom:0px}[data-kt-app-sidebar-primary-collapse-mobile=on]{--bs-app-sidebar-primary-width:0px}.app-sidebar-primary{width:var(--bs-app-sidebar-primary-width)}[data-kt-app-sidebar-primary-collapse-mobile=on] .app-sidebar-primary{transition:none;width:var(--bs-app-sidebar-primary-width-actual);margin-left:calc(-1 * var(--bs-app-sidebar-primary-width-actual))}[data-kt-app-sidebar-primary-minimize-mobile=on] .app-sidebar-primary{transition:none;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}[data-kt-app-sidebar-primary-hoverable-mobile=true] .app-sidebar-primary .app-sidebar-primary-hoverable{width:var(--bs-app-sidebar-primary-width-actual)}[data-kt-app-sidebar-primary-hoverable-mobile=true][data-kt-app-sidebar-primary-minimize-mobile=on] .app-sidebar-primary:hover:not(.animating){transition:none;width:var(--bs-app-sidebar-primary-width-actual);box-shadow:var(--bs-app-sidebar-primary-minimize-hover-box-shadow-mobile)}[data-kt-app-sidebar-primary-minimize-mobile=on] .app-sidebar-primary-minimize-mobile-d-none{display:none!important}[data-kt-app-sidebar-primary-minimize-mobile=on] .app-sidebar-primary-minimize-mobile-d-flex{display:flex!important}[data-kt-app-sidebar-primary-collapse-mobile=on] .app-sidebar-primary-collapse-mobile-d-none{display:none!important}[data-kt-app-sidebar-primary-collapse-mobile=on] .app-sidebar-primary-collapse-mobile-d-flex{display:flex!important}}.app-sidebar-secondary{transition:width .3s ease,margin .3s ease;position:relative;flex-shrink:0;background-color:var(--bs-app-sidebar-secondary-base-bg-color);box-shadow:var(--bs-app-sidebar-secondary-base-box-shadow);border-left:var(--bs-app-sidebar-secondary-base-border-start);border-right:var(--bs-app-sidebar-secondary-base-border-end)}.app-sidebar-secondary-collapse-d-flex,.app-sidebar-secondary-collapse-mobile-d-flex,.app-sidebar-secondary-minimize-d-flex,.app-sidebar-secondary-minimize-mobile-d-flex{display:none}@media (min-width:992px){.app-sidebar-secondary{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}[data-kt-app-sidebar-secondary-enabled=true]{--bs-app-sidebar-secondary-width-actual:calc( + */: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:#000000;--bs-white:#ffffff;--bs-gray:#78829D;--bs-gray-dark:#252F4A;--bs-gray-100:#F9F9F9;--bs-gray-200:#F1F1F4;--bs-gray-300:#DBDFE9;--bs-gray-400:#C4CADA;--bs-gray-500:#6D6D97;--bs-gray-600:#78829D;--bs-gray-700:#4B5675;--bs-gray-800:#252F4A;--bs-gray-900:#071437;--bs-light:#F9F9F9;--bs-primary:#0069E0;--bs-secondary:#F1F1F4;--bs-success:#17C653;--bs-info:#7239EA;--bs-warning:#F6C000;--bs-danger:#F8285A;--bs-dark:#1E2129;--bs-light-rgb:249,249,249;--bs-primary-rgb:0,105,224;--bs-secondary-rgb:241,241,244;--bs-success-rgb:23,198,83;--bs-info-rgb:114,57,234;--bs-warning-rgb:246,192,0;--bs-danger-rgb:248,40,90;--bs-dark-rgb:30,33,41;--bs-primary-text-emphasis:#002a5a;--bs-secondary-text-emphasis:#606062;--bs-success-text-emphasis:#094f21;--bs-info-text-emphasis:#2e175e;--bs-warning-text-emphasis:#624d00;--bs-danger-text-emphasis:#631024;--bs-light-text-emphasis:#4B5675;--bs-dark-text-emphasis:#4B5675;--bs-primary-bg-subtle:#cce1f9;--bs-secondary-bg-subtle:#fcfcfd;--bs-success-bg-subtle:#d1f4dd;--bs-info-bg-subtle:#e3d7fb;--bs-warning-bg-subtle:#fdf2cc;--bs-danger-bg-subtle:#fed4de;--bs-light-bg-subtle:#fcfcfc;--bs-dark-bg-subtle:#C4CADA;--bs-primary-border-subtle:#99c3f3;--bs-secondary-border-subtle:#f9f9fb;--bs-success-border-subtle:#a2e8ba;--bs-info-border-subtle:#c7b0f7;--bs-warning-border-subtle:#fbe699;--bs-danger-border-subtle:#fca9bd;--bs-light-border-subtle:#F1F1F4;--bs-dark-border-subtle:#6D6D97;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:Inter,Helvetica,"sans-serif";--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:#071437;--bs-body-color-rgb:7,20,55;--bs-body-bg:#ffffff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(7, 20, 55, 0.75);--bs-secondary-color-rgb:7,20,55;--bs-secondary-bg:#F1F1F4;--bs-secondary-bg-rgb:241,241,244;--bs-tertiary-color:rgba(7, 20, 55, 0.5);--bs-tertiary-color-rgb:7,20,55;--bs-tertiary-bg:#F9F9F9;--bs-tertiary-bg-rgb:249,249,249;--bs-heading-color:#071437;--bs-link-color:#0069E0;--bs-link-color-rgb:0,105,224;--bs-link-decoration:none;--bs-link-hover-color:#056EE9;--bs-link-hover-color-rgb:5,110,233;--bs-link-hover-decoration:none;--bs-code-color:#b93993;--bs-highlight-color:#071437;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#F1F1F4;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.475rem;--bs-border-radius-sm:0.425rem;--bs-border-radius-lg:0.625rem;--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 1.5rem 0.5rem rgba(0, 0, 0, 0.075);--bs-box-shadow-sm:0 0.1rem 1rem 0.25rem rgba(0, 0, 0, 0.05);--bs-box-shadow-lg:0 1rem 2rem 1rem rgba(0, 0, 0, 0.1);--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(0, 105, 224, 0.25);--bs-form-valid-color:#17C653;--bs-form-valid-border-color:#17C653;--bs-form-invalid-color:#F8285A;--bs-form-invalid-border-color:#F8285A}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#F5F5F5;--bs-body-color-rgb:245,245,245;--bs-body-bg:#15171C;--bs-body-bg-rgb:21,23,28;--bs-emphasis-color:#ffffff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(245, 245, 245, 0.75);--bs-secondary-color-rgb:245,245,245;--bs-secondary-bg:#252F4A;--bs-secondary-bg-rgb:37,47,74;--bs-tertiary-color:rgba(245, 245, 245, 0.5);--bs-tertiary-color-rgb:245,245,245;--bs-tertiary-bg:#162241;--bs-tertiary-bg-rgb:22,34,65;--bs-primary-text-emphasis:#66a5ec;--bs-secondary-text-emphasis:#f7f7f8;--bs-success-text-emphasis:#74dd98;--bs-info-text-emphasis:#aa88f2;--bs-warning-text-emphasis:#fad966;--bs-danger-text-emphasis:#fb7e9c;--bs-light-text-emphasis:#F9F9F9;--bs-dark-text-emphasis:#DBDFE9;--bs-primary-bg-subtle:#00152d;--bs-secondary-bg-subtle:#303031;--bs-success-bg-subtle:#052811;--bs-info-bg-subtle:#170b2f;--bs-warning-bg-subtle:#312600;--bs-danger-bg-subtle:#320812;--bs-light-bg-subtle:#252F4A;--bs-dark-bg-subtle:#131825;--bs-primary-border-subtle:#003f86;--bs-secondary-border-subtle:#919192;--bs-success-border-subtle:#0e7732;--bs-info-border-subtle:#44228c;--bs-warning-border-subtle:#947300;--bs-danger-border-subtle:#951836;--bs-light-border-subtle:#4B5675;--bs-dark-border-subtle:#252F4A;--bs-heading-color:#F5F5F5;--bs-link-color:#1F87FF;--bs-link-hover-color:#4c9fff;--bs-link-color-rgb:31,135,255;--bs-link-hover-color-rgb:76,159,255;--bs-code-color:#b93993;--bs-highlight-color:#F5F5F5;--bs-highlight-bg:#664d03;--bs-border-color:#26272F;--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}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:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:600;line-height:1.2;color:var(--bs-heading-color)}.h1,h1{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h1,h1{font-size:1.75rem}}.h2,h2{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h2,h2{font-size:1.5rem}}.h3,h3{font-size:calc(1.26rem + .12vw)}@media (min-width:1200px){.h3,h3{font-size:1.35rem}}.h4,h4{font-size:1.25rem}.h5,h5{font-size:1.15rem}.h6,h6{font-size:1.075rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;cursor:help;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:600}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:700}.small,small{font-size:.875em}.mark,mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:none}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb);text-decoration:none}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:1rem}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:1rem;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:1rem;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.425rem}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:.75rem;padding-bottom:.75rem;color:#6d6d97;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}[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:.5rem;line-height:inherit;font-size:calc(1.275rem + .3vw)}@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;outline-offset:-2px}[type=search]::-webkit-search-cancel-button{cursor:pointer;filter:grayscale(1)}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-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-weight:700;line-height:1.2;font-size:calc(1.625rem + 4.5vw)}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-weight:700;line-height:1.2;font-size:calc(1.575rem + 3.9vw)}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-weight:700;line-height:1.2;font-size:calc(1.525rem + 3.3vw)}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-weight:700;line-height:1.2;font-size:calc(1.475rem + 2.7vw)}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-weight:700;line-height:1.2;font-size:calc(1.425rem + 2.1vw)}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-weight:700;line-height:1.2;font-size:calc(1.375rem + 1.5vw)}@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:.5rem}.initialism{font-size:.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:.875em;color:#78829d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);box-shadow:var(--bs-box-shadow-sm);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-gray-600)}.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) * .5);padding-left:calc(var(--bs-gutter-x) * .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(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .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:0rem}.g-0,.gy-0{--bs-gutter-y:0rem}.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:0.75rem}.g-3,.gy-3{--bs-gutter-y:0.75rem}.g-4,.gx-4{--bs-gutter-x:1rem}.g-4,.gy-4{--bs-gutter-y:1rem}.g-5,.gx-5{--bs-gutter-x:1.25rem}.g-5,.gy-5{--bs-gutter-y:1.25rem}.g-6,.gx-6{--bs-gutter-x:1.5rem}.g-6,.gy-6{--bs-gutter-y:1.5rem}.g-7,.gx-7{--bs-gutter-x:1.75rem}.g-7,.gy-7{--bs-gutter-y:1.75rem}.g-8,.gx-8{--bs-gutter-x:2rem}.g-8,.gy-8{--bs-gutter-y:2rem}.g-9,.gx-9{--bs-gutter-x:2.25rem}.g-9,.gy-9{--bs-gutter-y:2.25rem}.g-10,.gx-10{--bs-gutter-x:2.5rem}.g-10,.gy-10{--bs-gutter-y:2.5rem}@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:0rem}.g-sm-0,.gy-sm-0{--bs-gutter-y:0rem}.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:0.75rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:0.75rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:1.25rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:1.25rem}.g-sm-6,.gx-sm-6{--bs-gutter-x:1.5rem}.g-sm-6,.gy-sm-6{--bs-gutter-y:1.5rem}.g-sm-7,.gx-sm-7{--bs-gutter-x:1.75rem}.g-sm-7,.gy-sm-7{--bs-gutter-y:1.75rem}.g-sm-8,.gx-sm-8{--bs-gutter-x:2rem}.g-sm-8,.gy-sm-8{--bs-gutter-y:2rem}.g-sm-9,.gx-sm-9{--bs-gutter-x:2.25rem}.g-sm-9,.gy-sm-9{--bs-gutter-y:2.25rem}.g-sm-10,.gx-sm-10{--bs-gutter-x:2.5rem}.g-sm-10,.gy-sm-10{--bs-gutter-y:2.5rem}}@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:0rem}.g-md-0,.gy-md-0{--bs-gutter-y:0rem}.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:0.75rem}.g-md-3,.gy-md-3{--bs-gutter-y:0.75rem}.g-md-4,.gx-md-4{--bs-gutter-x:1rem}.g-md-4,.gy-md-4{--bs-gutter-y:1rem}.g-md-5,.gx-md-5{--bs-gutter-x:1.25rem}.g-md-5,.gy-md-5{--bs-gutter-y:1.25rem}.g-md-6,.gx-md-6{--bs-gutter-x:1.5rem}.g-md-6,.gy-md-6{--bs-gutter-y:1.5rem}.g-md-7,.gx-md-7{--bs-gutter-x:1.75rem}.g-md-7,.gy-md-7{--bs-gutter-y:1.75rem}.g-md-8,.gx-md-8{--bs-gutter-x:2rem}.g-md-8,.gy-md-8{--bs-gutter-y:2rem}.g-md-9,.gx-md-9{--bs-gutter-x:2.25rem}.g-md-9,.gy-md-9{--bs-gutter-y:2.25rem}.g-md-10,.gx-md-10{--bs-gutter-x:2.5rem}.g-md-10,.gy-md-10{--bs-gutter-y:2.5rem}}@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:0rem}.g-lg-0,.gy-lg-0{--bs-gutter-y:0rem}.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:0.75rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:0.75rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:1.25rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:1.25rem}.g-lg-6,.gx-lg-6{--bs-gutter-x:1.5rem}.g-lg-6,.gy-lg-6{--bs-gutter-y:1.5rem}.g-lg-7,.gx-lg-7{--bs-gutter-x:1.75rem}.g-lg-7,.gy-lg-7{--bs-gutter-y:1.75rem}.g-lg-8,.gx-lg-8{--bs-gutter-x:2rem}.g-lg-8,.gy-lg-8{--bs-gutter-y:2rem}.g-lg-9,.gx-lg-9{--bs-gutter-x:2.25rem}.g-lg-9,.gy-lg-9{--bs-gutter-y:2.25rem}.g-lg-10,.gx-lg-10{--bs-gutter-x:2.5rem}.g-lg-10,.gy-lg-10{--bs-gutter-y:2.5rem}}@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:0rem}.g-xl-0,.gy-xl-0{--bs-gutter-y:0rem}.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:0.75rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:0.75rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:1.25rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:1.25rem}.g-xl-6,.gx-xl-6{--bs-gutter-x:1.5rem}.g-xl-6,.gy-xl-6{--bs-gutter-y:1.5rem}.g-xl-7,.gx-xl-7{--bs-gutter-x:1.75rem}.g-xl-7,.gy-xl-7{--bs-gutter-y:1.75rem}.g-xl-8,.gx-xl-8{--bs-gutter-x:2rem}.g-xl-8,.gy-xl-8{--bs-gutter-y:2rem}.g-xl-9,.gx-xl-9{--bs-gutter-x:2.25rem}.g-xl-9,.gy-xl-9{--bs-gutter-y:2.25rem}.g-xl-10,.gx-xl-10{--bs-gutter-x:2.5rem}.g-xl-10,.gy-xl-10{--bs-gutter-y:2.5rem}}@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:0rem}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0rem}.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:0.75rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:0.75rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:1.25rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:1.25rem}.g-xxl-6,.gx-xxl-6{--bs-gutter-x:1.5rem}.g-xxl-6,.gy-xxl-6{--bs-gutter-y:1.5rem}.g-xxl-7,.gx-xxl-7{--bs-gutter-x:1.75rem}.g-xxl-7,.gy-xxl-7{--bs-gutter-y:1.75rem}.g-xxl-8,.gx-xxl-8{--bs-gutter-x:2rem}.g-xxl-8,.gy-xxl-8{--bs-gutter-y:2rem}.g-xxl-9,.gx-xxl-9{--bs-gutter-x:2.25rem}.g-xxl-9,.gy-xxl-9{--bs-gutter-y:2.25rem}.g-xxl-10,.gx-xxl-10{--bs-gutter-x:2.5rem}.g-xxl-10,.gy-xxl-10{--bs-gutter-y:2.5rem}}.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-body-color);--bs-table-bg:transparent;--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-body-color);--bs-table-striped-bg:rgba(var(--bs-gray-100-rgb), 0.75);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:var(--bs-gray-100);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:var(--bs-gray-100);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.75rem .75rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;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(1px * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.5rem .5rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.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(even){--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:#000000;--bs-table-bg:#cce1f9;--bs-table-border-color:#b8cbe0;--bs-table-striped-bg:#c2d6ed;--bs-table-striped-color:#000000;--bs-table-active-bg:#b8cbe0;--bs-table-active-color:#000000;--bs-table-hover-bg:#bdd0e6;--bs-table-hover-color:#000000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000000;--bs-table-bg:#fcfcfd;--bs-table-border-color:#e3e3e4;--bs-table-striped-bg:#efeff0;--bs-table-striped-color:#000000;--bs-table-active-bg:#e3e3e4;--bs-table-active-color:#000000;--bs-table-hover-bg:#e9e9ea;--bs-table-hover-color:#000000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000000;--bs-table-bg:#d1f4dd;--bs-table-border-color:#bcdcc7;--bs-table-striped-bg:#c7e8d2;--bs-table-striped-color:#000000;--bs-table-active-bg:#bcdcc7;--bs-table-active-color:#000000;--bs-table-hover-bg:#c1e2cc;--bs-table-hover-color:#000000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000000;--bs-table-bg:#e3d7fb;--bs-table-border-color:#ccc2e2;--bs-table-striped-bg:#d8ccee;--bs-table-striped-color:#000000;--bs-table-active-bg:#ccc2e2;--bs-table-active-color:#000000;--bs-table-hover-bg:#d2c7e8;--bs-table-hover-color:#000000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000000;--bs-table-bg:#fdf2cc;--bs-table-border-color:#e4dab8;--bs-table-striped-bg:#f0e6c2;--bs-table-striped-color:#000000;--bs-table-active-bg:#e4dab8;--bs-table-active-color:#000000;--bs-table-hover-bg:#eae0bd;--bs-table-hover-color:#000000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000000;--bs-table-bg:#fed4de;--bs-table-border-color:#e5bfc8;--bs-table-striped-bg:#f1c9d3;--bs-table-striped-color:#000000;--bs-table-active-bg:#e5bfc8;--bs-table-active-color:#000000;--bs-table-hover-bg:#ebc4cd;--bs-table-hover-color:#000000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000000;--bs-table-bg:#F9F9F9;--bs-table-border-color:#e0e0e0;--bs-table-striped-bg:#ededed;--bs-table-striped-color:#000000;--bs-table-active-bg:#e0e0e0;--bs-table-active-color:#000000;--bs-table-hover-bg:#e6e6e6;--bs-table-hover-color:#000000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#ffffff;--bs-table-bg:#1E2129;--bs-table-border-color:#35373e;--bs-table-striped-bg:#292c34;--bs-table-striped-color:#ffffff;--bs-table-active-bg:#35373e;--bs-table-active-color:#ffffff;--bs-table-hover-bg:#2f3239;--bs-table-hover-color:#ffffff;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:.5rem;font-size:1.05rem;font-weight:500;color:var(--bs-gray-800)}.col-form-label{padding-top:calc(.775rem + 1px);padding-bottom:calc(.775rem + 1px);margin-bottom:0;font-size:inherit;font-weight:500;line-height:1.5;color:var(--bs-gray-800)}.col-form-label-lg{padding-top:calc(1rem + 1px);padding-bottom:calc(1rem + 1px);font-size:1.15rem}.col-form-label-sm{padding-top:calc(.55rem + 1px);padding-bottom:calc(.55rem + 1px);font-size:.95rem}.form-text{margin-top:.5rem;font-size:.95rem;color:var(--bs-text-muted)}.form-control{display:block;width:100%;padding:.775rem 1rem;font-size:1.1rem;font-weight:500;line-height:1.5;color:var(--bs-gray-700);appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:1px solid var(--bs-gray-300);border-radius:.475rem;box-shadow:false;transition:border-color .15s ease-in-out,box-shadow .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-gray-700);background-color:var(--bs-body-bg);border-color:var(--bs-gray-400);outline:0;box-shadow:false,0 0 0 .25rem rgba(0,105,224,.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::placeholder{color:var(--bs-gray-500);opacity:1}.form-control:disabled{color:var(--bs-gray-500);background-color:var(--bs-gray-200);border-color:var(--bs-gray-300);opacity:1}.form-control::file-selector-button{padding:.775rem 1rem;margin:-.775rem -1rem;margin-inline-end:1rem;color:var(--bs-gray-700);background-color:var(--bs-gray-100);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:shade-color(var(--bs-gray-100),5%)}.form-control-plaintext{display:block;width:100%;padding:.775rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-gray-700);background-color:transparent;border:solid transparent;border-width:1px 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 + 1.1rem + 2px);padding:.55rem .75rem;font-size:.95rem;border-radius:.425rem}.form-control-sm::file-selector-button{padding:.55rem .75rem;margin:-.55rem -.75rem;margin-inline-end:.75rem}.form-control-lg{min-height:calc(1.5em + 2rem + 2px);padding:1rem 1.5rem;font-size:1.15rem;border-radius:.625rem}.form-control-lg::file-selector-button{padding:1rem 1.5rem;margin:-1rem -1.5rem;margin-inline-end:1.5rem}textarea.form-control{min-height:calc(1.5em + 1.55rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + 1.1rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 2rem + 2px)}.form-control-color{width:3rem;height:calc(1.5em + 1.55rem + 2px);padding:.775rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:.475rem}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:.475rem}.form-control-color.form-control-sm{height:calc(1.5em + 1.1rem + 2px)}.form-control-color.form-control-lg{height:calc(1.5em + 2rem + 2px)}.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='%2378829D' 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:.775rem 3rem .775rem 1rem;font-size:1.1rem;font-weight:500;line-height:1.5;color:var(--bs-gray-700);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 1rem center;background-size:16px 12px;border:1px solid var(--bs-gray-300);border-radius:.475rem;box-shadow:false;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:var(--bs-gray-400);outline:0;box-shadow:false,0 0 0 .25rem rgba(var(--bs-component-active-bg),.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:1rem;background-image:none}.form-select:disabled{color:var(--bs-gray-500);background-color:var(--bs-gray-200);border-color:var(--bs-gray-300)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-gray-700)}.form-select-sm{padding-top:.55rem;padding-bottom:.55rem;padding-left:.75rem;font-size:.95rem;border-radius:.425rem}.form-select-lg{padding-top:1rem;padding-bottom:1rem;padding-left:1.5rem;font-size:1.15rem;border-radius:.625rem}[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='%23808290' 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:2.25rem;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-2.25rem}.form-check-reverse{padding-right:2.25rem;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-2.25rem;margin-left:0}.form-check-input{--bs-form-check-bg:transparent;flex-shrink:0;width:1.75rem;height:1.75rem;margin-top:-.125rem;vertical-align:top;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:1px solid var(--bs-gray-300);print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.45em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:var(--bs-gray-400);outline:0;box-shadow:none}.form-check-input:checked{background-color:#0069e0;border-color:#0069e0}.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 13 11' width='13' height='11' fill='none'%3e%3cpath d='M11.0426 1.02893C11.3258 0.695792 11.8254 0.655283 12.1585 0.938451C12.4917 1.22162 12.5322 1.72124 12.249 2.05437L5.51985 9.97104C5.23224 10.3094 4.72261 10.3451 4.3907 10.05L0.828197 6.88335C0.50141 6.59288 0.471975 6.09249 0.762452 5.7657C1.05293 5.43891 1.55332 5.40948 1.88011 5.69995L4.83765 8.32889L11.0426 1.02893Z' fill='%23ffffff'/%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='%23ffffff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0069e0;border-color:#0069e0;--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='%23ffffff' 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:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-check-label{color:var(--bs-gray-500)}.form-switch{padding-left:3.75rem}.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:3.25rem;margin-left:-3.75rem;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:3.25rem;transition:background-position .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='rgba%280, 0, 0, 0.25%29'/%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='%23ffffff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:3.75rem;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-3.75rem;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:.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;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 .25rem rgba(0,105,224,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(0,105,224,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;appearance:none;background-color:#0069e0;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b3d2f6}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-gray-300);border-color:transparent;border-radius:.475rem;box-shadow:var(--bs-box-shadow-inset)}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;background-color:#0069e0;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b3d2f6}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-gray-300);border-color:transparent;border-radius:.475rem;box-shadow:var(--bs-box-shadow-inset)}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-gray-500)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-gray-500)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.75rem + 2px);min-height:calc(3.75rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;max-width:100%;height:100%;padding:1rem 1rem;overflow:hidden;color:rgba(var(--bs-body-color-rgb),.65);text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .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 1rem}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.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.85rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.85rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.85rem;padding-bottom:.625rem;padding-left:1rem}.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{transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>textarea:focus~label::after,.form-floating>textarea:not(:placeholder-shown)~label::after{position:absolute;inset:1rem .5rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:.475rem}.form-floating>textarea:disabled~label::after{background-color:var(--bs-gray-200)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#78829d}.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:.775rem 1rem;font-size:1.1rem;font-weight:500;line-height:1.5;color:var(--bs-gray-700);text-align:center;white-space:nowrap;background-color:var(--bs-gray-100);border:1px solid var(--bs-gray-300);border-radius:.475rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:1rem 1.5rem;font-size:1.15rem;border-radius:.625rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.55rem .75rem;font-size:.95rem;border-radius:.425rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:4rem}.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(-1 * 1px);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:.5rem;font-size:.95rem;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.75rem 1rem;margin-top:.1rem;font-size:1rem;color:#fff;background-color:var(--bs-success);border-radius:.475rem}.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 + 1.55rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2317C653' 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.1'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .3875rem) center;background-size:calc(.75em + .775rem) calc(.75em + .775rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:false,0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 1.55rem);background-position:top calc(.375em + .3875rem) right calc(.375em + .3875rem)}.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='%2317C653' 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.1'/%3e%3c/svg%3e");padding-right:5.5rem;background-position:right 1rem center,center right 3rem;background-size:16px 12px,calc(.75em + .775rem) calc(.75em + .775rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:false,0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + 1.55rem))}.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 .25rem rgba(var(--bs-success-rgb),.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:.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:.5rem;font-size:.95rem;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.75rem 1rem;margin-top:.1rem;font-size:1rem;color:#fff;background-color:var(--bs-danger);border-radius:.475rem}.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 + 1.55rem);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='%23F8285A'%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='%23F8285A' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .3875rem) center;background-size:calc(.75em + .775rem) calc(.75em + .775rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:false,0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 1.55rem);background-position:top calc(.375em + .3875rem) right calc(.375em + .3875rem)}.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='%23F8285A'%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='%23F8285A' stroke='none'/%3e%3c/svg%3e");padding-right:5.5rem;background-position:right 1rem center,center right 3rem;background-size:16px 12px,calc(.75em + .775rem) calc(.75em + .775rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:false,0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + 1.55rem))}.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 .25rem rgba(var(--bs-danger-rgb),.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:.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:1.5rem;--bs-btn-padding-y:0.775rem;--bs-btn-font-size:1.1rem;--bs-btn-font-weight:500;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:1px;--bs-btn-border-color:transparent;--bs-btn-border-radius:0.475rem;--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:none;--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .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;vertical-align:middle;cursor:pointer;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);box-shadow:var(--bs-btn-box-shadow);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .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-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-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);box-shadow:var(--bs-btn-active-shadow)}.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-active-shadow),var(--bs-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-active-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);box-shadow:none}.btn-light{--bs-btn-color:#000000;--bs-btn-bg:#F9F9F9;--bs-btn-border-color:#F9F9F9;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#d4d4d4;--bs-btn-hover-border-color:#c7c7c7;--bs-btn-focus-shadow-rgb:212,212,212;--bs-btn-active-color:#000000;--bs-btn-active-bg:#c7c7c7;--bs-btn-active-border-color:#bbbbbb;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#F9F9F9;--bs-btn-disabled-border-color:#F9F9F9}.btn-primary{--bs-btn-color:#ffffff;--bs-btn-bg:#0069E0;--bs-btn-border-color:#0069E0;--bs-btn-hover-color:#ffffff;--bs-btn-hover-bg:#0059be;--bs-btn-hover-border-color:#0054b3;--bs-btn-focus-shadow-rgb:38,128,229;--bs-btn-active-color:#ffffff;--bs-btn-active-bg:#0054b3;--bs-btn-active-border-color:#004fa8;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#ffffff;--bs-btn-disabled-bg:#0069E0;--bs-btn-disabled-border-color:#0069E0}.btn-secondary{--bs-btn-color:#000000;--bs-btn-bg:#F1F1F4;--bs-btn-border-color:#F1F1F4;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#f3f3f6;--bs-btn-hover-border-color:#f2f2f5;--bs-btn-focus-shadow-rgb:205,205,207;--bs-btn-active-color:#000000;--bs-btn-active-bg:#f4f4f6;--bs-btn-active-border-color:#f2f2f5;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#F1F1F4;--bs-btn-disabled-border-color:#F1F1F4}.btn-success{--bs-btn-color:#000000;--bs-btn-bg:#17C653;--bs-btn-border-color:#17C653;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#3acf6d;--bs-btn-hover-border-color:#2ecc64;--bs-btn-focus-shadow-rgb:20,168,71;--bs-btn-active-color:#000000;--bs-btn-active-bg:#45d175;--bs-btn-active-border-color:#2ecc64;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#17C653;--bs-btn-disabled-border-color:#17C653}.btn-info{--bs-btn-color:#ffffff;--bs-btn-bg:#7239EA;--bs-btn-border-color:#7239EA;--bs-btn-hover-color:#ffffff;--bs-btn-hover-bg:#6130c7;--bs-btn-hover-border-color:#5b2ebb;--bs-btn-focus-shadow-rgb:135,87,237;--bs-btn-active-color:#ffffff;--bs-btn-active-bg:#5b2ebb;--bs-btn-active-border-color:#562bb0;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#ffffff;--bs-btn-disabled-bg:#7239EA;--bs-btn-disabled-border-color:#7239EA}.btn-warning{--bs-btn-color:#000000;--bs-btn-bg:#F6C000;--bs-btn-border-color:#F6C000;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#f7c926;--bs-btn-hover-border-color:#f7c61a;--bs-btn-focus-shadow-rgb:209,163,0;--bs-btn-active-color:#000000;--bs-btn-active-bg:#f8cd33;--bs-btn-active-border-color:#f7c61a;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#F6C000;--bs-btn-disabled-border-color:#F6C000}.btn-danger{--bs-btn-color:#000000;--bs-btn-bg:#F8285A;--bs-btn-border-color:#F8285A;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#f94873;--bs-btn-hover-border-color:#f93e6b;--bs-btn-focus-shadow-rgb:211,34,77;--bs-btn-active-color:#000000;--bs-btn-active-bg:#f9537b;--bs-btn-active-border-color:#f93e6b;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#F8285A;--bs-btn-disabled-border-color:#F8285A}.btn-dark{--bs-btn-color:#ffffff;--bs-btn-bg:#1E2129;--bs-btn-border-color:#1E2129;--bs-btn-hover-color:#ffffff;--bs-btn-hover-bg:#404249;--bs-btn-hover-border-color:#35373e;--bs-btn-focus-shadow-rgb:64,66,73;--bs-btn-active-color:#ffffff;--bs-btn-active-bg:#4b4d54;--bs-btn-active-border-color:#35373e;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#ffffff;--bs-btn-disabled-bg:#1E2129;--bs-btn-disabled-border-color:#1E2129}.btn-outline-light{--bs-btn-color:#F9F9F9;--bs-btn-border-color:#F9F9F9;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#F9F9F9;--bs-btn-hover-border-color:#F9F9F9;--bs-btn-focus-shadow-rgb:249,249,249;--bs-btn-active-color:#000000;--bs-btn-active-bg:#F9F9F9;--bs-btn-active-border-color:#F9F9F9;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#F9F9F9;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#F9F9F9;--bs-gradient:none}.btn-outline-primary{--bs-btn-color:#0069E0;--bs-btn-border-color:#0069E0;--bs-btn-hover-color:#ffffff;--bs-btn-hover-bg:#0069E0;--bs-btn-hover-border-color:#0069E0;--bs-btn-focus-shadow-rgb:0,105,224;--bs-btn-active-color:#ffffff;--bs-btn-active-bg:#0069E0;--bs-btn-active-border-color:#0069E0;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#0069E0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0069E0;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#F1F1F4;--bs-btn-border-color:#F1F1F4;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#F1F1F4;--bs-btn-hover-border-color:#F1F1F4;--bs-btn-focus-shadow-rgb:241,241,244;--bs-btn-active-color:#000000;--bs-btn-active-bg:#F1F1F4;--bs-btn-active-border-color:#F1F1F4;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#F1F1F4;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#F1F1F4;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#17C653;--bs-btn-border-color:#17C653;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#17C653;--bs-btn-hover-border-color:#17C653;--bs-btn-focus-shadow-rgb:23,198,83;--bs-btn-active-color:#000000;--bs-btn-active-bg:#17C653;--bs-btn-active-border-color:#17C653;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#17C653;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#17C653;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#7239EA;--bs-btn-border-color:#7239EA;--bs-btn-hover-color:#ffffff;--bs-btn-hover-bg:#7239EA;--bs-btn-hover-border-color:#7239EA;--bs-btn-focus-shadow-rgb:114,57,234;--bs-btn-active-color:#ffffff;--bs-btn-active-bg:#7239EA;--bs-btn-active-border-color:#7239EA;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#7239EA;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#7239EA;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#F6C000;--bs-btn-border-color:#F6C000;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#F6C000;--bs-btn-hover-border-color:#F6C000;--bs-btn-focus-shadow-rgb:246,192,0;--bs-btn-active-color:#000000;--bs-btn-active-bg:#F6C000;--bs-btn-active-border-color:#F6C000;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#F6C000;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#F6C000;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#F8285A;--bs-btn-border-color:#F8285A;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#F8285A;--bs-btn-hover-border-color:#F8285A;--bs-btn-focus-shadow-rgb:248,40,90;--bs-btn-active-color:#000000;--bs-btn-active-bg:#F8285A;--bs-btn-active-border-color:#F8285A;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#F8285A;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#F8285A;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#1E2129;--bs-btn-border-color:#1E2129;--bs-btn-hover-color:#ffffff;--bs-btn-hover-bg:#1E2129;--bs-btn-hover-border-color:#1E2129;--bs-btn-focus-shadow-rgb:30,33,41;--bs-btn-active-color:#ffffff;--bs-btn-active-bg:#1E2129;--bs-btn-active-border-color:#1E2129;--bs-btn-active-shadow:none;--bs-btn-disabled-color:#1E2129;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#1E2129;--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:var(--bs-gray-600);--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:38,128,229;text-decoration:none}.btn-link:focus-visible,.btn-link:hover{text-decoration:none}.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:1rem;--bs-btn-padding-x:1.75rem;--bs-btn-font-size:1.15rem;--bs-btn-border-radius:0.625rem}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.55rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:0.95rem;--bs-btn-border-radius:0.425rem}.fade{transition:opacity .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 .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .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:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.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:0.475rem;--bs-dropdown-border-width:0rem;--bs-dropdown-inner-border-radius:calc(0.475rem - 0rem);--bs-dropdown-divider-bg:var(--bs-gray-100);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:0px 0px 50px 0px rgba(82, 63, 105, 0.15);--bs-dropdown-link-color:var(--bs-gray-900);--bs-dropdown-link-hover-color:var(--bs-gray-900);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:var(--bs-component-hover-color);--bs-dropdown-link-active-bg:var(--bs-component-hover-bg);--bs-dropdown-link-disabled-color:var(--bs-gray-500);--bs-dropdown-item-padding-x:0.85rem;--bs-dropdown-item-padding-y:0.65rem;--bs-dropdown-header-color:var(--bs-gray-600);--bs-dropdown-header-padding-x:0.85rem;--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);box-shadow:var(--bs-dropdown-box-shadow)}.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:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.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:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.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:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.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;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:.95rem;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:#DBDFE9;--bs-dropdown-bg:#252F4A;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-link-color:#DBDFE9;--bs-dropdown-link-hover-color:#ffffff;--bs-dropdown-divider-bg:var(--bs-gray-100);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:var(--bs-component-hover-color);--bs-dropdown-link-active-bg:var(--bs-component-hover-bg);--bs-dropdown-link-disabled-color:#6D6D97;--bs-dropdown-header-color:#6D6D97}.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:.475rem}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(-1 * 1px)}.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:1.125rem;padding-left:1.125rem}.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:.75rem;padding-left:.75rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:1.3125rem;padding-left:1.3125rem}.btn-group.show .dropdown-toggle{box-shadow:none}.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.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(-1 * 1px)}.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:nth-child(n+3),.btn-group-vertical>:not(.btn-check)+.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-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);background:0 0;border:0;transition:color .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 .25rem rgba(0,105,224,.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:#ffffff;--bs-nav-pills-link-active-bg:#0069E0}.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:600;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-grow:1;flex-basis:0;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.44375rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.075rem;--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.075rem;--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%287, 20, 55, 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:0.475rem;--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);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-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:.5rem;padding-bottom:.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-grow:1;flex-basis:100%;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;box-shadow:none;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;box-shadow:none;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;box-shadow:none;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;box-shadow:none;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;box-shadow:none;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;box-shadow:none;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:#ffffff;--bs-navbar-brand-color:#ffffff;--bs-navbar-brand-hover-color:#ffffff;--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:var(--bs-gray-900);--bs-card-border-width:1px;--bs-card-border-color:#F1F1F4;--bs-card-border-radius:0.625rem;--bs-card-box-shadow:0px 3px 4px 0px rgba(0, 0, 0, 0.03);--bs-card-inner-border-radius:calc(0.625rem - 1px);--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:transparent;--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);box-shadow:var(--bs-card-box-shadow)}.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(-.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(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.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(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.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:0.475rem;--bs-accordion-inner-border-radius:calc(0.475rem - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.5rem;--bs-accordion-btn-padding-y:1.5rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-body-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23071437'%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.15rem;--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='%230069E0'%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-box-shadow:none;--bs-accordion-body-padding-x:1.5rem;--bs-accordion-body-padding-y:1.5rem;--bs-accordion-active-color:var(--bs-primary);--bs-accordion-active-bg:var(--bs-gray-100)}.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;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-header .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-header .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-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-collapse,.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .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='%23F5F5F5'%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='%231F87FF'%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-divider-color:var(--bs-gray-600);--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:var(--bs-primary);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:1.075rem;--bs-pagination-color:var(--bs-gray-700);--bs-pagination-bg:transparent;--bs-pagination-border-width:0;--bs-pagination-border-color:transparent;--bs-pagination-border-radius:0.475rem;--bs-pagination-hover-color:var(--bs-component-hover-color);--bs-pagination-hover-bg:var(--bs-component-hover-bg);--bs-pagination-hover-border-color:transparent;--bs-pagination-focus-color:var(--bs-component-hover-color);--bs-pagination-focus-bg:var(--bs-component-hover-bg);--bs-pagination-focus-box-shadow:none;--bs-pagination-active-color:var(--bs-component-active-color);--bs-pagination-active-bg:var(--bs-component-active-bg);--bs-pagination-active-border-color:transparent;--bs-pagination-disabled-color:var(--bs-gray-400);--bs-pagination-disabled-bg:transparent;--bs-pagination-disabled-border-color:transparent;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);background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .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(-1 * 0)}.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.075rem;--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.95rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:0.5rem;--bs-badge-padding-y:0.325rem;--bs-badge-font-size:0.85rem;--bs-badge-font-weight:600;--bs-badge-color:var(--bs-body-color);--bs-badge-border-radius:0.425rem;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:600;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-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-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-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:var(--bs-progress-height)}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:var(--bs-gray-100);--bs-progress-border-radius:6px;--bs-progress-box-shadow:none;--bs-progress-bar-color:#ffffff;--bs-progress-bar-bg:#0069E0;--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);box-shadow:var(--bs-progress-box-shadow)}.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,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.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-gray-900);--bs-list-group-bg:var(--bs-light);--bs-list-group-border-color:var(--bs-gray-200);--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-gray-700);--bs-list-group-action-hover-color:var(--bs-gray-700);--bs-list-group-action-hover-bg:var(--bs-gray-100);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-gray-200);--bs-list-group-disabled-color:var(--bs-gray-600);--bs-list-group-disabled-bg:var(--bs-light);--bs-list-group-active-color:var(--bs-component-active-color);--bs-list-group-active-bg:var(--bs-component-active-bg);--bs-list-group-active-border-color:var(--bs-component-active-bg);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{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);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-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:not(.active):focus,.list-group-item-action:not(.active):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:not(.active):active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.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-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-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-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:#000000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000000'%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:none;--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:0.25;box-sizing:content-box;width:.75rem;height:.75rem;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/.75rem auto no-repeat;filter:var(--bs-btn-close-filter);border:0;border-radius:.475rem;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;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{--bs-btn-close-filter:invert(1) grayscale(100%) brightness(200%)}[data-bs-theme=dark]{--bs-btn-close-filter:invert(1) grayscale(100%) brightness(200%)}.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:var(--bs-gray-700);--bs-toast-bg:var(--bs-body-bg);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:transparent;--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-gray-700);--bs-toast-header-bg:var(--bs-body-bg);--bs-toast-header-border-color:var(--bs-border-color);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: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(-.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:1.75rem;--bs-modal-margin:0.5rem;--bs-modal-color:var(--bs-body-color);--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:0;--bs-modal-border-radius:0.475rem;--bs-modal-box-shadow:0 0.25rem 0.5rem rgba(0, 0, 0, 0.1);--bs-modal-inner-border-radius:0.475rem;--bs-modal-header-padding-x:1.75rem;--bs-modal-header-padding-y:1.75rem;--bs-modal-header-padding:1.75rem 1.75rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:1px;--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:1px;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{transform:translate(0,-50px);transition:transform .3s ease-out}@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);box-shadow:var(--bs-modal-box-shadow);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000000;--bs-backdrop-opacity:0.4;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;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) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin-top:calc(-.5 * var(--bs-modal-header-padding-y));margin-right:calc(-.5 * var(--bs-modal-header-padding-x));margin-bottom:calc(-.5 * var(--bs-modal-header-padding-y));margin-left: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) * .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) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.1)}.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:1rem;--bs-tooltip-padding-y:0.75rem;--bs-tooltip-margin:0;--bs-tooltip-font-size:1rem;--bs-tooltip-color:var(--bs-gray-800);--bs-tooltip-bg:var(--bs-body-bg);--bs-tooltip-border-radius:0.475rem;--bs-tooltip-opacity:1;--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) * .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) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .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) * .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) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .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:1rem;--bs-popover-bg:#ffffff;--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:#ffffff;--bs-popover-border-radius:0.475rem;--bs-popover-inner-border-radius:0.475rem;--bs-popover-box-shadow:0px 0px 50px 0px rgba(82, 63, 105, 0.15);--bs-popover-header-padding-x:1.25rem;--bs-popover-header-padding-y:1rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:var(--bs-gray-800);--bs-popover-header-bg:#ffffff;--bs-popover-body-padding-x:1.25rem;--bs-popover-body-padding-y:1.25rem;--bs-popover-body-color:var(--bs-gray-800);--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);box-shadow:var(--bs-popover-box-shadow)}.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) * .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) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .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) * .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(-.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) * .5) 0 calc(var(--bs-popover-arrow-width) * .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%;backface-visibility:hidden;transition:transform .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 .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;filter:var(--bs-carousel-control-icon-filter);border:0;opacity:.5;transition:opacity .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:.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='%23ffffff'%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 0'/%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='%23ffffff'%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-.708'/%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:var(--bs-carousel-indicator-active-bg);background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .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:var(--bs-carousel-caption-color);text-align:center}.carousel-dark{--bs-carousel-indicator-active-bg:#000000;--bs-carousel-caption-color:#000000;--bs-carousel-control-icon-filter:invert(1) grayscale(100)}:root,[data-bs-theme=light]{--bs-carousel-indicator-active-bg:#ffffff;--bs-carousel-caption-color:#ffffff}[data-bs-theme=dark]{--bs-carousel-indicator-active-bg:#000000;--bs-carousel-caption-color:#000000;--bs-carousel-control-icon-filter:invert(1) grayscale(100)}.spinner-border,.spinner-grow{display:inline-block;flex-shrink:0;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.185rem;--bs-spinner-animation-speed:0.65s;--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.145em}@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.65s;--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.3s}}.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:1.75rem;--bs-offcanvas-padding-y:1.75rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:0;--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:0 0.25rem 0.5rem rgba(0, 0, 0, 0.1);--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;box-shadow:var(--bs-offcanvas-box-shadow);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;box-shadow:var(--bs-offcanvas-box-shadow);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;box-shadow:var(--bs-offcanvas-box-shadow);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;box-shadow:var(--bs-offcanvas-box-shadow);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;box-shadow:var(--bs-offcanvas-box-shadow);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;box-shadow:var(--bs-offcanvas-box-shadow);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:.4}.offcanvas-header{display:flex;align-items:center;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y));margin-left:auto}.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:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,.8) 75%,#000 95%);mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0}}.clearfix::after{display:block;clear:both;content:""}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#000!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#000!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#fff!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:#000!important;background-color:RGBA(var(--bs-danger-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-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-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(250,250,250,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(250,250,250,var(--bs-link-underline-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-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(0,84,179,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(0,84,179,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-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(244,244,246,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(244,244,246,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-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(69,209,117,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(69,209,117,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-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(91,46,187,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(91,46,187,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-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(248,205,51,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(248,205,51,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-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(249,83,123,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(249,83,123,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-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(24,26,33,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(24,26,33,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-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,.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,.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:.375rem;align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,.5));text-underline-offset:.25em;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.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(.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:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{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}.visually-hidden *,.visually-hidden-focusable:not(:focus):not(:focus-within) *{overflow:hidden!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:.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{object-fit:contain!important}.object-fit-cover{object-fit:cover!important}.object-fit-fill{object-fit:fill!important}.object-fit-scale{object-fit:scale-down!important}.object-fit-none{object-fit:none!important}.opacity-0{opacity:0!important}.opacity-5{opacity:.05!important}.opacity-10{opacity:.1!important}.opacity-15{opacity:.15!important}.opacity-20{opacity:.2!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.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-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.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-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:sticky!important}.top-0{top:0!important}.top-25{top:25%!important}.top-50{top:50%!important}.top-75{top:75%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-25{bottom:25%!important}.bottom-50{bottom:50%!important}.bottom-75{bottom:75%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-25{left:25%!important}.start-50{left:50%!important}.start-75{left:75%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-25{right:25%!important}.end-50{right:50%!important}.end-75{right:75%!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-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!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-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-0{border-width:0!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-unset{width:unset!important}.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}.w-1px{width:1px!important}.w-2px{width:2px!important}.w-3px{width:3px!important}.w-4px{width:4px!important}.w-5px{width:5px!important}.w-6px{width:6px!important}.w-7px{width:7px!important}.w-8px{width:8px!important}.w-9px{width:9px!important}.w-10px{width:10px!important}.w-15px{width:15px!important}.w-20px{width:20px!important}.w-25px{width:25px!important}.w-30px{width:30px!important}.w-35px{width:35px!important}.w-40px{width:40px!important}.w-45px{width:45px!important}.w-50px{width:50px!important}.w-55px{width:55px!important}.w-60px{width:60px!important}.w-65px{width:65px!important}.w-70px{width:70px!important}.w-75px{width:75px!important}.w-80px{width:80px!important}.w-85px{width:85px!important}.w-90px{width:90px!important}.w-95px{width:95px!important}.w-100px{width:100px!important}.w-125px{width:125px!important}.w-150px{width:150px!important}.w-175px{width:175px!important}.w-200px{width:200px!important}.w-225px{width:225px!important}.w-250px{width:250px!important}.w-275px{width:275px!important}.w-300px{width:300px!important}.w-325px{width:325px!important}.w-350px{width:350px!important}.w-375px{width:375px!important}.w-400px{width:400px!important}.w-425px{width:425px!important}.w-450px{width:450px!important}.w-475px{width:475px!important}.w-500px{width:500px!important}.w-550px{width:550px!important}.w-600px{width:600px!important}.w-650px{width:650px!important}.w-700px{width:700px!important}.w-750px{width:750px!important}.w-800px{width:800px!important}.w-850px{width:850px!important}.w-900px{width:900px!important}.w-950px{width:950px!important}.w-1000px{width:1000px!important}.mw-unset{max-width:unset!important}.mw-25{max-width:25%!important}.mw-50{max-width:50%!important}.mw-75{max-width:75%!important}.mw-100{max-width:100%!important}.mw-auto{max-width:auto!important}.mw-1px{max-width:1px!important}.mw-2px{max-width:2px!important}.mw-3px{max-width:3px!important}.mw-4px{max-width:4px!important}.mw-5px{max-width:5px!important}.mw-6px{max-width:6px!important}.mw-7px{max-width:7px!important}.mw-8px{max-width:8px!important}.mw-9px{max-width:9px!important}.mw-10px{max-width:10px!important}.mw-15px{max-width:15px!important}.mw-20px{max-width:20px!important}.mw-25px{max-width:25px!important}.mw-30px{max-width:30px!important}.mw-35px{max-width:35px!important}.mw-40px{max-width:40px!important}.mw-45px{max-width:45px!important}.mw-50px{max-width:50px!important}.mw-55px{max-width:55px!important}.mw-60px{max-width:60px!important}.mw-65px{max-width:65px!important}.mw-70px{max-width:70px!important}.mw-75px{max-width:75px!important}.mw-80px{max-width:80px!important}.mw-85px{max-width:85px!important}.mw-90px{max-width:90px!important}.mw-95px{max-width:95px!important}.mw-100px{max-width:100px!important}.mw-125px{max-width:125px!important}.mw-150px{max-width:150px!important}.mw-175px{max-width:175px!important}.mw-200px{max-width:200px!important}.mw-225px{max-width:225px!important}.mw-250px{max-width:250px!important}.mw-275px{max-width:275px!important}.mw-300px{max-width:300px!important}.mw-325px{max-width:325px!important}.mw-350px{max-width:350px!important}.mw-375px{max-width:375px!important}.mw-400px{max-width:400px!important}.mw-425px{max-width:425px!important}.mw-450px{max-width:450px!important}.mw-475px{max-width:475px!important}.mw-500px{max-width:500px!important}.mw-550px{max-width:550px!important}.mw-600px{max-width:600px!important}.mw-650px{max-width:650px!important}.mw-700px{max-width:700px!important}.mw-750px{max-width:750px!important}.mw-800px{max-width:800px!important}.mw-850px{max-width:850px!important}.mw-900px{max-width:900px!important}.mw-950px{max-width:950px!important}.mw-1000px{max-width:1000px!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-unset{height:unset!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}.h-1px{height:1px!important}.h-2px{height:2px!important}.h-3px{height:3px!important}.h-4px{height:4px!important}.h-5px{height:5px!important}.h-6px{height:6px!important}.h-7px{height:7px!important}.h-8px{height:8px!important}.h-9px{height:9px!important}.h-10px{height:10px!important}.h-15px{height:15px!important}.h-20px{height:20px!important}.h-25px{height:25px!important}.h-30px{height:30px!important}.h-35px{height:35px!important}.h-40px{height:40px!important}.h-45px{height:45px!important}.h-50px{height:50px!important}.h-55px{height:55px!important}.h-60px{height:60px!important}.h-65px{height:65px!important}.h-70px{height:70px!important}.h-75px{height:75px!important}.h-80px{height:80px!important}.h-85px{height:85px!important}.h-90px{height:90px!important}.h-95px{height:95px!important}.h-100px{height:100px!important}.h-125px{height:125px!important}.h-150px{height:150px!important}.h-175px{height:175px!important}.h-200px{height:200px!important}.h-225px{height:225px!important}.h-250px{height:250px!important}.h-275px{height:275px!important}.h-300px{height:300px!important}.h-325px{height:325px!important}.h-350px{height:350px!important}.h-375px{height:375px!important}.h-400px{height:400px!important}.h-425px{height:425px!important}.h-450px{height:450px!important}.h-475px{height:475px!important}.h-500px{height:500px!important}.h-550px{height:550px!important}.h-600px{height:600px!important}.h-650px{height:650px!important}.h-700px{height:700px!important}.h-750px{height:750px!important}.h-800px{height:800px!important}.h-850px{height:850px!important}.h-900px{height:900px!important}.h-950px{height:950px!important}.h-1000px{height:1000px!important}.mh-unset{max-height:unset!important}.mh-25{max-height:25%!important}.mh-50{max-height:50%!important}.mh-75{max-height:75%!important}.mh-100{max-height:100%!important}.mh-auto{max-height:auto!important}.mh-1px{max-height:1px!important}.mh-2px{max-height:2px!important}.mh-3px{max-height:3px!important}.mh-4px{max-height:4px!important}.mh-5px{max-height:5px!important}.mh-6px{max-height:6px!important}.mh-7px{max-height:7px!important}.mh-8px{max-height:8px!important}.mh-9px{max-height:9px!important}.mh-10px{max-height:10px!important}.mh-15px{max-height:15px!important}.mh-20px{max-height:20px!important}.mh-25px{max-height:25px!important}.mh-30px{max-height:30px!important}.mh-35px{max-height:35px!important}.mh-40px{max-height:40px!important}.mh-45px{max-height:45px!important}.mh-50px{max-height:50px!important}.mh-55px{max-height:55px!important}.mh-60px{max-height:60px!important}.mh-65px{max-height:65px!important}.mh-70px{max-height:70px!important}.mh-75px{max-height:75px!important}.mh-80px{max-height:80px!important}.mh-85px{max-height:85px!important}.mh-90px{max-height:90px!important}.mh-95px{max-height:95px!important}.mh-100px{max-height:100px!important}.mh-125px{max-height:125px!important}.mh-150px{max-height:150px!important}.mh-175px{max-height:175px!important}.mh-200px{max-height:200px!important}.mh-225px{max-height:225px!important}.mh-250px{max-height:250px!important}.mh-275px{max-height:275px!important}.mh-300px{max-height:300px!important}.mh-325px{max-height:325px!important}.mh-350px{max-height:350px!important}.mh-375px{max-height:375px!important}.mh-400px{max-height:400px!important}.mh-425px{max-height:425px!important}.mh-450px{max-height:450px!important}.mh-475px{max-height:475px!important}.mh-500px{max-height:500px!important}.mh-550px{max-height:550px!important}.mh-600px{max-height:600px!important}.mh-650px{max-height:650px!important}.mh-700px{max-height:700px!important}.mh-750px{max-height:750px!important}.mh-800px{max-height:800px!important}.mh-850px{max-height:850px!important}.mh-900px{max-height:900px!important}.mh-950px{max-height:950px!important}.mh-1000px{max-height:1000px!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:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:.75rem!important}.m-4{margin:1rem!important}.m-5{margin:1.25rem!important}.m-6{margin:1.5rem!important}.m-7{margin:1.75rem!important}.m-8{margin:2rem!important}.m-9{margin:2.25rem!important}.m-10{margin:2.5rem!important}.m-11{margin:2.75rem!important}.m-12{margin:3rem!important}.m-13{margin:3.25rem!important}.m-14{margin:3.5rem!important}.m-15{margin:3.75rem!important}.m-16{margin:4rem!important}.m-17{margin:4.25rem!important}.m-18{margin:4.5rem!important}.m-19{margin:4.75rem!important}.m-20{margin:5rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:.75rem!important;margin-left:.75rem!important}.mx-4{margin-right:1rem!important;margin-left:1rem!important}.mx-5{margin-right:1.25rem!important;margin-left:1.25rem!important}.mx-6{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-7{margin-right:1.75rem!important;margin-left:1.75rem!important}.mx-8{margin-right:2rem!important;margin-left:2rem!important}.mx-9{margin-right:2.25rem!important;margin-left:2.25rem!important}.mx-10{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-11{margin-right:2.75rem!important;margin-left:2.75rem!important}.mx-12{margin-right:3rem!important;margin-left:3rem!important}.mx-13{margin-right:3.25rem!important;margin-left:3.25rem!important}.mx-14{margin-right:3.5rem!important;margin-left:3.5rem!important}.mx-15{margin-right:3.75rem!important;margin-left:3.75rem!important}.mx-16{margin-right:4rem!important;margin-left:4rem!important}.mx-17{margin-right:4.25rem!important;margin-left:4.25rem!important}.mx-18{margin-right:4.5rem!important;margin-left:4.5rem!important}.mx-19{margin-right:4.75rem!important;margin-left:4.75rem!important}.mx-20{margin-right:5rem!important;margin-left:5rem!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:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.my-5{margin-top:1.25rem!important;margin-bottom:1.25rem!important}.my-6{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-7{margin-top:1.75rem!important;margin-bottom:1.75rem!important}.my-8{margin-top:2rem!important;margin-bottom:2rem!important}.my-9{margin-top:2.25rem!important;margin-bottom:2.25rem!important}.my-10{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-11{margin-top:2.75rem!important;margin-bottom:2.75rem!important}.my-12{margin-top:3rem!important;margin-bottom:3rem!important}.my-13{margin-top:3.25rem!important;margin-bottom:3.25rem!important}.my-14{margin-top:3.5rem!important;margin-bottom:3.5rem!important}.my-15{margin-top:3.75rem!important;margin-bottom:3.75rem!important}.my-16{margin-top:4rem!important;margin-bottom:4rem!important}.my-17{margin-top:4.25rem!important;margin-bottom:4.25rem!important}.my-18{margin-top:4.5rem!important;margin-bottom:4.5rem!important}.my-19{margin-top:4.75rem!important;margin-bottom:4.75rem!important}.my-20{margin-top:5rem!important;margin-bottom:5rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:.75rem!important}.mt-4{margin-top:1rem!important}.mt-5{margin-top:1.25rem!important}.mt-6{margin-top:1.5rem!important}.mt-7{margin-top:1.75rem!important}.mt-8{margin-top:2rem!important}.mt-9{margin-top:2.25rem!important}.mt-10{margin-top:2.5rem!important}.mt-11{margin-top:2.75rem!important}.mt-12{margin-top:3rem!important}.mt-13{margin-top:3.25rem!important}.mt-14{margin-top:3.5rem!important}.mt-15{margin-top:3.75rem!important}.mt-16{margin-top:4rem!important}.mt-17{margin-top:4.25rem!important}.mt-18{margin-top:4.5rem!important}.mt-19{margin-top:4.75rem!important}.mt-20{margin-top:5rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:.75rem!important}.me-4{margin-right:1rem!important}.me-5{margin-right:1.25rem!important}.me-6{margin-right:1.5rem!important}.me-7{margin-right:1.75rem!important}.me-8{margin-right:2rem!important}.me-9{margin-right:2.25rem!important}.me-10{margin-right:2.5rem!important}.me-11{margin-right:2.75rem!important}.me-12{margin-right:3rem!important}.me-13{margin-right:3.25rem!important}.me-14{margin-right:3.5rem!important}.me-15{margin-right:3.75rem!important}.me-16{margin-right:4rem!important}.me-17{margin-right:4.25rem!important}.me-18{margin-right:4.5rem!important}.me-19{margin-right:4.75rem!important}.me-20{margin-right:5rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:.75rem!important}.mb-4{margin-bottom:1rem!important}.mb-5{margin-bottom:1.25rem!important}.mb-6{margin-bottom:1.5rem!important}.mb-7{margin-bottom:1.75rem!important}.mb-8{margin-bottom:2rem!important}.mb-9{margin-bottom:2.25rem!important}.mb-10{margin-bottom:2.5rem!important}.mb-11{margin-bottom:2.75rem!important}.mb-12{margin-bottom:3rem!important}.mb-13{margin-bottom:3.25rem!important}.mb-14{margin-bottom:3.5rem!important}.mb-15{margin-bottom:3.75rem!important}.mb-16{margin-bottom:4rem!important}.mb-17{margin-bottom:4.25rem!important}.mb-18{margin-bottom:4.5rem!important}.mb-19{margin-bottom:4.75rem!important}.mb-20{margin-bottom:5rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:.75rem!important}.ms-4{margin-left:1rem!important}.ms-5{margin-left:1.25rem!important}.ms-6{margin-left:1.5rem!important}.ms-7{margin-left:1.75rem!important}.ms-8{margin-left:2rem!important}.ms-9{margin-left:2.25rem!important}.ms-10{margin-left:2.5rem!important}.ms-11{margin-left:2.75rem!important}.ms-12{margin-left:3rem!important}.ms-13{margin-left:3.25rem!important}.ms-14{margin-left:3.5rem!important}.ms-15{margin-left:3.75rem!important}.ms-16{margin-left:4rem!important}.ms-17{margin-left:4.25rem!important}.ms-18{margin-left:4.5rem!important}.ms-19{margin-left:4.75rem!important}.ms-20{margin-left:5rem!important}.ms-auto{margin-left:auto!important}.m-n1{margin:-.25rem!important}.m-n2{margin:-.5rem!important}.m-n3{margin:-.75rem!important}.m-n4{margin:-1rem!important}.m-n5{margin:-1.25rem!important}.m-n6{margin:-1.5rem!important}.m-n7{margin:-1.75rem!important}.m-n8{margin:-2rem!important}.m-n9{margin:-2.25rem!important}.m-n10{margin:-2.5rem!important}.m-n11{margin:-2.75rem!important}.m-n12{margin:-3rem!important}.m-n13{margin:-3.25rem!important}.m-n14{margin:-3.5rem!important}.m-n15{margin:-3.75rem!important}.m-n16{margin:-4rem!important}.m-n17{margin:-4.25rem!important}.m-n18{margin:-4.5rem!important}.m-n19{margin:-4.75rem!important}.m-n20{margin:-5rem!important}.mx-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-n3{margin-right:-.75rem!important;margin-left:-.75rem!important}.mx-n4{margin-right:-1rem!important;margin-left:-1rem!important}.mx-n5{margin-right:-1.25rem!important;margin-left:-1.25rem!important}.mx-n6{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-n7{margin-right:-1.75rem!important;margin-left:-1.75rem!important}.mx-n8{margin-right:-2rem!important;margin-left:-2rem!important}.mx-n9{margin-right:-2.25rem!important;margin-left:-2.25rem!important}.mx-n10{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.mx-n11{margin-right:-2.75rem!important;margin-left:-2.75rem!important}.mx-n12{margin-right:-3rem!important;margin-left:-3rem!important}.mx-n13{margin-right:-3.25rem!important;margin-left:-3.25rem!important}.mx-n14{margin-right:-3.5rem!important;margin-left:-3.5rem!important}.mx-n15{margin-right:-3.75rem!important;margin-left:-3.75rem!important}.mx-n16{margin-right:-4rem!important;margin-left:-4rem!important}.mx-n17{margin-right:-4.25rem!important;margin-left:-4.25rem!important}.mx-n18{margin-right:-4.5rem!important;margin-left:-4.5rem!important}.mx-n19{margin-right:-4.75rem!important;margin-left:-4.75rem!important}.mx-n20{margin-right:-5rem!important;margin-left:-5rem!important}.my-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-n3{margin-top:-.75rem!important;margin-bottom:-.75rem!important}.my-n4{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-n5{margin-top:-1.25rem!important;margin-bottom:-1.25rem!important}.my-n6{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-n7{margin-top:-1.75rem!important;margin-bottom:-1.75rem!important}.my-n8{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-n9{margin-top:-2.25rem!important;margin-bottom:-2.25rem!important}.my-n10{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.my-n11{margin-top:-2.75rem!important;margin-bottom:-2.75rem!important}.my-n12{margin-top:-3rem!important;margin-bottom:-3rem!important}.my-n13{margin-top:-3.25rem!important;margin-bottom:-3.25rem!important}.my-n14{margin-top:-3.5rem!important;margin-bottom:-3.5rem!important}.my-n15{margin-top:-3.75rem!important;margin-bottom:-3.75rem!important}.my-n16{margin-top:-4rem!important;margin-bottom:-4rem!important}.my-n17{margin-top:-4.25rem!important;margin-bottom:-4.25rem!important}.my-n18{margin-top:-4.5rem!important;margin-bottom:-4.5rem!important}.my-n19{margin-top:-4.75rem!important;margin-bottom:-4.75rem!important}.my-n20{margin-top:-5rem!important;margin-bottom:-5rem!important}.mt-n1{margin-top:-.25rem!important}.mt-n2{margin-top:-.5rem!important}.mt-n3{margin-top:-.75rem!important}.mt-n4{margin-top:-1rem!important}.mt-n5{margin-top:-1.25rem!important}.mt-n6{margin-top:-1.5rem!important}.mt-n7{margin-top:-1.75rem!important}.mt-n8{margin-top:-2rem!important}.mt-n9{margin-top:-2.25rem!important}.mt-n10{margin-top:-2.5rem!important}.mt-n11{margin-top:-2.75rem!important}.mt-n12{margin-top:-3rem!important}.mt-n13{margin-top:-3.25rem!important}.mt-n14{margin-top:-3.5rem!important}.mt-n15{margin-top:-3.75rem!important}.mt-n16{margin-top:-4rem!important}.mt-n17{margin-top:-4.25rem!important}.mt-n18{margin-top:-4.5rem!important}.mt-n19{margin-top:-4.75rem!important}.mt-n20{margin-top:-5rem!important}.me-n1{margin-right:-.25rem!important}.me-n2{margin-right:-.5rem!important}.me-n3{margin-right:-.75rem!important}.me-n4{margin-right:-1rem!important}.me-n5{margin-right:-1.25rem!important}.me-n6{margin-right:-1.5rem!important}.me-n7{margin-right:-1.75rem!important}.me-n8{margin-right:-2rem!important}.me-n9{margin-right:-2.25rem!important}.me-n10{margin-right:-2.5rem!important}.me-n11{margin-right:-2.75rem!important}.me-n12{margin-right:-3rem!important}.me-n13{margin-right:-3.25rem!important}.me-n14{margin-right:-3.5rem!important}.me-n15{margin-right:-3.75rem!important}.me-n16{margin-right:-4rem!important}.me-n17{margin-right:-4.25rem!important}.me-n18{margin-right:-4.5rem!important}.me-n19{margin-right:-4.75rem!important}.me-n20{margin-right:-5rem!important}.mb-n1{margin-bottom:-.25rem!important}.mb-n2{margin-bottom:-.5rem!important}.mb-n3{margin-bottom:-.75rem!important}.mb-n4{margin-bottom:-1rem!important}.mb-n5{margin-bottom:-1.25rem!important}.mb-n6{margin-bottom:-1.5rem!important}.mb-n7{margin-bottom:-1.75rem!important}.mb-n8{margin-bottom:-2rem!important}.mb-n9{margin-bottom:-2.25rem!important}.mb-n10{margin-bottom:-2.5rem!important}.mb-n11{margin-bottom:-2.75rem!important}.mb-n12{margin-bottom:-3rem!important}.mb-n13{margin-bottom:-3.25rem!important}.mb-n14{margin-bottom:-3.5rem!important}.mb-n15{margin-bottom:-3.75rem!important}.mb-n16{margin-bottom:-4rem!important}.mb-n17{margin-bottom:-4.25rem!important}.mb-n18{margin-bottom:-4.5rem!important}.mb-n19{margin-bottom:-4.75rem!important}.mb-n20{margin-bottom:-5rem!important}.ms-n1{margin-left:-.25rem!important}.ms-n2{margin-left:-.5rem!important}.ms-n3{margin-left:-.75rem!important}.ms-n4{margin-left:-1rem!important}.ms-n5{margin-left:-1.25rem!important}.ms-n6{margin-left:-1.5rem!important}.ms-n7{margin-left:-1.75rem!important}.ms-n8{margin-left:-2rem!important}.ms-n9{margin-left:-2.25rem!important}.ms-n10{margin-left:-2.5rem!important}.ms-n11{margin-left:-2.75rem!important}.ms-n12{margin-left:-3rem!important}.ms-n13{margin-left:-3.25rem!important}.ms-n14{margin-left:-3.5rem!important}.ms-n15{margin-left:-3.75rem!important}.ms-n16{margin-left:-4rem!important}.ms-n17{margin-left:-4.25rem!important}.ms-n18{margin-left:-4.5rem!important}.ms-n19{margin-left:-4.75rem!important}.ms-n20{margin-left:-5rem!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:.75rem!important}.p-4{padding:1rem!important}.p-5{padding:1.25rem!important}.p-6{padding:1.5rem!important}.p-7{padding:1.75rem!important}.p-8{padding:2rem!important}.p-9{padding:2.25rem!important}.p-10{padding:2.5rem!important}.p-11{padding:2.75rem!important}.p-12{padding:3rem!important}.p-13{padding:3.25rem!important}.p-14{padding:3.5rem!important}.p-15{padding:3.75rem!important}.p-16{padding:4rem!important}.p-17{padding:4.25rem!important}.p-18{padding:4.5rem!important}.p-19{padding:4.75rem!important}.p-20{padding:5rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:.75rem!important;padding-left:.75rem!important}.px-4{padding-right:1rem!important;padding-left:1rem!important}.px-5{padding-right:1.25rem!important;padding-left:1.25rem!important}.px-6{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-7{padding-right:1.75rem!important;padding-left:1.75rem!important}.px-8{padding-right:2rem!important;padding-left:2rem!important}.px-9{padding-right:2.25rem!important;padding-left:2.25rem!important}.px-10{padding-right:2.5rem!important;padding-left:2.5rem!important}.px-11{padding-right:2.75rem!important;padding-left:2.75rem!important}.px-12{padding-right:3rem!important;padding-left:3rem!important}.px-13{padding-right:3.25rem!important;padding-left:3.25rem!important}.px-14{padding-right:3.5rem!important;padding-left:3.5rem!important}.px-15{padding-right:3.75rem!important;padding-left:3.75rem!important}.px-16{padding-right:4rem!important;padding-left:4rem!important}.px-17{padding-right:4.25rem!important;padding-left:4.25rem!important}.px-18{padding-right:4.5rem!important;padding-left:4.5rem!important}.px-19{padding-right:4.75rem!important;padding-left:4.75rem!important}.px-20{padding-right:5rem!important;padding-left:5rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.py-5{padding-top:1.25rem!important;padding-bottom:1.25rem!important}.py-6{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-7{padding-top:1.75rem!important;padding-bottom:1.75rem!important}.py-8{padding-top:2rem!important;padding-bottom:2rem!important}.py-9{padding-top:2.25rem!important;padding-bottom:2.25rem!important}.py-10{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.py-11{padding-top:2.75rem!important;padding-bottom:2.75rem!important}.py-12{padding-top:3rem!important;padding-bottom:3rem!important}.py-13{padding-top:3.25rem!important;padding-bottom:3.25rem!important}.py-14{padding-top:3.5rem!important;padding-bottom:3.5rem!important}.py-15{padding-top:3.75rem!important;padding-bottom:3.75rem!important}.py-16{padding-top:4rem!important;padding-bottom:4rem!important}.py-17{padding-top:4.25rem!important;padding-bottom:4.25rem!important}.py-18{padding-top:4.5rem!important;padding-bottom:4.5rem!important}.py-19{padding-top:4.75rem!important;padding-bottom:4.75rem!important}.py-20{padding-top:5rem!important;padding-bottom:5rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:.75rem!important}.pt-4{padding-top:1rem!important}.pt-5{padding-top:1.25rem!important}.pt-6{padding-top:1.5rem!important}.pt-7{padding-top:1.75rem!important}.pt-8{padding-top:2rem!important}.pt-9{padding-top:2.25rem!important}.pt-10{padding-top:2.5rem!important}.pt-11{padding-top:2.75rem!important}.pt-12{padding-top:3rem!important}.pt-13{padding-top:3.25rem!important}.pt-14{padding-top:3.5rem!important}.pt-15{padding-top:3.75rem!important}.pt-16{padding-top:4rem!important}.pt-17{padding-top:4.25rem!important}.pt-18{padding-top:4.5rem!important}.pt-19{padding-top:4.75rem!important}.pt-20{padding-top:5rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:.75rem!important}.pe-4{padding-right:1rem!important}.pe-5{padding-right:1.25rem!important}.pe-6{padding-right:1.5rem!important}.pe-7{padding-right:1.75rem!important}.pe-8{padding-right:2rem!important}.pe-9{padding-right:2.25rem!important}.pe-10{padding-right:2.5rem!important}.pe-11{padding-right:2.75rem!important}.pe-12{padding-right:3rem!important}.pe-13{padding-right:3.25rem!important}.pe-14{padding-right:3.5rem!important}.pe-15{padding-right:3.75rem!important}.pe-16{padding-right:4rem!important}.pe-17{padding-right:4.25rem!important}.pe-18{padding-right:4.5rem!important}.pe-19{padding-right:4.75rem!important}.pe-20{padding-right:5rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:.75rem!important}.pb-4{padding-bottom:1rem!important}.pb-5{padding-bottom:1.25rem!important}.pb-6{padding-bottom:1.5rem!important}.pb-7{padding-bottom:1.75rem!important}.pb-8{padding-bottom:2rem!important}.pb-9{padding-bottom:2.25rem!important}.pb-10{padding-bottom:2.5rem!important}.pb-11{padding-bottom:2.75rem!important}.pb-12{padding-bottom:3rem!important}.pb-13{padding-bottom:3.25rem!important}.pb-14{padding-bottom:3.5rem!important}.pb-15{padding-bottom:3.75rem!important}.pb-16{padding-bottom:4rem!important}.pb-17{padding-bottom:4.25rem!important}.pb-18{padding-bottom:4.5rem!important}.pb-19{padding-bottom:4.75rem!important}.pb-20{padding-bottom:5rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:.75rem!important}.ps-4{padding-left:1rem!important}.ps-5{padding-left:1.25rem!important}.ps-6{padding-left:1.5rem!important}.ps-7{padding-left:1.75rem!important}.ps-8{padding-left:2rem!important}.ps-9{padding-left:2.25rem!important}.ps-10{padding-left:2.5rem!important}.ps-11{padding-left:2.75rem!important}.ps-12{padding-left:3rem!important}.ps-13{padding-left:3.25rem!important}.ps-14{padding-left:3.5rem!important}.ps-15{padding-left:3.75rem!important}.ps-16{padding-left:4rem!important}.ps-17{padding-left:4.25rem!important}.ps-18{padding-left:4.5rem!important}.ps-19{padding-left:4.75rem!important}.ps-20{padding-left:5rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:.75rem!important}.gap-4{gap:1rem!important}.gap-5{gap:1.25rem!important}.gap-6{gap:1.5rem!important}.gap-7{gap:1.75rem!important}.gap-8{gap:2rem!important}.gap-9{gap:2.25rem!important}.gap-10{gap:2.5rem!important}.gap-11{gap:2.75rem!important}.gap-12{gap:3rem!important}.gap-13{gap:3.25rem!important}.gap-14{gap:3.5rem!important}.gap-15{gap:3.75rem!important}.gap-16{gap:4rem!important}.gap-17{gap:4.25rem!important}.gap-18{gap:4.5rem!important}.gap-19{gap:4.75rem!important}.gap-20{gap:5rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:.75rem!important}.row-gap-4{row-gap:1rem!important}.row-gap-5{row-gap:1.25rem!important}.row-gap-6{row-gap:1.5rem!important}.row-gap-7{row-gap:1.75rem!important}.row-gap-8{row-gap:2rem!important}.row-gap-9{row-gap:2.25rem!important}.row-gap-10{row-gap:2.5rem!important}.row-gap-11{row-gap:2.75rem!important}.row-gap-12{row-gap:3rem!important}.row-gap-13{row-gap:3.25rem!important}.row-gap-14{row-gap:3.5rem!important}.row-gap-15{row-gap:3.75rem!important}.row-gap-16{row-gap:4rem!important}.row-gap-17{row-gap:4.25rem!important}.row-gap-18{row-gap:4.5rem!important}.row-gap-19{row-gap:4.75rem!important}.row-gap-20{row-gap:5rem!important}.column-gap-0{column-gap:0!important}.column-gap-1{column-gap:.25rem!important}.column-gap-2{column-gap:.5rem!important}.column-gap-3{column-gap:.75rem!important}.column-gap-4{column-gap:1rem!important}.column-gap-5{column-gap:1.25rem!important}.column-gap-6{column-gap:1.5rem!important}.column-gap-7{column-gap:1.75rem!important}.column-gap-8{column-gap:2rem!important}.column-gap-9{column-gap:2.25rem!important}.column-gap-10{column-gap:2.5rem!important}.column-gap-11{column-gap:2.75rem!important}.column-gap-12{column-gap:3rem!important}.column-gap-13{column-gap:3.25rem!important}.column-gap-14{column-gap:3.5rem!important}.column-gap-15{column-gap:3.75rem!important}.column-gap-16{column-gap:4rem!important}.column-gap-17{column-gap:4.25rem!important}.column-gap-18{column-gap:4.5rem!important}.column-gap-19{column-gap:4.75rem!important}.column-gap-20{column-gap:5rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.3rem + .6vw)!important}.fs-2{font-size:calc(1.275rem + .3vw)!important}.fs-3{font-size:calc(1.26rem + .12vw)!important}.fs-4{font-size:1.25rem!important}.fs-5{font-size:1.15rem!important}.fs-6{font-size:1.075rem!important}.fs-7{font-size:.95rem!important}.fs-8{font-size:.85rem!important}.fs-9{font-size:.75rem!important}.fs-10{font-size:.5rem!important}.fs-sm{font-size:.95rem!important}.fs-base{font-size:1rem!important}.fs-lg{font-size:1.075rem!important}.fs-xl{font-size:1.21rem!important}.fs-fluid{font-size:100%!important}.fs-2x{font-size:calc(1.325rem + .9vw)!important}.fs-2qx{font-size:calc(1.35rem + 1.2vw)!important}.fs-2hx{font-size:calc(1.375rem + 1.5vw)!important}.fs-2tx{font-size:calc(1.4rem + 1.8vw)!important}.fs-3x{font-size:calc(1.425rem + 2.1vw)!important}.fs-3qx{font-size:calc(1.45rem + 2.4vw)!important}.fs-3hx{font-size:calc(1.475rem + 2.7vw)!important}.fs-3tx{font-size:calc(1.5rem + 3vw)!important}.fs-4x{font-size:calc(1.525rem + 3.3vw)!important}.fs-4qx{font-size:calc(1.55rem + 3.6vw)!important}.fs-4hx{font-size:calc(1.575rem + 3.9vw)!important}.fs-4tx{font-size:calc(1.6rem + 4.2vw)!important}.fs-5x{font-size:calc(1.625rem + 4.5vw)!important}.fs-5qx{font-size:calc(1.65rem + 4.8vw)!important}.fs-5hx{font-size:calc(1.675rem + 5.1vw)!important}.fs-5tx{font-size:calc(1.7rem + 5.4vw)!important}.fs-6x{font-size:calc(1.725rem + 5.7vw)!important}.fs-6qx{font-size:calc(1.75rem + 6vw)!important}.fs-6hx{font-size:calc(1.775rem + 6.3vw)!important}.fs-6tx{font-size:calc(1.8rem + 6.6vw)!important}.fs-7x{font-size:calc(1.825rem + 6.9vw)!important}.fs-7qx{font-size:calc(1.85rem + 7.2vw)!important}.fs-7hx{font-size:calc(1.875rem + 7.5vw)!important}.fs-7tx{font-size:calc(1.9rem + 7.8vw)!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:500!important}.fw-bold{font-weight:600!important}.fw-bolder{font-weight:700!important}.lh-0{line-height:0!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:1.75!important}.lh-xl{line-height:2!important}.lh-xxl{line-height:2.25!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-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!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-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,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.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:.125em!important}.link-offset-1-hover:hover{text-underline-offset:.125em!important}.link-offset-2{text-underline-offset:.25em!important}.link-offset-2-hover:hover{text-underline-offset:.25em!important}.link-offset-3{text-underline-offset:.375em!important}.link-offset-3-hover:hover{text-underline-offset:.375em!important}.link-underline-light{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-primary{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;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-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.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-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{user-select:all!important}.user-select-auto{user-select:auto!important}.user-select-none{user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.475rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.425rem!important}.rounded-2{border-radius:.475rem!important}.rounded-3{border-radius:.625rem!important}.rounded-4{border-radius:1rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!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-index-n1{z-index:-1!important}.z-index-n2{z-index:-2!important}.z-index-0{z-index:0!important}.z-index-1{z-index:1!important}.z-index-2{z-index:2!important}.z-index-3{z-index:3!important}.cursor-help{cursor:help!important}.cursor-wait{cursor:wait!important}.cursor-crosshair{cursor:crosshair!important}.cursor-not-allowed{cursor:not-allowed!important}.cursor-zoom-in{cursor:zoom-in!important}.cursor-grab{cursor:grab!important}.cursor-pointer{cursor:pointer!important}.opacity-0{opacity:0!important}.opacity-0-hover:hover{opacity:0!important}.opacity-5{opacity:.05!important}.opacity-5-hover:hover{opacity:.05!important}.opacity-10{opacity:.1!important}.opacity-10-hover:hover{opacity:.1!important}.opacity-15{opacity:.15!important}.opacity-15-hover:hover{opacity:.15!important}.opacity-20{opacity:.2!important}.opacity-20-hover:hover{opacity:.2!important}.opacity-25{opacity:.25!important}.opacity-25-hover:hover{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-50-hover:hover{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-75-hover:hover{opacity:.75!important}.opacity-100{opacity:1!important}.opacity-100-hover:hover{opacity:1!important}.min-w-unset{min-width:unset!important}.min-w-25{min-width:25%!important}.min-w-50{min-width:50%!important}.min-w-75{min-width:75%!important}.min-w-100{min-width:100%!important}.min-w-auto{min-width:auto!important}.min-w-1px{min-width:1px!important}.min-w-2px{min-width:2px!important}.min-w-3px{min-width:3px!important}.min-w-4px{min-width:4px!important}.min-w-5px{min-width:5px!important}.min-w-6px{min-width:6px!important}.min-w-7px{min-width:7px!important}.min-w-8px{min-width:8px!important}.min-w-9px{min-width:9px!important}.min-w-10px{min-width:10px!important}.min-w-15px{min-width:15px!important}.min-w-20px{min-width:20px!important}.min-w-25px{min-width:25px!important}.min-w-30px{min-width:30px!important}.min-w-35px{min-width:35px!important}.min-w-40px{min-width:40px!important}.min-w-45px{min-width:45px!important}.min-w-50px{min-width:50px!important}.min-w-55px{min-width:55px!important}.min-w-60px{min-width:60px!important}.min-w-65px{min-width:65px!important}.min-w-70px{min-width:70px!important}.min-w-75px{min-width:75px!important}.min-w-80px{min-width:80px!important}.min-w-85px{min-width:85px!important}.min-w-90px{min-width:90px!important}.min-w-95px{min-width:95px!important}.min-w-100px{min-width:100px!important}.min-w-125px{min-width:125px!important}.min-w-150px{min-width:150px!important}.min-w-175px{min-width:175px!important}.min-w-200px{min-width:200px!important}.min-w-225px{min-width:225px!important}.min-w-250px{min-width:250px!important}.min-w-275px{min-width:275px!important}.min-w-300px{min-width:300px!important}.min-w-325px{min-width:325px!important}.min-w-350px{min-width:350px!important}.min-w-375px{min-width:375px!important}.min-w-400px{min-width:400px!important}.min-w-425px{min-width:425px!important}.min-w-450px{min-width:450px!important}.min-w-475px{min-width:475px!important}.min-w-500px{min-width:500px!important}.min-w-550px{min-width:550px!important}.min-w-600px{min-width:600px!important}.min-w-650px{min-width:650px!important}.min-w-700px{min-width:700px!important}.min-w-750px{min-width:750px!important}.min-w-800px{min-width:800px!important}.min-w-850px{min-width:850px!important}.min-w-900px{min-width:900px!important}.min-w-950px{min-width:950px!important}.min-w-1000px{min-width:1000px!important}.min-h-unset{min-height:unset!important}.min-h-25{min-height:25%!important}.min-h-50{min-height:50%!important}.min-h-75{min-height:75%!important}.min-h-100{min-height:100%!important}.min-h-auto{min-height:auto!important}.min-h-1px{min-height:1px!important}.min-h-2px{min-height:2px!important}.min-h-3px{min-height:3px!important}.min-h-4px{min-height:4px!important}.min-h-5px{min-height:5px!important}.min-h-6px{min-height:6px!important}.min-h-7px{min-height:7px!important}.min-h-8px{min-height:8px!important}.min-h-9px{min-height:9px!important}.min-h-10px{min-height:10px!important}.min-h-15px{min-height:15px!important}.min-h-20px{min-height:20px!important}.min-h-25px{min-height:25px!important}.min-h-30px{min-height:30px!important}.min-h-35px{min-height:35px!important}.min-h-40px{min-height:40px!important}.min-h-45px{min-height:45px!important}.min-h-50px{min-height:50px!important}.min-h-55px{min-height:55px!important}.min-h-60px{min-height:60px!important}.min-h-65px{min-height:65px!important}.min-h-70px{min-height:70px!important}.min-h-75px{min-height:75px!important}.min-h-80px{min-height:80px!important}.min-h-85px{min-height:85px!important}.min-h-90px{min-height:90px!important}.min-h-95px{min-height:95px!important}.min-h-100px{min-height:100px!important}.min-h-125px{min-height:125px!important}.min-h-150px{min-height:150px!important}.min-h-175px{min-height:175px!important}.min-h-200px{min-height:200px!important}.min-h-225px{min-height:225px!important}.min-h-250px{min-height:250px!important}.min-h-275px{min-height:275px!important}.min-h-300px{min-height:300px!important}.min-h-325px{min-height:325px!important}.min-h-350px{min-height:350px!important}.min-h-375px{min-height:375px!important}.min-h-400px{min-height:400px!important}.min-h-425px{min-height:425px!important}.min-h-450px{min-height:450px!important}.min-h-475px{min-height:475px!important}.min-h-500px{min-height:500px!important}.min-h-550px{min-height:550px!important}.min-h-600px{min-height:600px!important}.min-h-650px{min-height:650px!important}.min-h-700px{min-height:700px!important}.min-h-750px{min-height:750px!important}.min-h-800px{min-height:800px!important}.min-h-850px{min-height:850px!important}.min-h-900px{min-height:900px!important}.min-h-950px{min-height:950px!important}.min-h-1000px{min-height:1000px!important}.border-top-0{border-top-width:0!important}.border-top-1{border-top-width:1px!important}.border-top-2{border-top-width:2px!important}.border-top-3{border-top-width:3px!important}.border-top-4{border-top-width:4px!important}.border-top-5{border-top-width:5px!important}.border-bottom-0{border-bottom-width:0!important}.border-bottom-1{border-bottom-width:1px!important}.border-bottom-2{border-bottom-width:2px!important}.border-bottom-3{border-bottom-width:3px!important}.border-bottom-4{border-bottom-width:4px!important}.border-bottom-5{border-bottom-width:5px!important}.border-right-0{border-right-width:0!important}.border-right-1{border-right-width:1px!important}.border-right-2{border-right-width:2px!important}.border-right-3{border-right-width:3px!important}.border-right-4{border-right-width:4px!important}.border-right-5{border-right-width:5px!important}.border-left-0{border-left-width:0!important}.border-left-1{border-left-width:1px!important}.border-left-2{border-left-width:2px!important}.border-left-3{border-left-width:3px!important}.border-left-4{border-left-width:4px!important}.border-left-5{border-left-width:5px!important}.ls-1{letter-spacing:.1rem!important}.ls-2{letter-spacing:.115rem!important}.ls-3{letter-spacing:.125rem!important}.ls-4{letter-spacing:.25rem!important}.ls-5{letter-spacing:.5rem!important}.ls-n1{letter-spacing:-.1rem!important}.ls-n2{letter-spacing:-.115rem!important}.ls-n3{letter-spacing:-.125rem!important}.ls-n4{letter-spacing:-.25rem!important}.ls-n5{letter-spacing:-.5rem!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{object-fit:contain!important}.object-fit-sm-cover{object-fit:cover!important}.object-fit-sm-fill{object-fit:fill!important}.object-fit-sm-scale{object-fit:scale-down!important}.object-fit-sm-none{object-fit:none!important}.overflow-sm-auto{overflow:auto!important}.overflow-sm-hidden{overflow:hidden!important}.overflow-sm-visible{overflow:visible!important}.overflow-sm-scroll{overflow:scroll!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}.position-sm-static{position:static!important}.position-sm-relative{position:relative!important}.position-sm-absolute{position:absolute!important}.position-sm-fixed{position:fixed!important}.position-sm-sticky{position:sticky!important}.w-sm-unset{width:unset!important}.w-sm-25{width:25%!important}.w-sm-50{width:50%!important}.w-sm-75{width:75%!important}.w-sm-100{width:100%!important}.w-sm-auto{width:auto!important}.w-sm-1px{width:1px!important}.w-sm-2px{width:2px!important}.w-sm-3px{width:3px!important}.w-sm-4px{width:4px!important}.w-sm-5px{width:5px!important}.w-sm-6px{width:6px!important}.w-sm-7px{width:7px!important}.w-sm-8px{width:8px!important}.w-sm-9px{width:9px!important}.w-sm-10px{width:10px!important}.w-sm-15px{width:15px!important}.w-sm-20px{width:20px!important}.w-sm-25px{width:25px!important}.w-sm-30px{width:30px!important}.w-sm-35px{width:35px!important}.w-sm-40px{width:40px!important}.w-sm-45px{width:45px!important}.w-sm-50px{width:50px!important}.w-sm-55px{width:55px!important}.w-sm-60px{width:60px!important}.w-sm-65px{width:65px!important}.w-sm-70px{width:70px!important}.w-sm-75px{width:75px!important}.w-sm-80px{width:80px!important}.w-sm-85px{width:85px!important}.w-sm-90px{width:90px!important}.w-sm-95px{width:95px!important}.w-sm-100px{width:100px!important}.w-sm-125px{width:125px!important}.w-sm-150px{width:150px!important}.w-sm-175px{width:175px!important}.w-sm-200px{width:200px!important}.w-sm-225px{width:225px!important}.w-sm-250px{width:250px!important}.w-sm-275px{width:275px!important}.w-sm-300px{width:300px!important}.w-sm-325px{width:325px!important}.w-sm-350px{width:350px!important}.w-sm-375px{width:375px!important}.w-sm-400px{width:400px!important}.w-sm-425px{width:425px!important}.w-sm-450px{width:450px!important}.w-sm-475px{width:475px!important}.w-sm-500px{width:500px!important}.w-sm-550px{width:550px!important}.w-sm-600px{width:600px!important}.w-sm-650px{width:650px!important}.w-sm-700px{width:700px!important}.w-sm-750px{width:750px!important}.w-sm-800px{width:800px!important}.w-sm-850px{width:850px!important}.w-sm-900px{width:900px!important}.w-sm-950px{width:950px!important}.w-sm-1000px{width:1000px!important}.mw-sm-unset{max-width:unset!important}.mw-sm-25{max-width:25%!important}.mw-sm-50{max-width:50%!important}.mw-sm-75{max-width:75%!important}.mw-sm-100{max-width:100%!important}.mw-sm-auto{max-width:auto!important}.mw-sm-1px{max-width:1px!important}.mw-sm-2px{max-width:2px!important}.mw-sm-3px{max-width:3px!important}.mw-sm-4px{max-width:4px!important}.mw-sm-5px{max-width:5px!important}.mw-sm-6px{max-width:6px!important}.mw-sm-7px{max-width:7px!important}.mw-sm-8px{max-width:8px!important}.mw-sm-9px{max-width:9px!important}.mw-sm-10px{max-width:10px!important}.mw-sm-15px{max-width:15px!important}.mw-sm-20px{max-width:20px!important}.mw-sm-25px{max-width:25px!important}.mw-sm-30px{max-width:30px!important}.mw-sm-35px{max-width:35px!important}.mw-sm-40px{max-width:40px!important}.mw-sm-45px{max-width:45px!important}.mw-sm-50px{max-width:50px!important}.mw-sm-55px{max-width:55px!important}.mw-sm-60px{max-width:60px!important}.mw-sm-65px{max-width:65px!important}.mw-sm-70px{max-width:70px!important}.mw-sm-75px{max-width:75px!important}.mw-sm-80px{max-width:80px!important}.mw-sm-85px{max-width:85px!important}.mw-sm-90px{max-width:90px!important}.mw-sm-95px{max-width:95px!important}.mw-sm-100px{max-width:100px!important}.mw-sm-125px{max-width:125px!important}.mw-sm-150px{max-width:150px!important}.mw-sm-175px{max-width:175px!important}.mw-sm-200px{max-width:200px!important}.mw-sm-225px{max-width:225px!important}.mw-sm-250px{max-width:250px!important}.mw-sm-275px{max-width:275px!important}.mw-sm-300px{max-width:300px!important}.mw-sm-325px{max-width:325px!important}.mw-sm-350px{max-width:350px!important}.mw-sm-375px{max-width:375px!important}.mw-sm-400px{max-width:400px!important}.mw-sm-425px{max-width:425px!important}.mw-sm-450px{max-width:450px!important}.mw-sm-475px{max-width:475px!important}.mw-sm-500px{max-width:500px!important}.mw-sm-550px{max-width:550px!important}.mw-sm-600px{max-width:600px!important}.mw-sm-650px{max-width:650px!important}.mw-sm-700px{max-width:700px!important}.mw-sm-750px{max-width:750px!important}.mw-sm-800px{max-width:800px!important}.mw-sm-850px{max-width:850px!important}.mw-sm-900px{max-width:900px!important}.mw-sm-950px{max-width:950px!important}.mw-sm-1000px{max-width:1000px!important}.h-sm-unset{height:unset!important}.h-sm-25{height:25%!important}.h-sm-50{height:50%!important}.h-sm-75{height:75%!important}.h-sm-100{height:100%!important}.h-sm-auto{height:auto!important}.h-sm-1px{height:1px!important}.h-sm-2px{height:2px!important}.h-sm-3px{height:3px!important}.h-sm-4px{height:4px!important}.h-sm-5px{height:5px!important}.h-sm-6px{height:6px!important}.h-sm-7px{height:7px!important}.h-sm-8px{height:8px!important}.h-sm-9px{height:9px!important}.h-sm-10px{height:10px!important}.h-sm-15px{height:15px!important}.h-sm-20px{height:20px!important}.h-sm-25px{height:25px!important}.h-sm-30px{height:30px!important}.h-sm-35px{height:35px!important}.h-sm-40px{height:40px!important}.h-sm-45px{height:45px!important}.h-sm-50px{height:50px!important}.h-sm-55px{height:55px!important}.h-sm-60px{height:60px!important}.h-sm-65px{height:65px!important}.h-sm-70px{height:70px!important}.h-sm-75px{height:75px!important}.h-sm-80px{height:80px!important}.h-sm-85px{height:85px!important}.h-sm-90px{height:90px!important}.h-sm-95px{height:95px!important}.h-sm-100px{height:100px!important}.h-sm-125px{height:125px!important}.h-sm-150px{height:150px!important}.h-sm-175px{height:175px!important}.h-sm-200px{height:200px!important}.h-sm-225px{height:225px!important}.h-sm-250px{height:250px!important}.h-sm-275px{height:275px!important}.h-sm-300px{height:300px!important}.h-sm-325px{height:325px!important}.h-sm-350px{height:350px!important}.h-sm-375px{height:375px!important}.h-sm-400px{height:400px!important}.h-sm-425px{height:425px!important}.h-sm-450px{height:450px!important}.h-sm-475px{height:475px!important}.h-sm-500px{height:500px!important}.h-sm-550px{height:550px!important}.h-sm-600px{height:600px!important}.h-sm-650px{height:650px!important}.h-sm-700px{height:700px!important}.h-sm-750px{height:750px!important}.h-sm-800px{height:800px!important}.h-sm-850px{height:850px!important}.h-sm-900px{height:900px!important}.h-sm-950px{height:950px!important}.h-sm-1000px{height:1000px!important}.mh-sm-unset{max-height:unset!important}.mh-sm-25{max-height:25%!important}.mh-sm-50{max-height:50%!important}.mh-sm-75{max-height:75%!important}.mh-sm-100{max-height:100%!important}.mh-sm-auto{max-height:auto!important}.mh-sm-1px{max-height:1px!important}.mh-sm-2px{max-height:2px!important}.mh-sm-3px{max-height:3px!important}.mh-sm-4px{max-height:4px!important}.mh-sm-5px{max-height:5px!important}.mh-sm-6px{max-height:6px!important}.mh-sm-7px{max-height:7px!important}.mh-sm-8px{max-height:8px!important}.mh-sm-9px{max-height:9px!important}.mh-sm-10px{max-height:10px!important}.mh-sm-15px{max-height:15px!important}.mh-sm-20px{max-height:20px!important}.mh-sm-25px{max-height:25px!important}.mh-sm-30px{max-height:30px!important}.mh-sm-35px{max-height:35px!important}.mh-sm-40px{max-height:40px!important}.mh-sm-45px{max-height:45px!important}.mh-sm-50px{max-height:50px!important}.mh-sm-55px{max-height:55px!important}.mh-sm-60px{max-height:60px!important}.mh-sm-65px{max-height:65px!important}.mh-sm-70px{max-height:70px!important}.mh-sm-75px{max-height:75px!important}.mh-sm-80px{max-height:80px!important}.mh-sm-85px{max-height:85px!important}.mh-sm-90px{max-height:90px!important}.mh-sm-95px{max-height:95px!important}.mh-sm-100px{max-height:100px!important}.mh-sm-125px{max-height:125px!important}.mh-sm-150px{max-height:150px!important}.mh-sm-175px{max-height:175px!important}.mh-sm-200px{max-height:200px!important}.mh-sm-225px{max-height:225px!important}.mh-sm-250px{max-height:250px!important}.mh-sm-275px{max-height:275px!important}.mh-sm-300px{max-height:300px!important}.mh-sm-325px{max-height:325px!important}.mh-sm-350px{max-height:350px!important}.mh-sm-375px{max-height:375px!important}.mh-sm-400px{max-height:400px!important}.mh-sm-425px{max-height:425px!important}.mh-sm-450px{max-height:450px!important}.mh-sm-475px{max-height:475px!important}.mh-sm-500px{max-height:500px!important}.mh-sm-550px{max-height:550px!important}.mh-sm-600px{max-height:600px!important}.mh-sm-650px{max-height:650px!important}.mh-sm-700px{max-height:700px!important}.mh-sm-750px{max-height:750px!important}.mh-sm-800px{max-height:800px!important}.mh-sm-850px{max-height:850px!important}.mh-sm-900px{max-height:900px!important}.mh-sm-950px{max-height:950px!important}.mh-sm-1000px{max-height:1000px!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:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:.75rem!important}.m-sm-4{margin:1rem!important}.m-sm-5{margin:1.25rem!important}.m-sm-6{margin:1.5rem!important}.m-sm-7{margin:1.75rem!important}.m-sm-8{margin:2rem!important}.m-sm-9{margin:2.25rem!important}.m-sm-10{margin:2.5rem!important}.m-sm-11{margin:2.75rem!important}.m-sm-12{margin:3rem!important}.m-sm-13{margin:3.25rem!important}.m-sm-14{margin:3.5rem!important}.m-sm-15{margin:3.75rem!important}.m-sm-16{margin:4rem!important}.m-sm-17{margin:4.25rem!important}.m-sm-18{margin:4.5rem!important}.m-sm-19{margin:4.75rem!important}.m-sm-20{margin:5rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:.75rem!important;margin-left:.75rem!important}.mx-sm-4{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-5{margin-right:1.25rem!important;margin-left:1.25rem!important}.mx-sm-6{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-7{margin-right:1.75rem!important;margin-left:1.75rem!important}.mx-sm-8{margin-right:2rem!important;margin-left:2rem!important}.mx-sm-9{margin-right:2.25rem!important;margin-left:2.25rem!important}.mx-sm-10{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-sm-11{margin-right:2.75rem!important;margin-left:2.75rem!important}.mx-sm-12{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-13{margin-right:3.25rem!important;margin-left:3.25rem!important}.mx-sm-14{margin-right:3.5rem!important;margin-left:3.5rem!important}.mx-sm-15{margin-right:3.75rem!important;margin-left:3.75rem!important}.mx-sm-16{margin-right:4rem!important;margin-left:4rem!important}.mx-sm-17{margin-right:4.25rem!important;margin-left:4.25rem!important}.mx-sm-18{margin-right:4.5rem!important;margin-left:4.5rem!important}.mx-sm-19{margin-right:4.75rem!important;margin-left:4.75rem!important}.mx-sm-20{margin-right:5rem!important;margin-left:5rem!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:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.my-sm-4{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-5{margin-top:1.25rem!important;margin-bottom:1.25rem!important}.my-sm-6{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-7{margin-top:1.75rem!important;margin-bottom:1.75rem!important}.my-sm-8{margin-top:2rem!important;margin-bottom:2rem!important}.my-sm-9{margin-top:2.25rem!important;margin-bottom:2.25rem!important}.my-sm-10{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-sm-11{margin-top:2.75rem!important;margin-bottom:2.75rem!important}.my-sm-12{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-13{margin-top:3.25rem!important;margin-bottom:3.25rem!important}.my-sm-14{margin-top:3.5rem!important;margin-bottom:3.5rem!important}.my-sm-15{margin-top:3.75rem!important;margin-bottom:3.75rem!important}.my-sm-16{margin-top:4rem!important;margin-bottom:4rem!important}.my-sm-17{margin-top:4.25rem!important;margin-bottom:4.25rem!important}.my-sm-18{margin-top:4.5rem!important;margin-bottom:4.5rem!important}.my-sm-19{margin-top:4.75rem!important;margin-bottom:4.75rem!important}.my-sm-20{margin-top:5rem!important;margin-bottom:5rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:.75rem!important}.mt-sm-4{margin-top:1rem!important}.mt-sm-5{margin-top:1.25rem!important}.mt-sm-6{margin-top:1.5rem!important}.mt-sm-7{margin-top:1.75rem!important}.mt-sm-8{margin-top:2rem!important}.mt-sm-9{margin-top:2.25rem!important}.mt-sm-10{margin-top:2.5rem!important}.mt-sm-11{margin-top:2.75rem!important}.mt-sm-12{margin-top:3rem!important}.mt-sm-13{margin-top:3.25rem!important}.mt-sm-14{margin-top:3.5rem!important}.mt-sm-15{margin-top:3.75rem!important}.mt-sm-16{margin-top:4rem!important}.mt-sm-17{margin-top:4.25rem!important}.mt-sm-18{margin-top:4.5rem!important}.mt-sm-19{margin-top:4.75rem!important}.mt-sm-20{margin-top:5rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:.75rem!important}.me-sm-4{margin-right:1rem!important}.me-sm-5{margin-right:1.25rem!important}.me-sm-6{margin-right:1.5rem!important}.me-sm-7{margin-right:1.75rem!important}.me-sm-8{margin-right:2rem!important}.me-sm-9{margin-right:2.25rem!important}.me-sm-10{margin-right:2.5rem!important}.me-sm-11{margin-right:2.75rem!important}.me-sm-12{margin-right:3rem!important}.me-sm-13{margin-right:3.25rem!important}.me-sm-14{margin-right:3.5rem!important}.me-sm-15{margin-right:3.75rem!important}.me-sm-16{margin-right:4rem!important}.me-sm-17{margin-right:4.25rem!important}.me-sm-18{margin-right:4.5rem!important}.me-sm-19{margin-right:4.75rem!important}.me-sm-20{margin-right:5rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:.75rem!important}.mb-sm-4{margin-bottom:1rem!important}.mb-sm-5{margin-bottom:1.25rem!important}.mb-sm-6{margin-bottom:1.5rem!important}.mb-sm-7{margin-bottom:1.75rem!important}.mb-sm-8{margin-bottom:2rem!important}.mb-sm-9{margin-bottom:2.25rem!important}.mb-sm-10{margin-bottom:2.5rem!important}.mb-sm-11{margin-bottom:2.75rem!important}.mb-sm-12{margin-bottom:3rem!important}.mb-sm-13{margin-bottom:3.25rem!important}.mb-sm-14{margin-bottom:3.5rem!important}.mb-sm-15{margin-bottom:3.75rem!important}.mb-sm-16{margin-bottom:4rem!important}.mb-sm-17{margin-bottom:4.25rem!important}.mb-sm-18{margin-bottom:4.5rem!important}.mb-sm-19{margin-bottom:4.75rem!important}.mb-sm-20{margin-bottom:5rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:.75rem!important}.ms-sm-4{margin-left:1rem!important}.ms-sm-5{margin-left:1.25rem!important}.ms-sm-6{margin-left:1.5rem!important}.ms-sm-7{margin-left:1.75rem!important}.ms-sm-8{margin-left:2rem!important}.ms-sm-9{margin-left:2.25rem!important}.ms-sm-10{margin-left:2.5rem!important}.ms-sm-11{margin-left:2.75rem!important}.ms-sm-12{margin-left:3rem!important}.ms-sm-13{margin-left:3.25rem!important}.ms-sm-14{margin-left:3.5rem!important}.ms-sm-15{margin-left:3.75rem!important}.ms-sm-16{margin-left:4rem!important}.ms-sm-17{margin-left:4.25rem!important}.ms-sm-18{margin-left:4.5rem!important}.ms-sm-19{margin-left:4.75rem!important}.ms-sm-20{margin-left:5rem!important}.ms-sm-auto{margin-left:auto!important}.m-sm-n1{margin:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.m-sm-n3{margin:-.75rem!important}.m-sm-n4{margin:-1rem!important}.m-sm-n5{margin:-1.25rem!important}.m-sm-n6{margin:-1.5rem!important}.m-sm-n7{margin:-1.75rem!important}.m-sm-n8{margin:-2rem!important}.m-sm-n9{margin:-2.25rem!important}.m-sm-n10{margin:-2.5rem!important}.m-sm-n11{margin:-2.75rem!important}.m-sm-n12{margin:-3rem!important}.m-sm-n13{margin:-3.25rem!important}.m-sm-n14{margin:-3.5rem!important}.m-sm-n15{margin:-3.75rem!important}.m-sm-n16{margin:-4rem!important}.m-sm-n17{margin:-4.25rem!important}.m-sm-n18{margin:-4.5rem!important}.m-sm-n19{margin:-4.75rem!important}.m-sm-n20{margin:-5rem!important}.mx-sm-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-sm-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-sm-n3{margin-right:-.75rem!important;margin-left:-.75rem!important}.mx-sm-n4{margin-right:-1rem!important;margin-left:-1rem!important}.mx-sm-n5{margin-right:-1.25rem!important;margin-left:-1.25rem!important}.mx-sm-n6{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-sm-n7{margin-right:-1.75rem!important;margin-left:-1.75rem!important}.mx-sm-n8{margin-right:-2rem!important;margin-left:-2rem!important}.mx-sm-n9{margin-right:-2.25rem!important;margin-left:-2.25rem!important}.mx-sm-n10{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.mx-sm-n11{margin-right:-2.75rem!important;margin-left:-2.75rem!important}.mx-sm-n12{margin-right:-3rem!important;margin-left:-3rem!important}.mx-sm-n13{margin-right:-3.25rem!important;margin-left:-3.25rem!important}.mx-sm-n14{margin-right:-3.5rem!important;margin-left:-3.5rem!important}.mx-sm-n15{margin-right:-3.75rem!important;margin-left:-3.75rem!important}.mx-sm-n16{margin-right:-4rem!important;margin-left:-4rem!important}.mx-sm-n17{margin-right:-4.25rem!important;margin-left:-4.25rem!important}.mx-sm-n18{margin-right:-4.5rem!important;margin-left:-4.5rem!important}.mx-sm-n19{margin-right:-4.75rem!important;margin-left:-4.75rem!important}.mx-sm-n20{margin-right:-5rem!important;margin-left:-5rem!important}.my-sm-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-sm-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-sm-n3{margin-top:-.75rem!important;margin-bottom:-.75rem!important}.my-sm-n4{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-sm-n5{margin-top:-1.25rem!important;margin-bottom:-1.25rem!important}.my-sm-n6{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-sm-n7{margin-top:-1.75rem!important;margin-bottom:-1.75rem!important}.my-sm-n8{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-sm-n9{margin-top:-2.25rem!important;margin-bottom:-2.25rem!important}.my-sm-n10{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.my-sm-n11{margin-top:-2.75rem!important;margin-bottom:-2.75rem!important}.my-sm-n12{margin-top:-3rem!important;margin-bottom:-3rem!important}.my-sm-n13{margin-top:-3.25rem!important;margin-bottom:-3.25rem!important}.my-sm-n14{margin-top:-3.5rem!important;margin-bottom:-3.5rem!important}.my-sm-n15{margin-top:-3.75rem!important;margin-bottom:-3.75rem!important}.my-sm-n16{margin-top:-4rem!important;margin-bottom:-4rem!important}.my-sm-n17{margin-top:-4.25rem!important;margin-bottom:-4.25rem!important}.my-sm-n18{margin-top:-4.5rem!important;margin-bottom:-4.5rem!important}.my-sm-n19{margin-top:-4.75rem!important;margin-bottom:-4.75rem!important}.my-sm-n20{margin-top:-5rem!important;margin-bottom:-5rem!important}.mt-sm-n1{margin-top:-.25rem!important}.mt-sm-n2{margin-top:-.5rem!important}.mt-sm-n3{margin-top:-.75rem!important}.mt-sm-n4{margin-top:-1rem!important}.mt-sm-n5{margin-top:-1.25rem!important}.mt-sm-n6{margin-top:-1.5rem!important}.mt-sm-n7{margin-top:-1.75rem!important}.mt-sm-n8{margin-top:-2rem!important}.mt-sm-n9{margin-top:-2.25rem!important}.mt-sm-n10{margin-top:-2.5rem!important}.mt-sm-n11{margin-top:-2.75rem!important}.mt-sm-n12{margin-top:-3rem!important}.mt-sm-n13{margin-top:-3.25rem!important}.mt-sm-n14{margin-top:-3.5rem!important}.mt-sm-n15{margin-top:-3.75rem!important}.mt-sm-n16{margin-top:-4rem!important}.mt-sm-n17{margin-top:-4.25rem!important}.mt-sm-n18{margin-top:-4.5rem!important}.mt-sm-n19{margin-top:-4.75rem!important}.mt-sm-n20{margin-top:-5rem!important}.me-sm-n1{margin-right:-.25rem!important}.me-sm-n2{margin-right:-.5rem!important}.me-sm-n3{margin-right:-.75rem!important}.me-sm-n4{margin-right:-1rem!important}.me-sm-n5{margin-right:-1.25rem!important}.me-sm-n6{margin-right:-1.5rem!important}.me-sm-n7{margin-right:-1.75rem!important}.me-sm-n8{margin-right:-2rem!important}.me-sm-n9{margin-right:-2.25rem!important}.me-sm-n10{margin-right:-2.5rem!important}.me-sm-n11{margin-right:-2.75rem!important}.me-sm-n12{margin-right:-3rem!important}.me-sm-n13{margin-right:-3.25rem!important}.me-sm-n14{margin-right:-3.5rem!important}.me-sm-n15{margin-right:-3.75rem!important}.me-sm-n16{margin-right:-4rem!important}.me-sm-n17{margin-right:-4.25rem!important}.me-sm-n18{margin-right:-4.5rem!important}.me-sm-n19{margin-right:-4.75rem!important}.me-sm-n20{margin-right:-5rem!important}.mb-sm-n1{margin-bottom:-.25rem!important}.mb-sm-n2{margin-bottom:-.5rem!important}.mb-sm-n3{margin-bottom:-.75rem!important}.mb-sm-n4{margin-bottom:-1rem!important}.mb-sm-n5{margin-bottom:-1.25rem!important}.mb-sm-n6{margin-bottom:-1.5rem!important}.mb-sm-n7{margin-bottom:-1.75rem!important}.mb-sm-n8{margin-bottom:-2rem!important}.mb-sm-n9{margin-bottom:-2.25rem!important}.mb-sm-n10{margin-bottom:-2.5rem!important}.mb-sm-n11{margin-bottom:-2.75rem!important}.mb-sm-n12{margin-bottom:-3rem!important}.mb-sm-n13{margin-bottom:-3.25rem!important}.mb-sm-n14{margin-bottom:-3.5rem!important}.mb-sm-n15{margin-bottom:-3.75rem!important}.mb-sm-n16{margin-bottom:-4rem!important}.mb-sm-n17{margin-bottom:-4.25rem!important}.mb-sm-n18{margin-bottom:-4.5rem!important}.mb-sm-n19{margin-bottom:-4.75rem!important}.mb-sm-n20{margin-bottom:-5rem!important}.ms-sm-n1{margin-left:-.25rem!important}.ms-sm-n2{margin-left:-.5rem!important}.ms-sm-n3{margin-left:-.75rem!important}.ms-sm-n4{margin-left:-1rem!important}.ms-sm-n5{margin-left:-1.25rem!important}.ms-sm-n6{margin-left:-1.5rem!important}.ms-sm-n7{margin-left:-1.75rem!important}.ms-sm-n8{margin-left:-2rem!important}.ms-sm-n9{margin-left:-2.25rem!important}.ms-sm-n10{margin-left:-2.5rem!important}.ms-sm-n11{margin-left:-2.75rem!important}.ms-sm-n12{margin-left:-3rem!important}.ms-sm-n13{margin-left:-3.25rem!important}.ms-sm-n14{margin-left:-3.5rem!important}.ms-sm-n15{margin-left:-3.75rem!important}.ms-sm-n16{margin-left:-4rem!important}.ms-sm-n17{margin-left:-4.25rem!important}.ms-sm-n18{margin-left:-4.5rem!important}.ms-sm-n19{margin-left:-4.75rem!important}.ms-sm-n20{margin-left:-5rem!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:.75rem!important}.p-sm-4{padding:1rem!important}.p-sm-5{padding:1.25rem!important}.p-sm-6{padding:1.5rem!important}.p-sm-7{padding:1.75rem!important}.p-sm-8{padding:2rem!important}.p-sm-9{padding:2.25rem!important}.p-sm-10{padding:2.5rem!important}.p-sm-11{padding:2.75rem!important}.p-sm-12{padding:3rem!important}.p-sm-13{padding:3.25rem!important}.p-sm-14{padding:3.5rem!important}.p-sm-15{padding:3.75rem!important}.p-sm-16{padding:4rem!important}.p-sm-17{padding:4.25rem!important}.p-sm-18{padding:4.5rem!important}.p-sm-19{padding:4.75rem!important}.p-sm-20{padding:5rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:.75rem!important;padding-left:.75rem!important}.px-sm-4{padding-right:1rem!important;padding-left:1rem!important}.px-sm-5{padding-right:1.25rem!important;padding-left:1.25rem!important}.px-sm-6{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-7{padding-right:1.75rem!important;padding-left:1.75rem!important}.px-sm-8{padding-right:2rem!important;padding-left:2rem!important}.px-sm-9{padding-right:2.25rem!important;padding-left:2.25rem!important}.px-sm-10{padding-right:2.5rem!important;padding-left:2.5rem!important}.px-sm-11{padding-right:2.75rem!important;padding-left:2.75rem!important}.px-sm-12{padding-right:3rem!important;padding-left:3rem!important}.px-sm-13{padding-right:3.25rem!important;padding-left:3.25rem!important}.px-sm-14{padding-right:3.5rem!important;padding-left:3.5rem!important}.px-sm-15{padding-right:3.75rem!important;padding-left:3.75rem!important}.px-sm-16{padding-right:4rem!important;padding-left:4rem!important}.px-sm-17{padding-right:4.25rem!important;padding-left:4.25rem!important}.px-sm-18{padding-right:4.5rem!important;padding-left:4.5rem!important}.px-sm-19{padding-right:4.75rem!important;padding-left:4.75rem!important}.px-sm-20{padding-right:5rem!important;padding-left:5rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.py-sm-4{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-5{padding-top:1.25rem!important;padding-bottom:1.25rem!important}.py-sm-6{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-7{padding-top:1.75rem!important;padding-bottom:1.75rem!important}.py-sm-8{padding-top:2rem!important;padding-bottom:2rem!important}.py-sm-9{padding-top:2.25rem!important;padding-bottom:2.25rem!important}.py-sm-10{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.py-sm-11{padding-top:2.75rem!important;padding-bottom:2.75rem!important}.py-sm-12{padding-top:3rem!important;padding-bottom:3rem!important}.py-sm-13{padding-top:3.25rem!important;padding-bottom:3.25rem!important}.py-sm-14{padding-top:3.5rem!important;padding-bottom:3.5rem!important}.py-sm-15{padding-top:3.75rem!important;padding-bottom:3.75rem!important}.py-sm-16{padding-top:4rem!important;padding-bottom:4rem!important}.py-sm-17{padding-top:4.25rem!important;padding-bottom:4.25rem!important}.py-sm-18{padding-top:4.5rem!important;padding-bottom:4.5rem!important}.py-sm-19{padding-top:4.75rem!important;padding-bottom:4.75rem!important}.py-sm-20{padding-top:5rem!important;padding-bottom:5rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:.75rem!important}.pt-sm-4{padding-top:1rem!important}.pt-sm-5{padding-top:1.25rem!important}.pt-sm-6{padding-top:1.5rem!important}.pt-sm-7{padding-top:1.75rem!important}.pt-sm-8{padding-top:2rem!important}.pt-sm-9{padding-top:2.25rem!important}.pt-sm-10{padding-top:2.5rem!important}.pt-sm-11{padding-top:2.75rem!important}.pt-sm-12{padding-top:3rem!important}.pt-sm-13{padding-top:3.25rem!important}.pt-sm-14{padding-top:3.5rem!important}.pt-sm-15{padding-top:3.75rem!important}.pt-sm-16{padding-top:4rem!important}.pt-sm-17{padding-top:4.25rem!important}.pt-sm-18{padding-top:4.5rem!important}.pt-sm-19{padding-top:4.75rem!important}.pt-sm-20{padding-top:5rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:.75rem!important}.pe-sm-4{padding-right:1rem!important}.pe-sm-5{padding-right:1.25rem!important}.pe-sm-6{padding-right:1.5rem!important}.pe-sm-7{padding-right:1.75rem!important}.pe-sm-8{padding-right:2rem!important}.pe-sm-9{padding-right:2.25rem!important}.pe-sm-10{padding-right:2.5rem!important}.pe-sm-11{padding-right:2.75rem!important}.pe-sm-12{padding-right:3rem!important}.pe-sm-13{padding-right:3.25rem!important}.pe-sm-14{padding-right:3.5rem!important}.pe-sm-15{padding-right:3.75rem!important}.pe-sm-16{padding-right:4rem!important}.pe-sm-17{padding-right:4.25rem!important}.pe-sm-18{padding-right:4.5rem!important}.pe-sm-19{padding-right:4.75rem!important}.pe-sm-20{padding-right:5rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:.75rem!important}.pb-sm-4{padding-bottom:1rem!important}.pb-sm-5{padding-bottom:1.25rem!important}.pb-sm-6{padding-bottom:1.5rem!important}.pb-sm-7{padding-bottom:1.75rem!important}.pb-sm-8{padding-bottom:2rem!important}.pb-sm-9{padding-bottom:2.25rem!important}.pb-sm-10{padding-bottom:2.5rem!important}.pb-sm-11{padding-bottom:2.75rem!important}.pb-sm-12{padding-bottom:3rem!important}.pb-sm-13{padding-bottom:3.25rem!important}.pb-sm-14{padding-bottom:3.5rem!important}.pb-sm-15{padding-bottom:3.75rem!important}.pb-sm-16{padding-bottom:4rem!important}.pb-sm-17{padding-bottom:4.25rem!important}.pb-sm-18{padding-bottom:4.5rem!important}.pb-sm-19{padding-bottom:4.75rem!important}.pb-sm-20{padding-bottom:5rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:.75rem!important}.ps-sm-4{padding-left:1rem!important}.ps-sm-5{padding-left:1.25rem!important}.ps-sm-6{padding-left:1.5rem!important}.ps-sm-7{padding-left:1.75rem!important}.ps-sm-8{padding-left:2rem!important}.ps-sm-9{padding-left:2.25rem!important}.ps-sm-10{padding-left:2.5rem!important}.ps-sm-11{padding-left:2.75rem!important}.ps-sm-12{padding-left:3rem!important}.ps-sm-13{padding-left:3.25rem!important}.ps-sm-14{padding-left:3.5rem!important}.ps-sm-15{padding-left:3.75rem!important}.ps-sm-16{padding-left:4rem!important}.ps-sm-17{padding-left:4.25rem!important}.ps-sm-18{padding-left:4.5rem!important}.ps-sm-19{padding-left:4.75rem!important}.ps-sm-20{padding-left:5rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:.75rem!important}.gap-sm-4{gap:1rem!important}.gap-sm-5{gap:1.25rem!important}.gap-sm-6{gap:1.5rem!important}.gap-sm-7{gap:1.75rem!important}.gap-sm-8{gap:2rem!important}.gap-sm-9{gap:2.25rem!important}.gap-sm-10{gap:2.5rem!important}.gap-sm-11{gap:2.75rem!important}.gap-sm-12{gap:3rem!important}.gap-sm-13{gap:3.25rem!important}.gap-sm-14{gap:3.5rem!important}.gap-sm-15{gap:3.75rem!important}.gap-sm-16{gap:4rem!important}.gap-sm-17{gap:4.25rem!important}.gap-sm-18{gap:4.5rem!important}.gap-sm-19{gap:4.75rem!important}.gap-sm-20{gap:5rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:.75rem!important}.row-gap-sm-4{row-gap:1rem!important}.row-gap-sm-5{row-gap:1.25rem!important}.row-gap-sm-6{row-gap:1.5rem!important}.row-gap-sm-7{row-gap:1.75rem!important}.row-gap-sm-8{row-gap:2rem!important}.row-gap-sm-9{row-gap:2.25rem!important}.row-gap-sm-10{row-gap:2.5rem!important}.row-gap-sm-11{row-gap:2.75rem!important}.row-gap-sm-12{row-gap:3rem!important}.row-gap-sm-13{row-gap:3.25rem!important}.row-gap-sm-14{row-gap:3.5rem!important}.row-gap-sm-15{row-gap:3.75rem!important}.row-gap-sm-16{row-gap:4rem!important}.row-gap-sm-17{row-gap:4.25rem!important}.row-gap-sm-18{row-gap:4.5rem!important}.row-gap-sm-19{row-gap:4.75rem!important}.row-gap-sm-20{row-gap:5rem!important}.column-gap-sm-0{column-gap:0!important}.column-gap-sm-1{column-gap:.25rem!important}.column-gap-sm-2{column-gap:.5rem!important}.column-gap-sm-3{column-gap:.75rem!important}.column-gap-sm-4{column-gap:1rem!important}.column-gap-sm-5{column-gap:1.25rem!important}.column-gap-sm-6{column-gap:1.5rem!important}.column-gap-sm-7{column-gap:1.75rem!important}.column-gap-sm-8{column-gap:2rem!important}.column-gap-sm-9{column-gap:2.25rem!important}.column-gap-sm-10{column-gap:2.5rem!important}.column-gap-sm-11{column-gap:2.75rem!important}.column-gap-sm-12{column-gap:3rem!important}.column-gap-sm-13{column-gap:3.25rem!important}.column-gap-sm-14{column-gap:3.5rem!important}.column-gap-sm-15{column-gap:3.75rem!important}.column-gap-sm-16{column-gap:4rem!important}.column-gap-sm-17{column-gap:4.25rem!important}.column-gap-sm-18{column-gap:4.5rem!important}.column-gap-sm-19{column-gap:4.75rem!important}.column-gap-sm-20{column-gap:5rem!important}.fs-sm-1{font-size:calc(1.3rem + .6vw)!important}.fs-sm-2{font-size:calc(1.275rem + .3vw)!important}.fs-sm-3{font-size:calc(1.26rem + .12vw)!important}.fs-sm-4{font-size:1.25rem!important}.fs-sm-5{font-size:1.15rem!important}.fs-sm-6{font-size:1.075rem!important}.fs-sm-7{font-size:.95rem!important}.fs-sm-8{font-size:.85rem!important}.fs-sm-9{font-size:.75rem!important}.fs-sm-10{font-size:.5rem!important}.fs-sm-sm{font-size:.95rem!important}.fs-sm-base{font-size:1rem!important}.fs-sm-lg{font-size:1.075rem!important}.fs-sm-xl{font-size:1.21rem!important}.fs-sm-fluid{font-size:100%!important}.fs-sm-2x{font-size:calc(1.325rem + .9vw)!important}.fs-sm-2qx{font-size:calc(1.35rem + 1.2vw)!important}.fs-sm-2hx{font-size:calc(1.375rem + 1.5vw)!important}.fs-sm-2tx{font-size:calc(1.4rem + 1.8vw)!important}.fs-sm-3x{font-size:calc(1.425rem + 2.1vw)!important}.fs-sm-3qx{font-size:calc(1.45rem + 2.4vw)!important}.fs-sm-3hx{font-size:calc(1.475rem + 2.7vw)!important}.fs-sm-3tx{font-size:calc(1.5rem + 3vw)!important}.fs-sm-4x{font-size:calc(1.525rem + 3.3vw)!important}.fs-sm-4qx{font-size:calc(1.55rem + 3.6vw)!important}.fs-sm-4hx{font-size:calc(1.575rem + 3.9vw)!important}.fs-sm-4tx{font-size:calc(1.6rem + 4.2vw)!important}.fs-sm-5x{font-size:calc(1.625rem + 4.5vw)!important}.fs-sm-5qx{font-size:calc(1.65rem + 4.8vw)!important}.fs-sm-5hx{font-size:calc(1.675rem + 5.1vw)!important}.fs-sm-5tx{font-size:calc(1.7rem + 5.4vw)!important}.fs-sm-6x{font-size:calc(1.725rem + 5.7vw)!important}.fs-sm-6qx{font-size:calc(1.75rem + 6vw)!important}.fs-sm-6hx{font-size:calc(1.775rem + 6.3vw)!important}.fs-sm-6tx{font-size:calc(1.8rem + 6.6vw)!important}.fs-sm-7x{font-size:calc(1.825rem + 6.9vw)!important}.fs-sm-7qx{font-size:calc(1.85rem + 7.2vw)!important}.fs-sm-7hx{font-size:calc(1.875rem + 7.5vw)!important}.fs-sm-7tx{font-size:calc(1.9rem + 7.8vw)!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}.min-w-sm-unset{min-width:unset!important}.min-w-sm-25{min-width:25%!important}.min-w-sm-50{min-width:50%!important}.min-w-sm-75{min-width:75%!important}.min-w-sm-100{min-width:100%!important}.min-w-sm-auto{min-width:auto!important}.min-w-sm-1px{min-width:1px!important}.min-w-sm-2px{min-width:2px!important}.min-w-sm-3px{min-width:3px!important}.min-w-sm-4px{min-width:4px!important}.min-w-sm-5px{min-width:5px!important}.min-w-sm-6px{min-width:6px!important}.min-w-sm-7px{min-width:7px!important}.min-w-sm-8px{min-width:8px!important}.min-w-sm-9px{min-width:9px!important}.min-w-sm-10px{min-width:10px!important}.min-w-sm-15px{min-width:15px!important}.min-w-sm-20px{min-width:20px!important}.min-w-sm-25px{min-width:25px!important}.min-w-sm-30px{min-width:30px!important}.min-w-sm-35px{min-width:35px!important}.min-w-sm-40px{min-width:40px!important}.min-w-sm-45px{min-width:45px!important}.min-w-sm-50px{min-width:50px!important}.min-w-sm-55px{min-width:55px!important}.min-w-sm-60px{min-width:60px!important}.min-w-sm-65px{min-width:65px!important}.min-w-sm-70px{min-width:70px!important}.min-w-sm-75px{min-width:75px!important}.min-w-sm-80px{min-width:80px!important}.min-w-sm-85px{min-width:85px!important}.min-w-sm-90px{min-width:90px!important}.min-w-sm-95px{min-width:95px!important}.min-w-sm-100px{min-width:100px!important}.min-w-sm-125px{min-width:125px!important}.min-w-sm-150px{min-width:150px!important}.min-w-sm-175px{min-width:175px!important}.min-w-sm-200px{min-width:200px!important}.min-w-sm-225px{min-width:225px!important}.min-w-sm-250px{min-width:250px!important}.min-w-sm-275px{min-width:275px!important}.min-w-sm-300px{min-width:300px!important}.min-w-sm-325px{min-width:325px!important}.min-w-sm-350px{min-width:350px!important}.min-w-sm-375px{min-width:375px!important}.min-w-sm-400px{min-width:400px!important}.min-w-sm-425px{min-width:425px!important}.min-w-sm-450px{min-width:450px!important}.min-w-sm-475px{min-width:475px!important}.min-w-sm-500px{min-width:500px!important}.min-w-sm-550px{min-width:550px!important}.min-w-sm-600px{min-width:600px!important}.min-w-sm-650px{min-width:650px!important}.min-w-sm-700px{min-width:700px!important}.min-w-sm-750px{min-width:750px!important}.min-w-sm-800px{min-width:800px!important}.min-w-sm-850px{min-width:850px!important}.min-w-sm-900px{min-width:900px!important}.min-w-sm-950px{min-width:950px!important}.min-w-sm-1000px{min-width:1000px!important}.min-h-sm-unset{min-height:unset!important}.min-h-sm-25{min-height:25%!important}.min-h-sm-50{min-height:50%!important}.min-h-sm-75{min-height:75%!important}.min-h-sm-100{min-height:100%!important}.min-h-sm-auto{min-height:auto!important}.min-h-sm-1px{min-height:1px!important}.min-h-sm-2px{min-height:2px!important}.min-h-sm-3px{min-height:3px!important}.min-h-sm-4px{min-height:4px!important}.min-h-sm-5px{min-height:5px!important}.min-h-sm-6px{min-height:6px!important}.min-h-sm-7px{min-height:7px!important}.min-h-sm-8px{min-height:8px!important}.min-h-sm-9px{min-height:9px!important}.min-h-sm-10px{min-height:10px!important}.min-h-sm-15px{min-height:15px!important}.min-h-sm-20px{min-height:20px!important}.min-h-sm-25px{min-height:25px!important}.min-h-sm-30px{min-height:30px!important}.min-h-sm-35px{min-height:35px!important}.min-h-sm-40px{min-height:40px!important}.min-h-sm-45px{min-height:45px!important}.min-h-sm-50px{min-height:50px!important}.min-h-sm-55px{min-height:55px!important}.min-h-sm-60px{min-height:60px!important}.min-h-sm-65px{min-height:65px!important}.min-h-sm-70px{min-height:70px!important}.min-h-sm-75px{min-height:75px!important}.min-h-sm-80px{min-height:80px!important}.min-h-sm-85px{min-height:85px!important}.min-h-sm-90px{min-height:90px!important}.min-h-sm-95px{min-height:95px!important}.min-h-sm-100px{min-height:100px!important}.min-h-sm-125px{min-height:125px!important}.min-h-sm-150px{min-height:150px!important}.min-h-sm-175px{min-height:175px!important}.min-h-sm-200px{min-height:200px!important}.min-h-sm-225px{min-height:225px!important}.min-h-sm-250px{min-height:250px!important}.min-h-sm-275px{min-height:275px!important}.min-h-sm-300px{min-height:300px!important}.min-h-sm-325px{min-height:325px!important}.min-h-sm-350px{min-height:350px!important}.min-h-sm-375px{min-height:375px!important}.min-h-sm-400px{min-height:400px!important}.min-h-sm-425px{min-height:425px!important}.min-h-sm-450px{min-height:450px!important}.min-h-sm-475px{min-height:475px!important}.min-h-sm-500px{min-height:500px!important}.min-h-sm-550px{min-height:550px!important}.min-h-sm-600px{min-height:600px!important}.min-h-sm-650px{min-height:650px!important}.min-h-sm-700px{min-height:700px!important}.min-h-sm-750px{min-height:750px!important}.min-h-sm-800px{min-height:800px!important}.min-h-sm-850px{min-height:850px!important}.min-h-sm-900px{min-height:900px!important}.min-h-sm-950px{min-height:950px!important}.min-h-sm-1000px{min-height:1000px!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{object-fit:contain!important}.object-fit-md-cover{object-fit:cover!important}.object-fit-md-fill{object-fit:fill!important}.object-fit-md-scale{object-fit:scale-down!important}.object-fit-md-none{object-fit:none!important}.overflow-md-auto{overflow:auto!important}.overflow-md-hidden{overflow:hidden!important}.overflow-md-visible{overflow:visible!important}.overflow-md-scroll{overflow:scroll!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}.position-md-static{position:static!important}.position-md-relative{position:relative!important}.position-md-absolute{position:absolute!important}.position-md-fixed{position:fixed!important}.position-md-sticky{position:sticky!important}.w-md-unset{width:unset!important}.w-md-25{width:25%!important}.w-md-50{width:50%!important}.w-md-75{width:75%!important}.w-md-100{width:100%!important}.w-md-auto{width:auto!important}.w-md-1px{width:1px!important}.w-md-2px{width:2px!important}.w-md-3px{width:3px!important}.w-md-4px{width:4px!important}.w-md-5px{width:5px!important}.w-md-6px{width:6px!important}.w-md-7px{width:7px!important}.w-md-8px{width:8px!important}.w-md-9px{width:9px!important}.w-md-10px{width:10px!important}.w-md-15px{width:15px!important}.w-md-20px{width:20px!important}.w-md-25px{width:25px!important}.w-md-30px{width:30px!important}.w-md-35px{width:35px!important}.w-md-40px{width:40px!important}.w-md-45px{width:45px!important}.w-md-50px{width:50px!important}.w-md-55px{width:55px!important}.w-md-60px{width:60px!important}.w-md-65px{width:65px!important}.w-md-70px{width:70px!important}.w-md-75px{width:75px!important}.w-md-80px{width:80px!important}.w-md-85px{width:85px!important}.w-md-90px{width:90px!important}.w-md-95px{width:95px!important}.w-md-100px{width:100px!important}.w-md-125px{width:125px!important}.w-md-150px{width:150px!important}.w-md-175px{width:175px!important}.w-md-200px{width:200px!important}.w-md-225px{width:225px!important}.w-md-250px{width:250px!important}.w-md-275px{width:275px!important}.w-md-300px{width:300px!important}.w-md-325px{width:325px!important}.w-md-350px{width:350px!important}.w-md-375px{width:375px!important}.w-md-400px{width:400px!important}.w-md-425px{width:425px!important}.w-md-450px{width:450px!important}.w-md-475px{width:475px!important}.w-md-500px{width:500px!important}.w-md-550px{width:550px!important}.w-md-600px{width:600px!important}.w-md-650px{width:650px!important}.w-md-700px{width:700px!important}.w-md-750px{width:750px!important}.w-md-800px{width:800px!important}.w-md-850px{width:850px!important}.w-md-900px{width:900px!important}.w-md-950px{width:950px!important}.w-md-1000px{width:1000px!important}.mw-md-unset{max-width:unset!important}.mw-md-25{max-width:25%!important}.mw-md-50{max-width:50%!important}.mw-md-75{max-width:75%!important}.mw-md-100{max-width:100%!important}.mw-md-auto{max-width:auto!important}.mw-md-1px{max-width:1px!important}.mw-md-2px{max-width:2px!important}.mw-md-3px{max-width:3px!important}.mw-md-4px{max-width:4px!important}.mw-md-5px{max-width:5px!important}.mw-md-6px{max-width:6px!important}.mw-md-7px{max-width:7px!important}.mw-md-8px{max-width:8px!important}.mw-md-9px{max-width:9px!important}.mw-md-10px{max-width:10px!important}.mw-md-15px{max-width:15px!important}.mw-md-20px{max-width:20px!important}.mw-md-25px{max-width:25px!important}.mw-md-30px{max-width:30px!important}.mw-md-35px{max-width:35px!important}.mw-md-40px{max-width:40px!important}.mw-md-45px{max-width:45px!important}.mw-md-50px{max-width:50px!important}.mw-md-55px{max-width:55px!important}.mw-md-60px{max-width:60px!important}.mw-md-65px{max-width:65px!important}.mw-md-70px{max-width:70px!important}.mw-md-75px{max-width:75px!important}.mw-md-80px{max-width:80px!important}.mw-md-85px{max-width:85px!important}.mw-md-90px{max-width:90px!important}.mw-md-95px{max-width:95px!important}.mw-md-100px{max-width:100px!important}.mw-md-125px{max-width:125px!important}.mw-md-150px{max-width:150px!important}.mw-md-175px{max-width:175px!important}.mw-md-200px{max-width:200px!important}.mw-md-225px{max-width:225px!important}.mw-md-250px{max-width:250px!important}.mw-md-275px{max-width:275px!important}.mw-md-300px{max-width:300px!important}.mw-md-325px{max-width:325px!important}.mw-md-350px{max-width:350px!important}.mw-md-375px{max-width:375px!important}.mw-md-400px{max-width:400px!important}.mw-md-425px{max-width:425px!important}.mw-md-450px{max-width:450px!important}.mw-md-475px{max-width:475px!important}.mw-md-500px{max-width:500px!important}.mw-md-550px{max-width:550px!important}.mw-md-600px{max-width:600px!important}.mw-md-650px{max-width:650px!important}.mw-md-700px{max-width:700px!important}.mw-md-750px{max-width:750px!important}.mw-md-800px{max-width:800px!important}.mw-md-850px{max-width:850px!important}.mw-md-900px{max-width:900px!important}.mw-md-950px{max-width:950px!important}.mw-md-1000px{max-width:1000px!important}.h-md-unset{height:unset!important}.h-md-25{height:25%!important}.h-md-50{height:50%!important}.h-md-75{height:75%!important}.h-md-100{height:100%!important}.h-md-auto{height:auto!important}.h-md-1px{height:1px!important}.h-md-2px{height:2px!important}.h-md-3px{height:3px!important}.h-md-4px{height:4px!important}.h-md-5px{height:5px!important}.h-md-6px{height:6px!important}.h-md-7px{height:7px!important}.h-md-8px{height:8px!important}.h-md-9px{height:9px!important}.h-md-10px{height:10px!important}.h-md-15px{height:15px!important}.h-md-20px{height:20px!important}.h-md-25px{height:25px!important}.h-md-30px{height:30px!important}.h-md-35px{height:35px!important}.h-md-40px{height:40px!important}.h-md-45px{height:45px!important}.h-md-50px{height:50px!important}.h-md-55px{height:55px!important}.h-md-60px{height:60px!important}.h-md-65px{height:65px!important}.h-md-70px{height:70px!important}.h-md-75px{height:75px!important}.h-md-80px{height:80px!important}.h-md-85px{height:85px!important}.h-md-90px{height:90px!important}.h-md-95px{height:95px!important}.h-md-100px{height:100px!important}.h-md-125px{height:125px!important}.h-md-150px{height:150px!important}.h-md-175px{height:175px!important}.h-md-200px{height:200px!important}.h-md-225px{height:225px!important}.h-md-250px{height:250px!important}.h-md-275px{height:275px!important}.h-md-300px{height:300px!important}.h-md-325px{height:325px!important}.h-md-350px{height:350px!important}.h-md-375px{height:375px!important}.h-md-400px{height:400px!important}.h-md-425px{height:425px!important}.h-md-450px{height:450px!important}.h-md-475px{height:475px!important}.h-md-500px{height:500px!important}.h-md-550px{height:550px!important}.h-md-600px{height:600px!important}.h-md-650px{height:650px!important}.h-md-700px{height:700px!important}.h-md-750px{height:750px!important}.h-md-800px{height:800px!important}.h-md-850px{height:850px!important}.h-md-900px{height:900px!important}.h-md-950px{height:950px!important}.h-md-1000px{height:1000px!important}.mh-md-unset{max-height:unset!important}.mh-md-25{max-height:25%!important}.mh-md-50{max-height:50%!important}.mh-md-75{max-height:75%!important}.mh-md-100{max-height:100%!important}.mh-md-auto{max-height:auto!important}.mh-md-1px{max-height:1px!important}.mh-md-2px{max-height:2px!important}.mh-md-3px{max-height:3px!important}.mh-md-4px{max-height:4px!important}.mh-md-5px{max-height:5px!important}.mh-md-6px{max-height:6px!important}.mh-md-7px{max-height:7px!important}.mh-md-8px{max-height:8px!important}.mh-md-9px{max-height:9px!important}.mh-md-10px{max-height:10px!important}.mh-md-15px{max-height:15px!important}.mh-md-20px{max-height:20px!important}.mh-md-25px{max-height:25px!important}.mh-md-30px{max-height:30px!important}.mh-md-35px{max-height:35px!important}.mh-md-40px{max-height:40px!important}.mh-md-45px{max-height:45px!important}.mh-md-50px{max-height:50px!important}.mh-md-55px{max-height:55px!important}.mh-md-60px{max-height:60px!important}.mh-md-65px{max-height:65px!important}.mh-md-70px{max-height:70px!important}.mh-md-75px{max-height:75px!important}.mh-md-80px{max-height:80px!important}.mh-md-85px{max-height:85px!important}.mh-md-90px{max-height:90px!important}.mh-md-95px{max-height:95px!important}.mh-md-100px{max-height:100px!important}.mh-md-125px{max-height:125px!important}.mh-md-150px{max-height:150px!important}.mh-md-175px{max-height:175px!important}.mh-md-200px{max-height:200px!important}.mh-md-225px{max-height:225px!important}.mh-md-250px{max-height:250px!important}.mh-md-275px{max-height:275px!important}.mh-md-300px{max-height:300px!important}.mh-md-325px{max-height:325px!important}.mh-md-350px{max-height:350px!important}.mh-md-375px{max-height:375px!important}.mh-md-400px{max-height:400px!important}.mh-md-425px{max-height:425px!important}.mh-md-450px{max-height:450px!important}.mh-md-475px{max-height:475px!important}.mh-md-500px{max-height:500px!important}.mh-md-550px{max-height:550px!important}.mh-md-600px{max-height:600px!important}.mh-md-650px{max-height:650px!important}.mh-md-700px{max-height:700px!important}.mh-md-750px{max-height:750px!important}.mh-md-800px{max-height:800px!important}.mh-md-850px{max-height:850px!important}.mh-md-900px{max-height:900px!important}.mh-md-950px{max-height:950px!important}.mh-md-1000px{max-height:1000px!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:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:.75rem!important}.m-md-4{margin:1rem!important}.m-md-5{margin:1.25rem!important}.m-md-6{margin:1.5rem!important}.m-md-7{margin:1.75rem!important}.m-md-8{margin:2rem!important}.m-md-9{margin:2.25rem!important}.m-md-10{margin:2.5rem!important}.m-md-11{margin:2.75rem!important}.m-md-12{margin:3rem!important}.m-md-13{margin:3.25rem!important}.m-md-14{margin:3.5rem!important}.m-md-15{margin:3.75rem!important}.m-md-16{margin:4rem!important}.m-md-17{margin:4.25rem!important}.m-md-18{margin:4.5rem!important}.m-md-19{margin:4.75rem!important}.m-md-20{margin:5rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:.75rem!important;margin-left:.75rem!important}.mx-md-4{margin-right:1rem!important;margin-left:1rem!important}.mx-md-5{margin-right:1.25rem!important;margin-left:1.25rem!important}.mx-md-6{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-7{margin-right:1.75rem!important;margin-left:1.75rem!important}.mx-md-8{margin-right:2rem!important;margin-left:2rem!important}.mx-md-9{margin-right:2.25rem!important;margin-left:2.25rem!important}.mx-md-10{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-md-11{margin-right:2.75rem!important;margin-left:2.75rem!important}.mx-md-12{margin-right:3rem!important;margin-left:3rem!important}.mx-md-13{margin-right:3.25rem!important;margin-left:3.25rem!important}.mx-md-14{margin-right:3.5rem!important;margin-left:3.5rem!important}.mx-md-15{margin-right:3.75rem!important;margin-left:3.75rem!important}.mx-md-16{margin-right:4rem!important;margin-left:4rem!important}.mx-md-17{margin-right:4.25rem!important;margin-left:4.25rem!important}.mx-md-18{margin-right:4.5rem!important;margin-left:4.5rem!important}.mx-md-19{margin-right:4.75rem!important;margin-left:4.75rem!important}.mx-md-20{margin-right:5rem!important;margin-left:5rem!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:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.my-md-4{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-5{margin-top:1.25rem!important;margin-bottom:1.25rem!important}.my-md-6{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-7{margin-top:1.75rem!important;margin-bottom:1.75rem!important}.my-md-8{margin-top:2rem!important;margin-bottom:2rem!important}.my-md-9{margin-top:2.25rem!important;margin-bottom:2.25rem!important}.my-md-10{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-md-11{margin-top:2.75rem!important;margin-bottom:2.75rem!important}.my-md-12{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-13{margin-top:3.25rem!important;margin-bottom:3.25rem!important}.my-md-14{margin-top:3.5rem!important;margin-bottom:3.5rem!important}.my-md-15{margin-top:3.75rem!important;margin-bottom:3.75rem!important}.my-md-16{margin-top:4rem!important;margin-bottom:4rem!important}.my-md-17{margin-top:4.25rem!important;margin-bottom:4.25rem!important}.my-md-18{margin-top:4.5rem!important;margin-bottom:4.5rem!important}.my-md-19{margin-top:4.75rem!important;margin-bottom:4.75rem!important}.my-md-20{margin-top:5rem!important;margin-bottom:5rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:.75rem!important}.mt-md-4{margin-top:1rem!important}.mt-md-5{margin-top:1.25rem!important}.mt-md-6{margin-top:1.5rem!important}.mt-md-7{margin-top:1.75rem!important}.mt-md-8{margin-top:2rem!important}.mt-md-9{margin-top:2.25rem!important}.mt-md-10{margin-top:2.5rem!important}.mt-md-11{margin-top:2.75rem!important}.mt-md-12{margin-top:3rem!important}.mt-md-13{margin-top:3.25rem!important}.mt-md-14{margin-top:3.5rem!important}.mt-md-15{margin-top:3.75rem!important}.mt-md-16{margin-top:4rem!important}.mt-md-17{margin-top:4.25rem!important}.mt-md-18{margin-top:4.5rem!important}.mt-md-19{margin-top:4.75rem!important}.mt-md-20{margin-top:5rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:.75rem!important}.me-md-4{margin-right:1rem!important}.me-md-5{margin-right:1.25rem!important}.me-md-6{margin-right:1.5rem!important}.me-md-7{margin-right:1.75rem!important}.me-md-8{margin-right:2rem!important}.me-md-9{margin-right:2.25rem!important}.me-md-10{margin-right:2.5rem!important}.me-md-11{margin-right:2.75rem!important}.me-md-12{margin-right:3rem!important}.me-md-13{margin-right:3.25rem!important}.me-md-14{margin-right:3.5rem!important}.me-md-15{margin-right:3.75rem!important}.me-md-16{margin-right:4rem!important}.me-md-17{margin-right:4.25rem!important}.me-md-18{margin-right:4.5rem!important}.me-md-19{margin-right:4.75rem!important}.me-md-20{margin-right:5rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:.75rem!important}.mb-md-4{margin-bottom:1rem!important}.mb-md-5{margin-bottom:1.25rem!important}.mb-md-6{margin-bottom:1.5rem!important}.mb-md-7{margin-bottom:1.75rem!important}.mb-md-8{margin-bottom:2rem!important}.mb-md-9{margin-bottom:2.25rem!important}.mb-md-10{margin-bottom:2.5rem!important}.mb-md-11{margin-bottom:2.75rem!important}.mb-md-12{margin-bottom:3rem!important}.mb-md-13{margin-bottom:3.25rem!important}.mb-md-14{margin-bottom:3.5rem!important}.mb-md-15{margin-bottom:3.75rem!important}.mb-md-16{margin-bottom:4rem!important}.mb-md-17{margin-bottom:4.25rem!important}.mb-md-18{margin-bottom:4.5rem!important}.mb-md-19{margin-bottom:4.75rem!important}.mb-md-20{margin-bottom:5rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:.75rem!important}.ms-md-4{margin-left:1rem!important}.ms-md-5{margin-left:1.25rem!important}.ms-md-6{margin-left:1.5rem!important}.ms-md-7{margin-left:1.75rem!important}.ms-md-8{margin-left:2rem!important}.ms-md-9{margin-left:2.25rem!important}.ms-md-10{margin-left:2.5rem!important}.ms-md-11{margin-left:2.75rem!important}.ms-md-12{margin-left:3rem!important}.ms-md-13{margin-left:3.25rem!important}.ms-md-14{margin-left:3.5rem!important}.ms-md-15{margin-left:3.75rem!important}.ms-md-16{margin-left:4rem!important}.ms-md-17{margin-left:4.25rem!important}.ms-md-18{margin-left:4.5rem!important}.ms-md-19{margin-left:4.75rem!important}.ms-md-20{margin-left:5rem!important}.ms-md-auto{margin-left:auto!important}.m-md-n1{margin:-.25rem!important}.m-md-n2{margin:-.5rem!important}.m-md-n3{margin:-.75rem!important}.m-md-n4{margin:-1rem!important}.m-md-n5{margin:-1.25rem!important}.m-md-n6{margin:-1.5rem!important}.m-md-n7{margin:-1.75rem!important}.m-md-n8{margin:-2rem!important}.m-md-n9{margin:-2.25rem!important}.m-md-n10{margin:-2.5rem!important}.m-md-n11{margin:-2.75rem!important}.m-md-n12{margin:-3rem!important}.m-md-n13{margin:-3.25rem!important}.m-md-n14{margin:-3.5rem!important}.m-md-n15{margin:-3.75rem!important}.m-md-n16{margin:-4rem!important}.m-md-n17{margin:-4.25rem!important}.m-md-n18{margin:-4.5rem!important}.m-md-n19{margin:-4.75rem!important}.m-md-n20{margin:-5rem!important}.mx-md-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-md-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-md-n3{margin-right:-.75rem!important;margin-left:-.75rem!important}.mx-md-n4{margin-right:-1rem!important;margin-left:-1rem!important}.mx-md-n5{margin-right:-1.25rem!important;margin-left:-1.25rem!important}.mx-md-n6{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-md-n7{margin-right:-1.75rem!important;margin-left:-1.75rem!important}.mx-md-n8{margin-right:-2rem!important;margin-left:-2rem!important}.mx-md-n9{margin-right:-2.25rem!important;margin-left:-2.25rem!important}.mx-md-n10{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.mx-md-n11{margin-right:-2.75rem!important;margin-left:-2.75rem!important}.mx-md-n12{margin-right:-3rem!important;margin-left:-3rem!important}.mx-md-n13{margin-right:-3.25rem!important;margin-left:-3.25rem!important}.mx-md-n14{margin-right:-3.5rem!important;margin-left:-3.5rem!important}.mx-md-n15{margin-right:-3.75rem!important;margin-left:-3.75rem!important}.mx-md-n16{margin-right:-4rem!important;margin-left:-4rem!important}.mx-md-n17{margin-right:-4.25rem!important;margin-left:-4.25rem!important}.mx-md-n18{margin-right:-4.5rem!important;margin-left:-4.5rem!important}.mx-md-n19{margin-right:-4.75rem!important;margin-left:-4.75rem!important}.mx-md-n20{margin-right:-5rem!important;margin-left:-5rem!important}.my-md-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-md-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-md-n3{margin-top:-.75rem!important;margin-bottom:-.75rem!important}.my-md-n4{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-md-n5{margin-top:-1.25rem!important;margin-bottom:-1.25rem!important}.my-md-n6{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-md-n7{margin-top:-1.75rem!important;margin-bottom:-1.75rem!important}.my-md-n8{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-md-n9{margin-top:-2.25rem!important;margin-bottom:-2.25rem!important}.my-md-n10{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.my-md-n11{margin-top:-2.75rem!important;margin-bottom:-2.75rem!important}.my-md-n12{margin-top:-3rem!important;margin-bottom:-3rem!important}.my-md-n13{margin-top:-3.25rem!important;margin-bottom:-3.25rem!important}.my-md-n14{margin-top:-3.5rem!important;margin-bottom:-3.5rem!important}.my-md-n15{margin-top:-3.75rem!important;margin-bottom:-3.75rem!important}.my-md-n16{margin-top:-4rem!important;margin-bottom:-4rem!important}.my-md-n17{margin-top:-4.25rem!important;margin-bottom:-4.25rem!important}.my-md-n18{margin-top:-4.5rem!important;margin-bottom:-4.5rem!important}.my-md-n19{margin-top:-4.75rem!important;margin-bottom:-4.75rem!important}.my-md-n20{margin-top:-5rem!important;margin-bottom:-5rem!important}.mt-md-n1{margin-top:-.25rem!important}.mt-md-n2{margin-top:-.5rem!important}.mt-md-n3{margin-top:-.75rem!important}.mt-md-n4{margin-top:-1rem!important}.mt-md-n5{margin-top:-1.25rem!important}.mt-md-n6{margin-top:-1.5rem!important}.mt-md-n7{margin-top:-1.75rem!important}.mt-md-n8{margin-top:-2rem!important}.mt-md-n9{margin-top:-2.25rem!important}.mt-md-n10{margin-top:-2.5rem!important}.mt-md-n11{margin-top:-2.75rem!important}.mt-md-n12{margin-top:-3rem!important}.mt-md-n13{margin-top:-3.25rem!important}.mt-md-n14{margin-top:-3.5rem!important}.mt-md-n15{margin-top:-3.75rem!important}.mt-md-n16{margin-top:-4rem!important}.mt-md-n17{margin-top:-4.25rem!important}.mt-md-n18{margin-top:-4.5rem!important}.mt-md-n19{margin-top:-4.75rem!important}.mt-md-n20{margin-top:-5rem!important}.me-md-n1{margin-right:-.25rem!important}.me-md-n2{margin-right:-.5rem!important}.me-md-n3{margin-right:-.75rem!important}.me-md-n4{margin-right:-1rem!important}.me-md-n5{margin-right:-1.25rem!important}.me-md-n6{margin-right:-1.5rem!important}.me-md-n7{margin-right:-1.75rem!important}.me-md-n8{margin-right:-2rem!important}.me-md-n9{margin-right:-2.25rem!important}.me-md-n10{margin-right:-2.5rem!important}.me-md-n11{margin-right:-2.75rem!important}.me-md-n12{margin-right:-3rem!important}.me-md-n13{margin-right:-3.25rem!important}.me-md-n14{margin-right:-3.5rem!important}.me-md-n15{margin-right:-3.75rem!important}.me-md-n16{margin-right:-4rem!important}.me-md-n17{margin-right:-4.25rem!important}.me-md-n18{margin-right:-4.5rem!important}.me-md-n19{margin-right:-4.75rem!important}.me-md-n20{margin-right:-5rem!important}.mb-md-n1{margin-bottom:-.25rem!important}.mb-md-n2{margin-bottom:-.5rem!important}.mb-md-n3{margin-bottom:-.75rem!important}.mb-md-n4{margin-bottom:-1rem!important}.mb-md-n5{margin-bottom:-1.25rem!important}.mb-md-n6{margin-bottom:-1.5rem!important}.mb-md-n7{margin-bottom:-1.75rem!important}.mb-md-n8{margin-bottom:-2rem!important}.mb-md-n9{margin-bottom:-2.25rem!important}.mb-md-n10{margin-bottom:-2.5rem!important}.mb-md-n11{margin-bottom:-2.75rem!important}.mb-md-n12{margin-bottom:-3rem!important}.mb-md-n13{margin-bottom:-3.25rem!important}.mb-md-n14{margin-bottom:-3.5rem!important}.mb-md-n15{margin-bottom:-3.75rem!important}.mb-md-n16{margin-bottom:-4rem!important}.mb-md-n17{margin-bottom:-4.25rem!important}.mb-md-n18{margin-bottom:-4.5rem!important}.mb-md-n19{margin-bottom:-4.75rem!important}.mb-md-n20{margin-bottom:-5rem!important}.ms-md-n1{margin-left:-.25rem!important}.ms-md-n2{margin-left:-.5rem!important}.ms-md-n3{margin-left:-.75rem!important}.ms-md-n4{margin-left:-1rem!important}.ms-md-n5{margin-left:-1.25rem!important}.ms-md-n6{margin-left:-1.5rem!important}.ms-md-n7{margin-left:-1.75rem!important}.ms-md-n8{margin-left:-2rem!important}.ms-md-n9{margin-left:-2.25rem!important}.ms-md-n10{margin-left:-2.5rem!important}.ms-md-n11{margin-left:-2.75rem!important}.ms-md-n12{margin-left:-3rem!important}.ms-md-n13{margin-left:-3.25rem!important}.ms-md-n14{margin-left:-3.5rem!important}.ms-md-n15{margin-left:-3.75rem!important}.ms-md-n16{margin-left:-4rem!important}.ms-md-n17{margin-left:-4.25rem!important}.ms-md-n18{margin-left:-4.5rem!important}.ms-md-n19{margin-left:-4.75rem!important}.ms-md-n20{margin-left:-5rem!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:.75rem!important}.p-md-4{padding:1rem!important}.p-md-5{padding:1.25rem!important}.p-md-6{padding:1.5rem!important}.p-md-7{padding:1.75rem!important}.p-md-8{padding:2rem!important}.p-md-9{padding:2.25rem!important}.p-md-10{padding:2.5rem!important}.p-md-11{padding:2.75rem!important}.p-md-12{padding:3rem!important}.p-md-13{padding:3.25rem!important}.p-md-14{padding:3.5rem!important}.p-md-15{padding:3.75rem!important}.p-md-16{padding:4rem!important}.p-md-17{padding:4.25rem!important}.p-md-18{padding:4.5rem!important}.p-md-19{padding:4.75rem!important}.p-md-20{padding:5rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:.75rem!important;padding-left:.75rem!important}.px-md-4{padding-right:1rem!important;padding-left:1rem!important}.px-md-5{padding-right:1.25rem!important;padding-left:1.25rem!important}.px-md-6{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-7{padding-right:1.75rem!important;padding-left:1.75rem!important}.px-md-8{padding-right:2rem!important;padding-left:2rem!important}.px-md-9{padding-right:2.25rem!important;padding-left:2.25rem!important}.px-md-10{padding-right:2.5rem!important;padding-left:2.5rem!important}.px-md-11{padding-right:2.75rem!important;padding-left:2.75rem!important}.px-md-12{padding-right:3rem!important;padding-left:3rem!important}.px-md-13{padding-right:3.25rem!important;padding-left:3.25rem!important}.px-md-14{padding-right:3.5rem!important;padding-left:3.5rem!important}.px-md-15{padding-right:3.75rem!important;padding-left:3.75rem!important}.px-md-16{padding-right:4rem!important;padding-left:4rem!important}.px-md-17{padding-right:4.25rem!important;padding-left:4.25rem!important}.px-md-18{padding-right:4.5rem!important;padding-left:4.5rem!important}.px-md-19{padding-right:4.75rem!important;padding-left:4.75rem!important}.px-md-20{padding-right:5rem!important;padding-left:5rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.py-md-4{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-5{padding-top:1.25rem!important;padding-bottom:1.25rem!important}.py-md-6{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-7{padding-top:1.75rem!important;padding-bottom:1.75rem!important}.py-md-8{padding-top:2rem!important;padding-bottom:2rem!important}.py-md-9{padding-top:2.25rem!important;padding-bottom:2.25rem!important}.py-md-10{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.py-md-11{padding-top:2.75rem!important;padding-bottom:2.75rem!important}.py-md-12{padding-top:3rem!important;padding-bottom:3rem!important}.py-md-13{padding-top:3.25rem!important;padding-bottom:3.25rem!important}.py-md-14{padding-top:3.5rem!important;padding-bottom:3.5rem!important}.py-md-15{padding-top:3.75rem!important;padding-bottom:3.75rem!important}.py-md-16{padding-top:4rem!important;padding-bottom:4rem!important}.py-md-17{padding-top:4.25rem!important;padding-bottom:4.25rem!important}.py-md-18{padding-top:4.5rem!important;padding-bottom:4.5rem!important}.py-md-19{padding-top:4.75rem!important;padding-bottom:4.75rem!important}.py-md-20{padding-top:5rem!important;padding-bottom:5rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:.75rem!important}.pt-md-4{padding-top:1rem!important}.pt-md-5{padding-top:1.25rem!important}.pt-md-6{padding-top:1.5rem!important}.pt-md-7{padding-top:1.75rem!important}.pt-md-8{padding-top:2rem!important}.pt-md-9{padding-top:2.25rem!important}.pt-md-10{padding-top:2.5rem!important}.pt-md-11{padding-top:2.75rem!important}.pt-md-12{padding-top:3rem!important}.pt-md-13{padding-top:3.25rem!important}.pt-md-14{padding-top:3.5rem!important}.pt-md-15{padding-top:3.75rem!important}.pt-md-16{padding-top:4rem!important}.pt-md-17{padding-top:4.25rem!important}.pt-md-18{padding-top:4.5rem!important}.pt-md-19{padding-top:4.75rem!important}.pt-md-20{padding-top:5rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:.75rem!important}.pe-md-4{padding-right:1rem!important}.pe-md-5{padding-right:1.25rem!important}.pe-md-6{padding-right:1.5rem!important}.pe-md-7{padding-right:1.75rem!important}.pe-md-8{padding-right:2rem!important}.pe-md-9{padding-right:2.25rem!important}.pe-md-10{padding-right:2.5rem!important}.pe-md-11{padding-right:2.75rem!important}.pe-md-12{padding-right:3rem!important}.pe-md-13{padding-right:3.25rem!important}.pe-md-14{padding-right:3.5rem!important}.pe-md-15{padding-right:3.75rem!important}.pe-md-16{padding-right:4rem!important}.pe-md-17{padding-right:4.25rem!important}.pe-md-18{padding-right:4.5rem!important}.pe-md-19{padding-right:4.75rem!important}.pe-md-20{padding-right:5rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:.75rem!important}.pb-md-4{padding-bottom:1rem!important}.pb-md-5{padding-bottom:1.25rem!important}.pb-md-6{padding-bottom:1.5rem!important}.pb-md-7{padding-bottom:1.75rem!important}.pb-md-8{padding-bottom:2rem!important}.pb-md-9{padding-bottom:2.25rem!important}.pb-md-10{padding-bottom:2.5rem!important}.pb-md-11{padding-bottom:2.75rem!important}.pb-md-12{padding-bottom:3rem!important}.pb-md-13{padding-bottom:3.25rem!important}.pb-md-14{padding-bottom:3.5rem!important}.pb-md-15{padding-bottom:3.75rem!important}.pb-md-16{padding-bottom:4rem!important}.pb-md-17{padding-bottom:4.25rem!important}.pb-md-18{padding-bottom:4.5rem!important}.pb-md-19{padding-bottom:4.75rem!important}.pb-md-20{padding-bottom:5rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:.75rem!important}.ps-md-4{padding-left:1rem!important}.ps-md-5{padding-left:1.25rem!important}.ps-md-6{padding-left:1.5rem!important}.ps-md-7{padding-left:1.75rem!important}.ps-md-8{padding-left:2rem!important}.ps-md-9{padding-left:2.25rem!important}.ps-md-10{padding-left:2.5rem!important}.ps-md-11{padding-left:2.75rem!important}.ps-md-12{padding-left:3rem!important}.ps-md-13{padding-left:3.25rem!important}.ps-md-14{padding-left:3.5rem!important}.ps-md-15{padding-left:3.75rem!important}.ps-md-16{padding-left:4rem!important}.ps-md-17{padding-left:4.25rem!important}.ps-md-18{padding-left:4.5rem!important}.ps-md-19{padding-left:4.75rem!important}.ps-md-20{padding-left:5rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:.75rem!important}.gap-md-4{gap:1rem!important}.gap-md-5{gap:1.25rem!important}.gap-md-6{gap:1.5rem!important}.gap-md-7{gap:1.75rem!important}.gap-md-8{gap:2rem!important}.gap-md-9{gap:2.25rem!important}.gap-md-10{gap:2.5rem!important}.gap-md-11{gap:2.75rem!important}.gap-md-12{gap:3rem!important}.gap-md-13{gap:3.25rem!important}.gap-md-14{gap:3.5rem!important}.gap-md-15{gap:3.75rem!important}.gap-md-16{gap:4rem!important}.gap-md-17{gap:4.25rem!important}.gap-md-18{gap:4.5rem!important}.gap-md-19{gap:4.75rem!important}.gap-md-20{gap:5rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:.75rem!important}.row-gap-md-4{row-gap:1rem!important}.row-gap-md-5{row-gap:1.25rem!important}.row-gap-md-6{row-gap:1.5rem!important}.row-gap-md-7{row-gap:1.75rem!important}.row-gap-md-8{row-gap:2rem!important}.row-gap-md-9{row-gap:2.25rem!important}.row-gap-md-10{row-gap:2.5rem!important}.row-gap-md-11{row-gap:2.75rem!important}.row-gap-md-12{row-gap:3rem!important}.row-gap-md-13{row-gap:3.25rem!important}.row-gap-md-14{row-gap:3.5rem!important}.row-gap-md-15{row-gap:3.75rem!important}.row-gap-md-16{row-gap:4rem!important}.row-gap-md-17{row-gap:4.25rem!important}.row-gap-md-18{row-gap:4.5rem!important}.row-gap-md-19{row-gap:4.75rem!important}.row-gap-md-20{row-gap:5rem!important}.column-gap-md-0{column-gap:0!important}.column-gap-md-1{column-gap:.25rem!important}.column-gap-md-2{column-gap:.5rem!important}.column-gap-md-3{column-gap:.75rem!important}.column-gap-md-4{column-gap:1rem!important}.column-gap-md-5{column-gap:1.25rem!important}.column-gap-md-6{column-gap:1.5rem!important}.column-gap-md-7{column-gap:1.75rem!important}.column-gap-md-8{column-gap:2rem!important}.column-gap-md-9{column-gap:2.25rem!important}.column-gap-md-10{column-gap:2.5rem!important}.column-gap-md-11{column-gap:2.75rem!important}.column-gap-md-12{column-gap:3rem!important}.column-gap-md-13{column-gap:3.25rem!important}.column-gap-md-14{column-gap:3.5rem!important}.column-gap-md-15{column-gap:3.75rem!important}.column-gap-md-16{column-gap:4rem!important}.column-gap-md-17{column-gap:4.25rem!important}.column-gap-md-18{column-gap:4.5rem!important}.column-gap-md-19{column-gap:4.75rem!important}.column-gap-md-20{column-gap:5rem!important}.fs-md-1{font-size:calc(1.3rem + .6vw)!important}.fs-md-2{font-size:calc(1.275rem + .3vw)!important}.fs-md-3{font-size:calc(1.26rem + .12vw)!important}.fs-md-4{font-size:1.25rem!important}.fs-md-5{font-size:1.15rem!important}.fs-md-6{font-size:1.075rem!important}.fs-md-7{font-size:.95rem!important}.fs-md-8{font-size:.85rem!important}.fs-md-9{font-size:.75rem!important}.fs-md-10{font-size:.5rem!important}.fs-md-sm{font-size:.95rem!important}.fs-md-base{font-size:1rem!important}.fs-md-lg{font-size:1.075rem!important}.fs-md-xl{font-size:1.21rem!important}.fs-md-fluid{font-size:100%!important}.fs-md-2x{font-size:calc(1.325rem + .9vw)!important}.fs-md-2qx{font-size:calc(1.35rem + 1.2vw)!important}.fs-md-2hx{font-size:calc(1.375rem + 1.5vw)!important}.fs-md-2tx{font-size:calc(1.4rem + 1.8vw)!important}.fs-md-3x{font-size:calc(1.425rem + 2.1vw)!important}.fs-md-3qx{font-size:calc(1.45rem + 2.4vw)!important}.fs-md-3hx{font-size:calc(1.475rem + 2.7vw)!important}.fs-md-3tx{font-size:calc(1.5rem + 3vw)!important}.fs-md-4x{font-size:calc(1.525rem + 3.3vw)!important}.fs-md-4qx{font-size:calc(1.55rem + 3.6vw)!important}.fs-md-4hx{font-size:calc(1.575rem + 3.9vw)!important}.fs-md-4tx{font-size:calc(1.6rem + 4.2vw)!important}.fs-md-5x{font-size:calc(1.625rem + 4.5vw)!important}.fs-md-5qx{font-size:calc(1.65rem + 4.8vw)!important}.fs-md-5hx{font-size:calc(1.675rem + 5.1vw)!important}.fs-md-5tx{font-size:calc(1.7rem + 5.4vw)!important}.fs-md-6x{font-size:calc(1.725rem + 5.7vw)!important}.fs-md-6qx{font-size:calc(1.75rem + 6vw)!important}.fs-md-6hx{font-size:calc(1.775rem + 6.3vw)!important}.fs-md-6tx{font-size:calc(1.8rem + 6.6vw)!important}.fs-md-7x{font-size:calc(1.825rem + 6.9vw)!important}.fs-md-7qx{font-size:calc(1.85rem + 7.2vw)!important}.fs-md-7hx{font-size:calc(1.875rem + 7.5vw)!important}.fs-md-7tx{font-size:calc(1.9rem + 7.8vw)!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}.min-w-md-unset{min-width:unset!important}.min-w-md-25{min-width:25%!important}.min-w-md-50{min-width:50%!important}.min-w-md-75{min-width:75%!important}.min-w-md-100{min-width:100%!important}.min-w-md-auto{min-width:auto!important}.min-w-md-1px{min-width:1px!important}.min-w-md-2px{min-width:2px!important}.min-w-md-3px{min-width:3px!important}.min-w-md-4px{min-width:4px!important}.min-w-md-5px{min-width:5px!important}.min-w-md-6px{min-width:6px!important}.min-w-md-7px{min-width:7px!important}.min-w-md-8px{min-width:8px!important}.min-w-md-9px{min-width:9px!important}.min-w-md-10px{min-width:10px!important}.min-w-md-15px{min-width:15px!important}.min-w-md-20px{min-width:20px!important}.min-w-md-25px{min-width:25px!important}.min-w-md-30px{min-width:30px!important}.min-w-md-35px{min-width:35px!important}.min-w-md-40px{min-width:40px!important}.min-w-md-45px{min-width:45px!important}.min-w-md-50px{min-width:50px!important}.min-w-md-55px{min-width:55px!important}.min-w-md-60px{min-width:60px!important}.min-w-md-65px{min-width:65px!important}.min-w-md-70px{min-width:70px!important}.min-w-md-75px{min-width:75px!important}.min-w-md-80px{min-width:80px!important}.min-w-md-85px{min-width:85px!important}.min-w-md-90px{min-width:90px!important}.min-w-md-95px{min-width:95px!important}.min-w-md-100px{min-width:100px!important}.min-w-md-125px{min-width:125px!important}.min-w-md-150px{min-width:150px!important}.min-w-md-175px{min-width:175px!important}.min-w-md-200px{min-width:200px!important}.min-w-md-225px{min-width:225px!important}.min-w-md-250px{min-width:250px!important}.min-w-md-275px{min-width:275px!important}.min-w-md-300px{min-width:300px!important}.min-w-md-325px{min-width:325px!important}.min-w-md-350px{min-width:350px!important}.min-w-md-375px{min-width:375px!important}.min-w-md-400px{min-width:400px!important}.min-w-md-425px{min-width:425px!important}.min-w-md-450px{min-width:450px!important}.min-w-md-475px{min-width:475px!important}.min-w-md-500px{min-width:500px!important}.min-w-md-550px{min-width:550px!important}.min-w-md-600px{min-width:600px!important}.min-w-md-650px{min-width:650px!important}.min-w-md-700px{min-width:700px!important}.min-w-md-750px{min-width:750px!important}.min-w-md-800px{min-width:800px!important}.min-w-md-850px{min-width:850px!important}.min-w-md-900px{min-width:900px!important}.min-w-md-950px{min-width:950px!important}.min-w-md-1000px{min-width:1000px!important}.min-h-md-unset{min-height:unset!important}.min-h-md-25{min-height:25%!important}.min-h-md-50{min-height:50%!important}.min-h-md-75{min-height:75%!important}.min-h-md-100{min-height:100%!important}.min-h-md-auto{min-height:auto!important}.min-h-md-1px{min-height:1px!important}.min-h-md-2px{min-height:2px!important}.min-h-md-3px{min-height:3px!important}.min-h-md-4px{min-height:4px!important}.min-h-md-5px{min-height:5px!important}.min-h-md-6px{min-height:6px!important}.min-h-md-7px{min-height:7px!important}.min-h-md-8px{min-height:8px!important}.min-h-md-9px{min-height:9px!important}.min-h-md-10px{min-height:10px!important}.min-h-md-15px{min-height:15px!important}.min-h-md-20px{min-height:20px!important}.min-h-md-25px{min-height:25px!important}.min-h-md-30px{min-height:30px!important}.min-h-md-35px{min-height:35px!important}.min-h-md-40px{min-height:40px!important}.min-h-md-45px{min-height:45px!important}.min-h-md-50px{min-height:50px!important}.min-h-md-55px{min-height:55px!important}.min-h-md-60px{min-height:60px!important}.min-h-md-65px{min-height:65px!important}.min-h-md-70px{min-height:70px!important}.min-h-md-75px{min-height:75px!important}.min-h-md-80px{min-height:80px!important}.min-h-md-85px{min-height:85px!important}.min-h-md-90px{min-height:90px!important}.min-h-md-95px{min-height:95px!important}.min-h-md-100px{min-height:100px!important}.min-h-md-125px{min-height:125px!important}.min-h-md-150px{min-height:150px!important}.min-h-md-175px{min-height:175px!important}.min-h-md-200px{min-height:200px!important}.min-h-md-225px{min-height:225px!important}.min-h-md-250px{min-height:250px!important}.min-h-md-275px{min-height:275px!important}.min-h-md-300px{min-height:300px!important}.min-h-md-325px{min-height:325px!important}.min-h-md-350px{min-height:350px!important}.min-h-md-375px{min-height:375px!important}.min-h-md-400px{min-height:400px!important}.min-h-md-425px{min-height:425px!important}.min-h-md-450px{min-height:450px!important}.min-h-md-475px{min-height:475px!important}.min-h-md-500px{min-height:500px!important}.min-h-md-550px{min-height:550px!important}.min-h-md-600px{min-height:600px!important}.min-h-md-650px{min-height:650px!important}.min-h-md-700px{min-height:700px!important}.min-h-md-750px{min-height:750px!important}.min-h-md-800px{min-height:800px!important}.min-h-md-850px{min-height:850px!important}.min-h-md-900px{min-height:900px!important}.min-h-md-950px{min-height:950px!important}.min-h-md-1000px{min-height:1000px!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{object-fit:contain!important}.object-fit-lg-cover{object-fit:cover!important}.object-fit-lg-fill{object-fit:fill!important}.object-fit-lg-scale{object-fit:scale-down!important}.object-fit-lg-none{object-fit:none!important}.overflow-lg-auto{overflow:auto!important}.overflow-lg-hidden{overflow:hidden!important}.overflow-lg-visible{overflow:visible!important}.overflow-lg-scroll{overflow:scroll!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}.position-lg-static{position:static!important}.position-lg-relative{position:relative!important}.position-lg-absolute{position:absolute!important}.position-lg-fixed{position:fixed!important}.position-lg-sticky{position:sticky!important}.w-lg-unset{width:unset!important}.w-lg-25{width:25%!important}.w-lg-50{width:50%!important}.w-lg-75{width:75%!important}.w-lg-100{width:100%!important}.w-lg-auto{width:auto!important}.w-lg-1px{width:1px!important}.w-lg-2px{width:2px!important}.w-lg-3px{width:3px!important}.w-lg-4px{width:4px!important}.w-lg-5px{width:5px!important}.w-lg-6px{width:6px!important}.w-lg-7px{width:7px!important}.w-lg-8px{width:8px!important}.w-lg-9px{width:9px!important}.w-lg-10px{width:10px!important}.w-lg-15px{width:15px!important}.w-lg-20px{width:20px!important}.w-lg-25px{width:25px!important}.w-lg-30px{width:30px!important}.w-lg-35px{width:35px!important}.w-lg-40px{width:40px!important}.w-lg-45px{width:45px!important}.w-lg-50px{width:50px!important}.w-lg-55px{width:55px!important}.w-lg-60px{width:60px!important}.w-lg-65px{width:65px!important}.w-lg-70px{width:70px!important}.w-lg-75px{width:75px!important}.w-lg-80px{width:80px!important}.w-lg-85px{width:85px!important}.w-lg-90px{width:90px!important}.w-lg-95px{width:95px!important}.w-lg-100px{width:100px!important}.w-lg-125px{width:125px!important}.w-lg-150px{width:150px!important}.w-lg-175px{width:175px!important}.w-lg-200px{width:200px!important}.w-lg-225px{width:225px!important}.w-lg-250px{width:250px!important}.w-lg-275px{width:275px!important}.w-lg-300px{width:300px!important}.w-lg-325px{width:325px!important}.w-lg-350px{width:350px!important}.w-lg-375px{width:375px!important}.w-lg-400px{width:400px!important}.w-lg-425px{width:425px!important}.w-lg-450px{width:450px!important}.w-lg-475px{width:475px!important}.w-lg-500px{width:500px!important}.w-lg-550px{width:550px!important}.w-lg-600px{width:600px!important}.w-lg-650px{width:650px!important}.w-lg-700px{width:700px!important}.w-lg-750px{width:750px!important}.w-lg-800px{width:800px!important}.w-lg-850px{width:850px!important}.w-lg-900px{width:900px!important}.w-lg-950px{width:950px!important}.w-lg-1000px{width:1000px!important}.mw-lg-unset{max-width:unset!important}.mw-lg-25{max-width:25%!important}.mw-lg-50{max-width:50%!important}.mw-lg-75{max-width:75%!important}.mw-lg-100{max-width:100%!important}.mw-lg-auto{max-width:auto!important}.mw-lg-1px{max-width:1px!important}.mw-lg-2px{max-width:2px!important}.mw-lg-3px{max-width:3px!important}.mw-lg-4px{max-width:4px!important}.mw-lg-5px{max-width:5px!important}.mw-lg-6px{max-width:6px!important}.mw-lg-7px{max-width:7px!important}.mw-lg-8px{max-width:8px!important}.mw-lg-9px{max-width:9px!important}.mw-lg-10px{max-width:10px!important}.mw-lg-15px{max-width:15px!important}.mw-lg-20px{max-width:20px!important}.mw-lg-25px{max-width:25px!important}.mw-lg-30px{max-width:30px!important}.mw-lg-35px{max-width:35px!important}.mw-lg-40px{max-width:40px!important}.mw-lg-45px{max-width:45px!important}.mw-lg-50px{max-width:50px!important}.mw-lg-55px{max-width:55px!important}.mw-lg-60px{max-width:60px!important}.mw-lg-65px{max-width:65px!important}.mw-lg-70px{max-width:70px!important}.mw-lg-75px{max-width:75px!important}.mw-lg-80px{max-width:80px!important}.mw-lg-85px{max-width:85px!important}.mw-lg-90px{max-width:90px!important}.mw-lg-95px{max-width:95px!important}.mw-lg-100px{max-width:100px!important}.mw-lg-125px{max-width:125px!important}.mw-lg-150px{max-width:150px!important}.mw-lg-175px{max-width:175px!important}.mw-lg-200px{max-width:200px!important}.mw-lg-225px{max-width:225px!important}.mw-lg-250px{max-width:250px!important}.mw-lg-275px{max-width:275px!important}.mw-lg-300px{max-width:300px!important}.mw-lg-325px{max-width:325px!important}.mw-lg-350px{max-width:350px!important}.mw-lg-375px{max-width:375px!important}.mw-lg-400px{max-width:400px!important}.mw-lg-425px{max-width:425px!important}.mw-lg-450px{max-width:450px!important}.mw-lg-475px{max-width:475px!important}.mw-lg-500px{max-width:500px!important}.mw-lg-550px{max-width:550px!important}.mw-lg-600px{max-width:600px!important}.mw-lg-650px{max-width:650px!important}.mw-lg-700px{max-width:700px!important}.mw-lg-750px{max-width:750px!important}.mw-lg-800px{max-width:800px!important}.mw-lg-850px{max-width:850px!important}.mw-lg-900px{max-width:900px!important}.mw-lg-950px{max-width:950px!important}.mw-lg-1000px{max-width:1000px!important}.h-lg-unset{height:unset!important}.h-lg-25{height:25%!important}.h-lg-50{height:50%!important}.h-lg-75{height:75%!important}.h-lg-100{height:100%!important}.h-lg-auto{height:auto!important}.h-lg-1px{height:1px!important}.h-lg-2px{height:2px!important}.h-lg-3px{height:3px!important}.h-lg-4px{height:4px!important}.h-lg-5px{height:5px!important}.h-lg-6px{height:6px!important}.h-lg-7px{height:7px!important}.h-lg-8px{height:8px!important}.h-lg-9px{height:9px!important}.h-lg-10px{height:10px!important}.h-lg-15px{height:15px!important}.h-lg-20px{height:20px!important}.h-lg-25px{height:25px!important}.h-lg-30px{height:30px!important}.h-lg-35px{height:35px!important}.h-lg-40px{height:40px!important}.h-lg-45px{height:45px!important}.h-lg-50px{height:50px!important}.h-lg-55px{height:55px!important}.h-lg-60px{height:60px!important}.h-lg-65px{height:65px!important}.h-lg-70px{height:70px!important}.h-lg-75px{height:75px!important}.h-lg-80px{height:80px!important}.h-lg-85px{height:85px!important}.h-lg-90px{height:90px!important}.h-lg-95px{height:95px!important}.h-lg-100px{height:100px!important}.h-lg-125px{height:125px!important}.h-lg-150px{height:150px!important}.h-lg-175px{height:175px!important}.h-lg-200px{height:200px!important}.h-lg-225px{height:225px!important}.h-lg-250px{height:250px!important}.h-lg-275px{height:275px!important}.h-lg-300px{height:300px!important}.h-lg-325px{height:325px!important}.h-lg-350px{height:350px!important}.h-lg-375px{height:375px!important}.h-lg-400px{height:400px!important}.h-lg-425px{height:425px!important}.h-lg-450px{height:450px!important}.h-lg-475px{height:475px!important}.h-lg-500px{height:500px!important}.h-lg-550px{height:550px!important}.h-lg-600px{height:600px!important}.h-lg-650px{height:650px!important}.h-lg-700px{height:700px!important}.h-lg-750px{height:750px!important}.h-lg-800px{height:800px!important}.h-lg-850px{height:850px!important}.h-lg-900px{height:900px!important}.h-lg-950px{height:950px!important}.h-lg-1000px{height:1000px!important}.mh-lg-unset{max-height:unset!important}.mh-lg-25{max-height:25%!important}.mh-lg-50{max-height:50%!important}.mh-lg-75{max-height:75%!important}.mh-lg-100{max-height:100%!important}.mh-lg-auto{max-height:auto!important}.mh-lg-1px{max-height:1px!important}.mh-lg-2px{max-height:2px!important}.mh-lg-3px{max-height:3px!important}.mh-lg-4px{max-height:4px!important}.mh-lg-5px{max-height:5px!important}.mh-lg-6px{max-height:6px!important}.mh-lg-7px{max-height:7px!important}.mh-lg-8px{max-height:8px!important}.mh-lg-9px{max-height:9px!important}.mh-lg-10px{max-height:10px!important}.mh-lg-15px{max-height:15px!important}.mh-lg-20px{max-height:20px!important}.mh-lg-25px{max-height:25px!important}.mh-lg-30px{max-height:30px!important}.mh-lg-35px{max-height:35px!important}.mh-lg-40px{max-height:40px!important}.mh-lg-45px{max-height:45px!important}.mh-lg-50px{max-height:50px!important}.mh-lg-55px{max-height:55px!important}.mh-lg-60px{max-height:60px!important}.mh-lg-65px{max-height:65px!important}.mh-lg-70px{max-height:70px!important}.mh-lg-75px{max-height:75px!important}.mh-lg-80px{max-height:80px!important}.mh-lg-85px{max-height:85px!important}.mh-lg-90px{max-height:90px!important}.mh-lg-95px{max-height:95px!important}.mh-lg-100px{max-height:100px!important}.mh-lg-125px{max-height:125px!important}.mh-lg-150px{max-height:150px!important}.mh-lg-175px{max-height:175px!important}.mh-lg-200px{max-height:200px!important}.mh-lg-225px{max-height:225px!important}.mh-lg-250px{max-height:250px!important}.mh-lg-275px{max-height:275px!important}.mh-lg-300px{max-height:300px!important}.mh-lg-325px{max-height:325px!important}.mh-lg-350px{max-height:350px!important}.mh-lg-375px{max-height:375px!important}.mh-lg-400px{max-height:400px!important}.mh-lg-425px{max-height:425px!important}.mh-lg-450px{max-height:450px!important}.mh-lg-475px{max-height:475px!important}.mh-lg-500px{max-height:500px!important}.mh-lg-550px{max-height:550px!important}.mh-lg-600px{max-height:600px!important}.mh-lg-650px{max-height:650px!important}.mh-lg-700px{max-height:700px!important}.mh-lg-750px{max-height:750px!important}.mh-lg-800px{max-height:800px!important}.mh-lg-850px{max-height:850px!important}.mh-lg-900px{max-height:900px!important}.mh-lg-950px{max-height:950px!important}.mh-lg-1000px{max-height:1000px!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:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:.75rem!important}.m-lg-4{margin:1rem!important}.m-lg-5{margin:1.25rem!important}.m-lg-6{margin:1.5rem!important}.m-lg-7{margin:1.75rem!important}.m-lg-8{margin:2rem!important}.m-lg-9{margin:2.25rem!important}.m-lg-10{margin:2.5rem!important}.m-lg-11{margin:2.75rem!important}.m-lg-12{margin:3rem!important}.m-lg-13{margin:3.25rem!important}.m-lg-14{margin:3.5rem!important}.m-lg-15{margin:3.75rem!important}.m-lg-16{margin:4rem!important}.m-lg-17{margin:4.25rem!important}.m-lg-18{margin:4.5rem!important}.m-lg-19{margin:4.75rem!important}.m-lg-20{margin:5rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:.75rem!important;margin-left:.75rem!important}.mx-lg-4{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-5{margin-right:1.25rem!important;margin-left:1.25rem!important}.mx-lg-6{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-7{margin-right:1.75rem!important;margin-left:1.75rem!important}.mx-lg-8{margin-right:2rem!important;margin-left:2rem!important}.mx-lg-9{margin-right:2.25rem!important;margin-left:2.25rem!important}.mx-lg-10{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-lg-11{margin-right:2.75rem!important;margin-left:2.75rem!important}.mx-lg-12{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-13{margin-right:3.25rem!important;margin-left:3.25rem!important}.mx-lg-14{margin-right:3.5rem!important;margin-left:3.5rem!important}.mx-lg-15{margin-right:3.75rem!important;margin-left:3.75rem!important}.mx-lg-16{margin-right:4rem!important;margin-left:4rem!important}.mx-lg-17{margin-right:4.25rem!important;margin-left:4.25rem!important}.mx-lg-18{margin-right:4.5rem!important;margin-left:4.5rem!important}.mx-lg-19{margin-right:4.75rem!important;margin-left:4.75rem!important}.mx-lg-20{margin-right:5rem!important;margin-left:5rem!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:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.my-lg-4{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-5{margin-top:1.25rem!important;margin-bottom:1.25rem!important}.my-lg-6{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-7{margin-top:1.75rem!important;margin-bottom:1.75rem!important}.my-lg-8{margin-top:2rem!important;margin-bottom:2rem!important}.my-lg-9{margin-top:2.25rem!important;margin-bottom:2.25rem!important}.my-lg-10{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-lg-11{margin-top:2.75rem!important;margin-bottom:2.75rem!important}.my-lg-12{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-13{margin-top:3.25rem!important;margin-bottom:3.25rem!important}.my-lg-14{margin-top:3.5rem!important;margin-bottom:3.5rem!important}.my-lg-15{margin-top:3.75rem!important;margin-bottom:3.75rem!important}.my-lg-16{margin-top:4rem!important;margin-bottom:4rem!important}.my-lg-17{margin-top:4.25rem!important;margin-bottom:4.25rem!important}.my-lg-18{margin-top:4.5rem!important;margin-bottom:4.5rem!important}.my-lg-19{margin-top:4.75rem!important;margin-bottom:4.75rem!important}.my-lg-20{margin-top:5rem!important;margin-bottom:5rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:.75rem!important}.mt-lg-4{margin-top:1rem!important}.mt-lg-5{margin-top:1.25rem!important}.mt-lg-6{margin-top:1.5rem!important}.mt-lg-7{margin-top:1.75rem!important}.mt-lg-8{margin-top:2rem!important}.mt-lg-9{margin-top:2.25rem!important}.mt-lg-10{margin-top:2.5rem!important}.mt-lg-11{margin-top:2.75rem!important}.mt-lg-12{margin-top:3rem!important}.mt-lg-13{margin-top:3.25rem!important}.mt-lg-14{margin-top:3.5rem!important}.mt-lg-15{margin-top:3.75rem!important}.mt-lg-16{margin-top:4rem!important}.mt-lg-17{margin-top:4.25rem!important}.mt-lg-18{margin-top:4.5rem!important}.mt-lg-19{margin-top:4.75rem!important}.mt-lg-20{margin-top:5rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:.75rem!important}.me-lg-4{margin-right:1rem!important}.me-lg-5{margin-right:1.25rem!important}.me-lg-6{margin-right:1.5rem!important}.me-lg-7{margin-right:1.75rem!important}.me-lg-8{margin-right:2rem!important}.me-lg-9{margin-right:2.25rem!important}.me-lg-10{margin-right:2.5rem!important}.me-lg-11{margin-right:2.75rem!important}.me-lg-12{margin-right:3rem!important}.me-lg-13{margin-right:3.25rem!important}.me-lg-14{margin-right:3.5rem!important}.me-lg-15{margin-right:3.75rem!important}.me-lg-16{margin-right:4rem!important}.me-lg-17{margin-right:4.25rem!important}.me-lg-18{margin-right:4.5rem!important}.me-lg-19{margin-right:4.75rem!important}.me-lg-20{margin-right:5rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:.75rem!important}.mb-lg-4{margin-bottom:1rem!important}.mb-lg-5{margin-bottom:1.25rem!important}.mb-lg-6{margin-bottom:1.5rem!important}.mb-lg-7{margin-bottom:1.75rem!important}.mb-lg-8{margin-bottom:2rem!important}.mb-lg-9{margin-bottom:2.25rem!important}.mb-lg-10{margin-bottom:2.5rem!important}.mb-lg-11{margin-bottom:2.75rem!important}.mb-lg-12{margin-bottom:3rem!important}.mb-lg-13{margin-bottom:3.25rem!important}.mb-lg-14{margin-bottom:3.5rem!important}.mb-lg-15{margin-bottom:3.75rem!important}.mb-lg-16{margin-bottom:4rem!important}.mb-lg-17{margin-bottom:4.25rem!important}.mb-lg-18{margin-bottom:4.5rem!important}.mb-lg-19{margin-bottom:4.75rem!important}.mb-lg-20{margin-bottom:5rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:.75rem!important}.ms-lg-4{margin-left:1rem!important}.ms-lg-5{margin-left:1.25rem!important}.ms-lg-6{margin-left:1.5rem!important}.ms-lg-7{margin-left:1.75rem!important}.ms-lg-8{margin-left:2rem!important}.ms-lg-9{margin-left:2.25rem!important}.ms-lg-10{margin-left:2.5rem!important}.ms-lg-11{margin-left:2.75rem!important}.ms-lg-12{margin-left:3rem!important}.ms-lg-13{margin-left:3.25rem!important}.ms-lg-14{margin-left:3.5rem!important}.ms-lg-15{margin-left:3.75rem!important}.ms-lg-16{margin-left:4rem!important}.ms-lg-17{margin-left:4.25rem!important}.ms-lg-18{margin-left:4.5rem!important}.ms-lg-19{margin-left:4.75rem!important}.ms-lg-20{margin-left:5rem!important}.ms-lg-auto{margin-left:auto!important}.m-lg-n1{margin:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.m-lg-n3{margin:-.75rem!important}.m-lg-n4{margin:-1rem!important}.m-lg-n5{margin:-1.25rem!important}.m-lg-n6{margin:-1.5rem!important}.m-lg-n7{margin:-1.75rem!important}.m-lg-n8{margin:-2rem!important}.m-lg-n9{margin:-2.25rem!important}.m-lg-n10{margin:-2.5rem!important}.m-lg-n11{margin:-2.75rem!important}.m-lg-n12{margin:-3rem!important}.m-lg-n13{margin:-3.25rem!important}.m-lg-n14{margin:-3.5rem!important}.m-lg-n15{margin:-3.75rem!important}.m-lg-n16{margin:-4rem!important}.m-lg-n17{margin:-4.25rem!important}.m-lg-n18{margin:-4.5rem!important}.m-lg-n19{margin:-4.75rem!important}.m-lg-n20{margin:-5rem!important}.mx-lg-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-lg-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-lg-n3{margin-right:-.75rem!important;margin-left:-.75rem!important}.mx-lg-n4{margin-right:-1rem!important;margin-left:-1rem!important}.mx-lg-n5{margin-right:-1.25rem!important;margin-left:-1.25rem!important}.mx-lg-n6{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-lg-n7{margin-right:-1.75rem!important;margin-left:-1.75rem!important}.mx-lg-n8{margin-right:-2rem!important;margin-left:-2rem!important}.mx-lg-n9{margin-right:-2.25rem!important;margin-left:-2.25rem!important}.mx-lg-n10{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.mx-lg-n11{margin-right:-2.75rem!important;margin-left:-2.75rem!important}.mx-lg-n12{margin-right:-3rem!important;margin-left:-3rem!important}.mx-lg-n13{margin-right:-3.25rem!important;margin-left:-3.25rem!important}.mx-lg-n14{margin-right:-3.5rem!important;margin-left:-3.5rem!important}.mx-lg-n15{margin-right:-3.75rem!important;margin-left:-3.75rem!important}.mx-lg-n16{margin-right:-4rem!important;margin-left:-4rem!important}.mx-lg-n17{margin-right:-4.25rem!important;margin-left:-4.25rem!important}.mx-lg-n18{margin-right:-4.5rem!important;margin-left:-4.5rem!important}.mx-lg-n19{margin-right:-4.75rem!important;margin-left:-4.75rem!important}.mx-lg-n20{margin-right:-5rem!important;margin-left:-5rem!important}.my-lg-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-lg-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-lg-n3{margin-top:-.75rem!important;margin-bottom:-.75rem!important}.my-lg-n4{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-lg-n5{margin-top:-1.25rem!important;margin-bottom:-1.25rem!important}.my-lg-n6{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-lg-n7{margin-top:-1.75rem!important;margin-bottom:-1.75rem!important}.my-lg-n8{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-lg-n9{margin-top:-2.25rem!important;margin-bottom:-2.25rem!important}.my-lg-n10{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.my-lg-n11{margin-top:-2.75rem!important;margin-bottom:-2.75rem!important}.my-lg-n12{margin-top:-3rem!important;margin-bottom:-3rem!important}.my-lg-n13{margin-top:-3.25rem!important;margin-bottom:-3.25rem!important}.my-lg-n14{margin-top:-3.5rem!important;margin-bottom:-3.5rem!important}.my-lg-n15{margin-top:-3.75rem!important;margin-bottom:-3.75rem!important}.my-lg-n16{margin-top:-4rem!important;margin-bottom:-4rem!important}.my-lg-n17{margin-top:-4.25rem!important;margin-bottom:-4.25rem!important}.my-lg-n18{margin-top:-4.5rem!important;margin-bottom:-4.5rem!important}.my-lg-n19{margin-top:-4.75rem!important;margin-bottom:-4.75rem!important}.my-lg-n20{margin-top:-5rem!important;margin-bottom:-5rem!important}.mt-lg-n1{margin-top:-.25rem!important}.mt-lg-n2{margin-top:-.5rem!important}.mt-lg-n3{margin-top:-.75rem!important}.mt-lg-n4{margin-top:-1rem!important}.mt-lg-n5{margin-top:-1.25rem!important}.mt-lg-n6{margin-top:-1.5rem!important}.mt-lg-n7{margin-top:-1.75rem!important}.mt-lg-n8{margin-top:-2rem!important}.mt-lg-n9{margin-top:-2.25rem!important}.mt-lg-n10{margin-top:-2.5rem!important}.mt-lg-n11{margin-top:-2.75rem!important}.mt-lg-n12{margin-top:-3rem!important}.mt-lg-n13{margin-top:-3.25rem!important}.mt-lg-n14{margin-top:-3.5rem!important}.mt-lg-n15{margin-top:-3.75rem!important}.mt-lg-n16{margin-top:-4rem!important}.mt-lg-n17{margin-top:-4.25rem!important}.mt-lg-n18{margin-top:-4.5rem!important}.mt-lg-n19{margin-top:-4.75rem!important}.mt-lg-n20{margin-top:-5rem!important}.me-lg-n1{margin-right:-.25rem!important}.me-lg-n2{margin-right:-.5rem!important}.me-lg-n3{margin-right:-.75rem!important}.me-lg-n4{margin-right:-1rem!important}.me-lg-n5{margin-right:-1.25rem!important}.me-lg-n6{margin-right:-1.5rem!important}.me-lg-n7{margin-right:-1.75rem!important}.me-lg-n8{margin-right:-2rem!important}.me-lg-n9{margin-right:-2.25rem!important}.me-lg-n10{margin-right:-2.5rem!important}.me-lg-n11{margin-right:-2.75rem!important}.me-lg-n12{margin-right:-3rem!important}.me-lg-n13{margin-right:-3.25rem!important}.me-lg-n14{margin-right:-3.5rem!important}.me-lg-n15{margin-right:-3.75rem!important}.me-lg-n16{margin-right:-4rem!important}.me-lg-n17{margin-right:-4.25rem!important}.me-lg-n18{margin-right:-4.5rem!important}.me-lg-n19{margin-right:-4.75rem!important}.me-lg-n20{margin-right:-5rem!important}.mb-lg-n1{margin-bottom:-.25rem!important}.mb-lg-n2{margin-bottom:-.5rem!important}.mb-lg-n3{margin-bottom:-.75rem!important}.mb-lg-n4{margin-bottom:-1rem!important}.mb-lg-n5{margin-bottom:-1.25rem!important}.mb-lg-n6{margin-bottom:-1.5rem!important}.mb-lg-n7{margin-bottom:-1.75rem!important}.mb-lg-n8{margin-bottom:-2rem!important}.mb-lg-n9{margin-bottom:-2.25rem!important}.mb-lg-n10{margin-bottom:-2.5rem!important}.mb-lg-n11{margin-bottom:-2.75rem!important}.mb-lg-n12{margin-bottom:-3rem!important}.mb-lg-n13{margin-bottom:-3.25rem!important}.mb-lg-n14{margin-bottom:-3.5rem!important}.mb-lg-n15{margin-bottom:-3.75rem!important}.mb-lg-n16{margin-bottom:-4rem!important}.mb-lg-n17{margin-bottom:-4.25rem!important}.mb-lg-n18{margin-bottom:-4.5rem!important}.mb-lg-n19{margin-bottom:-4.75rem!important}.mb-lg-n20{margin-bottom:-5rem!important}.ms-lg-n1{margin-left:-.25rem!important}.ms-lg-n2{margin-left:-.5rem!important}.ms-lg-n3{margin-left:-.75rem!important}.ms-lg-n4{margin-left:-1rem!important}.ms-lg-n5{margin-left:-1.25rem!important}.ms-lg-n6{margin-left:-1.5rem!important}.ms-lg-n7{margin-left:-1.75rem!important}.ms-lg-n8{margin-left:-2rem!important}.ms-lg-n9{margin-left:-2.25rem!important}.ms-lg-n10{margin-left:-2.5rem!important}.ms-lg-n11{margin-left:-2.75rem!important}.ms-lg-n12{margin-left:-3rem!important}.ms-lg-n13{margin-left:-3.25rem!important}.ms-lg-n14{margin-left:-3.5rem!important}.ms-lg-n15{margin-left:-3.75rem!important}.ms-lg-n16{margin-left:-4rem!important}.ms-lg-n17{margin-left:-4.25rem!important}.ms-lg-n18{margin-left:-4.5rem!important}.ms-lg-n19{margin-left:-4.75rem!important}.ms-lg-n20{margin-left:-5rem!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:.75rem!important}.p-lg-4{padding:1rem!important}.p-lg-5{padding:1.25rem!important}.p-lg-6{padding:1.5rem!important}.p-lg-7{padding:1.75rem!important}.p-lg-8{padding:2rem!important}.p-lg-9{padding:2.25rem!important}.p-lg-10{padding:2.5rem!important}.p-lg-11{padding:2.75rem!important}.p-lg-12{padding:3rem!important}.p-lg-13{padding:3.25rem!important}.p-lg-14{padding:3.5rem!important}.p-lg-15{padding:3.75rem!important}.p-lg-16{padding:4rem!important}.p-lg-17{padding:4.25rem!important}.p-lg-18{padding:4.5rem!important}.p-lg-19{padding:4.75rem!important}.p-lg-20{padding:5rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:.75rem!important;padding-left:.75rem!important}.px-lg-4{padding-right:1rem!important;padding-left:1rem!important}.px-lg-5{padding-right:1.25rem!important;padding-left:1.25rem!important}.px-lg-6{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-7{padding-right:1.75rem!important;padding-left:1.75rem!important}.px-lg-8{padding-right:2rem!important;padding-left:2rem!important}.px-lg-9{padding-right:2.25rem!important;padding-left:2.25rem!important}.px-lg-10{padding-right:2.5rem!important;padding-left:2.5rem!important}.px-lg-11{padding-right:2.75rem!important;padding-left:2.75rem!important}.px-lg-12{padding-right:3rem!important;padding-left:3rem!important}.px-lg-13{padding-right:3.25rem!important;padding-left:3.25rem!important}.px-lg-14{padding-right:3.5rem!important;padding-left:3.5rem!important}.px-lg-15{padding-right:3.75rem!important;padding-left:3.75rem!important}.px-lg-16{padding-right:4rem!important;padding-left:4rem!important}.px-lg-17{padding-right:4.25rem!important;padding-left:4.25rem!important}.px-lg-18{padding-right:4.5rem!important;padding-left:4.5rem!important}.px-lg-19{padding-right:4.75rem!important;padding-left:4.75rem!important}.px-lg-20{padding-right:5rem!important;padding-left:5rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.py-lg-4{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-5{padding-top:1.25rem!important;padding-bottom:1.25rem!important}.py-lg-6{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-7{padding-top:1.75rem!important;padding-bottom:1.75rem!important}.py-lg-8{padding-top:2rem!important;padding-bottom:2rem!important}.py-lg-9{padding-top:2.25rem!important;padding-bottom:2.25rem!important}.py-lg-10{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.py-lg-11{padding-top:2.75rem!important;padding-bottom:2.75rem!important}.py-lg-12{padding-top:3rem!important;padding-bottom:3rem!important}.py-lg-13{padding-top:3.25rem!important;padding-bottom:3.25rem!important}.py-lg-14{padding-top:3.5rem!important;padding-bottom:3.5rem!important}.py-lg-15{padding-top:3.75rem!important;padding-bottom:3.75rem!important}.py-lg-16{padding-top:4rem!important;padding-bottom:4rem!important}.py-lg-17{padding-top:4.25rem!important;padding-bottom:4.25rem!important}.py-lg-18{padding-top:4.5rem!important;padding-bottom:4.5rem!important}.py-lg-19{padding-top:4.75rem!important;padding-bottom:4.75rem!important}.py-lg-20{padding-top:5rem!important;padding-bottom:5rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:.75rem!important}.pt-lg-4{padding-top:1rem!important}.pt-lg-5{padding-top:1.25rem!important}.pt-lg-6{padding-top:1.5rem!important}.pt-lg-7{padding-top:1.75rem!important}.pt-lg-8{padding-top:2rem!important}.pt-lg-9{padding-top:2.25rem!important}.pt-lg-10{padding-top:2.5rem!important}.pt-lg-11{padding-top:2.75rem!important}.pt-lg-12{padding-top:3rem!important}.pt-lg-13{padding-top:3.25rem!important}.pt-lg-14{padding-top:3.5rem!important}.pt-lg-15{padding-top:3.75rem!important}.pt-lg-16{padding-top:4rem!important}.pt-lg-17{padding-top:4.25rem!important}.pt-lg-18{padding-top:4.5rem!important}.pt-lg-19{padding-top:4.75rem!important}.pt-lg-20{padding-top:5rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:.75rem!important}.pe-lg-4{padding-right:1rem!important}.pe-lg-5{padding-right:1.25rem!important}.pe-lg-6{padding-right:1.5rem!important}.pe-lg-7{padding-right:1.75rem!important}.pe-lg-8{padding-right:2rem!important}.pe-lg-9{padding-right:2.25rem!important}.pe-lg-10{padding-right:2.5rem!important}.pe-lg-11{padding-right:2.75rem!important}.pe-lg-12{padding-right:3rem!important}.pe-lg-13{padding-right:3.25rem!important}.pe-lg-14{padding-right:3.5rem!important}.pe-lg-15{padding-right:3.75rem!important}.pe-lg-16{padding-right:4rem!important}.pe-lg-17{padding-right:4.25rem!important}.pe-lg-18{padding-right:4.5rem!important}.pe-lg-19{padding-right:4.75rem!important}.pe-lg-20{padding-right:5rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:.75rem!important}.pb-lg-4{padding-bottom:1rem!important}.pb-lg-5{padding-bottom:1.25rem!important}.pb-lg-6{padding-bottom:1.5rem!important}.pb-lg-7{padding-bottom:1.75rem!important}.pb-lg-8{padding-bottom:2rem!important}.pb-lg-9{padding-bottom:2.25rem!important}.pb-lg-10{padding-bottom:2.5rem!important}.pb-lg-11{padding-bottom:2.75rem!important}.pb-lg-12{padding-bottom:3rem!important}.pb-lg-13{padding-bottom:3.25rem!important}.pb-lg-14{padding-bottom:3.5rem!important}.pb-lg-15{padding-bottom:3.75rem!important}.pb-lg-16{padding-bottom:4rem!important}.pb-lg-17{padding-bottom:4.25rem!important}.pb-lg-18{padding-bottom:4.5rem!important}.pb-lg-19{padding-bottom:4.75rem!important}.pb-lg-20{padding-bottom:5rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:.75rem!important}.ps-lg-4{padding-left:1rem!important}.ps-lg-5{padding-left:1.25rem!important}.ps-lg-6{padding-left:1.5rem!important}.ps-lg-7{padding-left:1.75rem!important}.ps-lg-8{padding-left:2rem!important}.ps-lg-9{padding-left:2.25rem!important}.ps-lg-10{padding-left:2.5rem!important}.ps-lg-11{padding-left:2.75rem!important}.ps-lg-12{padding-left:3rem!important}.ps-lg-13{padding-left:3.25rem!important}.ps-lg-14{padding-left:3.5rem!important}.ps-lg-15{padding-left:3.75rem!important}.ps-lg-16{padding-left:4rem!important}.ps-lg-17{padding-left:4.25rem!important}.ps-lg-18{padding-left:4.5rem!important}.ps-lg-19{padding-left:4.75rem!important}.ps-lg-20{padding-left:5rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:.75rem!important}.gap-lg-4{gap:1rem!important}.gap-lg-5{gap:1.25rem!important}.gap-lg-6{gap:1.5rem!important}.gap-lg-7{gap:1.75rem!important}.gap-lg-8{gap:2rem!important}.gap-lg-9{gap:2.25rem!important}.gap-lg-10{gap:2.5rem!important}.gap-lg-11{gap:2.75rem!important}.gap-lg-12{gap:3rem!important}.gap-lg-13{gap:3.25rem!important}.gap-lg-14{gap:3.5rem!important}.gap-lg-15{gap:3.75rem!important}.gap-lg-16{gap:4rem!important}.gap-lg-17{gap:4.25rem!important}.gap-lg-18{gap:4.5rem!important}.gap-lg-19{gap:4.75rem!important}.gap-lg-20{gap:5rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:.75rem!important}.row-gap-lg-4{row-gap:1rem!important}.row-gap-lg-5{row-gap:1.25rem!important}.row-gap-lg-6{row-gap:1.5rem!important}.row-gap-lg-7{row-gap:1.75rem!important}.row-gap-lg-8{row-gap:2rem!important}.row-gap-lg-9{row-gap:2.25rem!important}.row-gap-lg-10{row-gap:2.5rem!important}.row-gap-lg-11{row-gap:2.75rem!important}.row-gap-lg-12{row-gap:3rem!important}.row-gap-lg-13{row-gap:3.25rem!important}.row-gap-lg-14{row-gap:3.5rem!important}.row-gap-lg-15{row-gap:3.75rem!important}.row-gap-lg-16{row-gap:4rem!important}.row-gap-lg-17{row-gap:4.25rem!important}.row-gap-lg-18{row-gap:4.5rem!important}.row-gap-lg-19{row-gap:4.75rem!important}.row-gap-lg-20{row-gap:5rem!important}.column-gap-lg-0{column-gap:0!important}.column-gap-lg-1{column-gap:.25rem!important}.column-gap-lg-2{column-gap:.5rem!important}.column-gap-lg-3{column-gap:.75rem!important}.column-gap-lg-4{column-gap:1rem!important}.column-gap-lg-5{column-gap:1.25rem!important}.column-gap-lg-6{column-gap:1.5rem!important}.column-gap-lg-7{column-gap:1.75rem!important}.column-gap-lg-8{column-gap:2rem!important}.column-gap-lg-9{column-gap:2.25rem!important}.column-gap-lg-10{column-gap:2.5rem!important}.column-gap-lg-11{column-gap:2.75rem!important}.column-gap-lg-12{column-gap:3rem!important}.column-gap-lg-13{column-gap:3.25rem!important}.column-gap-lg-14{column-gap:3.5rem!important}.column-gap-lg-15{column-gap:3.75rem!important}.column-gap-lg-16{column-gap:4rem!important}.column-gap-lg-17{column-gap:4.25rem!important}.column-gap-lg-18{column-gap:4.5rem!important}.column-gap-lg-19{column-gap:4.75rem!important}.column-gap-lg-20{column-gap:5rem!important}.fs-lg-1{font-size:calc(1.3rem + .6vw)!important}.fs-lg-2{font-size:calc(1.275rem + .3vw)!important}.fs-lg-3{font-size:calc(1.26rem + .12vw)!important}.fs-lg-4{font-size:1.25rem!important}.fs-lg-5{font-size:1.15rem!important}.fs-lg-6{font-size:1.075rem!important}.fs-lg-7{font-size:.95rem!important}.fs-lg-8{font-size:.85rem!important}.fs-lg-9{font-size:.75rem!important}.fs-lg-10{font-size:.5rem!important}.fs-lg-sm{font-size:.95rem!important}.fs-lg-base{font-size:1rem!important}.fs-lg-lg{font-size:1.075rem!important}.fs-lg-xl{font-size:1.21rem!important}.fs-lg-fluid{font-size:100%!important}.fs-lg-2x{font-size:calc(1.325rem + .9vw)!important}.fs-lg-2qx{font-size:calc(1.35rem + 1.2vw)!important}.fs-lg-2hx{font-size:calc(1.375rem + 1.5vw)!important}.fs-lg-2tx{font-size:calc(1.4rem + 1.8vw)!important}.fs-lg-3x{font-size:calc(1.425rem + 2.1vw)!important}.fs-lg-3qx{font-size:calc(1.45rem + 2.4vw)!important}.fs-lg-3hx{font-size:calc(1.475rem + 2.7vw)!important}.fs-lg-3tx{font-size:calc(1.5rem + 3vw)!important}.fs-lg-4x{font-size:calc(1.525rem + 3.3vw)!important}.fs-lg-4qx{font-size:calc(1.55rem + 3.6vw)!important}.fs-lg-4hx{font-size:calc(1.575rem + 3.9vw)!important}.fs-lg-4tx{font-size:calc(1.6rem + 4.2vw)!important}.fs-lg-5x{font-size:calc(1.625rem + 4.5vw)!important}.fs-lg-5qx{font-size:calc(1.65rem + 4.8vw)!important}.fs-lg-5hx{font-size:calc(1.675rem + 5.1vw)!important}.fs-lg-5tx{font-size:calc(1.7rem + 5.4vw)!important}.fs-lg-6x{font-size:calc(1.725rem + 5.7vw)!important}.fs-lg-6qx{font-size:calc(1.75rem + 6vw)!important}.fs-lg-6hx{font-size:calc(1.775rem + 6.3vw)!important}.fs-lg-6tx{font-size:calc(1.8rem + 6.6vw)!important}.fs-lg-7x{font-size:calc(1.825rem + 6.9vw)!important}.fs-lg-7qx{font-size:calc(1.85rem + 7.2vw)!important}.fs-lg-7hx{font-size:calc(1.875rem + 7.5vw)!important}.fs-lg-7tx{font-size:calc(1.9rem + 7.8vw)!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}.min-w-lg-unset{min-width:unset!important}.min-w-lg-25{min-width:25%!important}.min-w-lg-50{min-width:50%!important}.min-w-lg-75{min-width:75%!important}.min-w-lg-100{min-width:100%!important}.min-w-lg-auto{min-width:auto!important}.min-w-lg-1px{min-width:1px!important}.min-w-lg-2px{min-width:2px!important}.min-w-lg-3px{min-width:3px!important}.min-w-lg-4px{min-width:4px!important}.min-w-lg-5px{min-width:5px!important}.min-w-lg-6px{min-width:6px!important}.min-w-lg-7px{min-width:7px!important}.min-w-lg-8px{min-width:8px!important}.min-w-lg-9px{min-width:9px!important}.min-w-lg-10px{min-width:10px!important}.min-w-lg-15px{min-width:15px!important}.min-w-lg-20px{min-width:20px!important}.min-w-lg-25px{min-width:25px!important}.min-w-lg-30px{min-width:30px!important}.min-w-lg-35px{min-width:35px!important}.min-w-lg-40px{min-width:40px!important}.min-w-lg-45px{min-width:45px!important}.min-w-lg-50px{min-width:50px!important}.min-w-lg-55px{min-width:55px!important}.min-w-lg-60px{min-width:60px!important}.min-w-lg-65px{min-width:65px!important}.min-w-lg-70px{min-width:70px!important}.min-w-lg-75px{min-width:75px!important}.min-w-lg-80px{min-width:80px!important}.min-w-lg-85px{min-width:85px!important}.min-w-lg-90px{min-width:90px!important}.min-w-lg-95px{min-width:95px!important}.min-w-lg-100px{min-width:100px!important}.min-w-lg-125px{min-width:125px!important}.min-w-lg-150px{min-width:150px!important}.min-w-lg-175px{min-width:175px!important}.min-w-lg-200px{min-width:200px!important}.min-w-lg-225px{min-width:225px!important}.min-w-lg-250px{min-width:250px!important}.min-w-lg-275px{min-width:275px!important}.min-w-lg-300px{min-width:300px!important}.min-w-lg-325px{min-width:325px!important}.min-w-lg-350px{min-width:350px!important}.min-w-lg-375px{min-width:375px!important}.min-w-lg-400px{min-width:400px!important}.min-w-lg-425px{min-width:425px!important}.min-w-lg-450px{min-width:450px!important}.min-w-lg-475px{min-width:475px!important}.min-w-lg-500px{min-width:500px!important}.min-w-lg-550px{min-width:550px!important}.min-w-lg-600px{min-width:600px!important}.min-w-lg-650px{min-width:650px!important}.min-w-lg-700px{min-width:700px!important}.min-w-lg-750px{min-width:750px!important}.min-w-lg-800px{min-width:800px!important}.min-w-lg-850px{min-width:850px!important}.min-w-lg-900px{min-width:900px!important}.min-w-lg-950px{min-width:950px!important}.min-w-lg-1000px{min-width:1000px!important}.min-h-lg-unset{min-height:unset!important}.min-h-lg-25{min-height:25%!important}.min-h-lg-50{min-height:50%!important}.min-h-lg-75{min-height:75%!important}.min-h-lg-100{min-height:100%!important}.min-h-lg-auto{min-height:auto!important}.min-h-lg-1px{min-height:1px!important}.min-h-lg-2px{min-height:2px!important}.min-h-lg-3px{min-height:3px!important}.min-h-lg-4px{min-height:4px!important}.min-h-lg-5px{min-height:5px!important}.min-h-lg-6px{min-height:6px!important}.min-h-lg-7px{min-height:7px!important}.min-h-lg-8px{min-height:8px!important}.min-h-lg-9px{min-height:9px!important}.min-h-lg-10px{min-height:10px!important}.min-h-lg-15px{min-height:15px!important}.min-h-lg-20px{min-height:20px!important}.min-h-lg-25px{min-height:25px!important}.min-h-lg-30px{min-height:30px!important}.min-h-lg-35px{min-height:35px!important}.min-h-lg-40px{min-height:40px!important}.min-h-lg-45px{min-height:45px!important}.min-h-lg-50px{min-height:50px!important}.min-h-lg-55px{min-height:55px!important}.min-h-lg-60px{min-height:60px!important}.min-h-lg-65px{min-height:65px!important}.min-h-lg-70px{min-height:70px!important}.min-h-lg-75px{min-height:75px!important}.min-h-lg-80px{min-height:80px!important}.min-h-lg-85px{min-height:85px!important}.min-h-lg-90px{min-height:90px!important}.min-h-lg-95px{min-height:95px!important}.min-h-lg-100px{min-height:100px!important}.min-h-lg-125px{min-height:125px!important}.min-h-lg-150px{min-height:150px!important}.min-h-lg-175px{min-height:175px!important}.min-h-lg-200px{min-height:200px!important}.min-h-lg-225px{min-height:225px!important}.min-h-lg-250px{min-height:250px!important}.min-h-lg-275px{min-height:275px!important}.min-h-lg-300px{min-height:300px!important}.min-h-lg-325px{min-height:325px!important}.min-h-lg-350px{min-height:350px!important}.min-h-lg-375px{min-height:375px!important}.min-h-lg-400px{min-height:400px!important}.min-h-lg-425px{min-height:425px!important}.min-h-lg-450px{min-height:450px!important}.min-h-lg-475px{min-height:475px!important}.min-h-lg-500px{min-height:500px!important}.min-h-lg-550px{min-height:550px!important}.min-h-lg-600px{min-height:600px!important}.min-h-lg-650px{min-height:650px!important}.min-h-lg-700px{min-height:700px!important}.min-h-lg-750px{min-height:750px!important}.min-h-lg-800px{min-height:800px!important}.min-h-lg-850px{min-height:850px!important}.min-h-lg-900px{min-height:900px!important}.min-h-lg-950px{min-height:950px!important}.min-h-lg-1000px{min-height:1000px!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{object-fit:contain!important}.object-fit-xl-cover{object-fit:cover!important}.object-fit-xl-fill{object-fit:fill!important}.object-fit-xl-scale{object-fit:scale-down!important}.object-fit-xl-none{object-fit:none!important}.overflow-xl-auto{overflow:auto!important}.overflow-xl-hidden{overflow:hidden!important}.overflow-xl-visible{overflow:visible!important}.overflow-xl-scroll{overflow:scroll!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}.position-xl-static{position:static!important}.position-xl-relative{position:relative!important}.position-xl-absolute{position:absolute!important}.position-xl-fixed{position:fixed!important}.position-xl-sticky{position:sticky!important}.w-xl-unset{width:unset!important}.w-xl-25{width:25%!important}.w-xl-50{width:50%!important}.w-xl-75{width:75%!important}.w-xl-100{width:100%!important}.w-xl-auto{width:auto!important}.w-xl-1px{width:1px!important}.w-xl-2px{width:2px!important}.w-xl-3px{width:3px!important}.w-xl-4px{width:4px!important}.w-xl-5px{width:5px!important}.w-xl-6px{width:6px!important}.w-xl-7px{width:7px!important}.w-xl-8px{width:8px!important}.w-xl-9px{width:9px!important}.w-xl-10px{width:10px!important}.w-xl-15px{width:15px!important}.w-xl-20px{width:20px!important}.w-xl-25px{width:25px!important}.w-xl-30px{width:30px!important}.w-xl-35px{width:35px!important}.w-xl-40px{width:40px!important}.w-xl-45px{width:45px!important}.w-xl-50px{width:50px!important}.w-xl-55px{width:55px!important}.w-xl-60px{width:60px!important}.w-xl-65px{width:65px!important}.w-xl-70px{width:70px!important}.w-xl-75px{width:75px!important}.w-xl-80px{width:80px!important}.w-xl-85px{width:85px!important}.w-xl-90px{width:90px!important}.w-xl-95px{width:95px!important}.w-xl-100px{width:100px!important}.w-xl-125px{width:125px!important}.w-xl-150px{width:150px!important}.w-xl-175px{width:175px!important}.w-xl-200px{width:200px!important}.w-xl-225px{width:225px!important}.w-xl-250px{width:250px!important}.w-xl-275px{width:275px!important}.w-xl-300px{width:300px!important}.w-xl-325px{width:325px!important}.w-xl-350px{width:350px!important}.w-xl-375px{width:375px!important}.w-xl-400px{width:400px!important}.w-xl-425px{width:425px!important}.w-xl-450px{width:450px!important}.w-xl-475px{width:475px!important}.w-xl-500px{width:500px!important}.w-xl-550px{width:550px!important}.w-xl-600px{width:600px!important}.w-xl-650px{width:650px!important}.w-xl-700px{width:700px!important}.w-xl-750px{width:750px!important}.w-xl-800px{width:800px!important}.w-xl-850px{width:850px!important}.w-xl-900px{width:900px!important}.w-xl-950px{width:950px!important}.w-xl-1000px{width:1000px!important}.mw-xl-unset{max-width:unset!important}.mw-xl-25{max-width:25%!important}.mw-xl-50{max-width:50%!important}.mw-xl-75{max-width:75%!important}.mw-xl-100{max-width:100%!important}.mw-xl-auto{max-width:auto!important}.mw-xl-1px{max-width:1px!important}.mw-xl-2px{max-width:2px!important}.mw-xl-3px{max-width:3px!important}.mw-xl-4px{max-width:4px!important}.mw-xl-5px{max-width:5px!important}.mw-xl-6px{max-width:6px!important}.mw-xl-7px{max-width:7px!important}.mw-xl-8px{max-width:8px!important}.mw-xl-9px{max-width:9px!important}.mw-xl-10px{max-width:10px!important}.mw-xl-15px{max-width:15px!important}.mw-xl-20px{max-width:20px!important}.mw-xl-25px{max-width:25px!important}.mw-xl-30px{max-width:30px!important}.mw-xl-35px{max-width:35px!important}.mw-xl-40px{max-width:40px!important}.mw-xl-45px{max-width:45px!important}.mw-xl-50px{max-width:50px!important}.mw-xl-55px{max-width:55px!important}.mw-xl-60px{max-width:60px!important}.mw-xl-65px{max-width:65px!important}.mw-xl-70px{max-width:70px!important}.mw-xl-75px{max-width:75px!important}.mw-xl-80px{max-width:80px!important}.mw-xl-85px{max-width:85px!important}.mw-xl-90px{max-width:90px!important}.mw-xl-95px{max-width:95px!important}.mw-xl-100px{max-width:100px!important}.mw-xl-125px{max-width:125px!important}.mw-xl-150px{max-width:150px!important}.mw-xl-175px{max-width:175px!important}.mw-xl-200px{max-width:200px!important}.mw-xl-225px{max-width:225px!important}.mw-xl-250px{max-width:250px!important}.mw-xl-275px{max-width:275px!important}.mw-xl-300px{max-width:300px!important}.mw-xl-325px{max-width:325px!important}.mw-xl-350px{max-width:350px!important}.mw-xl-375px{max-width:375px!important}.mw-xl-400px{max-width:400px!important}.mw-xl-425px{max-width:425px!important}.mw-xl-450px{max-width:450px!important}.mw-xl-475px{max-width:475px!important}.mw-xl-500px{max-width:500px!important}.mw-xl-550px{max-width:550px!important}.mw-xl-600px{max-width:600px!important}.mw-xl-650px{max-width:650px!important}.mw-xl-700px{max-width:700px!important}.mw-xl-750px{max-width:750px!important}.mw-xl-800px{max-width:800px!important}.mw-xl-850px{max-width:850px!important}.mw-xl-900px{max-width:900px!important}.mw-xl-950px{max-width:950px!important}.mw-xl-1000px{max-width:1000px!important}.h-xl-unset{height:unset!important}.h-xl-25{height:25%!important}.h-xl-50{height:50%!important}.h-xl-75{height:75%!important}.h-xl-100{height:100%!important}.h-xl-auto{height:auto!important}.h-xl-1px{height:1px!important}.h-xl-2px{height:2px!important}.h-xl-3px{height:3px!important}.h-xl-4px{height:4px!important}.h-xl-5px{height:5px!important}.h-xl-6px{height:6px!important}.h-xl-7px{height:7px!important}.h-xl-8px{height:8px!important}.h-xl-9px{height:9px!important}.h-xl-10px{height:10px!important}.h-xl-15px{height:15px!important}.h-xl-20px{height:20px!important}.h-xl-25px{height:25px!important}.h-xl-30px{height:30px!important}.h-xl-35px{height:35px!important}.h-xl-40px{height:40px!important}.h-xl-45px{height:45px!important}.h-xl-50px{height:50px!important}.h-xl-55px{height:55px!important}.h-xl-60px{height:60px!important}.h-xl-65px{height:65px!important}.h-xl-70px{height:70px!important}.h-xl-75px{height:75px!important}.h-xl-80px{height:80px!important}.h-xl-85px{height:85px!important}.h-xl-90px{height:90px!important}.h-xl-95px{height:95px!important}.h-xl-100px{height:100px!important}.h-xl-125px{height:125px!important}.h-xl-150px{height:150px!important}.h-xl-175px{height:175px!important}.h-xl-200px{height:200px!important}.h-xl-225px{height:225px!important}.h-xl-250px{height:250px!important}.h-xl-275px{height:275px!important}.h-xl-300px{height:300px!important}.h-xl-325px{height:325px!important}.h-xl-350px{height:350px!important}.h-xl-375px{height:375px!important}.h-xl-400px{height:400px!important}.h-xl-425px{height:425px!important}.h-xl-450px{height:450px!important}.h-xl-475px{height:475px!important}.h-xl-500px{height:500px!important}.h-xl-550px{height:550px!important}.h-xl-600px{height:600px!important}.h-xl-650px{height:650px!important}.h-xl-700px{height:700px!important}.h-xl-750px{height:750px!important}.h-xl-800px{height:800px!important}.h-xl-850px{height:850px!important}.h-xl-900px{height:900px!important}.h-xl-950px{height:950px!important}.h-xl-1000px{height:1000px!important}.mh-xl-unset{max-height:unset!important}.mh-xl-25{max-height:25%!important}.mh-xl-50{max-height:50%!important}.mh-xl-75{max-height:75%!important}.mh-xl-100{max-height:100%!important}.mh-xl-auto{max-height:auto!important}.mh-xl-1px{max-height:1px!important}.mh-xl-2px{max-height:2px!important}.mh-xl-3px{max-height:3px!important}.mh-xl-4px{max-height:4px!important}.mh-xl-5px{max-height:5px!important}.mh-xl-6px{max-height:6px!important}.mh-xl-7px{max-height:7px!important}.mh-xl-8px{max-height:8px!important}.mh-xl-9px{max-height:9px!important}.mh-xl-10px{max-height:10px!important}.mh-xl-15px{max-height:15px!important}.mh-xl-20px{max-height:20px!important}.mh-xl-25px{max-height:25px!important}.mh-xl-30px{max-height:30px!important}.mh-xl-35px{max-height:35px!important}.mh-xl-40px{max-height:40px!important}.mh-xl-45px{max-height:45px!important}.mh-xl-50px{max-height:50px!important}.mh-xl-55px{max-height:55px!important}.mh-xl-60px{max-height:60px!important}.mh-xl-65px{max-height:65px!important}.mh-xl-70px{max-height:70px!important}.mh-xl-75px{max-height:75px!important}.mh-xl-80px{max-height:80px!important}.mh-xl-85px{max-height:85px!important}.mh-xl-90px{max-height:90px!important}.mh-xl-95px{max-height:95px!important}.mh-xl-100px{max-height:100px!important}.mh-xl-125px{max-height:125px!important}.mh-xl-150px{max-height:150px!important}.mh-xl-175px{max-height:175px!important}.mh-xl-200px{max-height:200px!important}.mh-xl-225px{max-height:225px!important}.mh-xl-250px{max-height:250px!important}.mh-xl-275px{max-height:275px!important}.mh-xl-300px{max-height:300px!important}.mh-xl-325px{max-height:325px!important}.mh-xl-350px{max-height:350px!important}.mh-xl-375px{max-height:375px!important}.mh-xl-400px{max-height:400px!important}.mh-xl-425px{max-height:425px!important}.mh-xl-450px{max-height:450px!important}.mh-xl-475px{max-height:475px!important}.mh-xl-500px{max-height:500px!important}.mh-xl-550px{max-height:550px!important}.mh-xl-600px{max-height:600px!important}.mh-xl-650px{max-height:650px!important}.mh-xl-700px{max-height:700px!important}.mh-xl-750px{max-height:750px!important}.mh-xl-800px{max-height:800px!important}.mh-xl-850px{max-height:850px!important}.mh-xl-900px{max-height:900px!important}.mh-xl-950px{max-height:950px!important}.mh-xl-1000px{max-height:1000px!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:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:.75rem!important}.m-xl-4{margin:1rem!important}.m-xl-5{margin:1.25rem!important}.m-xl-6{margin:1.5rem!important}.m-xl-7{margin:1.75rem!important}.m-xl-8{margin:2rem!important}.m-xl-9{margin:2.25rem!important}.m-xl-10{margin:2.5rem!important}.m-xl-11{margin:2.75rem!important}.m-xl-12{margin:3rem!important}.m-xl-13{margin:3.25rem!important}.m-xl-14{margin:3.5rem!important}.m-xl-15{margin:3.75rem!important}.m-xl-16{margin:4rem!important}.m-xl-17{margin:4.25rem!important}.m-xl-18{margin:4.5rem!important}.m-xl-19{margin:4.75rem!important}.m-xl-20{margin:5rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:.75rem!important;margin-left:.75rem!important}.mx-xl-4{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-5{margin-right:1.25rem!important;margin-left:1.25rem!important}.mx-xl-6{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-7{margin-right:1.75rem!important;margin-left:1.75rem!important}.mx-xl-8{margin-right:2rem!important;margin-left:2rem!important}.mx-xl-9{margin-right:2.25rem!important;margin-left:2.25rem!important}.mx-xl-10{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-xl-11{margin-right:2.75rem!important;margin-left:2.75rem!important}.mx-xl-12{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-13{margin-right:3.25rem!important;margin-left:3.25rem!important}.mx-xl-14{margin-right:3.5rem!important;margin-left:3.5rem!important}.mx-xl-15{margin-right:3.75rem!important;margin-left:3.75rem!important}.mx-xl-16{margin-right:4rem!important;margin-left:4rem!important}.mx-xl-17{margin-right:4.25rem!important;margin-left:4.25rem!important}.mx-xl-18{margin-right:4.5rem!important;margin-left:4.5rem!important}.mx-xl-19{margin-right:4.75rem!important;margin-left:4.75rem!important}.mx-xl-20{margin-right:5rem!important;margin-left:5rem!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:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.my-xl-4{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-5{margin-top:1.25rem!important;margin-bottom:1.25rem!important}.my-xl-6{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-7{margin-top:1.75rem!important;margin-bottom:1.75rem!important}.my-xl-8{margin-top:2rem!important;margin-bottom:2rem!important}.my-xl-9{margin-top:2.25rem!important;margin-bottom:2.25rem!important}.my-xl-10{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-xl-11{margin-top:2.75rem!important;margin-bottom:2.75rem!important}.my-xl-12{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-13{margin-top:3.25rem!important;margin-bottom:3.25rem!important}.my-xl-14{margin-top:3.5rem!important;margin-bottom:3.5rem!important}.my-xl-15{margin-top:3.75rem!important;margin-bottom:3.75rem!important}.my-xl-16{margin-top:4rem!important;margin-bottom:4rem!important}.my-xl-17{margin-top:4.25rem!important;margin-bottom:4.25rem!important}.my-xl-18{margin-top:4.5rem!important;margin-bottom:4.5rem!important}.my-xl-19{margin-top:4.75rem!important;margin-bottom:4.75rem!important}.my-xl-20{margin-top:5rem!important;margin-bottom:5rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:.75rem!important}.mt-xl-4{margin-top:1rem!important}.mt-xl-5{margin-top:1.25rem!important}.mt-xl-6{margin-top:1.5rem!important}.mt-xl-7{margin-top:1.75rem!important}.mt-xl-8{margin-top:2rem!important}.mt-xl-9{margin-top:2.25rem!important}.mt-xl-10{margin-top:2.5rem!important}.mt-xl-11{margin-top:2.75rem!important}.mt-xl-12{margin-top:3rem!important}.mt-xl-13{margin-top:3.25rem!important}.mt-xl-14{margin-top:3.5rem!important}.mt-xl-15{margin-top:3.75rem!important}.mt-xl-16{margin-top:4rem!important}.mt-xl-17{margin-top:4.25rem!important}.mt-xl-18{margin-top:4.5rem!important}.mt-xl-19{margin-top:4.75rem!important}.mt-xl-20{margin-top:5rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:.75rem!important}.me-xl-4{margin-right:1rem!important}.me-xl-5{margin-right:1.25rem!important}.me-xl-6{margin-right:1.5rem!important}.me-xl-7{margin-right:1.75rem!important}.me-xl-8{margin-right:2rem!important}.me-xl-9{margin-right:2.25rem!important}.me-xl-10{margin-right:2.5rem!important}.me-xl-11{margin-right:2.75rem!important}.me-xl-12{margin-right:3rem!important}.me-xl-13{margin-right:3.25rem!important}.me-xl-14{margin-right:3.5rem!important}.me-xl-15{margin-right:3.75rem!important}.me-xl-16{margin-right:4rem!important}.me-xl-17{margin-right:4.25rem!important}.me-xl-18{margin-right:4.5rem!important}.me-xl-19{margin-right:4.75rem!important}.me-xl-20{margin-right:5rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:.75rem!important}.mb-xl-4{margin-bottom:1rem!important}.mb-xl-5{margin-bottom:1.25rem!important}.mb-xl-6{margin-bottom:1.5rem!important}.mb-xl-7{margin-bottom:1.75rem!important}.mb-xl-8{margin-bottom:2rem!important}.mb-xl-9{margin-bottom:2.25rem!important}.mb-xl-10{margin-bottom:2.5rem!important}.mb-xl-11{margin-bottom:2.75rem!important}.mb-xl-12{margin-bottom:3rem!important}.mb-xl-13{margin-bottom:3.25rem!important}.mb-xl-14{margin-bottom:3.5rem!important}.mb-xl-15{margin-bottom:3.75rem!important}.mb-xl-16{margin-bottom:4rem!important}.mb-xl-17{margin-bottom:4.25rem!important}.mb-xl-18{margin-bottom:4.5rem!important}.mb-xl-19{margin-bottom:4.75rem!important}.mb-xl-20{margin-bottom:5rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:.75rem!important}.ms-xl-4{margin-left:1rem!important}.ms-xl-5{margin-left:1.25rem!important}.ms-xl-6{margin-left:1.5rem!important}.ms-xl-7{margin-left:1.75rem!important}.ms-xl-8{margin-left:2rem!important}.ms-xl-9{margin-left:2.25rem!important}.ms-xl-10{margin-left:2.5rem!important}.ms-xl-11{margin-left:2.75rem!important}.ms-xl-12{margin-left:3rem!important}.ms-xl-13{margin-left:3.25rem!important}.ms-xl-14{margin-left:3.5rem!important}.ms-xl-15{margin-left:3.75rem!important}.ms-xl-16{margin-left:4rem!important}.ms-xl-17{margin-left:4.25rem!important}.ms-xl-18{margin-left:4.5rem!important}.ms-xl-19{margin-left:4.75rem!important}.ms-xl-20{margin-left:5rem!important}.ms-xl-auto{margin-left:auto!important}.m-xl-n1{margin:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.m-xl-n3{margin:-.75rem!important}.m-xl-n4{margin:-1rem!important}.m-xl-n5{margin:-1.25rem!important}.m-xl-n6{margin:-1.5rem!important}.m-xl-n7{margin:-1.75rem!important}.m-xl-n8{margin:-2rem!important}.m-xl-n9{margin:-2.25rem!important}.m-xl-n10{margin:-2.5rem!important}.m-xl-n11{margin:-2.75rem!important}.m-xl-n12{margin:-3rem!important}.m-xl-n13{margin:-3.25rem!important}.m-xl-n14{margin:-3.5rem!important}.m-xl-n15{margin:-3.75rem!important}.m-xl-n16{margin:-4rem!important}.m-xl-n17{margin:-4.25rem!important}.m-xl-n18{margin:-4.5rem!important}.m-xl-n19{margin:-4.75rem!important}.m-xl-n20{margin:-5rem!important}.mx-xl-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-xl-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-xl-n3{margin-right:-.75rem!important;margin-left:-.75rem!important}.mx-xl-n4{margin-right:-1rem!important;margin-left:-1rem!important}.mx-xl-n5{margin-right:-1.25rem!important;margin-left:-1.25rem!important}.mx-xl-n6{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-xl-n7{margin-right:-1.75rem!important;margin-left:-1.75rem!important}.mx-xl-n8{margin-right:-2rem!important;margin-left:-2rem!important}.mx-xl-n9{margin-right:-2.25rem!important;margin-left:-2.25rem!important}.mx-xl-n10{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.mx-xl-n11{margin-right:-2.75rem!important;margin-left:-2.75rem!important}.mx-xl-n12{margin-right:-3rem!important;margin-left:-3rem!important}.mx-xl-n13{margin-right:-3.25rem!important;margin-left:-3.25rem!important}.mx-xl-n14{margin-right:-3.5rem!important;margin-left:-3.5rem!important}.mx-xl-n15{margin-right:-3.75rem!important;margin-left:-3.75rem!important}.mx-xl-n16{margin-right:-4rem!important;margin-left:-4rem!important}.mx-xl-n17{margin-right:-4.25rem!important;margin-left:-4.25rem!important}.mx-xl-n18{margin-right:-4.5rem!important;margin-left:-4.5rem!important}.mx-xl-n19{margin-right:-4.75rem!important;margin-left:-4.75rem!important}.mx-xl-n20{margin-right:-5rem!important;margin-left:-5rem!important}.my-xl-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-xl-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-xl-n3{margin-top:-.75rem!important;margin-bottom:-.75rem!important}.my-xl-n4{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-xl-n5{margin-top:-1.25rem!important;margin-bottom:-1.25rem!important}.my-xl-n6{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-xl-n7{margin-top:-1.75rem!important;margin-bottom:-1.75rem!important}.my-xl-n8{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-xl-n9{margin-top:-2.25rem!important;margin-bottom:-2.25rem!important}.my-xl-n10{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.my-xl-n11{margin-top:-2.75rem!important;margin-bottom:-2.75rem!important}.my-xl-n12{margin-top:-3rem!important;margin-bottom:-3rem!important}.my-xl-n13{margin-top:-3.25rem!important;margin-bottom:-3.25rem!important}.my-xl-n14{margin-top:-3.5rem!important;margin-bottom:-3.5rem!important}.my-xl-n15{margin-top:-3.75rem!important;margin-bottom:-3.75rem!important}.my-xl-n16{margin-top:-4rem!important;margin-bottom:-4rem!important}.my-xl-n17{margin-top:-4.25rem!important;margin-bottom:-4.25rem!important}.my-xl-n18{margin-top:-4.5rem!important;margin-bottom:-4.5rem!important}.my-xl-n19{margin-top:-4.75rem!important;margin-bottom:-4.75rem!important}.my-xl-n20{margin-top:-5rem!important;margin-bottom:-5rem!important}.mt-xl-n1{margin-top:-.25rem!important}.mt-xl-n2{margin-top:-.5rem!important}.mt-xl-n3{margin-top:-.75rem!important}.mt-xl-n4{margin-top:-1rem!important}.mt-xl-n5{margin-top:-1.25rem!important}.mt-xl-n6{margin-top:-1.5rem!important}.mt-xl-n7{margin-top:-1.75rem!important}.mt-xl-n8{margin-top:-2rem!important}.mt-xl-n9{margin-top:-2.25rem!important}.mt-xl-n10{margin-top:-2.5rem!important}.mt-xl-n11{margin-top:-2.75rem!important}.mt-xl-n12{margin-top:-3rem!important}.mt-xl-n13{margin-top:-3.25rem!important}.mt-xl-n14{margin-top:-3.5rem!important}.mt-xl-n15{margin-top:-3.75rem!important}.mt-xl-n16{margin-top:-4rem!important}.mt-xl-n17{margin-top:-4.25rem!important}.mt-xl-n18{margin-top:-4.5rem!important}.mt-xl-n19{margin-top:-4.75rem!important}.mt-xl-n20{margin-top:-5rem!important}.me-xl-n1{margin-right:-.25rem!important}.me-xl-n2{margin-right:-.5rem!important}.me-xl-n3{margin-right:-.75rem!important}.me-xl-n4{margin-right:-1rem!important}.me-xl-n5{margin-right:-1.25rem!important}.me-xl-n6{margin-right:-1.5rem!important}.me-xl-n7{margin-right:-1.75rem!important}.me-xl-n8{margin-right:-2rem!important}.me-xl-n9{margin-right:-2.25rem!important}.me-xl-n10{margin-right:-2.5rem!important}.me-xl-n11{margin-right:-2.75rem!important}.me-xl-n12{margin-right:-3rem!important}.me-xl-n13{margin-right:-3.25rem!important}.me-xl-n14{margin-right:-3.5rem!important}.me-xl-n15{margin-right:-3.75rem!important}.me-xl-n16{margin-right:-4rem!important}.me-xl-n17{margin-right:-4.25rem!important}.me-xl-n18{margin-right:-4.5rem!important}.me-xl-n19{margin-right:-4.75rem!important}.me-xl-n20{margin-right:-5rem!important}.mb-xl-n1{margin-bottom:-.25rem!important}.mb-xl-n2{margin-bottom:-.5rem!important}.mb-xl-n3{margin-bottom:-.75rem!important}.mb-xl-n4{margin-bottom:-1rem!important}.mb-xl-n5{margin-bottom:-1.25rem!important}.mb-xl-n6{margin-bottom:-1.5rem!important}.mb-xl-n7{margin-bottom:-1.75rem!important}.mb-xl-n8{margin-bottom:-2rem!important}.mb-xl-n9{margin-bottom:-2.25rem!important}.mb-xl-n10{margin-bottom:-2.5rem!important}.mb-xl-n11{margin-bottom:-2.75rem!important}.mb-xl-n12{margin-bottom:-3rem!important}.mb-xl-n13{margin-bottom:-3.25rem!important}.mb-xl-n14{margin-bottom:-3.5rem!important}.mb-xl-n15{margin-bottom:-3.75rem!important}.mb-xl-n16{margin-bottom:-4rem!important}.mb-xl-n17{margin-bottom:-4.25rem!important}.mb-xl-n18{margin-bottom:-4.5rem!important}.mb-xl-n19{margin-bottom:-4.75rem!important}.mb-xl-n20{margin-bottom:-5rem!important}.ms-xl-n1{margin-left:-.25rem!important}.ms-xl-n2{margin-left:-.5rem!important}.ms-xl-n3{margin-left:-.75rem!important}.ms-xl-n4{margin-left:-1rem!important}.ms-xl-n5{margin-left:-1.25rem!important}.ms-xl-n6{margin-left:-1.5rem!important}.ms-xl-n7{margin-left:-1.75rem!important}.ms-xl-n8{margin-left:-2rem!important}.ms-xl-n9{margin-left:-2.25rem!important}.ms-xl-n10{margin-left:-2.5rem!important}.ms-xl-n11{margin-left:-2.75rem!important}.ms-xl-n12{margin-left:-3rem!important}.ms-xl-n13{margin-left:-3.25rem!important}.ms-xl-n14{margin-left:-3.5rem!important}.ms-xl-n15{margin-left:-3.75rem!important}.ms-xl-n16{margin-left:-4rem!important}.ms-xl-n17{margin-left:-4.25rem!important}.ms-xl-n18{margin-left:-4.5rem!important}.ms-xl-n19{margin-left:-4.75rem!important}.ms-xl-n20{margin-left:-5rem!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:.75rem!important}.p-xl-4{padding:1rem!important}.p-xl-5{padding:1.25rem!important}.p-xl-6{padding:1.5rem!important}.p-xl-7{padding:1.75rem!important}.p-xl-8{padding:2rem!important}.p-xl-9{padding:2.25rem!important}.p-xl-10{padding:2.5rem!important}.p-xl-11{padding:2.75rem!important}.p-xl-12{padding:3rem!important}.p-xl-13{padding:3.25rem!important}.p-xl-14{padding:3.5rem!important}.p-xl-15{padding:3.75rem!important}.p-xl-16{padding:4rem!important}.p-xl-17{padding:4.25rem!important}.p-xl-18{padding:4.5rem!important}.p-xl-19{padding:4.75rem!important}.p-xl-20{padding:5rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:.75rem!important;padding-left:.75rem!important}.px-xl-4{padding-right:1rem!important;padding-left:1rem!important}.px-xl-5{padding-right:1.25rem!important;padding-left:1.25rem!important}.px-xl-6{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-7{padding-right:1.75rem!important;padding-left:1.75rem!important}.px-xl-8{padding-right:2rem!important;padding-left:2rem!important}.px-xl-9{padding-right:2.25rem!important;padding-left:2.25rem!important}.px-xl-10{padding-right:2.5rem!important;padding-left:2.5rem!important}.px-xl-11{padding-right:2.75rem!important;padding-left:2.75rem!important}.px-xl-12{padding-right:3rem!important;padding-left:3rem!important}.px-xl-13{padding-right:3.25rem!important;padding-left:3.25rem!important}.px-xl-14{padding-right:3.5rem!important;padding-left:3.5rem!important}.px-xl-15{padding-right:3.75rem!important;padding-left:3.75rem!important}.px-xl-16{padding-right:4rem!important;padding-left:4rem!important}.px-xl-17{padding-right:4.25rem!important;padding-left:4.25rem!important}.px-xl-18{padding-right:4.5rem!important;padding-left:4.5rem!important}.px-xl-19{padding-right:4.75rem!important;padding-left:4.75rem!important}.px-xl-20{padding-right:5rem!important;padding-left:5rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.py-xl-4{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-5{padding-top:1.25rem!important;padding-bottom:1.25rem!important}.py-xl-6{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-7{padding-top:1.75rem!important;padding-bottom:1.75rem!important}.py-xl-8{padding-top:2rem!important;padding-bottom:2rem!important}.py-xl-9{padding-top:2.25rem!important;padding-bottom:2.25rem!important}.py-xl-10{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.py-xl-11{padding-top:2.75rem!important;padding-bottom:2.75rem!important}.py-xl-12{padding-top:3rem!important;padding-bottom:3rem!important}.py-xl-13{padding-top:3.25rem!important;padding-bottom:3.25rem!important}.py-xl-14{padding-top:3.5rem!important;padding-bottom:3.5rem!important}.py-xl-15{padding-top:3.75rem!important;padding-bottom:3.75rem!important}.py-xl-16{padding-top:4rem!important;padding-bottom:4rem!important}.py-xl-17{padding-top:4.25rem!important;padding-bottom:4.25rem!important}.py-xl-18{padding-top:4.5rem!important;padding-bottom:4.5rem!important}.py-xl-19{padding-top:4.75rem!important;padding-bottom:4.75rem!important}.py-xl-20{padding-top:5rem!important;padding-bottom:5rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:.75rem!important}.pt-xl-4{padding-top:1rem!important}.pt-xl-5{padding-top:1.25rem!important}.pt-xl-6{padding-top:1.5rem!important}.pt-xl-7{padding-top:1.75rem!important}.pt-xl-8{padding-top:2rem!important}.pt-xl-9{padding-top:2.25rem!important}.pt-xl-10{padding-top:2.5rem!important}.pt-xl-11{padding-top:2.75rem!important}.pt-xl-12{padding-top:3rem!important}.pt-xl-13{padding-top:3.25rem!important}.pt-xl-14{padding-top:3.5rem!important}.pt-xl-15{padding-top:3.75rem!important}.pt-xl-16{padding-top:4rem!important}.pt-xl-17{padding-top:4.25rem!important}.pt-xl-18{padding-top:4.5rem!important}.pt-xl-19{padding-top:4.75rem!important}.pt-xl-20{padding-top:5rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:.75rem!important}.pe-xl-4{padding-right:1rem!important}.pe-xl-5{padding-right:1.25rem!important}.pe-xl-6{padding-right:1.5rem!important}.pe-xl-7{padding-right:1.75rem!important}.pe-xl-8{padding-right:2rem!important}.pe-xl-9{padding-right:2.25rem!important}.pe-xl-10{padding-right:2.5rem!important}.pe-xl-11{padding-right:2.75rem!important}.pe-xl-12{padding-right:3rem!important}.pe-xl-13{padding-right:3.25rem!important}.pe-xl-14{padding-right:3.5rem!important}.pe-xl-15{padding-right:3.75rem!important}.pe-xl-16{padding-right:4rem!important}.pe-xl-17{padding-right:4.25rem!important}.pe-xl-18{padding-right:4.5rem!important}.pe-xl-19{padding-right:4.75rem!important}.pe-xl-20{padding-right:5rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:.75rem!important}.pb-xl-4{padding-bottom:1rem!important}.pb-xl-5{padding-bottom:1.25rem!important}.pb-xl-6{padding-bottom:1.5rem!important}.pb-xl-7{padding-bottom:1.75rem!important}.pb-xl-8{padding-bottom:2rem!important}.pb-xl-9{padding-bottom:2.25rem!important}.pb-xl-10{padding-bottom:2.5rem!important}.pb-xl-11{padding-bottom:2.75rem!important}.pb-xl-12{padding-bottom:3rem!important}.pb-xl-13{padding-bottom:3.25rem!important}.pb-xl-14{padding-bottom:3.5rem!important}.pb-xl-15{padding-bottom:3.75rem!important}.pb-xl-16{padding-bottom:4rem!important}.pb-xl-17{padding-bottom:4.25rem!important}.pb-xl-18{padding-bottom:4.5rem!important}.pb-xl-19{padding-bottom:4.75rem!important}.pb-xl-20{padding-bottom:5rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:.75rem!important}.ps-xl-4{padding-left:1rem!important}.ps-xl-5{padding-left:1.25rem!important}.ps-xl-6{padding-left:1.5rem!important}.ps-xl-7{padding-left:1.75rem!important}.ps-xl-8{padding-left:2rem!important}.ps-xl-9{padding-left:2.25rem!important}.ps-xl-10{padding-left:2.5rem!important}.ps-xl-11{padding-left:2.75rem!important}.ps-xl-12{padding-left:3rem!important}.ps-xl-13{padding-left:3.25rem!important}.ps-xl-14{padding-left:3.5rem!important}.ps-xl-15{padding-left:3.75rem!important}.ps-xl-16{padding-left:4rem!important}.ps-xl-17{padding-left:4.25rem!important}.ps-xl-18{padding-left:4.5rem!important}.ps-xl-19{padding-left:4.75rem!important}.ps-xl-20{padding-left:5rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:.75rem!important}.gap-xl-4{gap:1rem!important}.gap-xl-5{gap:1.25rem!important}.gap-xl-6{gap:1.5rem!important}.gap-xl-7{gap:1.75rem!important}.gap-xl-8{gap:2rem!important}.gap-xl-9{gap:2.25rem!important}.gap-xl-10{gap:2.5rem!important}.gap-xl-11{gap:2.75rem!important}.gap-xl-12{gap:3rem!important}.gap-xl-13{gap:3.25rem!important}.gap-xl-14{gap:3.5rem!important}.gap-xl-15{gap:3.75rem!important}.gap-xl-16{gap:4rem!important}.gap-xl-17{gap:4.25rem!important}.gap-xl-18{gap:4.5rem!important}.gap-xl-19{gap:4.75rem!important}.gap-xl-20{gap:5rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:.75rem!important}.row-gap-xl-4{row-gap:1rem!important}.row-gap-xl-5{row-gap:1.25rem!important}.row-gap-xl-6{row-gap:1.5rem!important}.row-gap-xl-7{row-gap:1.75rem!important}.row-gap-xl-8{row-gap:2rem!important}.row-gap-xl-9{row-gap:2.25rem!important}.row-gap-xl-10{row-gap:2.5rem!important}.row-gap-xl-11{row-gap:2.75rem!important}.row-gap-xl-12{row-gap:3rem!important}.row-gap-xl-13{row-gap:3.25rem!important}.row-gap-xl-14{row-gap:3.5rem!important}.row-gap-xl-15{row-gap:3.75rem!important}.row-gap-xl-16{row-gap:4rem!important}.row-gap-xl-17{row-gap:4.25rem!important}.row-gap-xl-18{row-gap:4.5rem!important}.row-gap-xl-19{row-gap:4.75rem!important}.row-gap-xl-20{row-gap:5rem!important}.column-gap-xl-0{column-gap:0!important}.column-gap-xl-1{column-gap:.25rem!important}.column-gap-xl-2{column-gap:.5rem!important}.column-gap-xl-3{column-gap:.75rem!important}.column-gap-xl-4{column-gap:1rem!important}.column-gap-xl-5{column-gap:1.25rem!important}.column-gap-xl-6{column-gap:1.5rem!important}.column-gap-xl-7{column-gap:1.75rem!important}.column-gap-xl-8{column-gap:2rem!important}.column-gap-xl-9{column-gap:2.25rem!important}.column-gap-xl-10{column-gap:2.5rem!important}.column-gap-xl-11{column-gap:2.75rem!important}.column-gap-xl-12{column-gap:3rem!important}.column-gap-xl-13{column-gap:3.25rem!important}.column-gap-xl-14{column-gap:3.5rem!important}.column-gap-xl-15{column-gap:3.75rem!important}.column-gap-xl-16{column-gap:4rem!important}.column-gap-xl-17{column-gap:4.25rem!important}.column-gap-xl-18{column-gap:4.5rem!important}.column-gap-xl-19{column-gap:4.75rem!important}.column-gap-xl-20{column-gap:5rem!important}.fs-xl-1{font-size:calc(1.3rem + .6vw)!important}.fs-xl-2{font-size:calc(1.275rem + .3vw)!important}.fs-xl-3{font-size:calc(1.26rem + .12vw)!important}.fs-xl-4{font-size:1.25rem!important}.fs-xl-5{font-size:1.15rem!important}.fs-xl-6{font-size:1.075rem!important}.fs-xl-7{font-size:.95rem!important}.fs-xl-8{font-size:.85rem!important}.fs-xl-9{font-size:.75rem!important}.fs-xl-10{font-size:.5rem!important}.fs-xl-sm{font-size:.95rem!important}.fs-xl-base{font-size:1rem!important}.fs-xl-lg{font-size:1.075rem!important}.fs-xl-xl{font-size:1.21rem!important}.fs-xl-fluid{font-size:100%!important}.fs-xl-2x{font-size:calc(1.325rem + .9vw)!important}.fs-xl-2qx{font-size:calc(1.35rem + 1.2vw)!important}.fs-xl-2hx{font-size:calc(1.375rem + 1.5vw)!important}.fs-xl-2tx{font-size:calc(1.4rem + 1.8vw)!important}.fs-xl-3x{font-size:calc(1.425rem + 2.1vw)!important}.fs-xl-3qx{font-size:calc(1.45rem + 2.4vw)!important}.fs-xl-3hx{font-size:calc(1.475rem + 2.7vw)!important}.fs-xl-3tx{font-size:calc(1.5rem + 3vw)!important}.fs-xl-4x{font-size:calc(1.525rem + 3.3vw)!important}.fs-xl-4qx{font-size:calc(1.55rem + 3.6vw)!important}.fs-xl-4hx{font-size:calc(1.575rem + 3.9vw)!important}.fs-xl-4tx{font-size:calc(1.6rem + 4.2vw)!important}.fs-xl-5x{font-size:calc(1.625rem + 4.5vw)!important}.fs-xl-5qx{font-size:calc(1.65rem + 4.8vw)!important}.fs-xl-5hx{font-size:calc(1.675rem + 5.1vw)!important}.fs-xl-5tx{font-size:calc(1.7rem + 5.4vw)!important}.fs-xl-6x{font-size:calc(1.725rem + 5.7vw)!important}.fs-xl-6qx{font-size:calc(1.75rem + 6vw)!important}.fs-xl-6hx{font-size:calc(1.775rem + 6.3vw)!important}.fs-xl-6tx{font-size:calc(1.8rem + 6.6vw)!important}.fs-xl-7x{font-size:calc(1.825rem + 6.9vw)!important}.fs-xl-7qx{font-size:calc(1.85rem + 7.2vw)!important}.fs-xl-7hx{font-size:calc(1.875rem + 7.5vw)!important}.fs-xl-7tx{font-size:calc(1.9rem + 7.8vw)!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}.min-w-xl-unset{min-width:unset!important}.min-w-xl-25{min-width:25%!important}.min-w-xl-50{min-width:50%!important}.min-w-xl-75{min-width:75%!important}.min-w-xl-100{min-width:100%!important}.min-w-xl-auto{min-width:auto!important}.min-w-xl-1px{min-width:1px!important}.min-w-xl-2px{min-width:2px!important}.min-w-xl-3px{min-width:3px!important}.min-w-xl-4px{min-width:4px!important}.min-w-xl-5px{min-width:5px!important}.min-w-xl-6px{min-width:6px!important}.min-w-xl-7px{min-width:7px!important}.min-w-xl-8px{min-width:8px!important}.min-w-xl-9px{min-width:9px!important}.min-w-xl-10px{min-width:10px!important}.min-w-xl-15px{min-width:15px!important}.min-w-xl-20px{min-width:20px!important}.min-w-xl-25px{min-width:25px!important}.min-w-xl-30px{min-width:30px!important}.min-w-xl-35px{min-width:35px!important}.min-w-xl-40px{min-width:40px!important}.min-w-xl-45px{min-width:45px!important}.min-w-xl-50px{min-width:50px!important}.min-w-xl-55px{min-width:55px!important}.min-w-xl-60px{min-width:60px!important}.min-w-xl-65px{min-width:65px!important}.min-w-xl-70px{min-width:70px!important}.min-w-xl-75px{min-width:75px!important}.min-w-xl-80px{min-width:80px!important}.min-w-xl-85px{min-width:85px!important}.min-w-xl-90px{min-width:90px!important}.min-w-xl-95px{min-width:95px!important}.min-w-xl-100px{min-width:100px!important}.min-w-xl-125px{min-width:125px!important}.min-w-xl-150px{min-width:150px!important}.min-w-xl-175px{min-width:175px!important}.min-w-xl-200px{min-width:200px!important}.min-w-xl-225px{min-width:225px!important}.min-w-xl-250px{min-width:250px!important}.min-w-xl-275px{min-width:275px!important}.min-w-xl-300px{min-width:300px!important}.min-w-xl-325px{min-width:325px!important}.min-w-xl-350px{min-width:350px!important}.min-w-xl-375px{min-width:375px!important}.min-w-xl-400px{min-width:400px!important}.min-w-xl-425px{min-width:425px!important}.min-w-xl-450px{min-width:450px!important}.min-w-xl-475px{min-width:475px!important}.min-w-xl-500px{min-width:500px!important}.min-w-xl-550px{min-width:550px!important}.min-w-xl-600px{min-width:600px!important}.min-w-xl-650px{min-width:650px!important}.min-w-xl-700px{min-width:700px!important}.min-w-xl-750px{min-width:750px!important}.min-w-xl-800px{min-width:800px!important}.min-w-xl-850px{min-width:850px!important}.min-w-xl-900px{min-width:900px!important}.min-w-xl-950px{min-width:950px!important}.min-w-xl-1000px{min-width:1000px!important}.min-h-xl-unset{min-height:unset!important}.min-h-xl-25{min-height:25%!important}.min-h-xl-50{min-height:50%!important}.min-h-xl-75{min-height:75%!important}.min-h-xl-100{min-height:100%!important}.min-h-xl-auto{min-height:auto!important}.min-h-xl-1px{min-height:1px!important}.min-h-xl-2px{min-height:2px!important}.min-h-xl-3px{min-height:3px!important}.min-h-xl-4px{min-height:4px!important}.min-h-xl-5px{min-height:5px!important}.min-h-xl-6px{min-height:6px!important}.min-h-xl-7px{min-height:7px!important}.min-h-xl-8px{min-height:8px!important}.min-h-xl-9px{min-height:9px!important}.min-h-xl-10px{min-height:10px!important}.min-h-xl-15px{min-height:15px!important}.min-h-xl-20px{min-height:20px!important}.min-h-xl-25px{min-height:25px!important}.min-h-xl-30px{min-height:30px!important}.min-h-xl-35px{min-height:35px!important}.min-h-xl-40px{min-height:40px!important}.min-h-xl-45px{min-height:45px!important}.min-h-xl-50px{min-height:50px!important}.min-h-xl-55px{min-height:55px!important}.min-h-xl-60px{min-height:60px!important}.min-h-xl-65px{min-height:65px!important}.min-h-xl-70px{min-height:70px!important}.min-h-xl-75px{min-height:75px!important}.min-h-xl-80px{min-height:80px!important}.min-h-xl-85px{min-height:85px!important}.min-h-xl-90px{min-height:90px!important}.min-h-xl-95px{min-height:95px!important}.min-h-xl-100px{min-height:100px!important}.min-h-xl-125px{min-height:125px!important}.min-h-xl-150px{min-height:150px!important}.min-h-xl-175px{min-height:175px!important}.min-h-xl-200px{min-height:200px!important}.min-h-xl-225px{min-height:225px!important}.min-h-xl-250px{min-height:250px!important}.min-h-xl-275px{min-height:275px!important}.min-h-xl-300px{min-height:300px!important}.min-h-xl-325px{min-height:325px!important}.min-h-xl-350px{min-height:350px!important}.min-h-xl-375px{min-height:375px!important}.min-h-xl-400px{min-height:400px!important}.min-h-xl-425px{min-height:425px!important}.min-h-xl-450px{min-height:450px!important}.min-h-xl-475px{min-height:475px!important}.min-h-xl-500px{min-height:500px!important}.min-h-xl-550px{min-height:550px!important}.min-h-xl-600px{min-height:600px!important}.min-h-xl-650px{min-height:650px!important}.min-h-xl-700px{min-height:700px!important}.min-h-xl-750px{min-height:750px!important}.min-h-xl-800px{min-height:800px!important}.min-h-xl-850px{min-height:850px!important}.min-h-xl-900px{min-height:900px!important}.min-h-xl-950px{min-height:950px!important}.min-h-xl-1000px{min-height:1000px!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{object-fit:contain!important}.object-fit-xxl-cover{object-fit:cover!important}.object-fit-xxl-fill{object-fit:fill!important}.object-fit-xxl-scale{object-fit:scale-down!important}.object-fit-xxl-none{object-fit:none!important}.overflow-xxl-auto{overflow:auto!important}.overflow-xxl-hidden{overflow:hidden!important}.overflow-xxl-visible{overflow:visible!important}.overflow-xxl-scroll{overflow:scroll!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}.position-xxl-static{position:static!important}.position-xxl-relative{position:relative!important}.position-xxl-absolute{position:absolute!important}.position-xxl-fixed{position:fixed!important}.position-xxl-sticky{position:sticky!important}.w-xxl-unset{width:unset!important}.w-xxl-25{width:25%!important}.w-xxl-50{width:50%!important}.w-xxl-75{width:75%!important}.w-xxl-100{width:100%!important}.w-xxl-auto{width:auto!important}.w-xxl-1px{width:1px!important}.w-xxl-2px{width:2px!important}.w-xxl-3px{width:3px!important}.w-xxl-4px{width:4px!important}.w-xxl-5px{width:5px!important}.w-xxl-6px{width:6px!important}.w-xxl-7px{width:7px!important}.w-xxl-8px{width:8px!important}.w-xxl-9px{width:9px!important}.w-xxl-10px{width:10px!important}.w-xxl-15px{width:15px!important}.w-xxl-20px{width:20px!important}.w-xxl-25px{width:25px!important}.w-xxl-30px{width:30px!important}.w-xxl-35px{width:35px!important}.w-xxl-40px{width:40px!important}.w-xxl-45px{width:45px!important}.w-xxl-50px{width:50px!important}.w-xxl-55px{width:55px!important}.w-xxl-60px{width:60px!important}.w-xxl-65px{width:65px!important}.w-xxl-70px{width:70px!important}.w-xxl-75px{width:75px!important}.w-xxl-80px{width:80px!important}.w-xxl-85px{width:85px!important}.w-xxl-90px{width:90px!important}.w-xxl-95px{width:95px!important}.w-xxl-100px{width:100px!important}.w-xxl-125px{width:125px!important}.w-xxl-150px{width:150px!important}.w-xxl-175px{width:175px!important}.w-xxl-200px{width:200px!important}.w-xxl-225px{width:225px!important}.w-xxl-250px{width:250px!important}.w-xxl-275px{width:275px!important}.w-xxl-300px{width:300px!important}.w-xxl-325px{width:325px!important}.w-xxl-350px{width:350px!important}.w-xxl-375px{width:375px!important}.w-xxl-400px{width:400px!important}.w-xxl-425px{width:425px!important}.w-xxl-450px{width:450px!important}.w-xxl-475px{width:475px!important}.w-xxl-500px{width:500px!important}.w-xxl-550px{width:550px!important}.w-xxl-600px{width:600px!important}.w-xxl-650px{width:650px!important}.w-xxl-700px{width:700px!important}.w-xxl-750px{width:750px!important}.w-xxl-800px{width:800px!important}.w-xxl-850px{width:850px!important}.w-xxl-900px{width:900px!important}.w-xxl-950px{width:950px!important}.w-xxl-1000px{width:1000px!important}.mw-xxl-unset{max-width:unset!important}.mw-xxl-25{max-width:25%!important}.mw-xxl-50{max-width:50%!important}.mw-xxl-75{max-width:75%!important}.mw-xxl-100{max-width:100%!important}.mw-xxl-auto{max-width:auto!important}.mw-xxl-1px{max-width:1px!important}.mw-xxl-2px{max-width:2px!important}.mw-xxl-3px{max-width:3px!important}.mw-xxl-4px{max-width:4px!important}.mw-xxl-5px{max-width:5px!important}.mw-xxl-6px{max-width:6px!important}.mw-xxl-7px{max-width:7px!important}.mw-xxl-8px{max-width:8px!important}.mw-xxl-9px{max-width:9px!important}.mw-xxl-10px{max-width:10px!important}.mw-xxl-15px{max-width:15px!important}.mw-xxl-20px{max-width:20px!important}.mw-xxl-25px{max-width:25px!important}.mw-xxl-30px{max-width:30px!important}.mw-xxl-35px{max-width:35px!important}.mw-xxl-40px{max-width:40px!important}.mw-xxl-45px{max-width:45px!important}.mw-xxl-50px{max-width:50px!important}.mw-xxl-55px{max-width:55px!important}.mw-xxl-60px{max-width:60px!important}.mw-xxl-65px{max-width:65px!important}.mw-xxl-70px{max-width:70px!important}.mw-xxl-75px{max-width:75px!important}.mw-xxl-80px{max-width:80px!important}.mw-xxl-85px{max-width:85px!important}.mw-xxl-90px{max-width:90px!important}.mw-xxl-95px{max-width:95px!important}.mw-xxl-100px{max-width:100px!important}.mw-xxl-125px{max-width:125px!important}.mw-xxl-150px{max-width:150px!important}.mw-xxl-175px{max-width:175px!important}.mw-xxl-200px{max-width:200px!important}.mw-xxl-225px{max-width:225px!important}.mw-xxl-250px{max-width:250px!important}.mw-xxl-275px{max-width:275px!important}.mw-xxl-300px{max-width:300px!important}.mw-xxl-325px{max-width:325px!important}.mw-xxl-350px{max-width:350px!important}.mw-xxl-375px{max-width:375px!important}.mw-xxl-400px{max-width:400px!important}.mw-xxl-425px{max-width:425px!important}.mw-xxl-450px{max-width:450px!important}.mw-xxl-475px{max-width:475px!important}.mw-xxl-500px{max-width:500px!important}.mw-xxl-550px{max-width:550px!important}.mw-xxl-600px{max-width:600px!important}.mw-xxl-650px{max-width:650px!important}.mw-xxl-700px{max-width:700px!important}.mw-xxl-750px{max-width:750px!important}.mw-xxl-800px{max-width:800px!important}.mw-xxl-850px{max-width:850px!important}.mw-xxl-900px{max-width:900px!important}.mw-xxl-950px{max-width:950px!important}.mw-xxl-1000px{max-width:1000px!important}.h-xxl-unset{height:unset!important}.h-xxl-25{height:25%!important}.h-xxl-50{height:50%!important}.h-xxl-75{height:75%!important}.h-xxl-100{height:100%!important}.h-xxl-auto{height:auto!important}.h-xxl-1px{height:1px!important}.h-xxl-2px{height:2px!important}.h-xxl-3px{height:3px!important}.h-xxl-4px{height:4px!important}.h-xxl-5px{height:5px!important}.h-xxl-6px{height:6px!important}.h-xxl-7px{height:7px!important}.h-xxl-8px{height:8px!important}.h-xxl-9px{height:9px!important}.h-xxl-10px{height:10px!important}.h-xxl-15px{height:15px!important}.h-xxl-20px{height:20px!important}.h-xxl-25px{height:25px!important}.h-xxl-30px{height:30px!important}.h-xxl-35px{height:35px!important}.h-xxl-40px{height:40px!important}.h-xxl-45px{height:45px!important}.h-xxl-50px{height:50px!important}.h-xxl-55px{height:55px!important}.h-xxl-60px{height:60px!important}.h-xxl-65px{height:65px!important}.h-xxl-70px{height:70px!important}.h-xxl-75px{height:75px!important}.h-xxl-80px{height:80px!important}.h-xxl-85px{height:85px!important}.h-xxl-90px{height:90px!important}.h-xxl-95px{height:95px!important}.h-xxl-100px{height:100px!important}.h-xxl-125px{height:125px!important}.h-xxl-150px{height:150px!important}.h-xxl-175px{height:175px!important}.h-xxl-200px{height:200px!important}.h-xxl-225px{height:225px!important}.h-xxl-250px{height:250px!important}.h-xxl-275px{height:275px!important}.h-xxl-300px{height:300px!important}.h-xxl-325px{height:325px!important}.h-xxl-350px{height:350px!important}.h-xxl-375px{height:375px!important}.h-xxl-400px{height:400px!important}.h-xxl-425px{height:425px!important}.h-xxl-450px{height:450px!important}.h-xxl-475px{height:475px!important}.h-xxl-500px{height:500px!important}.h-xxl-550px{height:550px!important}.h-xxl-600px{height:600px!important}.h-xxl-650px{height:650px!important}.h-xxl-700px{height:700px!important}.h-xxl-750px{height:750px!important}.h-xxl-800px{height:800px!important}.h-xxl-850px{height:850px!important}.h-xxl-900px{height:900px!important}.h-xxl-950px{height:950px!important}.h-xxl-1000px{height:1000px!important}.mh-xxl-unset{max-height:unset!important}.mh-xxl-25{max-height:25%!important}.mh-xxl-50{max-height:50%!important}.mh-xxl-75{max-height:75%!important}.mh-xxl-100{max-height:100%!important}.mh-xxl-auto{max-height:auto!important}.mh-xxl-1px{max-height:1px!important}.mh-xxl-2px{max-height:2px!important}.mh-xxl-3px{max-height:3px!important}.mh-xxl-4px{max-height:4px!important}.mh-xxl-5px{max-height:5px!important}.mh-xxl-6px{max-height:6px!important}.mh-xxl-7px{max-height:7px!important}.mh-xxl-8px{max-height:8px!important}.mh-xxl-9px{max-height:9px!important}.mh-xxl-10px{max-height:10px!important}.mh-xxl-15px{max-height:15px!important}.mh-xxl-20px{max-height:20px!important}.mh-xxl-25px{max-height:25px!important}.mh-xxl-30px{max-height:30px!important}.mh-xxl-35px{max-height:35px!important}.mh-xxl-40px{max-height:40px!important}.mh-xxl-45px{max-height:45px!important}.mh-xxl-50px{max-height:50px!important}.mh-xxl-55px{max-height:55px!important}.mh-xxl-60px{max-height:60px!important}.mh-xxl-65px{max-height:65px!important}.mh-xxl-70px{max-height:70px!important}.mh-xxl-75px{max-height:75px!important}.mh-xxl-80px{max-height:80px!important}.mh-xxl-85px{max-height:85px!important}.mh-xxl-90px{max-height:90px!important}.mh-xxl-95px{max-height:95px!important}.mh-xxl-100px{max-height:100px!important}.mh-xxl-125px{max-height:125px!important}.mh-xxl-150px{max-height:150px!important}.mh-xxl-175px{max-height:175px!important}.mh-xxl-200px{max-height:200px!important}.mh-xxl-225px{max-height:225px!important}.mh-xxl-250px{max-height:250px!important}.mh-xxl-275px{max-height:275px!important}.mh-xxl-300px{max-height:300px!important}.mh-xxl-325px{max-height:325px!important}.mh-xxl-350px{max-height:350px!important}.mh-xxl-375px{max-height:375px!important}.mh-xxl-400px{max-height:400px!important}.mh-xxl-425px{max-height:425px!important}.mh-xxl-450px{max-height:450px!important}.mh-xxl-475px{max-height:475px!important}.mh-xxl-500px{max-height:500px!important}.mh-xxl-550px{max-height:550px!important}.mh-xxl-600px{max-height:600px!important}.mh-xxl-650px{max-height:650px!important}.mh-xxl-700px{max-height:700px!important}.mh-xxl-750px{max-height:750px!important}.mh-xxl-800px{max-height:800px!important}.mh-xxl-850px{max-height:850px!important}.mh-xxl-900px{max-height:900px!important}.mh-xxl-950px{max-height:950px!important}.mh-xxl-1000px{max-height:1000px!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:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:.75rem!important}.m-xxl-4{margin:1rem!important}.m-xxl-5{margin:1.25rem!important}.m-xxl-6{margin:1.5rem!important}.m-xxl-7{margin:1.75rem!important}.m-xxl-8{margin:2rem!important}.m-xxl-9{margin:2.25rem!important}.m-xxl-10{margin:2.5rem!important}.m-xxl-11{margin:2.75rem!important}.m-xxl-12{margin:3rem!important}.m-xxl-13{margin:3.25rem!important}.m-xxl-14{margin:3.5rem!important}.m-xxl-15{margin:3.75rem!important}.m-xxl-16{margin:4rem!important}.m-xxl-17{margin:4.25rem!important}.m-xxl-18{margin:4.5rem!important}.m-xxl-19{margin:4.75rem!important}.m-xxl-20{margin:5rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:.75rem!important;margin-left:.75rem!important}.mx-xxl-4{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-5{margin-right:1.25rem!important;margin-left:1.25rem!important}.mx-xxl-6{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-7{margin-right:1.75rem!important;margin-left:1.75rem!important}.mx-xxl-8{margin-right:2rem!important;margin-left:2rem!important}.mx-xxl-9{margin-right:2.25rem!important;margin-left:2.25rem!important}.mx-xxl-10{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-xxl-11{margin-right:2.75rem!important;margin-left:2.75rem!important}.mx-xxl-12{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-13{margin-right:3.25rem!important;margin-left:3.25rem!important}.mx-xxl-14{margin-right:3.5rem!important;margin-left:3.5rem!important}.mx-xxl-15{margin-right:3.75rem!important;margin-left:3.75rem!important}.mx-xxl-16{margin-right:4rem!important;margin-left:4rem!important}.mx-xxl-17{margin-right:4.25rem!important;margin-left:4.25rem!important}.mx-xxl-18{margin-right:4.5rem!important;margin-left:4.5rem!important}.mx-xxl-19{margin-right:4.75rem!important;margin-left:4.75rem!important}.mx-xxl-20{margin-right:5rem!important;margin-left:5rem!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:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.my-xxl-4{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-5{margin-top:1.25rem!important;margin-bottom:1.25rem!important}.my-xxl-6{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-7{margin-top:1.75rem!important;margin-bottom:1.75rem!important}.my-xxl-8{margin-top:2rem!important;margin-bottom:2rem!important}.my-xxl-9{margin-top:2.25rem!important;margin-bottom:2.25rem!important}.my-xxl-10{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-xxl-11{margin-top:2.75rem!important;margin-bottom:2.75rem!important}.my-xxl-12{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-13{margin-top:3.25rem!important;margin-bottom:3.25rem!important}.my-xxl-14{margin-top:3.5rem!important;margin-bottom:3.5rem!important}.my-xxl-15{margin-top:3.75rem!important;margin-bottom:3.75rem!important}.my-xxl-16{margin-top:4rem!important;margin-bottom:4rem!important}.my-xxl-17{margin-top:4.25rem!important;margin-bottom:4.25rem!important}.my-xxl-18{margin-top:4.5rem!important;margin-bottom:4.5rem!important}.my-xxl-19{margin-top:4.75rem!important;margin-bottom:4.75rem!important}.my-xxl-20{margin-top:5rem!important;margin-bottom:5rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:.75rem!important}.mt-xxl-4{margin-top:1rem!important}.mt-xxl-5{margin-top:1.25rem!important}.mt-xxl-6{margin-top:1.5rem!important}.mt-xxl-7{margin-top:1.75rem!important}.mt-xxl-8{margin-top:2rem!important}.mt-xxl-9{margin-top:2.25rem!important}.mt-xxl-10{margin-top:2.5rem!important}.mt-xxl-11{margin-top:2.75rem!important}.mt-xxl-12{margin-top:3rem!important}.mt-xxl-13{margin-top:3.25rem!important}.mt-xxl-14{margin-top:3.5rem!important}.mt-xxl-15{margin-top:3.75rem!important}.mt-xxl-16{margin-top:4rem!important}.mt-xxl-17{margin-top:4.25rem!important}.mt-xxl-18{margin-top:4.5rem!important}.mt-xxl-19{margin-top:4.75rem!important}.mt-xxl-20{margin-top:5rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:.75rem!important}.me-xxl-4{margin-right:1rem!important}.me-xxl-5{margin-right:1.25rem!important}.me-xxl-6{margin-right:1.5rem!important}.me-xxl-7{margin-right:1.75rem!important}.me-xxl-8{margin-right:2rem!important}.me-xxl-9{margin-right:2.25rem!important}.me-xxl-10{margin-right:2.5rem!important}.me-xxl-11{margin-right:2.75rem!important}.me-xxl-12{margin-right:3rem!important}.me-xxl-13{margin-right:3.25rem!important}.me-xxl-14{margin-right:3.5rem!important}.me-xxl-15{margin-right:3.75rem!important}.me-xxl-16{margin-right:4rem!important}.me-xxl-17{margin-right:4.25rem!important}.me-xxl-18{margin-right:4.5rem!important}.me-xxl-19{margin-right:4.75rem!important}.me-xxl-20{margin-right:5rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:.75rem!important}.mb-xxl-4{margin-bottom:1rem!important}.mb-xxl-5{margin-bottom:1.25rem!important}.mb-xxl-6{margin-bottom:1.5rem!important}.mb-xxl-7{margin-bottom:1.75rem!important}.mb-xxl-8{margin-bottom:2rem!important}.mb-xxl-9{margin-bottom:2.25rem!important}.mb-xxl-10{margin-bottom:2.5rem!important}.mb-xxl-11{margin-bottom:2.75rem!important}.mb-xxl-12{margin-bottom:3rem!important}.mb-xxl-13{margin-bottom:3.25rem!important}.mb-xxl-14{margin-bottom:3.5rem!important}.mb-xxl-15{margin-bottom:3.75rem!important}.mb-xxl-16{margin-bottom:4rem!important}.mb-xxl-17{margin-bottom:4.25rem!important}.mb-xxl-18{margin-bottom:4.5rem!important}.mb-xxl-19{margin-bottom:4.75rem!important}.mb-xxl-20{margin-bottom:5rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:.75rem!important}.ms-xxl-4{margin-left:1rem!important}.ms-xxl-5{margin-left:1.25rem!important}.ms-xxl-6{margin-left:1.5rem!important}.ms-xxl-7{margin-left:1.75rem!important}.ms-xxl-8{margin-left:2rem!important}.ms-xxl-9{margin-left:2.25rem!important}.ms-xxl-10{margin-left:2.5rem!important}.ms-xxl-11{margin-left:2.75rem!important}.ms-xxl-12{margin-left:3rem!important}.ms-xxl-13{margin-left:3.25rem!important}.ms-xxl-14{margin-left:3.5rem!important}.ms-xxl-15{margin-left:3.75rem!important}.ms-xxl-16{margin-left:4rem!important}.ms-xxl-17{margin-left:4.25rem!important}.ms-xxl-18{margin-left:4.5rem!important}.ms-xxl-19{margin-left:4.75rem!important}.ms-xxl-20{margin-left:5rem!important}.ms-xxl-auto{margin-left:auto!important}.m-xxl-n1{margin:-.25rem!important}.m-xxl-n2{margin:-.5rem!important}.m-xxl-n3{margin:-.75rem!important}.m-xxl-n4{margin:-1rem!important}.m-xxl-n5{margin:-1.25rem!important}.m-xxl-n6{margin:-1.5rem!important}.m-xxl-n7{margin:-1.75rem!important}.m-xxl-n8{margin:-2rem!important}.m-xxl-n9{margin:-2.25rem!important}.m-xxl-n10{margin:-2.5rem!important}.m-xxl-n11{margin:-2.75rem!important}.m-xxl-n12{margin:-3rem!important}.m-xxl-n13{margin:-3.25rem!important}.m-xxl-n14{margin:-3.5rem!important}.m-xxl-n15{margin:-3.75rem!important}.m-xxl-n16{margin:-4rem!important}.m-xxl-n17{margin:-4.25rem!important}.m-xxl-n18{margin:-4.5rem!important}.m-xxl-n19{margin:-4.75rem!important}.m-xxl-n20{margin:-5rem!important}.mx-xxl-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-xxl-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-xxl-n3{margin-right:-.75rem!important;margin-left:-.75rem!important}.mx-xxl-n4{margin-right:-1rem!important;margin-left:-1rem!important}.mx-xxl-n5{margin-right:-1.25rem!important;margin-left:-1.25rem!important}.mx-xxl-n6{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-xxl-n7{margin-right:-1.75rem!important;margin-left:-1.75rem!important}.mx-xxl-n8{margin-right:-2rem!important;margin-left:-2rem!important}.mx-xxl-n9{margin-right:-2.25rem!important;margin-left:-2.25rem!important}.mx-xxl-n10{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.mx-xxl-n11{margin-right:-2.75rem!important;margin-left:-2.75rem!important}.mx-xxl-n12{margin-right:-3rem!important;margin-left:-3rem!important}.mx-xxl-n13{margin-right:-3.25rem!important;margin-left:-3.25rem!important}.mx-xxl-n14{margin-right:-3.5rem!important;margin-left:-3.5rem!important}.mx-xxl-n15{margin-right:-3.75rem!important;margin-left:-3.75rem!important}.mx-xxl-n16{margin-right:-4rem!important;margin-left:-4rem!important}.mx-xxl-n17{margin-right:-4.25rem!important;margin-left:-4.25rem!important}.mx-xxl-n18{margin-right:-4.5rem!important;margin-left:-4.5rem!important}.mx-xxl-n19{margin-right:-4.75rem!important;margin-left:-4.75rem!important}.mx-xxl-n20{margin-right:-5rem!important;margin-left:-5rem!important}.my-xxl-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-xxl-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-xxl-n3{margin-top:-.75rem!important;margin-bottom:-.75rem!important}.my-xxl-n4{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-xxl-n5{margin-top:-1.25rem!important;margin-bottom:-1.25rem!important}.my-xxl-n6{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-xxl-n7{margin-top:-1.75rem!important;margin-bottom:-1.75rem!important}.my-xxl-n8{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-xxl-n9{margin-top:-2.25rem!important;margin-bottom:-2.25rem!important}.my-xxl-n10{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.my-xxl-n11{margin-top:-2.75rem!important;margin-bottom:-2.75rem!important}.my-xxl-n12{margin-top:-3rem!important;margin-bottom:-3rem!important}.my-xxl-n13{margin-top:-3.25rem!important;margin-bottom:-3.25rem!important}.my-xxl-n14{margin-top:-3.5rem!important;margin-bottom:-3.5rem!important}.my-xxl-n15{margin-top:-3.75rem!important;margin-bottom:-3.75rem!important}.my-xxl-n16{margin-top:-4rem!important;margin-bottom:-4rem!important}.my-xxl-n17{margin-top:-4.25rem!important;margin-bottom:-4.25rem!important}.my-xxl-n18{margin-top:-4.5rem!important;margin-bottom:-4.5rem!important}.my-xxl-n19{margin-top:-4.75rem!important;margin-bottom:-4.75rem!important}.my-xxl-n20{margin-top:-5rem!important;margin-bottom:-5rem!important}.mt-xxl-n1{margin-top:-.25rem!important}.mt-xxl-n2{margin-top:-.5rem!important}.mt-xxl-n3{margin-top:-.75rem!important}.mt-xxl-n4{margin-top:-1rem!important}.mt-xxl-n5{margin-top:-1.25rem!important}.mt-xxl-n6{margin-top:-1.5rem!important}.mt-xxl-n7{margin-top:-1.75rem!important}.mt-xxl-n8{margin-top:-2rem!important}.mt-xxl-n9{margin-top:-2.25rem!important}.mt-xxl-n10{margin-top:-2.5rem!important}.mt-xxl-n11{margin-top:-2.75rem!important}.mt-xxl-n12{margin-top:-3rem!important}.mt-xxl-n13{margin-top:-3.25rem!important}.mt-xxl-n14{margin-top:-3.5rem!important}.mt-xxl-n15{margin-top:-3.75rem!important}.mt-xxl-n16{margin-top:-4rem!important}.mt-xxl-n17{margin-top:-4.25rem!important}.mt-xxl-n18{margin-top:-4.5rem!important}.mt-xxl-n19{margin-top:-4.75rem!important}.mt-xxl-n20{margin-top:-5rem!important}.me-xxl-n1{margin-right:-.25rem!important}.me-xxl-n2{margin-right:-.5rem!important}.me-xxl-n3{margin-right:-.75rem!important}.me-xxl-n4{margin-right:-1rem!important}.me-xxl-n5{margin-right:-1.25rem!important}.me-xxl-n6{margin-right:-1.5rem!important}.me-xxl-n7{margin-right:-1.75rem!important}.me-xxl-n8{margin-right:-2rem!important}.me-xxl-n9{margin-right:-2.25rem!important}.me-xxl-n10{margin-right:-2.5rem!important}.me-xxl-n11{margin-right:-2.75rem!important}.me-xxl-n12{margin-right:-3rem!important}.me-xxl-n13{margin-right:-3.25rem!important}.me-xxl-n14{margin-right:-3.5rem!important}.me-xxl-n15{margin-right:-3.75rem!important}.me-xxl-n16{margin-right:-4rem!important}.me-xxl-n17{margin-right:-4.25rem!important}.me-xxl-n18{margin-right:-4.5rem!important}.me-xxl-n19{margin-right:-4.75rem!important}.me-xxl-n20{margin-right:-5rem!important}.mb-xxl-n1{margin-bottom:-.25rem!important}.mb-xxl-n2{margin-bottom:-.5rem!important}.mb-xxl-n3{margin-bottom:-.75rem!important}.mb-xxl-n4{margin-bottom:-1rem!important}.mb-xxl-n5{margin-bottom:-1.25rem!important}.mb-xxl-n6{margin-bottom:-1.5rem!important}.mb-xxl-n7{margin-bottom:-1.75rem!important}.mb-xxl-n8{margin-bottom:-2rem!important}.mb-xxl-n9{margin-bottom:-2.25rem!important}.mb-xxl-n10{margin-bottom:-2.5rem!important}.mb-xxl-n11{margin-bottom:-2.75rem!important}.mb-xxl-n12{margin-bottom:-3rem!important}.mb-xxl-n13{margin-bottom:-3.25rem!important}.mb-xxl-n14{margin-bottom:-3.5rem!important}.mb-xxl-n15{margin-bottom:-3.75rem!important}.mb-xxl-n16{margin-bottom:-4rem!important}.mb-xxl-n17{margin-bottom:-4.25rem!important}.mb-xxl-n18{margin-bottom:-4.5rem!important}.mb-xxl-n19{margin-bottom:-4.75rem!important}.mb-xxl-n20{margin-bottom:-5rem!important}.ms-xxl-n1{margin-left:-.25rem!important}.ms-xxl-n2{margin-left:-.5rem!important}.ms-xxl-n3{margin-left:-.75rem!important}.ms-xxl-n4{margin-left:-1rem!important}.ms-xxl-n5{margin-left:-1.25rem!important}.ms-xxl-n6{margin-left:-1.5rem!important}.ms-xxl-n7{margin-left:-1.75rem!important}.ms-xxl-n8{margin-left:-2rem!important}.ms-xxl-n9{margin-left:-2.25rem!important}.ms-xxl-n10{margin-left:-2.5rem!important}.ms-xxl-n11{margin-left:-2.75rem!important}.ms-xxl-n12{margin-left:-3rem!important}.ms-xxl-n13{margin-left:-3.25rem!important}.ms-xxl-n14{margin-left:-3.5rem!important}.ms-xxl-n15{margin-left:-3.75rem!important}.ms-xxl-n16{margin-left:-4rem!important}.ms-xxl-n17{margin-left:-4.25rem!important}.ms-xxl-n18{margin-left:-4.5rem!important}.ms-xxl-n19{margin-left:-4.75rem!important}.ms-xxl-n20{margin-left:-5rem!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:.75rem!important}.p-xxl-4{padding:1rem!important}.p-xxl-5{padding:1.25rem!important}.p-xxl-6{padding:1.5rem!important}.p-xxl-7{padding:1.75rem!important}.p-xxl-8{padding:2rem!important}.p-xxl-9{padding:2.25rem!important}.p-xxl-10{padding:2.5rem!important}.p-xxl-11{padding:2.75rem!important}.p-xxl-12{padding:3rem!important}.p-xxl-13{padding:3.25rem!important}.p-xxl-14{padding:3.5rem!important}.p-xxl-15{padding:3.75rem!important}.p-xxl-16{padding:4rem!important}.p-xxl-17{padding:4.25rem!important}.p-xxl-18{padding:4.5rem!important}.p-xxl-19{padding:4.75rem!important}.p-xxl-20{padding:5rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:.75rem!important;padding-left:.75rem!important}.px-xxl-4{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-5{padding-right:1.25rem!important;padding-left:1.25rem!important}.px-xxl-6{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-7{padding-right:1.75rem!important;padding-left:1.75rem!important}.px-xxl-8{padding-right:2rem!important;padding-left:2rem!important}.px-xxl-9{padding-right:2.25rem!important;padding-left:2.25rem!important}.px-xxl-10{padding-right:2.5rem!important;padding-left:2.5rem!important}.px-xxl-11{padding-right:2.75rem!important;padding-left:2.75rem!important}.px-xxl-12{padding-right:3rem!important;padding-left:3rem!important}.px-xxl-13{padding-right:3.25rem!important;padding-left:3.25rem!important}.px-xxl-14{padding-right:3.5rem!important;padding-left:3.5rem!important}.px-xxl-15{padding-right:3.75rem!important;padding-left:3.75rem!important}.px-xxl-16{padding-right:4rem!important;padding-left:4rem!important}.px-xxl-17{padding-right:4.25rem!important;padding-left:4.25rem!important}.px-xxl-18{padding-right:4.5rem!important;padding-left:4.5rem!important}.px-xxl-19{padding-right:4.75rem!important;padding-left:4.75rem!important}.px-xxl-20{padding-right:5rem!important;padding-left:5rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.py-xxl-4{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-5{padding-top:1.25rem!important;padding-bottom:1.25rem!important}.py-xxl-6{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-7{padding-top:1.75rem!important;padding-bottom:1.75rem!important}.py-xxl-8{padding-top:2rem!important;padding-bottom:2rem!important}.py-xxl-9{padding-top:2.25rem!important;padding-bottom:2.25rem!important}.py-xxl-10{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.py-xxl-11{padding-top:2.75rem!important;padding-bottom:2.75rem!important}.py-xxl-12{padding-top:3rem!important;padding-bottom:3rem!important}.py-xxl-13{padding-top:3.25rem!important;padding-bottom:3.25rem!important}.py-xxl-14{padding-top:3.5rem!important;padding-bottom:3.5rem!important}.py-xxl-15{padding-top:3.75rem!important;padding-bottom:3.75rem!important}.py-xxl-16{padding-top:4rem!important;padding-bottom:4rem!important}.py-xxl-17{padding-top:4.25rem!important;padding-bottom:4.25rem!important}.py-xxl-18{padding-top:4.5rem!important;padding-bottom:4.5rem!important}.py-xxl-19{padding-top:4.75rem!important;padding-bottom:4.75rem!important}.py-xxl-20{padding-top:5rem!important;padding-bottom:5rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:.75rem!important}.pt-xxl-4{padding-top:1rem!important}.pt-xxl-5{padding-top:1.25rem!important}.pt-xxl-6{padding-top:1.5rem!important}.pt-xxl-7{padding-top:1.75rem!important}.pt-xxl-8{padding-top:2rem!important}.pt-xxl-9{padding-top:2.25rem!important}.pt-xxl-10{padding-top:2.5rem!important}.pt-xxl-11{padding-top:2.75rem!important}.pt-xxl-12{padding-top:3rem!important}.pt-xxl-13{padding-top:3.25rem!important}.pt-xxl-14{padding-top:3.5rem!important}.pt-xxl-15{padding-top:3.75rem!important}.pt-xxl-16{padding-top:4rem!important}.pt-xxl-17{padding-top:4.25rem!important}.pt-xxl-18{padding-top:4.5rem!important}.pt-xxl-19{padding-top:4.75rem!important}.pt-xxl-20{padding-top:5rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:.75rem!important}.pe-xxl-4{padding-right:1rem!important}.pe-xxl-5{padding-right:1.25rem!important}.pe-xxl-6{padding-right:1.5rem!important}.pe-xxl-7{padding-right:1.75rem!important}.pe-xxl-8{padding-right:2rem!important}.pe-xxl-9{padding-right:2.25rem!important}.pe-xxl-10{padding-right:2.5rem!important}.pe-xxl-11{padding-right:2.75rem!important}.pe-xxl-12{padding-right:3rem!important}.pe-xxl-13{padding-right:3.25rem!important}.pe-xxl-14{padding-right:3.5rem!important}.pe-xxl-15{padding-right:3.75rem!important}.pe-xxl-16{padding-right:4rem!important}.pe-xxl-17{padding-right:4.25rem!important}.pe-xxl-18{padding-right:4.5rem!important}.pe-xxl-19{padding-right:4.75rem!important}.pe-xxl-20{padding-right:5rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:.75rem!important}.pb-xxl-4{padding-bottom:1rem!important}.pb-xxl-5{padding-bottom:1.25rem!important}.pb-xxl-6{padding-bottom:1.5rem!important}.pb-xxl-7{padding-bottom:1.75rem!important}.pb-xxl-8{padding-bottom:2rem!important}.pb-xxl-9{padding-bottom:2.25rem!important}.pb-xxl-10{padding-bottom:2.5rem!important}.pb-xxl-11{padding-bottom:2.75rem!important}.pb-xxl-12{padding-bottom:3rem!important}.pb-xxl-13{padding-bottom:3.25rem!important}.pb-xxl-14{padding-bottom:3.5rem!important}.pb-xxl-15{padding-bottom:3.75rem!important}.pb-xxl-16{padding-bottom:4rem!important}.pb-xxl-17{padding-bottom:4.25rem!important}.pb-xxl-18{padding-bottom:4.5rem!important}.pb-xxl-19{padding-bottom:4.75rem!important}.pb-xxl-20{padding-bottom:5rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:.75rem!important}.ps-xxl-4{padding-left:1rem!important}.ps-xxl-5{padding-left:1.25rem!important}.ps-xxl-6{padding-left:1.5rem!important}.ps-xxl-7{padding-left:1.75rem!important}.ps-xxl-8{padding-left:2rem!important}.ps-xxl-9{padding-left:2.25rem!important}.ps-xxl-10{padding-left:2.5rem!important}.ps-xxl-11{padding-left:2.75rem!important}.ps-xxl-12{padding-left:3rem!important}.ps-xxl-13{padding-left:3.25rem!important}.ps-xxl-14{padding-left:3.5rem!important}.ps-xxl-15{padding-left:3.75rem!important}.ps-xxl-16{padding-left:4rem!important}.ps-xxl-17{padding-left:4.25rem!important}.ps-xxl-18{padding-left:4.5rem!important}.ps-xxl-19{padding-left:4.75rem!important}.ps-xxl-20{padding-left:5rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:.75rem!important}.gap-xxl-4{gap:1rem!important}.gap-xxl-5{gap:1.25rem!important}.gap-xxl-6{gap:1.5rem!important}.gap-xxl-7{gap:1.75rem!important}.gap-xxl-8{gap:2rem!important}.gap-xxl-9{gap:2.25rem!important}.gap-xxl-10{gap:2.5rem!important}.gap-xxl-11{gap:2.75rem!important}.gap-xxl-12{gap:3rem!important}.gap-xxl-13{gap:3.25rem!important}.gap-xxl-14{gap:3.5rem!important}.gap-xxl-15{gap:3.75rem!important}.gap-xxl-16{gap:4rem!important}.gap-xxl-17{gap:4.25rem!important}.gap-xxl-18{gap:4.5rem!important}.gap-xxl-19{gap:4.75rem!important}.gap-xxl-20{gap:5rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:.75rem!important}.row-gap-xxl-4{row-gap:1rem!important}.row-gap-xxl-5{row-gap:1.25rem!important}.row-gap-xxl-6{row-gap:1.5rem!important}.row-gap-xxl-7{row-gap:1.75rem!important}.row-gap-xxl-8{row-gap:2rem!important}.row-gap-xxl-9{row-gap:2.25rem!important}.row-gap-xxl-10{row-gap:2.5rem!important}.row-gap-xxl-11{row-gap:2.75rem!important}.row-gap-xxl-12{row-gap:3rem!important}.row-gap-xxl-13{row-gap:3.25rem!important}.row-gap-xxl-14{row-gap:3.5rem!important}.row-gap-xxl-15{row-gap:3.75rem!important}.row-gap-xxl-16{row-gap:4rem!important}.row-gap-xxl-17{row-gap:4.25rem!important}.row-gap-xxl-18{row-gap:4.5rem!important}.row-gap-xxl-19{row-gap:4.75rem!important}.row-gap-xxl-20{row-gap:5rem!important}.column-gap-xxl-0{column-gap:0!important}.column-gap-xxl-1{column-gap:.25rem!important}.column-gap-xxl-2{column-gap:.5rem!important}.column-gap-xxl-3{column-gap:.75rem!important}.column-gap-xxl-4{column-gap:1rem!important}.column-gap-xxl-5{column-gap:1.25rem!important}.column-gap-xxl-6{column-gap:1.5rem!important}.column-gap-xxl-7{column-gap:1.75rem!important}.column-gap-xxl-8{column-gap:2rem!important}.column-gap-xxl-9{column-gap:2.25rem!important}.column-gap-xxl-10{column-gap:2.5rem!important}.column-gap-xxl-11{column-gap:2.75rem!important}.column-gap-xxl-12{column-gap:3rem!important}.column-gap-xxl-13{column-gap:3.25rem!important}.column-gap-xxl-14{column-gap:3.5rem!important}.column-gap-xxl-15{column-gap:3.75rem!important}.column-gap-xxl-16{column-gap:4rem!important}.column-gap-xxl-17{column-gap:4.25rem!important}.column-gap-xxl-18{column-gap:4.5rem!important}.column-gap-xxl-19{column-gap:4.75rem!important}.column-gap-xxl-20{column-gap:5rem!important}.fs-xxl-1{font-size:calc(1.3rem + .6vw)!important}.fs-xxl-2{font-size:calc(1.275rem + .3vw)!important}.fs-xxl-3{font-size:calc(1.26rem + .12vw)!important}.fs-xxl-4{font-size:1.25rem!important}.fs-xxl-5{font-size:1.15rem!important}.fs-xxl-6{font-size:1.075rem!important}.fs-xxl-7{font-size:.95rem!important}.fs-xxl-8{font-size:.85rem!important}.fs-xxl-9{font-size:.75rem!important}.fs-xxl-10{font-size:.5rem!important}.fs-xxl-sm{font-size:.95rem!important}.fs-xxl-base{font-size:1rem!important}.fs-xxl-lg{font-size:1.075rem!important}.fs-xxl-xl{font-size:1.21rem!important}.fs-xxl-fluid{font-size:100%!important}.fs-xxl-2x{font-size:calc(1.325rem + .9vw)!important}.fs-xxl-2qx{font-size:calc(1.35rem + 1.2vw)!important}.fs-xxl-2hx{font-size:calc(1.375rem + 1.5vw)!important}.fs-xxl-2tx{font-size:calc(1.4rem + 1.8vw)!important}.fs-xxl-3x{font-size:calc(1.425rem + 2.1vw)!important}.fs-xxl-3qx{font-size:calc(1.45rem + 2.4vw)!important}.fs-xxl-3hx{font-size:calc(1.475rem + 2.7vw)!important}.fs-xxl-3tx{font-size:calc(1.5rem + 3vw)!important}.fs-xxl-4x{font-size:calc(1.525rem + 3.3vw)!important}.fs-xxl-4qx{font-size:calc(1.55rem + 3.6vw)!important}.fs-xxl-4hx{font-size:calc(1.575rem + 3.9vw)!important}.fs-xxl-4tx{font-size:calc(1.6rem + 4.2vw)!important}.fs-xxl-5x{font-size:calc(1.625rem + 4.5vw)!important}.fs-xxl-5qx{font-size:calc(1.65rem + 4.8vw)!important}.fs-xxl-5hx{font-size:calc(1.675rem + 5.1vw)!important}.fs-xxl-5tx{font-size:calc(1.7rem + 5.4vw)!important}.fs-xxl-6x{font-size:calc(1.725rem + 5.7vw)!important}.fs-xxl-6qx{font-size:calc(1.75rem + 6vw)!important}.fs-xxl-6hx{font-size:calc(1.775rem + 6.3vw)!important}.fs-xxl-6tx{font-size:calc(1.8rem + 6.6vw)!important}.fs-xxl-7x{font-size:calc(1.825rem + 6.9vw)!important}.fs-xxl-7qx{font-size:calc(1.85rem + 7.2vw)!important}.fs-xxl-7hx{font-size:calc(1.875rem + 7.5vw)!important}.fs-xxl-7tx{font-size:calc(1.9rem + 7.8vw)!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}.min-w-xxl-unset{min-width:unset!important}.min-w-xxl-25{min-width:25%!important}.min-w-xxl-50{min-width:50%!important}.min-w-xxl-75{min-width:75%!important}.min-w-xxl-100{min-width:100%!important}.min-w-xxl-auto{min-width:auto!important}.min-w-xxl-1px{min-width:1px!important}.min-w-xxl-2px{min-width:2px!important}.min-w-xxl-3px{min-width:3px!important}.min-w-xxl-4px{min-width:4px!important}.min-w-xxl-5px{min-width:5px!important}.min-w-xxl-6px{min-width:6px!important}.min-w-xxl-7px{min-width:7px!important}.min-w-xxl-8px{min-width:8px!important}.min-w-xxl-9px{min-width:9px!important}.min-w-xxl-10px{min-width:10px!important}.min-w-xxl-15px{min-width:15px!important}.min-w-xxl-20px{min-width:20px!important}.min-w-xxl-25px{min-width:25px!important}.min-w-xxl-30px{min-width:30px!important}.min-w-xxl-35px{min-width:35px!important}.min-w-xxl-40px{min-width:40px!important}.min-w-xxl-45px{min-width:45px!important}.min-w-xxl-50px{min-width:50px!important}.min-w-xxl-55px{min-width:55px!important}.min-w-xxl-60px{min-width:60px!important}.min-w-xxl-65px{min-width:65px!important}.min-w-xxl-70px{min-width:70px!important}.min-w-xxl-75px{min-width:75px!important}.min-w-xxl-80px{min-width:80px!important}.min-w-xxl-85px{min-width:85px!important}.min-w-xxl-90px{min-width:90px!important}.min-w-xxl-95px{min-width:95px!important}.min-w-xxl-100px{min-width:100px!important}.min-w-xxl-125px{min-width:125px!important}.min-w-xxl-150px{min-width:150px!important}.min-w-xxl-175px{min-width:175px!important}.min-w-xxl-200px{min-width:200px!important}.min-w-xxl-225px{min-width:225px!important}.min-w-xxl-250px{min-width:250px!important}.min-w-xxl-275px{min-width:275px!important}.min-w-xxl-300px{min-width:300px!important}.min-w-xxl-325px{min-width:325px!important}.min-w-xxl-350px{min-width:350px!important}.min-w-xxl-375px{min-width:375px!important}.min-w-xxl-400px{min-width:400px!important}.min-w-xxl-425px{min-width:425px!important}.min-w-xxl-450px{min-width:450px!important}.min-w-xxl-475px{min-width:475px!important}.min-w-xxl-500px{min-width:500px!important}.min-w-xxl-550px{min-width:550px!important}.min-w-xxl-600px{min-width:600px!important}.min-w-xxl-650px{min-width:650px!important}.min-w-xxl-700px{min-width:700px!important}.min-w-xxl-750px{min-width:750px!important}.min-w-xxl-800px{min-width:800px!important}.min-w-xxl-850px{min-width:850px!important}.min-w-xxl-900px{min-width:900px!important}.min-w-xxl-950px{min-width:950px!important}.min-w-xxl-1000px{min-width:1000px!important}.min-h-xxl-unset{min-height:unset!important}.min-h-xxl-25{min-height:25%!important}.min-h-xxl-50{min-height:50%!important}.min-h-xxl-75{min-height:75%!important}.min-h-xxl-100{min-height:100%!important}.min-h-xxl-auto{min-height:auto!important}.min-h-xxl-1px{min-height:1px!important}.min-h-xxl-2px{min-height:2px!important}.min-h-xxl-3px{min-height:3px!important}.min-h-xxl-4px{min-height:4px!important}.min-h-xxl-5px{min-height:5px!important}.min-h-xxl-6px{min-height:6px!important}.min-h-xxl-7px{min-height:7px!important}.min-h-xxl-8px{min-height:8px!important}.min-h-xxl-9px{min-height:9px!important}.min-h-xxl-10px{min-height:10px!important}.min-h-xxl-15px{min-height:15px!important}.min-h-xxl-20px{min-height:20px!important}.min-h-xxl-25px{min-height:25px!important}.min-h-xxl-30px{min-height:30px!important}.min-h-xxl-35px{min-height:35px!important}.min-h-xxl-40px{min-height:40px!important}.min-h-xxl-45px{min-height:45px!important}.min-h-xxl-50px{min-height:50px!important}.min-h-xxl-55px{min-height:55px!important}.min-h-xxl-60px{min-height:60px!important}.min-h-xxl-65px{min-height:65px!important}.min-h-xxl-70px{min-height:70px!important}.min-h-xxl-75px{min-height:75px!important}.min-h-xxl-80px{min-height:80px!important}.min-h-xxl-85px{min-height:85px!important}.min-h-xxl-90px{min-height:90px!important}.min-h-xxl-95px{min-height:95px!important}.min-h-xxl-100px{min-height:100px!important}.min-h-xxl-125px{min-height:125px!important}.min-h-xxl-150px{min-height:150px!important}.min-h-xxl-175px{min-height:175px!important}.min-h-xxl-200px{min-height:200px!important}.min-h-xxl-225px{min-height:225px!important}.min-h-xxl-250px{min-height:250px!important}.min-h-xxl-275px{min-height:275px!important}.min-h-xxl-300px{min-height:300px!important}.min-h-xxl-325px{min-height:325px!important}.min-h-xxl-350px{min-height:350px!important}.min-h-xxl-375px{min-height:375px!important}.min-h-xxl-400px{min-height:400px!important}.min-h-xxl-425px{min-height:425px!important}.min-h-xxl-450px{min-height:450px!important}.min-h-xxl-475px{min-height:475px!important}.min-h-xxl-500px{min-height:500px!important}.min-h-xxl-550px{min-height:550px!important}.min-h-xxl-600px{min-height:600px!important}.min-h-xxl-650px{min-height:650px!important}.min-h-xxl-700px{min-height:700px!important}.min-h-xxl-750px{min-height:750px!important}.min-h-xxl-800px{min-height:800px!important}.min-h-xxl-850px{min-height:850px!important}.min-h-xxl-900px{min-height:900px!important}.min-h-xxl-950px{min-height:950px!important}.min-h-xxl-1000px{min-height:1000px!important}}@media (min-width:1200px){.fs-1{font-size:1.75rem!important}.fs-2{font-size:1.5rem!important}.fs-3{font-size:1.35rem!important}.fs-2x{font-size:2rem!important}.fs-2qx{font-size:2.25rem!important}.fs-2hx{font-size:2.5rem!important}.fs-2tx{font-size:2.75rem!important}.fs-3x{font-size:3rem!important}.fs-3qx{font-size:3.25rem!important}.fs-3hx{font-size:3.5rem!important}.fs-3tx{font-size:3.75rem!important}.fs-4x{font-size:4rem!important}.fs-4qx{font-size:4.25rem!important}.fs-4hx{font-size:4.5rem!important}.fs-4tx{font-size:4.75rem!important}.fs-5x{font-size:5rem!important}.fs-5qx{font-size:5.25rem!important}.fs-5hx{font-size:5.5rem!important}.fs-5tx{font-size:5.75rem!important}.fs-6x{font-size:6rem!important}.fs-6qx{font-size:6.25rem!important}.fs-6hx{font-size:6.5rem!important}.fs-6tx{font-size:6.75rem!important}.fs-7x{font-size:7rem!important}.fs-7qx{font-size:7.25rem!important}.fs-7hx{font-size:7.5rem!important}.fs-7tx{font-size:7.75rem!important}.fs-sm-1{font-size:1.75rem!important}.fs-sm-2{font-size:1.5rem!important}.fs-sm-3{font-size:1.35rem!important}.fs-sm-2x{font-size:2rem!important}.fs-sm-2qx{font-size:2.25rem!important}.fs-sm-2hx{font-size:2.5rem!important}.fs-sm-2tx{font-size:2.75rem!important}.fs-sm-3x{font-size:3rem!important}.fs-sm-3qx{font-size:3.25rem!important}.fs-sm-3hx{font-size:3.5rem!important}.fs-sm-3tx{font-size:3.75rem!important}.fs-sm-4x{font-size:4rem!important}.fs-sm-4qx{font-size:4.25rem!important}.fs-sm-4hx{font-size:4.5rem!important}.fs-sm-4tx{font-size:4.75rem!important}.fs-sm-5x{font-size:5rem!important}.fs-sm-5qx{font-size:5.25rem!important}.fs-sm-5hx{font-size:5.5rem!important}.fs-sm-5tx{font-size:5.75rem!important}.fs-sm-6x{font-size:6rem!important}.fs-sm-6qx{font-size:6.25rem!important}.fs-sm-6hx{font-size:6.5rem!important}.fs-sm-6tx{font-size:6.75rem!important}.fs-sm-7x{font-size:7rem!important}.fs-sm-7qx{font-size:7.25rem!important}.fs-sm-7hx{font-size:7.5rem!important}.fs-sm-7tx{font-size:7.75rem!important}.fs-md-1{font-size:1.75rem!important}.fs-md-2{font-size:1.5rem!important}.fs-md-3{font-size:1.35rem!important}.fs-md-2x{font-size:2rem!important}.fs-md-2qx{font-size:2.25rem!important}.fs-md-2hx{font-size:2.5rem!important}.fs-md-2tx{font-size:2.75rem!important}.fs-md-3x{font-size:3rem!important}.fs-md-3qx{font-size:3.25rem!important}.fs-md-3hx{font-size:3.5rem!important}.fs-md-3tx{font-size:3.75rem!important}.fs-md-4x{font-size:4rem!important}.fs-md-4qx{font-size:4.25rem!important}.fs-md-4hx{font-size:4.5rem!important}.fs-md-4tx{font-size:4.75rem!important}.fs-md-5x{font-size:5rem!important}.fs-md-5qx{font-size:5.25rem!important}.fs-md-5hx{font-size:5.5rem!important}.fs-md-5tx{font-size:5.75rem!important}.fs-md-6x{font-size:6rem!important}.fs-md-6qx{font-size:6.25rem!important}.fs-md-6hx{font-size:6.5rem!important}.fs-md-6tx{font-size:6.75rem!important}.fs-md-7x{font-size:7rem!important}.fs-md-7qx{font-size:7.25rem!important}.fs-md-7hx{font-size:7.5rem!important}.fs-md-7tx{font-size:7.75rem!important}.fs-lg-1{font-size:1.75rem!important}.fs-lg-2{font-size:1.5rem!important}.fs-lg-3{font-size:1.35rem!important}.fs-lg-2x{font-size:2rem!important}.fs-lg-2qx{font-size:2.25rem!important}.fs-lg-2hx{font-size:2.5rem!important}.fs-lg-2tx{font-size:2.75rem!important}.fs-lg-3x{font-size:3rem!important}.fs-lg-3qx{font-size:3.25rem!important}.fs-lg-3hx{font-size:3.5rem!important}.fs-lg-3tx{font-size:3.75rem!important}.fs-lg-4x{font-size:4rem!important}.fs-lg-4qx{font-size:4.25rem!important}.fs-lg-4hx{font-size:4.5rem!important}.fs-lg-4tx{font-size:4.75rem!important}.fs-lg-5x{font-size:5rem!important}.fs-lg-5qx{font-size:5.25rem!important}.fs-lg-5hx{font-size:5.5rem!important}.fs-lg-5tx{font-size:5.75rem!important}.fs-lg-6x{font-size:6rem!important}.fs-lg-6qx{font-size:6.25rem!important}.fs-lg-6hx{font-size:6.5rem!important}.fs-lg-6tx{font-size:6.75rem!important}.fs-lg-7x{font-size:7rem!important}.fs-lg-7qx{font-size:7.25rem!important}.fs-lg-7hx{font-size:7.5rem!important}.fs-lg-7tx{font-size:7.75rem!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}}:root{--bs-xs:0;--bs-sm:576px;--bs-md:768px;--bs-lg:992px;--bs-xl:1200px;--bs-xxl:1400px;--bs-scrollbar-size:5px;--bs-scrollbar-overlay-size:19px;--bs-scrollbar-overlay-space:7px;--bs-white-bg-rgb:255,255,255;--bs-black-bg-rgb:0,0,0}[data-bs-theme=light]{--bs-text-muted:#6D6D97;--bs-gray-100:#F9F9F9;--bs-gray-100-rgb:249,249,249;--bs-gray-200:#F1F1F4;--bs-gray-200-rgb:241,241,244;--bs-gray-300:#DBDFE9;--bs-gray-300-rgb:219,223,233;--bs-gray-400:#C4CADA;--bs-gray-400-rgb:196,202,218;--bs-gray-500:#6D6D97;--bs-gray-500-rgb:109,109,151;--bs-gray-600:#78829D;--bs-gray-600-rgb:120,130,157;--bs-gray-700:#4B5675;--bs-gray-700-rgb:75,86,117;--bs-gray-800:#252F4A;--bs-gray-800-rgb:37,47,74;--bs-gray-900:#071437;--bs-gray-900-rgb:7,20,55;--bs-light:#F9F9F9;--bs-primary:#0069E0;--bs-secondary:#F1F1F4;--bs-success:#17C653;--bs-info:#7239EA;--bs-warning:#F6C000;--bs-danger:#F8285A;--bs-dark:#1E2129;--bs-primary-active:#056EE9;--bs-secondary-active:#C4CADA;--bs-light-active:#F1F1F4;--bs-success-active:#04B440;--bs-info-active:#5014D0;--bs-warning-active:#DEAD00;--bs-danger-active:#D81A48;--bs-dark-active:#111318;--bs-primary-light:#E9F3FF;--bs-secondary-light:#F9F9F9;--bs-success-light:#DFFFEA;--bs-info-light:#F8F5FF;--bs-warning-light:#FFF8DD;--bs-danger-light:#FFEEF3;--bs-dark-light:#F9F9F9;--bs-light-light:#ffffff;--bs-primary-inverse:#ffffff;--bs-secondary-inverse:#252F4A;--bs-light-inverse:#252F4A;--bs-success-inverse:#ffffff;--bs-info-inverse:#ffffff;--bs-warning-inverse:#ffffff;--bs-danger-inverse:#ffffff;--bs-dark-inverse:#ffffff;--bs-primary-clarity:rgba(0, 105, 224, 0.2);--bs-secondary-clarity:rgba(249, 249, 249, 0.2);--bs-success-clarity:rgba(23, 198, 83, 0.2);--bs-info-clarity:rgba(114, 57, 234, 0.2);--bs-warning-clarity:rgba(246, 192, 0, 0.2);--bs-danger-clarity:rgba(248, 40, 90, 0.2);--bs-dark-clarity:rgba(30, 33, 41, 0.2);--bs-light-clarity:rgba(255, 255, 255, 0.2);--bs-light-rgb:249,249,249;--bs-primary-rgb:0,105,224;--bs-secondary-rgb:241,241,244;--bs-success-rgb:23,198,83;--bs-info-rgb:114,57,234;--bs-warning-rgb:246,192,0;--bs-danger-rgb:248,40,90;--bs-dark-rgb:30,33,41;--bs-text-white:#ffffff;--bs-text-primary:#0069E0;--bs-text-secondary:#F1F1F4;--bs-text-light:#F9F9F9;--bs-text-success:#17C653;--bs-text-info:#7239EA;--bs-text-warning:#F6C000;--bs-text-danger:#F8285A;--bs-text-dark:#1E2129;--bs-text-muted:#6D6D97;--bs-text-gray-100:#F9F9F9;--bs-text-gray-200:#F1F1F4;--bs-text-gray-300:#DBDFE9;--bs-text-gray-400:#C4CADA;--bs-text-gray-500:#6D6D97;--bs-text-gray-600:#78829D;--bs-text-gray-700:#4B5675;--bs-text-gray-800:#252F4A;--bs-text-gray-900:#071437;--bs-border-color:#F1F1F4;--bs-border-dashed-color:#DBDFE9;--bs-component-active-color:#ffffff;--bs-component-active-bg:#0069E0;--bs-component-hover-color:#0069E0;--bs-component-hover-bg:#F9F9F9;--bs-component-checked-color:#ffffff;--bs-component-checked-bg:#0069E0;--bs-box-shadow-xs:0 0.1rem 0.75rem 0.25rem rgba(0, 0, 0, 0.05);--bs-box-shadow-sm:0 0.1rem 1rem 0.25rem rgba(0, 0, 0, 0.05);--bs-box-shadow:0 0.5rem 1.5rem 0.5rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 2rem 1rem rgba(0, 0, 0, 0.1);--bs-input-bg:var(--bs-body-bg);--bs-input-color:var(--bs-gray-700);--bs-input-solid-color:var(--bs-gray-700);--bs-input-solid-bg:var(--bs-gray-100);--bs-input-solid-bg-focus:var(--bs-gray-200);--bs-input-solid-placeholder-color:var(--bs-gray-500);--bs-root-card-box-shadow:0px 3px 4px 0px rgba(0, 0, 0, 0.03);--bs-root-card-border-color:#F1F1F4;--bs-tooltip-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.15);--bs-table-striped-bg:rgba(var(--bs-gray-100-rgb), 0.75);--bs-table-loading-message-box-shadow:0px 0px 50px 0px rgba(82, 63, 105, 0.15);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-box-shadow:0px 0px 50px 0px rgba(82, 63, 105, 0.15);--bs-code-bg:#f1f3f8;--bs-code-shadow:0px 3px 9px rgba(0, 0, 0, 0.08);--bs-code-border-color:transparent;--bs-code-color:#b93993;--bs-symbol-label-color:var(--bs-gray-800);--bs-symbol-label-bg:var(--bs-gray-100);--bs-symbol-border-color:rgba(var(--bs-body-bg), 0.5);--bs-bullet-bg-color:var(--bs-gray-400);--bs-scrolltop-opacity:0;--bs-scrolltop-opacity-on:0.3;--bs-scrolltop-opacity-hover:1;--bs-scrolltop-box-shadow:var(--bs-box-shadow);--bs-scrolltop-bg-color:var(--bs-primary);--bs-scrolltop-bg-color-hover:var(--bs-primary);--bs-scrolltop-icon-color:var(--bs-primary-inverse);--bs-scrolltop-icon-color-hover:var(--bs-primary-inverse);--bs-drawer-box-shadow:0px 1px 9px -3px rgba(0, 0, 0, 0.05);--bs-drawer-bg-color:#ffffff;--bs-drawer-overlay-bg-color:rgba(0, 0, 0, 0.2);--bs-menu-dropdown-box-shadow:0px 0px 50px 0px rgba(82, 63, 105, 0.15);--bs-menu-dropdown-bg-color:var(--bs-body-bg);--bs-menu-heading-color:#6D6D97;--bs-menu-link-color-hover:#0069E0;--bs-menu-link-color-show:#0069E0;--bs-menu-link-color-here:#0069E0;--bs-menu-link-color-active:#0069E0;--bs-menu-link-bg-color-hover:#F9F9F9;--bs-menu-link-bg-color-show:#F9F9F9;--bs-menu-link-bg-color-here:#F9F9F9;--bs-menu-link-bg-color-active:#F9F9F9;--bs-scrollbar-color:#F1F1F4;--bs-scrollbar-hover-color:#DBDFE9;--bs-overlay-bg:rgba(0, 0, 0, 0.05);--bs-blockui-overlay-bg:rgba(0, 0, 0, 0.05);--bs-rating-color-default:#C4CADA;--bs-rating-color-active:#FFAD0F;--bs-ribbon-label-box-shadow:0px -1px 5px 0px rgba(30, 33, 41, 0.1);--bs-ribbon-label-bg:#0069E0;--bs-ribbon-label-border-color:#00397a;--bs-ribbon-clip-bg:#1E2129;--bs-engage-btn-bg:#ffffff;--bs-engage-btn-box-shadow:0px 0px 22px #E0E0E0;--bs-engage-btn-border-color:#E8E8E8;--bs-engage-btn-color:#252F4A;--bs-engage-btn-icon-color:#78829D;--bs-engage-btn-color-active:#252F4A}[data-bs-theme=dark]{--bs-text-muted:#9A9CAE;--bs-gray-100:#1B1C22;--bs-gray-100-rgb:27,28,34;--bs-gray-200:#26272F;--bs-gray-200-rgb:38,39,47;--bs-gray-300:#363843;--bs-gray-300-rgb:54,56,67;--bs-gray-400:#464852;--bs-gray-400-rgb:70,72,82;--bs-gray-500:#9A9CAE;--bs-gray-500-rgb:154,156,174;--bs-gray-600:#808290;--bs-gray-600-rgb:128,130,144;--bs-gray-700:#9A9CAE;--bs-gray-700-rgb:154,156,174;--bs-gray-800:#B5B7C8;--bs-gray-800-rgb:181,183,200;--bs-gray-900:#F5F5F5;--bs-gray-900-rgb:245,245,245;--bs-light:#1B1C22;--bs-primary:#1F87FF;--bs-secondary:#363843;--bs-success:#00A261;--bs-info:#883FFF;--bs-warning:#C59A00;--bs-danger:#E42855;--bs-dark:#F9F9F9;--bs-primary-active:#107EFF;--bs-secondary-active:#464852;--bs-light-active:#1F212A;--bs-success-active:#01BF73;--bs-info-active:#9E63FF;--bs-warning-active:#D9AA00;--bs-danger-active:#FF3767;--bs-dark-active:#F9F9F9;--bs-primary-light:#172331;--bs-secondary-light:#363843;--bs-success-light:#1F212A;--bs-info-light:#272134;--bs-warning-light:#242320;--bs-danger-light:#302024;--bs-dark-light:#1E2027;--bs-light-light:#1F212A;--bs-primary-inverse:#ffffff;--bs-secondary-inverse:#ffffff;--bs-light-inverse:#808290;--bs-success-inverse:#ffffff;--bs-info-inverse:#ffffff;--bs-warning-inverse:#ffffff;--bs-danger-inverse:#ffffff;--bs-dark-inverse:#1E2129;--bs-primary-clarity:rgba(31, 135, 255, 0.2);--bs-secondary-clarity:rgba(54, 56, 67, 0.2);--bs-success-clarity:rgba(0, 162, 97, 0.2);--bs-info-clarity:rgba(136, 63, 255, 0.2);--bs-warning-clarity:rgba(197, 154, 0, 0.2);--bs-danger-clarity:rgba(228, 40, 85, 0.2);--bs-dark-clarity:rgba(39, 42, 52, 0.2);--bs-light-clarity:rgba(31, 33, 42, 0.2);--bs-light-rgb:27,28,34;--bs-primary-rgb:31,135,255;--bs-secondary-rgb:54,56,67;--bs-success-rgb:0,162,97;--bs-info-rgb:136,63,255;--bs-warning-rgb:197,154,0;--bs-danger-rgb:228,40,85;--bs-dark-rgb:249,249,249;--bs-text-white:#ffffff;--bs-text-primary:#1F87FF;--bs-text-secondary:#363843;--bs-text-light:#1B1C22;--bs-text-success:#00A261;--bs-text-info:#883FFF;--bs-text-warning:#C59A00;--bs-text-danger:#E42855;--bs-text-dark:#F9F9F9;--bs-text-muted:#9A9CAE;--bs-text-gray-100:#1B1C22;--bs-text-gray-200:#26272F;--bs-text-gray-300:#363843;--bs-text-gray-400:#464852;--bs-text-gray-500:#9A9CAE;--bs-text-gray-600:#808290;--bs-text-gray-700:#9A9CAE;--bs-text-gray-800:#B5B7C8;--bs-text-gray-900:#F5F5F5;--bs-border-color:#26272F;--bs-border-dashed-color:#363843;--bs-component-active-color:#ffffff;--bs-component-active-bg:#1F87FF;--bs-component-hover-color:#1F87FF;--bs-component-hover-bg:#1B1C22;--bs-component-checked-color:#ffffff;--bs-component-checked-bg:#1F87FF;--bs-box-shadow-xs:0 0.1rem 0.75rem 0.25rem rgba(0, 0, 0, 0.05);--bs-box-shadow-sm:0 0.1rem 1rem 0.25rem rgba(0, 0, 0, 0.05);--bs-box-shadow:0 0.5rem 1.5rem 0.5rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 2rem 1rem rgba(0, 0, 0, 0.1);--bs-input-color:var(--bs-gray-700);--bs-input-bg:var(--bs-body-bg);--bs-input-solid-color:var(--bs-gray-700);--bs-input-solid-bg:var(--bs-gray-100);--bs-input-solid-bg-focus:var(--bs-gray-200);--bs-input-solid-placeholder-color:var(--bs-gray-500);--bs-tooltip-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.15);--bs-root-card-box-shadow:none;--bs-root-card-border-color:#1E2027;--bs-table-striped-bg:rgba(27, 28, 34, 0.75);--bs-table-loading-message-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.3);--bs-dropdown-bg:#1C1D22;--bs-dropdown-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.3);--bs-code-bg:#2b2b40;--bs-code-shadow:rgba(0, 0, 0, 0.08) 0px 3px 9px 0px;--bs-code-border-color:transparent;--bs-code-color:#b93993;--bs-symbol-label-color:#B5B7C8;--bs-symbol-label-bg:#1B1C22;--bs-symbol-border-color:rgba(255, 255, 255, 0.5);--bs-bullet-bg-color:#464852;--bs-scrolltop-opacity:0;--bs-scrolltop-opacity-on:0.3;--bs-scrolltop-opacity-hover:1;--bs-scrolltop-box-shadow:0 0.5rem 1.5rem 0.5rem rgba(0, 0, 0, 0.075);--bs-scrolltop-bg-color:#0069E0;--bs-scrolltop-bg-color-hover:#0069E0;--bs-scrolltop-icon-color:#ffffff;--bs-scrolltop-icon-color-hover:#ffffff;--bs-drawer-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.1);--bs-drawer-bg-color:#1C1D22;--bs-drawer-overlay-bg-color:rgba(0, 0, 0, 0.4);--bs-menu-dropdown-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.3);--bs-menu-dropdown-bg-color:#1C1D22;--bs-menu-heading-color:#9A9CAE;--bs-menu-link-color-hover:#1F87FF;--bs-menu-link-color-show:#1F87FF;--bs-menu-link-color-here:#1F87FF;--bs-menu-link-color-active:#1F87FF;--bs-menu-link-bg-color-hover:#1B1C22;--bs-menu-link-bg-color-show:#1B1C22;--bs-menu-link-bg-color-here:#1B1C22;--bs-menu-link-bg-color-active:#1B1C22;--bs-scrollbar-color:#26272F;--bs-scrollbar-hover-color:#363843;--bs-overlay-bg:rgba(255, 255, 255, 0.05);--bs-blockui-overlay-bg:rgba(255, 255, 255, 0.05);--bs-rating-color-default:#464852;--bs-rating-color-active:#FFAD0F;--bs-ribbon-label-box-shadow:0px -1px 5px 0px rgba(255, 255, 255, 0.1);--bs-ribbon-label-bg:#0069E0;--bs-ribbon-label-border-color:#00397a;--bs-ribbon-clip-bg:#F9F9F9;--bs-engage-btn-bg:#26272F;--bs-engage-btn-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.3);--bs-engage-btn-border-color:#26272F;--bs-engage-btn-color:#B5B7C8;--bs-engage-btn-icon-color:#808290;--bs-engage-btn-color-active:#B5B7C8}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{outline:0}.blockquote-footer{color:var(--bs-blockquote-footer-color)}.list-style-none{list-style:none}[data-kt-theme-mode-switching=true] *{transition:none!important}[data-bs-theme=light] .theme-dark-show{display:none!important}[data-bs-theme=light] .theme-light-bg-transparent{background-color:transparent!important}[data-bs-theme=light] .theme-light-bg-body{background-color:var(--bs-body-bg)!important}[data-bs-theme=dark] .theme-light-show{display:none!important}[data-bs-theme=dark] .theme-dark-bg-transparent{background-color:transparent!important}[data-bs-theme=dark] .theme-dark-bg-body{background-color:var(--bs-body-bg)!important}.animation{animation-duration:1s;animation-fill-mode:both}@keyframes animationSlideInDown{from{transform:translate3d(0,-100%,0);visibility:visible}to{transform:translate3d(0,0,0)}}.animation-slide-in-down{animation-name:animationSlideInDown}@keyframes animationSlideInUp{from{transform:translate3d(0,100%,0);visibility:visible}to{transform:translate3d(0,0,0)}}.animation-slide-in-up{animation-name:animationSlideInUp}@keyframes animationFadeIn{from{opacity:0}to{opacity:1}}.animation-fade-in{animation-name:animationFadeIn}@keyframes animationFadeOut{from{opacity:1}to{opacity:0}}.animation-fade-out{animation-name:animationFadeOut}.animation-blink{animation:animationBlink 1s steps(5,start) infinite}@keyframes animationBlink{to{visibility:hidden}}.alert-light{color:var(--bs-light);border-color:var(--bs-light);background-color:var(--bs-light-light)}.alert-light .alert-link{color:var(--bs-light)}.alert-primary{color:var(--bs-primary);border-color:var(--bs-primary);background-color:var(--bs-primary-light)}.alert-primary .alert-link{color:var(--bs-primary)}.alert-secondary{color:var(--bs-secondary);border-color:var(--bs-secondary);background-color:var(--bs-secondary-light)}.alert-secondary .alert-link{color:var(--bs-secondary)}.alert-success{color:var(--bs-success);border-color:var(--bs-success);background-color:var(--bs-success-light)}.alert-success .alert-link{color:var(--bs-success)}.alert-info{color:var(--bs-info);border-color:var(--bs-info);background-color:var(--bs-info-light)}.alert-info .alert-link{color:var(--bs-info)}.alert-warning{color:var(--bs-warning);border-color:var(--bs-warning);background-color:var(--bs-warning-light)}.alert-warning .alert-link{color:var(--bs-warning)}.alert-danger{color:var(--bs-danger);border-color:var(--bs-danger);background-color:var(--bs-danger-light)}.alert-danger .alert-link{color:var(--bs-danger)}.alert-dark{color:var(--bs-dark);border-color:var(--bs-dark);background-color:var(--bs-dark-light)}.alert-dark .alert-link{color:var(--bs-dark)}[data-bs-theme=dark] .dropdown-menu{box-shadow:0 0 30px rgba(0,0,0,.3)}.toast .toast-header .btn-close{margin-right:0}[data-bs-theme=dark] .toast{--bs-toast-bg:#26272F;--bs-toast-header-bg:#26272F;--bs-toast-header-border-color:#363843}.nav-pills .nav-item{margin-right:.5rem}.nav-pills .nav-item:last-child{margin-right:0}.nav-stretch{align-items:stretch;padding-top:0!important;padding-bottom:0!important}.nav-stretch .nav-item{display:flex;align-items:stretch;padding-top:0!important;padding-bottom:0!important}.nav-stretch .nav-link{display:flex;align-items:center}.nav-group{padding:.35rem;border-radius:.475rem;background-color:var(--bs-gray-100)}.nav-group.nav-group-outline{background-color:transparent;border:1px solid var(--bs-border-color)}.nav-group.nav-group-fluid{display:flex}.nav-group.nav-group-fluid>.btn,.nav-group.nav-group-fluid>label{position:relative;flex-shrink:0;flex-grow:1;flex-basis:0}.nav-group.nav-group-fluid>label{margin-right:.1rem}.nav-group.nav-group-fluid>label>.btn{width:100%}.nav-group.nav-group-fluid>label:last-child{margin-right:0}.nav-line-tabs{border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:var(--bs-border-color)}.nav-line-tabs .nav-item{margin-bottom:-1px}.nav-line-tabs .nav-item .nav-link{color:var(--bs-gray-700);border:0;border-bottom:1px solid transparent;transition:color .2s ease;padding:.5rem 0;margin:0 1rem}.nav-line-tabs .nav-item:first-child .nav-link{margin-left:0}.nav-line-tabs .nav-item:last-child .nav-link{margin-right:0}.nav-line-tabs .nav-item .nav-link.active,.nav-line-tabs .nav-item .nav-link:hover:not(.disabled),.nav-line-tabs .nav-item.show .nav-link{background-color:transparent;border:0;border-bottom:1px solid var(--bs-primary);color:var(--bs-primary);transition:color .2s ease}.nav-line-tabs.nav-line-tabs-2x{border-bottom-width:2px}.nav-line-tabs.nav-line-tabs-2x .nav-item{margin-bottom:-2px}.nav-line-tabs.nav-line-tabs-2x .nav-item .nav-link{border-bottom-width:2px}.nav-line-tabs.nav-line-tabs-2x .nav-item .nav-link.active,.nav-line-tabs.nav-line-tabs-2x .nav-item .nav-link:hover:not(.disabled),.nav-line-tabs.nav-line-tabs-2x .nav-item.show .nav-link{color:var(--bs-primary);border-bottom-width:2px}.nav.nav-pills.nav-pills-custom .nav-link,.nav.nav-pills.nav-pills-custom .show>.nav-link{border:1px dashed var(--bs-border-dashed-color);border-radius:.625rem}.nav.nav-pills.nav-pills-custom .nav-link.nav-link-border-solid,.nav.nav-pills.nav-pills-custom .show>.nav-link.nav-link-border-solid{border:3px solid var(--bs-border-dashed-color)}.nav.nav-pills.nav-pills-custom .nav-link.nav-link-border-solid.active,.nav.nav-pills.nav-pills-custom .show>.nav-link.nav-link-border-solid.active{border:3px solid var(--bs-primary)}.nav.nav-pills.nav-pills-custom .nav-link .nav-icon img,.nav.nav-pills.nav-pills-custom .show>.nav-link .nav-icon img{width:30px;transition:color .2s ease}.nav.nav-pills.nav-pills-custom .nav-link .nav-icon img.default,.nav.nav-pills.nav-pills-custom .show>.nav-link .nav-icon img.default{display:inline-block}.nav.nav-pills.nav-pills-custom .nav-link .nav-icon img.active,.nav.nav-pills.nav-pills-custom .show>.nav-link .nav-icon img.active{display:none}.nav.nav-pills.nav-pills-custom .nav-link.active,.nav.nav-pills.nav-pills-custom .show>.nav-link.active{background-color:transparent;border:1px solid var(--bs-border-dashed-color);transition-duration:1ms;position:relative}.nav.nav-pills.nav-pills-custom .nav-link.active .nav-text,.nav.nav-pills.nav-pills-custom .show>.nav-link.active .nav-text{color:var(--bs-gray-800)!important;transition:color .2s ease}.nav.nav-pills.nav-pills-custom .nav-link.active .bullet-custom,.nav.nav-pills.nav-pills-custom .show>.nav-link.active .bullet-custom{display:block}.nav.nav-pills.nav-pills-custom .nav-link .bullet-custom,.nav.nav-pills.nav-pills-custom .show>.nav-link .bullet-custom{display:none}.nav.nav-pills.nav-pills-custom.nav-pills-active-custom .nav-item .nav-link:not(:active) span:nth-child(1){color:#b5b5c3}.nav.nav-pills.nav-pills-custom.nav-pills-active-custom .nav-item .nav-link:not(:active) span:nth-child(2){color:#3f4254}.nav.nav-pills.nav-pills-custom.nav-pills-active-custom .nav-item .nav-link:hover span:nth-child(1){color:#fff!important}.nav.nav-pills.nav-pills-custom.nav-pills-active-custom .nav-item .nav-link:hover span:nth-child(2){color:#fff!important}.nav.nav-pills.nav-pills-custom.nav-pills-active-custom .nav-item .nav-link.active span:nth-child(1){color:#fff!important}.nav.nav-pills.nav-pills-custom.nav-pills-active-custom .nav-item .nav-link.active span:nth-child(2){color:#fff!important}.pagination{display:flex;flex-wrap:wrap;justify-content:center;margin:0}.pagination.pagination-circle .page-link{border-radius:50%}.pagination.pagination-outline .page-link{border:1px solid var(--bs-border-color)}.pagination.pagination-outline .page-item.active .page-link,.pagination.pagination-outline .page-item:hover:not(.disabled) .page-link{border-color:var(--bs-primary-light)}.page-item{margin-right:.5rem}.page-item:last-child{margin-right:0}.page-item .page-link{display:flex;justify-content:center;align-items:center;border-radius:.475rem;height:2.5rem;min-width:2.5rem;font-weight:500;font-size:1.075rem}.page-item .page-link i{font-size:.85rem}.page-item .page-link .next,.page-item .page-link .previous{display:block;height:.875rem;width:.875rem}.page-item .page-link .first{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-700);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e")}.page-item .page-link .previous{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-700);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e")}.page-item .page-link .next{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-700);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.page-item .page-link .last{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-700);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.page-item:focus .page-link{color:var(--bs-pagination-focus-color)}.page-item:focus .page-link .svg-icon,.page-item:focus .page-link i{color:var(--bs-pagination-focus-color)}.page-item:focus .page-link .previous{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-pagination-focus-color);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-focus-color%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-focus-color%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e")}.page-item:focus .page-link .next{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-pagination-focus-color);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-focus-color%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-focus-color%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.page-item:hover:not(.active):not(.offset):not(.disabled) .page-link{color:var(--bs-pagination-hover-color)}.page-item:hover:not(.active):not(.offset):not(.disabled) .page-link.page-text{background-color:transparent}.page-item:hover:not(.active):not(.offset):not(.disabled) .page-link .svg-icon,.page-item:hover:not(.active):not(.offset):not(.disabled) .page-link i{color:var(--bs-pagination-hover-color)}.page-item:hover:not(.active):not(.offset):not(.disabled) .page-link .previous{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-pagination-hover-color);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-hover-color%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-hover-color%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e")}.page-item:hover:not(.active):not(.offset):not(.disabled) .page-link .next{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-pagination-hover-color);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-hover-color%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-hover-color%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.page-item.active .page-link{color:var(--bs-pagination-active-color)}.page-item.active .page-link.page-text{background-color:transparent}.page-item.active .page-link .svg-icon,.page-item.active .page-link i{color:var(--bs-pagination-active-color)}.page-item.active .page-link .previous{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-pagination-active-color);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-active-color%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-active-color%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e")}.page-item.active .page-link .next{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-pagination-active-color);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-active-color%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-active-color%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.page-item.disabled .page-link{color:var(--bs-pagination-disabled-color)}.page-item.disabled .page-link .svg-icon,.page-item.disabled .page-link i{color:var(--bs-pagination-disabled-color)}.page-item.disabled .page-link .previous{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-pagination-disabled-color);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-disabled-color%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-disabled-color%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e")}.page-item.disabled .page-link .next{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-pagination-disabled-color);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-disabled-color%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-pagination-disabled-color%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}@media (max-width:991.98px){.page-item{margin-right:.25rem}.page-item:last-child{margin-right:0}}.separator{display:block;height:0;border-bottom:1px solid var(--bs-border-color)}.separator.separator-dotted{border-bottom-style:dotted;border-bottom-color:var(--bs-border-dashed-color)}.separator.separator-dashed{border-bottom-style:dashed;border-bottom-color:var(--bs-border-dashed-color)}.separator.separator-content{display:flex;align-items:center;border-bottom:0;text-align:center}.separator.separator-content::after,.separator.separator-content::before{content:" ";width:50%;border-bottom:1px solid var(--bs-border-color)}.separator.separator-content::before{margin-right:1.25rem}.separator.separator-content::after{margin-left:1.25rem}.separator.separator-content.separator-dotted::after,.separator.separator-content.separator-dotted::before{border-bottom-style:dotted;border-bottom-color:var(--bs-border-dashed-color)}.separator.separator-content.separator-dashed::after,.separator.separator-content.separator-dashed::before{border-bottom-style:dashed;border-bottom-color:var(--bs-border-dashed-color)}.separator.separator-content.border-light::after,.separator.separator-content.border-light::before{border-color:#f9f9f9!important}.separator.separator-content.border-primary::after,.separator.separator-content.border-primary::before{border-color:#0069e0!important}.separator.separator-content.border-secondary::after,.separator.separator-content.border-secondary::before{border-color:#f1f1f4!important}.separator.separator-content.border-success::after,.separator.separator-content.border-success::before{border-color:#17c653!important}.separator.separator-content.border-info::after,.separator.separator-content.border-info::before{border-color:#7239ea!important}.separator.separator-content.border-warning::after,.separator.separator-content.border-warning::before{border-color:#f6c000!important}.separator.separator-content.border-danger::after,.separator.separator-content.border-danger::before{border-color:#f8285a!important}.separator.separator-content.border-dark::after,.separator.separator-content.border-dark::before{border-color:#1e2129!important}.carousel-custom .carousel-indicators{align-items:center;position:static;z-index:auto;margin:0;padding:0;list-style:none}.carousel-custom .carousel-indicators li{transform:none;opacity:1}.carousel-custom .carousel-indicators li.active{transform:none;opacity:1}.carousel-custom .carousel-indicators.carousel-indicators-dots li{border-radius:0;background-color:transparent!important;height:13px;width:13px;display:flex;align-items:center;justify-content:center;text-align:center}.carousel-custom .carousel-indicators.carousel-indicators-dots li:after{display:inline-block;content:" ";border-radius:50%;transition:all .3s ease;background-color:var(--bs-gray-200);height:9px;width:9px}.carousel-custom .carousel-indicators.carousel-indicators-dots li.active{background-color:transparent}.carousel-custom .carousel-indicators.carousel-indicators-dots li.active:after{transition:all .3s ease;height:13px;width:13px;background-color:var(--bs-gray-400)}.carousel-custom .carousel-indicators.carousel-indicators-bullet li{transition:all .3s ease;background-color:transparent!important;border-radius:6px;height:6px;width:6px;display:flex;align-items:center;justify-content:center;text-align:center}.carousel-custom .carousel-indicators.carousel-indicators-bullet li:after{display:inline-block;content:" ";transition:all .3s ease;background-color:var(--bs-gray-400);border-radius:6px;height:6px;width:6px}.carousel-custom .carousel-indicators.carousel-indicators-bullet li.active{transition:all .3s ease;background-color:transparent;height:6px;width:16px}.carousel-custom .carousel-indicators.carousel-indicators-bullet li.active:after{transition:all .3s ease;height:6px;width:16px;background-color:var(--bs-gray-600)}.carousel-custom .carousel-indicators-active-light li.active:after{background-color:var(--bs-light)!important}.carousel-custom .carousel-indicators-active-primary li.active:after{background-color:var(--bs-primary)!important}.carousel-custom .carousel-indicators-active-secondary li.active:after{background-color:var(--bs-secondary)!important}.carousel-custom .carousel-indicators-active-success li.active:after{background-color:var(--bs-success)!important}.carousel-custom .carousel-indicators-active-info li.active:after{background-color:var(--bs-info)!important}.carousel-custom .carousel-indicators-active-warning li.active:after{background-color:var(--bs-warning)!important}.carousel-custom .carousel-indicators-active-danger li.active:after{background-color:var(--bs-danger)!important}.carousel-custom .carousel-indicators-active-dark li.active:after{background-color:var(--bs-dark)!important}.carousel-custom.carousel-stretch{height:100%;display:flex;flex-direction:column}.carousel-custom.carousel-stretch .carousel-inner{flex-grow:1}.carousel-custom.carousel-stretch .carousel-item{height:100%}.carousel-custom.carousel-stretch .carousel-wrapper{display:flex;flex-direction:column;height:100%}.menu-group{display:flex}.menu,.menu-wrapper{display:flex;padding:0;margin:0;list-style:none}.menu-inner{padding:0;margin:0;list-style:none}.menu-sub{display:none;padding:0;margin:0;list-style:none;flex-direction:column}.menu-item{display:block;padding:.15rem 0}.menu-item .menu-link{cursor:pointer;display:flex;align-items:center;padding:0;flex:0 0 100%;padding:.65rem 1rem;transition:none;outline:0!important}.menu-item .menu-link .menu-icon{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:2rem;margin-right:.5rem}.menu-item .menu-link .menu-icon .svg-icon,.menu-item .menu-link .menu-icon i{line-height:1}.menu-item .menu-link .menu-bullet{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:1.25rem;margin-right:.5rem}.menu-item .menu-link .menu-title{display:flex;align-items:center;flex-grow:1}.menu-item .menu-link .menu-badge{display:flex;align-items:center;flex-shrink:0;margin-left:.5rem}.menu-item .menu-link .menu-arrow{display:flex;align-items:stretch;position:relative;overflow:hidden;flex-shrink:0;margin-left:5px;width:9px;height:9px}.menu-item .menu-link .menu-arrow:after{display:block;width:100%;content:" ";will-change:transform;background-size:100% 100%;mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-muted);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-muted);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-item .menu-content{padding:.65rem 1rem}.menu-item.show .menu-link .menu-arrow:after{backface-visibility:hidden;transition:transform .3s ease}.menu-nowrap .menu-link,.menu-nowrap .menu-title{flex-wrap:nowrap;flex-shrink:0}.menu-center{justify-content:center}.menu-heading{color:var(--bs-menu-heading-color)}.menu-item.menu-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-dropdown.menu.show,.menu-sub-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-accordion{display:none}.menu-sub-accordion.show,.show:not(.menu-dropdown)>.menu-sub-accordion{display:flex}.menu-sub-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-inline{display:flex}.menu-fit>.menu-item>.menu-content,.menu-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-column{flex-direction:column;width:100%}.menu-row{flex-direction:row}.menu-row>.menu-item{display:flex;align-items:center}.menu-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-rounded .menu-link{border-radius:.475rem}.menu-pill .menu-link{border-radius:50px}.menu-rounded-0 .menu-link{border-radius:0!important}@media (min-width:576px){.menu-item.menu-sm-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-sm-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-sm-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-sm-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-sm-dropdown.menu.show,.menu-sub-sm-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-sm-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-sm-accordion{display:none}.menu-sub-sm-accordion.show,.show:not(.menu-dropdown)>.menu-sub-sm-accordion{display:flex}.menu-sub-sm-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-sm-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-sm-inline{display:flex}.menu-sm-fit>.menu-item>.menu-content,.menu-sm-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-sm-column{flex-direction:column;width:100%}.menu-sm-row{flex-direction:row}.menu-sm-row>.menu-item{display:flex;align-items:center}.menu-sm-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-sm-rounded .menu-link{border-radius:.475rem}.menu-sm-pill .menu-link{border-radius:50px}.menu-sm-rounded-0 .menu-link{border-radius:0!important}}@media (min-width:768px){.menu-item.menu-md-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-md-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-md-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-md-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-md-dropdown.menu.show,.menu-sub-md-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-md-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-md-accordion{display:none}.menu-sub-md-accordion.show,.show:not(.menu-dropdown)>.menu-sub-md-accordion{display:flex}.menu-sub-md-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-md-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-md-inline{display:flex}.menu-md-fit>.menu-item>.menu-content,.menu-md-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-md-column{flex-direction:column;width:100%}.menu-md-row{flex-direction:row}.menu-md-row>.menu-item{display:flex;align-items:center}.menu-md-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-md-rounded .menu-link{border-radius:.475rem}.menu-md-pill .menu-link{border-radius:50px}.menu-md-rounded-0 .menu-link{border-radius:0!important}}@media (min-width:992px){.menu-item.menu-lg-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-lg-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-lg-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-lg-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-lg-dropdown.menu.show,.menu-sub-lg-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-lg-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-lg-accordion{display:none}.menu-sub-lg-accordion.show,.show:not(.menu-dropdown)>.menu-sub-lg-accordion{display:flex}.menu-sub-lg-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-lg-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-lg-inline{display:flex}.menu-lg-fit>.menu-item>.menu-content,.menu-lg-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-lg-column{flex-direction:column;width:100%}.menu-lg-row{flex-direction:row}.menu-lg-row>.menu-item{display:flex;align-items:center}.menu-lg-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-lg-rounded .menu-link{border-radius:.475rem}.menu-lg-pill .menu-link{border-radius:50px}.menu-lg-rounded-0 .menu-link{border-radius:0!important}}@media (min-width:1200px){.menu-item.menu-xl-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-xl-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-xl-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-xl-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-xl-dropdown.menu.show,.menu-sub-xl-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-xl-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-xl-accordion{display:none}.menu-sub-xl-accordion.show,.show:not(.menu-dropdown)>.menu-sub-xl-accordion{display:flex}.menu-sub-xl-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-xl-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-xl-inline{display:flex}.menu-xl-fit>.menu-item>.menu-content,.menu-xl-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-xl-column{flex-direction:column;width:100%}.menu-xl-row{flex-direction:row}.menu-xl-row>.menu-item{display:flex;align-items:center}.menu-xl-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-xl-rounded .menu-link{border-radius:.475rem}.menu-xl-pill .menu-link{border-radius:50px}.menu-xl-rounded-0 .menu-link{border-radius:0!important}}@media (min-width:1400px){.menu-item.menu-xxl-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-xxl-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-xxl-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-xxl-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-xxl-dropdown.menu.show,.menu-sub-xxl-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-xxl-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-xxl-accordion{display:none}.menu-sub-xxl-accordion.show,.show:not(.menu-dropdown)>.menu-sub-xxl-accordion{display:flex}.menu-sub-xxl-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-xxl-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-xxl-inline{display:flex}.menu-xxl-fit>.menu-item>.menu-content,.menu-xxl-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-xxl-column{flex-direction:column;width:100%}.menu-xxl-row{flex-direction:row}.menu-xxl-row>.menu-item{display:flex;align-items:center}.menu-xxl-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-xxl-rounded .menu-link{border-radius:.475rem}.menu-xxl-pill .menu-link{border-radius:50px}.menu-xxl-rounded-0 .menu-link{border-radius:0!important}}@media (max-width:575.98px){.menu-item.menu-sm-down-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-sm-down-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-sm-down-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-sm-down-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-sm-down-dropdown.menu.show,.menu-sub-sm-down-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-sm-down-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-sm-down-accordion{display:none}.menu-sub-sm-down-accordion.show,.show:not(.menu-dropdown)>.menu-sub-sm-down-accordion{display:flex}.menu-sub-sm-down-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-sm-down-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-sm-down-inline{display:flex}.menu-sm-down-fit>.menu-item>.menu-content,.menu-sm-down-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-sm-down-column{flex-direction:column;width:100%}.menu-sm-down-row{flex-direction:row}.menu-sm-down-row>.menu-item{display:flex;align-items:center}.menu-sm-down-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-sm-down-rounded .menu-link{border-radius:.475rem}.menu-sm-down-pill .menu-link{border-radius:50px}.menu-sm-down-rounded-0 .menu-link{border-radius:0!important}}@media (max-width:767.98px){.menu-item.menu-md-down-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-md-down-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-md-down-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-md-down-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-md-down-dropdown.menu.show,.menu-sub-md-down-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-md-down-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-md-down-accordion{display:none}.menu-sub-md-down-accordion.show,.show:not(.menu-dropdown)>.menu-sub-md-down-accordion{display:flex}.menu-sub-md-down-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-md-down-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-md-down-inline{display:flex}.menu-md-down-fit>.menu-item>.menu-content,.menu-md-down-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-md-down-column{flex-direction:column;width:100%}.menu-md-down-row{flex-direction:row}.menu-md-down-row>.menu-item{display:flex;align-items:center}.menu-md-down-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-md-down-rounded .menu-link{border-radius:.475rem}.menu-md-down-pill .menu-link{border-radius:50px}.menu-md-down-rounded-0 .menu-link{border-radius:0!important}}@media (max-width:991.98px){.menu-item.menu-lg-down-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-lg-down-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-lg-down-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-lg-down-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-lg-down-dropdown.menu.show,.menu-sub-lg-down-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-lg-down-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-lg-down-accordion{display:none}.menu-sub-lg-down-accordion.show,.show:not(.menu-dropdown)>.menu-sub-lg-down-accordion{display:flex}.menu-sub-lg-down-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-lg-down-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-lg-down-inline{display:flex}.menu-lg-down-fit>.menu-item>.menu-content,.menu-lg-down-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-lg-down-column{flex-direction:column;width:100%}.menu-lg-down-row{flex-direction:row}.menu-lg-down-row>.menu-item{display:flex;align-items:center}.menu-lg-down-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-lg-down-rounded .menu-link{border-radius:.475rem}.menu-lg-down-pill .menu-link{border-radius:50px}.menu-lg-down-rounded-0 .menu-link{border-radius:0!important}}@media (max-width:1199.98px){.menu-item.menu-xl-down-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-xl-down-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-xl-down-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-xl-down-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-xl-down-dropdown.menu.show,.menu-sub-xl-down-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-xl-down-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-xl-down-accordion{display:none}.menu-sub-xl-down-accordion.show,.show:not(.menu-dropdown)>.menu-sub-xl-down-accordion{display:flex}.menu-sub-xl-down-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-xl-down-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-xl-down-inline{display:flex}.menu-xl-down-fit>.menu-item>.menu-content,.menu-xl-down-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-xl-down-column{flex-direction:column;width:100%}.menu-xl-down-row{flex-direction:row}.menu-xl-down-row>.menu-item{display:flex;align-items:center}.menu-xl-down-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-xl-down-rounded .menu-link{border-radius:.475rem}.menu-xl-down-pill .menu-link{border-radius:50px}.menu-xl-down-rounded-0 .menu-link{border-radius:0!important}}@media (max-width:1399.98px){.menu-item.menu-xxl-down-accordion .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-item.menu-xxl-down-accordion.show:not(.hiding):not(.menu-dropdown)>.menu-link .menu-arrow:after,.menu-item.menu-xxl-down-accordion.showing:not(.menu-dropdown)>.menu-link .menu-arrow:after{transform:rotateZ(90deg);transform:rotateZ(-90deg);transition:transform .3s ease}.menu-sub-xxl-down-dropdown{display:none;border-radius:.475rem;background-color:var(--bs-menu-dropdown-bg-color);box-shadow:var(--bs-menu-dropdown-box-shadow);z-index:107}.menu-sub-xxl-down-dropdown.menu.show,.menu-sub-xxl-down-dropdown.show[data-popper-placement],.show.menu-dropdown>.menu-sub-xxl-down-dropdown{display:flex;will-change:transform;animation:menu-sub-dropdown-animation-fade-in .3s ease 1,menu-sub-dropdown-animation-move-up .3s ease 1}.menu-sub-xxl-down-accordion{display:none}.menu-sub-xxl-down-accordion.show,.show:not(.menu-dropdown)>.menu-sub-xxl-down-accordion{display:flex}.menu-sub-xxl-down-indention .menu-sub:not([data-popper-placement]){margin-left:1rem}.menu-sub-xxl-down-indention .menu-item .menu-item .menu-link.active{margin-right:1rem}.menu-xxl-down-inline{display:flex}.menu-xxl-down-fit>.menu-item>.menu-content,.menu-xxl-down-fit>.menu-item>.menu-link{padding-left:0!important;padding-right:0!important}.menu-xxl-down-column{flex-direction:column;width:100%}.menu-xxl-down-row{flex-direction:row}.menu-xxl-down-row>.menu-item{display:flex;align-items:center}.menu-xxl-down-row>.menu-item>.menu-link .menu-arrow:after{transform:rotateZ(-90deg);transform:rotateZ(90deg);transition:transform .3s ease}.menu-xxl-down-rounded .menu-link{border-radius:.475rem}.menu-xxl-down-pill .menu-link{border-radius:50px}.menu-xxl-down-rounded-0 .menu-link{border-radius:0!important}}.menu-link-indention .menu-item{padding-top:0;padding-bottom:0}.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-link{padding-left:calc(1rem + 1rem)}.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link{padding-left:calc(2rem + 1rem)}.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link{padding-left:calc(3rem + 1rem)}.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link{padding-left:calc(4rem + 1rem)}.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-link{padding-left:1rem;padding-right:0}.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link{padding-left:calc(2rem);padding-right:0}.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link{padding-left:calc(3rem);padding-right:0}.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-inner>.menu-item>.menu-link,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-content,.menu-link-indention.menu-fit .menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-sub:not([data-popper-placement])>.menu-item>.menu-link{padding-left:calc(4rem);padding-right:0}@keyframes menu-sub-dropdown-animation-fade-in{from{opacity:0}to{opacity:1}}@keyframes menu-sub-dropdown-animation-move-up{from{margin-top:.75rem}to{margin-top:0}}@keyframes menu-sub-dropdown-animation-move-down{from{margin-bottom:.75rem}to{margin-bottom:0}}.menu-white .menu-item .menu-link{color:var(--bs-white)}.menu-white .menu-item .menu-link .menu-title{color:var(--bs-white)}.menu-white .menu-item .menu-link .menu-icon,.menu-white .menu-item .menu-link .menu-icon .svg-icon,.menu-white .menu-item .menu-link .menu-icon i{color:var(--bs-white)}.menu-white .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-white)}.menu-white .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-white);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-white%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-white%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-white);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-white%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-white%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-white .menu-item .menu-link{color:var(--bs-text-white)}.menu-title-white .menu-item .menu-link .menu-title{color:var(--bs-text-white)}.menu-icon-white .menu-item .menu-link .menu-icon,.menu-icon-white .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-white .menu-item .menu-link .menu-icon i{color:var(--bs-text-white)}.menu-bullet-white .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-white)}.menu-arrow-white .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-white);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-white%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-white%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-white);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-white%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-white%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-primary .menu-item .menu-link{color:var(--bs-primary)}.menu-primary .menu-item .menu-link .menu-title{color:var(--bs-primary)}.menu-primary .menu-item .menu-link .menu-icon,.menu-primary .menu-item .menu-link .menu-icon .svg-icon,.menu-primary .menu-item .menu-link .menu-icon i{color:var(--bs-primary)}.menu-primary .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-primary .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-primary .menu-item .menu-link{color:var(--bs-text-primary)}.menu-title-primary .menu-item .menu-link .menu-title{color:var(--bs-text-primary)}.menu-icon-primary .menu-item .menu-link .menu-icon,.menu-icon-primary .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-primary .menu-item .menu-link .menu-icon i{color:var(--bs-text-primary)}.menu-bullet-primary .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-primary)}.menu-arrow-primary .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-secondary .menu-item .menu-link{color:var(--bs-secondary)}.menu-secondary .menu-item .menu-link .menu-title{color:var(--bs-secondary)}.menu-secondary .menu-item .menu-link .menu-icon,.menu-secondary .menu-item .menu-link .menu-icon .svg-icon,.menu-secondary .menu-item .menu-link .menu-icon i{color:var(--bs-secondary)}.menu-secondary .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-secondary)}.menu-secondary .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-secondary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-secondary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-secondary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-secondary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-secondary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-secondary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-secondary .menu-item .menu-link{color:var(--bs-text-secondary)}.menu-title-secondary .menu-item .menu-link .menu-title{color:var(--bs-text-secondary)}.menu-icon-secondary .menu-item .menu-link .menu-icon,.menu-icon-secondary .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-secondary .menu-item .menu-link .menu-icon i{color:var(--bs-text-secondary)}.menu-bullet-secondary .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-secondary)}.menu-arrow-secondary .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-secondary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-secondary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-secondary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-secondary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-secondary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-secondary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-light .menu-item .menu-link{color:var(--bs-light)}.menu-light .menu-item .menu-link .menu-title{color:var(--bs-light)}.menu-light .menu-item .menu-link .menu-icon,.menu-light .menu-item .menu-link .menu-icon .svg-icon,.menu-light .menu-item .menu-link .menu-icon i{color:var(--bs-light)}.menu-light .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-light)}.menu-light .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-light);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-light%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-light%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-light);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-light%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-light%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-light .menu-item .menu-link{color:var(--bs-text-light)}.menu-title-light .menu-item .menu-link .menu-title{color:var(--bs-text-light)}.menu-icon-light .menu-item .menu-link .menu-icon,.menu-icon-light .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-light .menu-item .menu-link .menu-icon i{color:var(--bs-text-light)}.menu-bullet-light .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-light)}.menu-arrow-light .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-light);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-light%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-light%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-light);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-light%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-light%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-success .menu-item .menu-link{color:var(--bs-success)}.menu-success .menu-item .menu-link .menu-title{color:var(--bs-success)}.menu-success .menu-item .menu-link .menu-icon,.menu-success .menu-item .menu-link .menu-icon .svg-icon,.menu-success .menu-item .menu-link .menu-icon i{color:var(--bs-success)}.menu-success .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-success)}.menu-success .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-success);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-success%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-success%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-success);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-success%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-success%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-success .menu-item .menu-link{color:var(--bs-text-success)}.menu-title-success .menu-item .menu-link .menu-title{color:var(--bs-text-success)}.menu-icon-success .menu-item .menu-link .menu-icon,.menu-icon-success .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-success .menu-item .menu-link .menu-icon i{color:var(--bs-text-success)}.menu-bullet-success .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-success)}.menu-arrow-success .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-success);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-success%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-success%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-success);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-success%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-success%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-info .menu-item .menu-link{color:var(--bs-info)}.menu-info .menu-item .menu-link .menu-title{color:var(--bs-info)}.menu-info .menu-item .menu-link .menu-icon,.menu-info .menu-item .menu-link .menu-icon .svg-icon,.menu-info .menu-item .menu-link .menu-icon i{color:var(--bs-info)}.menu-info .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-info)}.menu-info .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-info);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-info%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-info%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-info);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-info%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-info%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-info .menu-item .menu-link{color:var(--bs-text-info)}.menu-title-info .menu-item .menu-link .menu-title{color:var(--bs-text-info)}.menu-icon-info .menu-item .menu-link .menu-icon,.menu-icon-info .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-info .menu-item .menu-link .menu-icon i{color:var(--bs-text-info)}.menu-bullet-info .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-info)}.menu-arrow-info .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-info);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-info%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-info%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-info);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-info%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-info%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-warning .menu-item .menu-link{color:var(--bs-warning)}.menu-warning .menu-item .menu-link .menu-title{color:var(--bs-warning)}.menu-warning .menu-item .menu-link .menu-icon,.menu-warning .menu-item .menu-link .menu-icon .svg-icon,.menu-warning .menu-item .menu-link .menu-icon i{color:var(--bs-warning)}.menu-warning .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-warning)}.menu-warning .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-warning);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-warning%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-warning%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-warning);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-warning%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-warning%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-warning .menu-item .menu-link{color:var(--bs-text-warning)}.menu-title-warning .menu-item .menu-link .menu-title{color:var(--bs-text-warning)}.menu-icon-warning .menu-item .menu-link .menu-icon,.menu-icon-warning .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-warning .menu-item .menu-link .menu-icon i{color:var(--bs-text-warning)}.menu-bullet-warning .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-warning)}.menu-arrow-warning .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-warning);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-warning%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-warning%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-warning);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-warning%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-warning%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-danger .menu-item .menu-link{color:var(--bs-danger)}.menu-danger .menu-item .menu-link .menu-title{color:var(--bs-danger)}.menu-danger .menu-item .menu-link .menu-icon,.menu-danger .menu-item .menu-link .menu-icon .svg-icon,.menu-danger .menu-item .menu-link .menu-icon i{color:var(--bs-danger)}.menu-danger .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-danger)}.menu-danger .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-danger);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-danger%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-danger%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-danger);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-danger%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-danger%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-danger .menu-item .menu-link{color:var(--bs-text-danger)}.menu-title-danger .menu-item .menu-link .menu-title{color:var(--bs-text-danger)}.menu-icon-danger .menu-item .menu-link .menu-icon,.menu-icon-danger .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-danger .menu-item .menu-link .menu-icon i{color:var(--bs-text-danger)}.menu-bullet-danger .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-danger)}.menu-arrow-danger .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-danger);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-danger%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-danger%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-danger);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-danger%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-danger%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-dark .menu-item .menu-link{color:var(--bs-dark)}.menu-dark .menu-item .menu-link .menu-title{color:var(--bs-dark)}.menu-dark .menu-item .menu-link .menu-icon,.menu-dark .menu-item .menu-link .menu-icon .svg-icon,.menu-dark .menu-item .menu-link .menu-icon i{color:var(--bs-dark)}.menu-dark .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-dark)}.menu-dark .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-dark .menu-item .menu-link{color:var(--bs-text-dark)}.menu-title-dark .menu-item .menu-link .menu-title{color:var(--bs-text-dark)}.menu-icon-dark .menu-item .menu-link .menu-icon,.menu-icon-dark .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-dark .menu-item .menu-link .menu-icon i{color:var(--bs-text-dark)}.menu-bullet-dark .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-dark)}.menu-arrow-dark .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-muted .menu-item .menu-link{color:var(--bs-muted)}.menu-muted .menu-item .menu-link .menu-title{color:var(--bs-muted)}.menu-muted .menu-item .menu-link .menu-icon,.menu-muted .menu-item .menu-link .menu-icon .svg-icon,.menu-muted .menu-item .menu-link .menu-icon i{color:var(--bs-muted)}.menu-muted .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-muted)}.menu-muted .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-muted);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-muted%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-muted%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-muted);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-muted%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-muted%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-muted .menu-item .menu-link{color:var(--bs-text-muted)}.menu-title-muted .menu-item .menu-link .menu-title{color:var(--bs-text-muted)}.menu-icon-muted .menu-item .menu-link .menu-icon,.menu-icon-muted .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-muted .menu-item .menu-link .menu-icon i{color:var(--bs-text-muted)}.menu-bullet-muted .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-muted)}.menu-arrow-muted .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-muted);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-muted);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-100 .menu-item .menu-link{color:var(--bs-gray-100)}.menu-gray-100 .menu-item .menu-link .menu-title{color:var(--bs-gray-100)}.menu-gray-100 .menu-item .menu-link .menu-icon,.menu-gray-100 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-100 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-100)}.menu-gray-100 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-100)}.menu-gray-100 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-100);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-100%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-100%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-100);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-100%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-100%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-100 .menu-item .menu-link{color:var(--bs-text-gray-100)}.menu-title-gray-100 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-100)}.menu-icon-gray-100 .menu-item .menu-link .menu-icon,.menu-icon-gray-100 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-100 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-100)}.menu-bullet-gray-100 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-100)}.menu-arrow-gray-100 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-100);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-100%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-100%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-100);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-100%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-100%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-200 .menu-item .menu-link{color:var(--bs-gray-200)}.menu-gray-200 .menu-item .menu-link .menu-title{color:var(--bs-gray-200)}.menu-gray-200 .menu-item .menu-link .menu-icon,.menu-gray-200 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-200 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-200)}.menu-gray-200 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-200)}.menu-gray-200 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-200);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-200%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-200%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-200);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-200%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-200%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-200 .menu-item .menu-link{color:var(--bs-text-gray-200)}.menu-title-gray-200 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-200)}.menu-icon-gray-200 .menu-item .menu-link .menu-icon,.menu-icon-gray-200 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-200 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-200)}.menu-bullet-gray-200 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-200)}.menu-arrow-gray-200 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-200);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-200%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-200%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-200);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-200%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-200%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-300 .menu-item .menu-link{color:var(--bs-gray-300)}.menu-gray-300 .menu-item .menu-link .menu-title{color:var(--bs-gray-300)}.menu-gray-300 .menu-item .menu-link .menu-icon,.menu-gray-300 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-300 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-300)}.menu-gray-300 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-300)}.menu-gray-300 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-300);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-300%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-300%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-300);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-300%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-300%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-300 .menu-item .menu-link{color:var(--bs-text-gray-300)}.menu-title-gray-300 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-300)}.menu-icon-gray-300 .menu-item .menu-link .menu-icon,.menu-icon-gray-300 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-300 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-300)}.menu-bullet-gray-300 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-300)}.menu-arrow-gray-300 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-300);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-300%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-300%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-300);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-300%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-300%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-400 .menu-item .menu-link{color:var(--bs-gray-400)}.menu-gray-400 .menu-item .menu-link .menu-title{color:var(--bs-gray-400)}.menu-gray-400 .menu-item .menu-link .menu-icon,.menu-gray-400 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-400 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-400)}.menu-gray-400 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-400)}.menu-gray-400 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-400);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-400%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-400%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-400);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-400%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-400%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-400 .menu-item .menu-link{color:var(--bs-text-gray-400)}.menu-title-gray-400 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-400)}.menu-icon-gray-400 .menu-item .menu-link .menu-icon,.menu-icon-gray-400 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-400 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-400)}.menu-bullet-gray-400 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-400)}.menu-arrow-gray-400 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-400);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-400%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-400%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-400);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-400%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-400%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-500 .menu-item .menu-link{color:var(--bs-gray-500)}.menu-gray-500 .menu-item .menu-link .menu-title{color:var(--bs-gray-500)}.menu-gray-500 .menu-item .menu-link .menu-icon,.menu-gray-500 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-500 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-500)}.menu-gray-500 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-500)}.menu-gray-500 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-500);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-500%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-500%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-500);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-500%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-500%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-500 .menu-item .menu-link{color:var(--bs-text-gray-500)}.menu-title-gray-500 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-500)}.menu-icon-gray-500 .menu-item .menu-link .menu-icon,.menu-icon-gray-500 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-500 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-500)}.menu-bullet-gray-500 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-500)}.menu-arrow-gray-500 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-500);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-500%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-500%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-500);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-500%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-500%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-600 .menu-item .menu-link{color:var(--bs-gray-600)}.menu-gray-600 .menu-item .menu-link .menu-title{color:var(--bs-gray-600)}.menu-gray-600 .menu-item .menu-link .menu-icon,.menu-gray-600 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-600 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-600)}.menu-gray-600 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-600)}.menu-gray-600 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-600);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-600%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-600%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-600);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-600%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-600%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-600 .menu-item .menu-link{color:var(--bs-text-gray-600)}.menu-title-gray-600 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-600)}.menu-icon-gray-600 .menu-item .menu-link .menu-icon,.menu-icon-gray-600 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-600 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-600)}.menu-bullet-gray-600 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-600)}.menu-arrow-gray-600 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-600);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-600%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-600%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-600);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-600%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-600%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-700 .menu-item .menu-link{color:var(--bs-gray-700)}.menu-gray-700 .menu-item .menu-link .menu-title{color:var(--bs-gray-700)}.menu-gray-700 .menu-item .menu-link .menu-icon,.menu-gray-700 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-700 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-700)}.menu-gray-700 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-700)}.menu-gray-700 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-700);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-700);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-700%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-700 .menu-item .menu-link{color:var(--bs-text-gray-700)}.menu-title-gray-700 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-700)}.menu-icon-gray-700 .menu-item .menu-link .menu-icon,.menu-icon-gray-700 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-700 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-700)}.menu-bullet-gray-700 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-700)}.menu-arrow-gray-700 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-700);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-700%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-700%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-700);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-700%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-700%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-800 .menu-item .menu-link{color:var(--bs-gray-800)}.menu-gray-800 .menu-item .menu-link .menu-title{color:var(--bs-gray-800)}.menu-gray-800 .menu-item .menu-link .menu-icon,.menu-gray-800 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-800 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-800)}.menu-gray-800 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-800)}.menu-gray-800 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-800);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-800%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-800%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-800);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-800%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-800%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-800 .menu-item .menu-link{color:var(--bs-text-gray-800)}.menu-title-gray-800 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-800)}.menu-icon-gray-800 .menu-item .menu-link .menu-icon,.menu-icon-gray-800 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-800 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-800)}.menu-bullet-gray-800 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-800)}.menu-arrow-gray-800 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-800);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-800%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-800%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-800);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-800%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-800%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-gray-900 .menu-item .menu-link{color:var(--bs-gray-900)}.menu-gray-900 .menu-item .menu-link .menu-title{color:var(--bs-gray-900)}.menu-gray-900 .menu-item .menu-link .menu-icon,.menu-gray-900 .menu-item .menu-link .menu-icon .svg-icon,.menu-gray-900 .menu-item .menu-link .menu-icon i{color:var(--bs-gray-900)}.menu-gray-900 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-gray-900)}.menu-gray-900 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-title-gray-900 .menu-item .menu-link{color:var(--bs-text-gray-900)}.menu-title-gray-900 .menu-item .menu-link .menu-title{color:var(--bs-text-gray-900)}.menu-icon-gray-900 .menu-item .menu-link .menu-icon,.menu-icon-gray-900 .menu-item .menu-link .menu-icon .svg-icon,.menu-icon-gray-900 .menu-item .menu-link .menu-icon i{color:var(--bs-text-gray-900)}.menu-bullet-gray-900 .menu-item .menu-link .menu-bullet .bullet{background-color:var(--bs-text-gray-900)}.menu-arrow-gray-900 .menu-item .menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-hover-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-hover-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-hover);color:var(--bs-menu-link-color-hover)}.menu-hover-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-hover-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-menu-link-color-hover)}.menu-hover-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-hover-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-menu-link-color-hover)}.menu-hover-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-hover-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-menu-link-color-hover)}.menu-hover-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-hover-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-hover);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-hover);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-here-bg .menu-item.here>.menu-link{transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-here);color:var(--bs-menu-link-color-here)}.menu-here-bg .menu-item.here>.menu-link .menu-title{color:var(--bs-menu-link-color-here)}.menu-here-bg .menu-item.here>.menu-link .menu-icon,.menu-here-bg .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-here-bg .menu-item.here>.menu-link .menu-icon i{color:var(--bs-menu-link-color-here)}.menu-here-bg .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-menu-link-color-here)}.menu-here-bg .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-root-here-bg>.menu-item.here>.menu-link{transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-here);color:var(--bs-menu-link-color-here)}.menu-root-here-bg>.menu-item.here>.menu-link .menu-title{color:var(--bs-menu-link-color-here)}.menu-root-here-bg>.menu-item.here>.menu-link .menu-icon,.menu-root-here-bg>.menu-item.here>.menu-link .menu-icon .svg-icon,.menu-root-here-bg>.menu-item.here>.menu-link .menu-icon i{color:var(--bs-menu-link-color-here)}.menu-root-here-bg>.menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-menu-link-color-here)}.menu-root-here-bg>.menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}@media (min-width:992px){.menu-root-here-bg-desktop>.menu-item.here>.menu-link{transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-here);color:var(--bs-menu-link-color-here)}.menu-root-here-bg-desktop>.menu-item.here>.menu-link .menu-title{color:var(--bs-menu-link-color-here)}.menu-root-here-bg-desktop>.menu-item.here>.menu-link .menu-icon,.menu-root-here-bg-desktop>.menu-item.here>.menu-link .menu-icon .svg-icon,.menu-root-here-bg-desktop>.menu-item.here>.menu-link .menu-icon i{color:var(--bs-menu-link-color-here)}.menu-root-here-bg-desktop>.menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-menu-link-color-here)}.menu-root-here-bg-desktop>.menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}}.menu-show-bg .menu-item.show>.menu-link{transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-show);color:var(--bs-menu-link-color-show)}.menu-show-bg .menu-item.show>.menu-link .menu-title{color:var(--bs-menu-link-color-show)}.menu-show-bg .menu-item.show>.menu-link .menu-icon,.menu-show-bg .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-show-bg .menu-item.show>.menu-link .menu-icon i{color:var(--bs-menu-link-color-show)}.menu-show-bg .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-menu-link-color-show)}.menu-show-bg .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-show);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-show);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-active-bg .menu-item .menu-link.active{transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-active);color:var(--bs-menu-link-color-active)}.menu-active-bg .menu-item .menu-link.active .menu-title{color:var(--bs-menu-link-color-active)}.menu-active-bg .menu-item .menu-link.active .menu-icon,.menu-active-bg .menu-item .menu-link.active .menu-icon .svg-icon,.menu-active-bg .menu-item .menu-link.active .menu-icon i{color:var(--bs-menu-link-color-active)}.menu-active-bg .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-menu-link-color-active)}.menu-active-bg .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-active);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-active);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-hover);color:var(--bs-menu-link-color-hover)}.menu-state-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-state-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-menu-link-color-hover)}.menu-state-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-state-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-menu-link-color-hover)}.menu-state-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-state-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-menu-link-color-hover)}.menu-state-bg .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-state-bg .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-hover);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-hover);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg .menu-item.here>.menu-link{transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-here);color:var(--bs-menu-link-color-here)}.menu-state-bg .menu-item.here>.menu-link .menu-title{color:var(--bs-menu-link-color-here)}.menu-state-bg .menu-item.here>.menu-link .menu-icon,.menu-state-bg .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-state-bg .menu-item.here>.menu-link .menu-icon i{color:var(--bs-menu-link-color-here)}.menu-state-bg .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-menu-link-color-here)}.menu-state-bg .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg .menu-item.show>.menu-link{transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-show);color:var(--bs-menu-link-color-show)}.menu-state-bg .menu-item.show>.menu-link .menu-title{color:var(--bs-menu-link-color-show)}.menu-state-bg .menu-item.show>.menu-link .menu-icon,.menu-state-bg .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-bg .menu-item.show>.menu-link .menu-icon i{color:var(--bs-menu-link-color-show)}.menu-state-bg .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-menu-link-color-show)}.menu-state-bg .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-show);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-show);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg .menu-item .menu-link.active{transition:color .2s ease;background-color:var(--bs-menu-link-bg-color-active);color:var(--bs-menu-link-color-active)}.menu-state-bg .menu-item .menu-link.active .menu-title{color:var(--bs-menu-link-color-active)}.menu-state-bg .menu-item .menu-link.active .menu-icon,.menu-state-bg .menu-item .menu-link.active .menu-icon .svg-icon,.menu-state-bg .menu-item .menu-link.active .menu-icon i{color:var(--bs-menu-link-color-active)}.menu-state-bg .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-menu-link-color-active)}.menu-state-bg .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-active);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-active);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-color .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-color .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;color:var(--bs-menu-link-color-hover)}.menu-state-color .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-state-color .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-menu-link-color-hover)}.menu-state-color .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-color .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-color .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-state-color .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-color .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-color .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-menu-link-color-hover)}.menu-state-color .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-state-color .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-menu-link-color-hover)}.menu-state-color .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-state-color .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-hover);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-hover);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-hover%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-color .menu-item.here>.menu-link{transition:color .2s ease;color:var(--bs-menu-link-color-here)}.menu-state-color .menu-item.here>.menu-link .menu-title{color:var(--bs-menu-link-color-here)}.menu-state-color .menu-item.here>.menu-link .menu-icon,.menu-state-color .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-state-color .menu-item.here>.menu-link .menu-icon i{color:var(--bs-menu-link-color-here)}.menu-state-color .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-menu-link-color-here)}.menu-state-color .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-here);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-here%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-color .menu-item.show>.menu-link{transition:color .2s ease;color:var(--bs-menu-link-color-show)}.menu-state-color .menu-item.show>.menu-link .menu-title{color:var(--bs-menu-link-color-show)}.menu-state-color .menu-item.show>.menu-link .menu-icon,.menu-state-color .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-color .menu-item.show>.menu-link .menu-icon i{color:var(--bs-menu-link-color-show)}.menu-state-color .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-menu-link-color-show)}.menu-state-color .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-show);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-show);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-show%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-color .menu-item .menu-link.active{transition:color .2s ease;color:var(--bs-menu-link-color-active)}.menu-state-color .menu-item .menu-link.active .menu-title{color:var(--bs-menu-link-color-active)}.menu-state-color .menu-item .menu-link.active .menu-icon,.menu-state-color .menu-item .menu-link.active .menu-icon .svg-icon,.menu-state-color .menu-item .menu-link.active .menu-icon i{color:var(--bs-menu-link-color-active)}.menu-state-color .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-menu-link-color-active)}.menu-state-color .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-active);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-menu-link-color-active);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-menu-link-color-active%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-hover-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-hover-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-hover-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-hover-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-primary-inverse)}.menu-hover-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-hover-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-primary-inverse)}.menu-hover-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-hover-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-hover-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-hover-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-show-bg-primary .menu-item.show>.menu-link{transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-show-bg-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary-inverse)}.menu-show-bg-primary .menu-item.show>.menu-link .menu-icon,.menu-show-bg-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-show-bg-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary-inverse)}.menu-show-bg-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-show-bg-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-here-bg-primary .menu-item.here>.menu-link{transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-here-bg-primary .menu-item.here>.menu-link .menu-title{color:var(--bs-primary-inverse)}.menu-here-bg-primary .menu-item.here>.menu-link .menu-icon,.menu-here-bg-primary .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-here-bg-primary .menu-item.here>.menu-link .menu-icon i{color:var(--bs-primary-inverse)}.menu-here-bg-primary .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-here-bg-primary .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-active-bg-primary .menu-item .menu-link.active{transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-active-bg-primary .menu-item .menu-link.active .menu-title{color:var(--bs-primary-inverse)}.menu-active-bg-primary .menu-item .menu-link.active .menu-icon,.menu-active-bg-primary .menu-item .menu-link.active .menu-icon .svg-icon,.menu-active-bg-primary .menu-item .menu-link.active .menu-icon i{color:var(--bs-primary-inverse)}.menu-active-bg-primary .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-active-bg-primary .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-state-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-state-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-state-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-state-bg-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-primary .menu-item.show>.menu-link{transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.show>.menu-link .menu-icon,.menu-state-bg-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-bg-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-primary .menu-item.here>.menu-link{transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.here>.menu-link .menu-title{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.here>.menu-link .menu-icon,.menu-state-bg-primary .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-state-bg-primary .menu-item.here>.menu-link .menu-icon i{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-primary .menu-item .menu-link.active{transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item .menu-link.active .menu-title{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item .menu-link.active .menu-icon,.menu-state-bg-primary .menu-item .menu-link.active .menu-icon .svg-icon,.menu-state-bg-primary .menu-item .menu-link.active .menu-icon i{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-primary .menu-item.show>.menu-link{transition:color .2s ease;background-color:var(--bs-primary);color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.show>.menu-link .menu-icon,.menu-state-bg-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-bg-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary-inverse)}.menu-state-bg-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary-inverse);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary-inverse%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-show-bg-light-primary .menu-item.show>.menu-link{transition:color .2s ease;background-color:var(--bs-primary-light);color:var(--bs-primary)}.menu-show-bg-light-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary)}.menu-show-bg-light-primary .menu-item.show>.menu-link .menu-icon,.menu-show-bg-light-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-show-bg-light-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-show-bg-light-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-show-bg-light-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-here-bg-light-primary .menu-item.here>.menu-link{transition:color .2s ease;background-color:var(--bs-primary-light);color:var(--bs-primary)}.menu-here-bg-light-primary .menu-item.here>.menu-link .menu-title{color:var(--bs-primary)}.menu-here-bg-light-primary .menu-item.here>.menu-link .menu-icon,.menu-here-bg-light-primary .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-here-bg-light-primary .menu-item.here>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-here-bg-light-primary .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-here-bg-light-primary .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-hover-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-hover-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;background-color:var(--bs-primary-light);color:var(--bs-primary)}.menu-hover-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-hover-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-primary)}.menu-hover-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-hover-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-primary)}.menu-hover-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-hover-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-hover-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-hover-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-active-bg-light-primary .menu-item .menu-link.active{transition:color .2s ease;background-color:var(--bs-primary-light);color:var(--bs-primary)}.menu-active-bg-light-primary .menu-item .menu-link.active .menu-title{color:var(--bs-primary)}.menu-active-bg-light-primary .menu-item .menu-link.active .menu-icon,.menu-active-bg-light-primary .menu-item .menu-link.active .menu-icon .svg-icon,.menu-active-bg-light-primary .menu-item .menu-link.active .menu-icon i{color:var(--bs-primary)}.menu-active-bg-light-primary .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-active-bg-light-primary .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-light-primary .menu-item.show>.menu-link{transition:color .2s ease;background-color:var(--bs-primary-light);color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.show>.menu-link .menu-icon,.menu-state-bg-light-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-bg-light-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-light-primary .menu-item.here>.menu-link{transition:color .2s ease;background-color:var(--bs-primary-light);color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.here>.menu-link .menu-title{color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.here>.menu-link .menu-icon,.menu-state-bg-light-primary .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-state-bg-light-primary .menu-item.here>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;background-color:var(--bs-primary-light);color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-state-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-state-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-state-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-state-bg-light-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-bg-light-primary .menu-item .menu-link.active{transition:color .2s ease;background-color:var(--bs-primary-light);color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item .menu-link.active .menu-title{color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item .menu-link.active .menu-icon,.menu-state-bg-light-primary .menu-item .menu-link.active .menu-icon .svg-icon,.menu-state-bg-light-primary .menu-item .menu-link.active .menu-icon i{color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-bg-light-primary .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-hover-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-hover-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;color:var(--bs-primary)}.menu-hover-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-hover-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-primary)}.menu-hover-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-hover-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-primary)}.menu-hover-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-hover-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-hover-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-hover-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-show-primary .menu-item.show>.menu-link{transition:color .2s ease;color:var(--bs-primary)}.menu-show-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary)}.menu-show-primary .menu-item.show>.menu-link .menu-icon,.menu-show-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-show-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-show-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-show-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-here-primary .menu-item.here>.menu-link{transition:color .2s ease;color:var(--bs-primary)}.menu-here-primary .menu-item.here>.menu-link .menu-title{color:var(--bs-primary)}.menu-here-primary .menu-item.here>.menu-link .menu-icon,.menu-here-primary .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-here-primary .menu-item.here>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-here-primary .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-here-primary .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-active-primary .menu-item .menu-link.active{transition:color .2s ease;color:var(--bs-primary)}.menu-active-primary .menu-item .menu-link.active .menu-title{color:var(--bs-primary)}.menu-active-primary .menu-item .menu-link.active .menu-icon,.menu-active-primary .menu-item .menu-link.active .menu-icon .svg-icon,.menu-active-primary .menu-item .menu-link.active .menu-icon i{color:var(--bs-primary)}.menu-active-primary .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-active-primary .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;color:var(--bs-primary)}.menu-state-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-state-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-primary)}.menu-state-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-state-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-primary)}.menu-state-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-state-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-state-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-primary .menu-item.show>.menu-link{transition:color .2s ease;color:var(--bs-primary)}.menu-state-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary)}.menu-state-primary .menu-item.show>.menu-link .menu-icon,.menu-state-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-state-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-primary .menu-item.here>.menu-link{transition:color .2s ease;color:var(--bs-primary)}.menu-state-primary .menu-item.here>.menu-link .menu-title{color:var(--bs-primary)}.menu-state-primary .menu-item.here>.menu-link .menu-icon,.menu-state-primary .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-state-primary .menu-item.here>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-state-primary .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-primary .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-primary .menu-item .menu-link.active{transition:color .2s ease;color:var(--bs-primary)}.menu-state-primary .menu-item .menu-link.active .menu-title{color:var(--bs-primary)}.menu-state-primary .menu-item .menu-link.active .menu-icon,.menu-state-primary .menu-item .menu-link.active .menu-icon .svg-icon,.menu-state-primary .menu-item .menu-link.active .menu-icon i{color:var(--bs-primary)}.menu-state-primary .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-primary .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-dark .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-dark .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;color:var(--bs-dark)}.menu-state-dark .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-state-dark .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-dark)}.menu-state-dark .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-dark .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-dark .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-state-dark .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-dark .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-dark .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-dark)}.menu-state-dark .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-state-dark .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-dark)}.menu-state-dark .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-state-dark .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-dark .menu-item.show>.menu-link{transition:color .2s ease;color:var(--bs-dark)}.menu-state-dark .menu-item.show>.menu-link .menu-title{color:var(--bs-dark)}.menu-state-dark .menu-item.show>.menu-link .menu-icon,.menu-state-dark .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-dark .menu-item.show>.menu-link .menu-icon i{color:var(--bs-dark)}.menu-state-dark .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-dark)}.menu-state-dark .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-dark .menu-item.here>.menu-link{transition:color .2s ease;color:var(--bs-dark)}.menu-state-dark .menu-item.here>.menu-link .menu-title{color:var(--bs-dark)}.menu-state-dark .menu-item.here>.menu-link .menu-icon,.menu-state-dark .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-state-dark .menu-item.here>.menu-link .menu-icon i{color:var(--bs-dark)}.menu-state-dark .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-dark)}.menu-state-dark .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-dark .menu-item .menu-link.active{transition:color .2s ease;color:var(--bs-dark)}.menu-state-dark .menu-item .menu-link.active .menu-title{color:var(--bs-dark)}.menu-state-dark .menu-item .menu-link.active .menu-icon,.menu-state-dark .menu-item .menu-link.active .menu-icon .svg-icon,.menu-state-dark .menu-item .menu-link.active .menu-icon i{color:var(--bs-dark)}.menu-state-dark .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-dark)}.menu-state-dark .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-dark);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-dark%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-gray-900 .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-gray-900 .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-state-gray-900 .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-gray-900 .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-gray-900 .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-state-gray-900 .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-gray-900 .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-gray-900 .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-state-gray-900 .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-state-gray-900 .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-gray-900 .menu-item.show>.menu-link{transition:color .2s ease;color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.show>.menu-link .menu-title{color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.show>.menu-link .menu-icon,.menu-state-gray-900 .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-gray-900 .menu-item.show>.menu-link .menu-icon i{color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-gray-900 .menu-item.here>.menu-link{transition:color .2s ease;color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.here>.menu-link .menu-title{color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.here>.menu-link .menu-icon,.menu-state-gray-900 .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-state-gray-900 .menu-item.here>.menu-link .menu-icon i{color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-gray-900 .menu-item .menu-link.active{transition:color .2s ease;color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item .menu-link.active .menu-title{color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item .menu-link.active .menu-icon,.menu-state-gray-900 .menu-item .menu-link.active .menu-icon .svg-icon,.menu-state-gray-900 .menu-item .menu-link.active .menu-icon i{color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-gray-900)}.menu-state-gray-900 .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-900);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-gray-900%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-hover-title-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-hover-title-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;color:var(--bs-primary)}.menu-hover-title-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-hover-title-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-primary)}.menu-here-title-primary .menu-item.here>.menu-link{transition:color .2s ease;color:var(--bs-primary)}.menu-here-title-primary .menu-item.here>.menu-link .menu-title{color:var(--bs-primary)}.menu-show-title-primary .menu-item.show>.menu-link{transition:color .2s ease;color:var(--bs-primary)}.menu-show-title-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary)}.menu-active-title-primary .menu-item .menu-link.active{transition:color .2s ease;color:var(--bs-primary)}.menu-active-title-primary .menu-item .menu-link.active .menu-title{color:var(--bs-primary)}.menu-state-title-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-title-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease;color:var(--bs-primary)}.menu-state-title-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-title,.menu-state-title-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-title{color:var(--bs-primary)}.menu-state-title-primary .menu-item.here>.menu-link{transition:color .2s ease;color:var(--bs-primary)}.menu-state-title-primary .menu-item.here>.menu-link .menu-title{color:var(--bs-primary)}.menu-state-title-primary .menu-item.show>.menu-link{transition:color .2s ease;color:var(--bs-primary)}.menu-state-title-primary .menu-item.show>.menu-link .menu-title{color:var(--bs-primary)}.menu-state-title-primary .menu-item .menu-link.active{transition:color .2s ease;color:var(--bs-primary)}.menu-state-title-primary .menu-item .menu-link.active .menu-title{color:var(--bs-primary)}.menu-hover-icon-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-hover-icon-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease}.menu-hover-icon-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-icon-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-icon-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-hover-icon-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-hover-icon-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-hover-icon-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-primary)}.menu-here-icon-primary .menu-item.here>.menu-link{transition:color .2s ease}.menu-here-icon-primary .menu-item.here>.menu-link .menu-icon,.menu-here-icon-primary .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-here-icon-primary .menu-item.here>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-show-icon-primary .menu-item.show>.menu-link{transition:color .2s ease}.menu-show-icon-primary .menu-item.show>.menu-link .menu-icon,.menu-show-icon-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-show-icon-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-active-icon-primary .menu-item .menu-link.active{transition:color .2s ease}.menu-active-icon-primary .menu-item .menu-link.active .menu-icon,.menu-active-icon-primary .menu-item .menu-link.active .menu-icon .svg-icon,.menu-active-icon-primary .menu-item .menu-link.active .menu-icon i{color:var(--bs-primary)}.menu-state-icon-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-icon-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease}.menu-state-icon-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-icon-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-icon-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-icon i,.menu-state-icon-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon,.menu-state-icon-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon .svg-icon,.menu-state-icon-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-icon i{color:var(--bs-primary)}.menu-state-icon-primary .menu-item.here>.menu-link{transition:color .2s ease}.menu-state-icon-primary .menu-item.here>.menu-link .menu-icon,.menu-state-icon-primary .menu-item.here>.menu-link .menu-icon .svg-icon,.menu-state-icon-primary .menu-item.here>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-state-icon-primary .menu-item.show>.menu-link{transition:color .2s ease}.menu-state-icon-primary .menu-item.show>.menu-link .menu-icon,.menu-state-icon-primary .menu-item.show>.menu-link .menu-icon .svg-icon,.menu-state-icon-primary .menu-item.show>.menu-link .menu-icon i{color:var(--bs-primary)}.menu-state-icon-primary .menu-item .menu-link.active{transition:color .2s ease}.menu-state-icon-primary .menu-item .menu-link.active .menu-icon,.menu-state-icon-primary .menu-item .menu-link.active .menu-icon .svg-icon,.menu-state-icon-primary .menu-item .menu-link.active .menu-icon i{color:var(--bs-primary)}.menu-hover-bullet-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-hover-bullet-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease}.menu-hover-bullet-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-hover-bullet-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-show-bullet-primary .menu-item.show>.menu-link{transition:color .2s ease}.menu-show-bullet-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-here-bullet-primary .menu-item.here>.menu-link{transition:color .2s ease}.menu-here-bullet-primary .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-active-bullet-primary .menu-item .menu-link.active{transition:color .2s ease}.menu-active-bullet-primary .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-bullet-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-bullet-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease}.menu-state-bullet-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-bullet .bullet,.menu-state-bullet-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-bullet-primary .menu-item.here>.menu-link{transition:color .2s ease}.menu-state-bullet-primary .menu-item.here>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-bullet-primary .menu-item.show>.menu-link{transition:color .2s ease}.menu-state-bullet-primary .menu-item.show>.menu-link .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-state-bullet-primary .menu-item .menu-link.active{transition:color .2s ease}.menu-state-bullet-primary .menu-item .menu-link.active .menu-bullet .bullet{background-color:var(--bs-primary)}.menu-hover-arrow-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-hover-arrow-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease}.menu-hover-arrow-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-hover-arrow-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-here-arrow-primary .menu-item.here>.menu-link{transition:color .2s ease}.menu-here-arrow-primary .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-show-arrow-primary .menu-item.show>.menu-link{transition:color .2s ease}.menu-show-arrow-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-active-arrow-primary .menu-item .menu-link.active{transition:color .2s ease}.menu-active-arrow-primary .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-arrow-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here),.menu-state-arrow-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here){transition:color .2s ease}.menu-state-arrow-primary .menu-item.hover:not(.here)>.menu-link:not(.disabled):not(.active):not(.here) .menu-arrow:after,.menu-state-arrow-primary .menu-item:not(.here) .menu-link:hover:not(.disabled):not(.active):not(.here) .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-arrow-primary .menu-item.here>.menu-link{transition:color .2s ease}.menu-state-arrow-primary .menu-item.here>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-arrow-primary .menu-item.show>.menu-link{transition:color .2s ease}.menu-state-arrow-primary .menu-item.show>.menu-link .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.menu-state-arrow-primary .menu-item .menu-link.active{transition:color .2s ease}.menu-state-arrow-primary .menu-item .menu-link.active .menu-arrow:after{mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M2.72011 2.76429L4.46358 1.02083C4.63618 0.848244 4.63617 0.568419 4.46358 0.395831C4.29099 0.223244 4.01118 0.223244 3.83861 0.395831L1.52904 2.70537C1.36629 2.86808 1.36629 3.13191 1.52904 3.29462L3.83861 5.60419C4.01117 5.77675 4.29099 5.77675 4.46358 5.60419C4.63617 5.43156 4.63617 5.15175 4.46358 4.97919L2.72011 3.23571C2.58994 3.10554 2.58994 2.89446 2.72011 2.76429Z'/%3e%3c/svg%3e");mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-primary);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-primary%29'%3e%3cpath d='M3.27989 3.23571L1.53642 4.97917C1.36382 5.15176 1.36383 5.43158 1.53642 5.60417C1.70901 5.77676 1.98882 5.77676 2.16139 5.60417L4.47096 3.29463C4.63371 3.13192 4.63371 2.86809 4.47096 2.70538L2.16139 0.395812C1.98883 0.22325 1.70901 0.22325 1.53642 0.395812C1.36383 0.568437 1.36383 0.84825 1.53642 1.02081L3.27989 2.76429C3.41006 2.89446 3.41006 3.10554 3.27989 3.23571Z'/%3e%3c/svg%3e")}.anchor{display:flex;align-items:center}.anchor a{position:relative;display:none;align-items:center;justify-content:flex-start;height:1em;width:1.25em;margin-left:-1.25em;font-weight:500;font-size:.8em;color:var(--bs-text-muted);transition:all .2s ease-in-out}.anchor a:before{content:"#"}.anchor:hover a{display:flex}.anchor:hover a:hover{color:var(--bs-primary);transition:all .2s ease-in-out}.card{--bs-card-box-shadow:var(--bs-root-card-box-shadow);--bs-card-border-color:var(--bs-root-card-border-color);border:1px solid var(--bs-card-border-color)}.card .card-header{display:flex;justify-content:space-between;align-items:stretch;flex-wrap:wrap;min-height:70px;padding:0 2.25rem;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:1px solid var(--bs-card-border-color)}.card .card-header .card-title{display:flex;align-items:center;margin:.5rem;margin-left:0}.card .card-header .card-title.flex-column{align-items:flex-start;justify-content:center}.card .card-header .card-title .card-icon{margin-right:.75rem;line-height:0}.card .card-header .card-title .card-icon i{font-size:1.25rem;color:var(--bs-gray-600);line-height:0}.card .card-header .card-title .card-icon i:after,.card .card-header .card-title .card-icon i:before{line-height:0}.card .card-header .card-title .card-icon .svg-icon{color:var(--bs-gray-600)}.card .card-header .card-title .card-icon .svg-icon svg{height:24px;width:24px}.card .card-header .card-title,.card .card-header .card-title .card-label{font-weight:500;font-size:1.275rem;color:var(--bs-text-gray-900)}.card .card-header .card-title .card-label{margin:0 .75rem 0 0;flex-wrap:wrap}.card .card-header .card-title .small,.card .card-header .card-title small{color:var(--bs-text-muted);font-size:1rem}.card .card-header .card-title .h1,.card .card-header .card-title .h2,.card .card-header .card-title .h3,.card .card-header .card-title .h4,.card .card-header .card-title .h5,.card .card-header .card-title .h6,.card .card-header .card-title h1,.card .card-header .card-title h2,.card .card-header .card-title h3,.card .card-header .card-title h4,.card .card-header .card-title h5,.card .card-header .card-title h6{margin-bottom:0}.card .card-header .card-toolbar{display:flex;align-items:center;margin:.5rem 0;flex-wrap:wrap}.card .card-body{padding:2rem 2.25rem;color:var(--bs-card-color)}.card .card-footer{padding:2rem 2.25rem;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:1px solid var(--bs-card-border-color)}.card .card-scroll{position:relative;overflow:auto}.card.card-px-0 .card-body,.card.card-px-0 .card-footer,.card.card-px-0 .card-header{padding-left:0;padding-right:0}.card.card-py-0 .card-body,.card.card-py-0 .card-footer,.card.card-py-0 .card-header{padding-top:0;padding-bottom:0}.card.card-p-0 .card-body,.card.card-p-0 .card-footer,.card.card-p-0 .card-header{padding:0}.card.card-dashed{box-shadow:none;border:1px dashed var(--bs-border-dashed-color)}.card.card-dashed>.card-header{border-bottom:1px dashed var(--bs-border-dashed-color)}.card.card-dashed>.card-footer{border-top:1px dashed var(--bs-border-dashed-color)}.card.card-bordered{box-shadow:none;border:1px solid #f1f1f4}.card.card-flush>.card-header{border-bottom:0!important}.card.card-flush>.card-footer{border-top:0!important}.card.card-shadow{box-shadow:var(--bs-card-box-shadow);border:0}.card.card-reset{border:0!important;box-shadow:none!important;background-color:transparent!important}.card.card-reset>.card-header{border-bottom:0!important}.card.card-reset>.card-footer{border-top:0!important}.card.card-borderless{border:0!important}.card.card-borderless>.card-header{border-bottom:0!important}.card.card-borderless>.card-footer{border-top:0!important}.card.card-border-0{border:0!important}.card.card-stretch{height:calc(100% - var(--bs-gutter-y))}.card.card-stretch-75{height:calc(75% - var(--bs-gutter-y))}.card.card-stretch-50{height:calc(50% - var(--bs-gutter-y))}.card.card-stretch-33{height:calc(33.333% - var(--bs-gutter-y))}.card.card-stretch-25{height:calc(25% - var(--bs-gutter-y))}.card .card-header-stretch{padding-top:0!important;padding-bottom:0!important;align-items:stretch}.card .card-header-stretch .card-toolbar{margin:0;align-items:stretch}@media (min-width:576px){.card.card-sm-stretch{height:calc(100% - var(--bs-gutter-y))}.card.card-sm-stretch-75{height:calc(75% - var(--bs-gutter-y))}.card.card-sm-stretch-50{height:calc(50% - var(--bs-gutter-y))}.card.card-sm-stretch-33{height:calc(33.333% - var(--bs-gutter-y))}.card.card-sm-stretch-25{height:calc(25% - var(--bs-gutter-y))}.card .card-header-sm-stretch{padding-top:0!important;padding-bottom:0!important;align-items:stretch}.card .card-header-sm-stretch .card-toolbar{margin:0;align-items:stretch}}@media (min-width:768px){.card.card-md-stretch{height:calc(100% - var(--bs-gutter-y))}.card.card-md-stretch-75{height:calc(75% - var(--bs-gutter-y))}.card.card-md-stretch-50{height:calc(50% - var(--bs-gutter-y))}.card.card-md-stretch-33{height:calc(33.333% - var(--bs-gutter-y))}.card.card-md-stretch-25{height:calc(25% - var(--bs-gutter-y))}.card .card-header-md-stretch{padding-top:0!important;padding-bottom:0!important;align-items:stretch}.card .card-header-md-stretch .card-toolbar{margin:0;align-items:stretch}}@media (min-width:992px){.card.card-lg-stretch{height:calc(100% - var(--bs-gutter-y))}.card.card-lg-stretch-75{height:calc(75% - var(--bs-gutter-y))}.card.card-lg-stretch-50{height:calc(50% - var(--bs-gutter-y))}.card.card-lg-stretch-33{height:calc(33.333% - var(--bs-gutter-y))}.card.card-lg-stretch-25{height:calc(25% - var(--bs-gutter-y))}.card .card-header-lg-stretch{padding-top:0!important;padding-bottom:0!important;align-items:stretch}.card .card-header-lg-stretch .card-toolbar{margin:0;align-items:stretch}}@media (min-width:1200px){.card.card-xl-stretch{height:calc(100% - var(--bs-gutter-y))}.card.card-xl-stretch-75{height:calc(75% - var(--bs-gutter-y))}.card.card-xl-stretch-50{height:calc(50% - var(--bs-gutter-y))}.card.card-xl-stretch-33{height:calc(33.333% - var(--bs-gutter-y))}.card.card-xl-stretch-25{height:calc(25% - var(--bs-gutter-y))}.card .card-header-xl-stretch{padding-top:0!important;padding-bottom:0!important;align-items:stretch}.card .card-header-xl-stretch .card-toolbar{margin:0;align-items:stretch}}@media (min-width:1400px){.card.card-xxl-stretch{height:calc(100% - var(--bs-gutter-y))}.card.card-xxl-stretch-75{height:calc(75% - var(--bs-gutter-y))}.card.card-xxl-stretch-50{height:calc(50% - var(--bs-gutter-y))}.card.card-xxl-stretch-33{height:calc(33.333% - var(--bs-gutter-y))}.card.card-xxl-stretch-25{height:calc(25% - var(--bs-gutter-y))}.card .card-header-xxl-stretch{padding-top:0!important;padding-bottom:0!important;align-items:stretch}.card .card-header-xxl-stretch .card-toolbar{margin:0;align-items:stretch}}.card-p{padding:2rem 2.25rem!important}.card-border{border:1px solid var(--bs-root-card-border-color)!important}.card-px{padding-left:2.25rem!important;padding-right:2.25rem!important}.card-shadow{box-shadow:var(--bs-card-box-shadow)}.card-py{padding-top:2rem!important;padding-bottom:2rem!important}.card-rounded{border-radius:.625rem}.card-rounded-start{border-top-left-radius:.625rem;border-bottom-left-radius:.625rem}.card-rounded-end{border-top-right-radius:.625rem;border-bottom-right-radius:.625rem}.card-rounded-top{border-top-left-radius:.625rem;border-top-right-radius:.625rem}.card-rounded-bottom{border-bottom-left-radius:.625rem;border-bottom-right-radius:.625rem}@media (max-width:767.98px){.card>.card-header:not(.flex-nowrap){padding-top:.5rem;padding-bottom:.5rem}}[data-bs-theme=dark] .card{--bs-card-box-shadow:none}.breadcrumb{display:flex;align-items:center;background-color:transparent;padding:0;margin:0}.breadcrumb .breadcrumb-item{display:flex;align-items:center;padding-left:.5rem}.breadcrumb .breadcrumb-item:last-child{padding-right:0}.breadcrumb .breadcrumb-item:after{padding-left:.5rem;content:"/"}.breadcrumb .breadcrumb-item:before{display:none}.breadcrumb .breadcrumb-item:first-child{padding-left:0}.breadcrumb .breadcrumb-item:last-child:after{display:none}.breadcrumb-line .breadcrumb-item:after{content:"-"}.breadcrumb-dot .breadcrumb-item:after{content:"•"}.breadcrumb-separatorless .breadcrumb-item:after{display:none}.btn{--bs-btn-color:var(--bs-body-color);outline:0!important}.btn:not(.btn-shadow):not(.shadow):not(.shadow-sm):not(.shadow-lg):not(.shadow-xs){box-shadow:none}.btn:not(.btn-outline):not(.btn-dashed):not(.btn-bordered):not(.border-hover):not(.border-active):not(.btn-flush):not(.btn-icon):not(.btn-hover-outline){border:0;padding:calc(.775rem + 1px) calc(1.5rem + 1px)}.btn-group-lg>.btn:not(.btn-outline):not(.btn-dashed):not(.btn-bordered):not(.border-hover):not(.border-active):not(.btn-flush):not(.btn-icon):not(.btn-hover-outline),.btn:not(.btn-outline):not(.btn-dashed):not(.btn-bordered):not(.border-hover):not(.border-active):not(.btn-flush):not(.btn-icon):not(.btn-hover-outline).btn-lg{padding:calc(1rem + 1px) calc(1.75rem + 1px)}.btn-group-sm>.btn:not(.btn-outline):not(.btn-dashed):not(.btn-bordered):not(.border-hover):not(.border-active):not(.btn-flush):not(.btn-icon):not(.btn-hover-outline),.btn:not(.btn-outline):not(.btn-dashed):not(.btn-bordered):not(.border-hover):not(.border-active):not(.btn-flush):not(.btn-icon):not(.btn-hover-outline).btn-sm{padding:calc(.55rem + 1px) calc(1rem + 1px)}.btn.btn-link{border:0;border-radius:0;padding-left:0!important;padding-right:0!important;text-decoration:none;font-weight:500}.btn.btn-outline:not(.btn-outline-dashed){border:1px solid var(--bs-gray-300)}.btn.btn-outline-dashed{border:1px dashed var(--bs-gray-300)}.btn.btn-flush{appearance:none;box-shadow:none;border-radius:0;border:none;cursor:pointer;background-color:transparent;outline:0!important;margin:0;padding:0}.btn.btn-flex{display:inline-flex;align-items:center}.btn.btn-trim-start{justify-content:flex-start!important;padding-left:0!important}.btn.btn-trim-end{justify-content:flex-end!important;padding-right:0!important}.btn-reset{background-color:transparent;border:0;box-shadow:none;user-select:none;outline:0}.btn>i{display:inline-flex;font-size:1rem;padding-right:.35rem;vertical-align:middle}.btn.btn-icon{display:inline-flex;align-items:center;justify-content:center;padding:0;height:calc(1.5em + 1.55rem + 2px);width:calc(1.5em + 1.55rem + 2px);line-height:1}.btn.btn-icon i{padding-right:0}.btn.btn-icon:not(.btn-outline):not(.btn-dashed):not(.border-hover):not(.border-active):not(.btn-flush){border:0}.btn-group-sm>.btn.btn-icon,.btn.btn-icon.btn-sm{height:calc(1.5em + 1.1rem + 2px);width:calc(1.5em + 1.1rem + 2px)}.btn-group-lg>.btn.btn-icon,.btn.btn-icon.btn-lg{height:calc(1.5em + 2rem + 2px);width:calc(1.5em + 2rem + 2px)}.btn.btn-icon.btn-circle{border-radius:50%}.btn.btn-outline.btn-outline-dashed{border-width:1px;border-style:dashed}.btn-check:active+.btn.btn-outline.btn-outline-dashed,.btn-check:checked+.btn.btn-outline.btn-outline-dashed,.btn.btn-outline.btn-outline-dashed.active,.btn.btn-outline.btn-outline-dashed.show,.btn.btn-outline.btn-outline-dashed:active:not(.btn-active),.btn.btn-outline.btn-outline-dashed:focus:not(.btn-active),.btn.btn-outline.btn-outline-dashed:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-dashed{border-color:var(--bs-primary)}.btn.btn-hover-outline{border-width:1px;border-style:solid}.btn-check:active+.btn.btn-hover-outline,.btn-check:checked+.btn.btn-hover-outline,.btn.btn-hover-outline.active,.btn.btn-hover-outline.show,.btn.btn-hover-outline:active:not(.btn-active),.btn.btn-hover-outline:focus:not(.btn-active),.btn.btn-hover-outline:hover:not(.btn-active),.show>.btn.btn-hover-outline{border-color:var(--bs-gray-300)}.btn.btn-light{color:var(--bs-light-inverse);border-color:var(--bs-light);background-color:var(--bs-light)}.btn.btn-light .svg-icon,.btn.btn-light i{color:var(--bs-light-inverse)}.btn.btn-light.dropdown-toggle:after{color:var(--bs-light-inverse)}.btn-check:active+.btn.btn-light,.btn-check:checked+.btn.btn-light,.btn.btn-light.active,.btn.btn-light.show,.btn.btn-light:active:not(.btn-active),.btn.btn-light:focus:not(.btn-active),.btn.btn-light:hover:not(.btn-active),.show>.btn.btn-light{color:var(--bs-light-inverse);border-color:var(--bs-light-active);background-color:var(--bs-light-active)!important}.btn-check:active+.btn.btn-light .svg-icon,.btn-check:active+.btn.btn-light i,.btn-check:checked+.btn.btn-light .svg-icon,.btn-check:checked+.btn.btn-light i,.btn.btn-light.active .svg-icon,.btn.btn-light.active i,.btn.btn-light.show .svg-icon,.btn.btn-light.show i,.btn.btn-light:active:not(.btn-active) .svg-icon,.btn.btn-light:active:not(.btn-active) i,.btn.btn-light:focus:not(.btn-active) .svg-icon,.btn.btn-light:focus:not(.btn-active) i,.btn.btn-light:hover:not(.btn-active) .svg-icon,.btn.btn-light:hover:not(.btn-active) i,.show>.btn.btn-light .svg-icon,.show>.btn.btn-light i{color:var(--bs-light-inverse)}.btn-check:active+.btn.btn-light.dropdown-toggle:after,.btn-check:checked+.btn.btn-light.dropdown-toggle:after,.btn.btn-light.active.dropdown-toggle:after,.btn.btn-light.show.dropdown-toggle:after,.btn.btn-light:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light.dropdown-toggle:after{color:var(--bs-light-inverse)}.btn.btn-light-light{color:var(--bs-light);border-color:var(--bs-light-light);background-color:var(--bs-light-light)}.btn.btn-light-light .svg-icon,.btn.btn-light-light i{color:var(--bs-light)}.btn.btn-light-light.dropdown-toggle:after{color:var(--bs-light)}.btn-check:active+.btn.btn-light-light,.btn-check:checked+.btn.btn-light-light,.btn.btn-light-light.active,.btn.btn-light-light.show,.btn.btn-light-light:active:not(.btn-active),.btn.btn-light-light:focus:not(.btn-active),.btn.btn-light-light:hover:not(.btn-active),.show>.btn.btn-light-light{color:var(--bs-light-inverse);border-color:var(--bs-light);background-color:var(--bs-light)!important}.btn-check:active+.btn.btn-light-light .svg-icon,.btn-check:active+.btn.btn-light-light i,.btn-check:checked+.btn.btn-light-light .svg-icon,.btn-check:checked+.btn.btn-light-light i,.btn.btn-light-light.active .svg-icon,.btn.btn-light-light.active i,.btn.btn-light-light.show .svg-icon,.btn.btn-light-light.show i,.btn.btn-light-light:active:not(.btn-active) .svg-icon,.btn.btn-light-light:active:not(.btn-active) i,.btn.btn-light-light:focus:not(.btn-active) .svg-icon,.btn.btn-light-light:focus:not(.btn-active) i,.btn.btn-light-light:hover:not(.btn-active) .svg-icon,.btn.btn-light-light:hover:not(.btn-active) i,.show>.btn.btn-light-light .svg-icon,.show>.btn.btn-light-light i{color:var(--bs-light-inverse)}.btn-check:active+.btn.btn-light-light.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-light.dropdown-toggle:after,.btn.btn-light-light.active.dropdown-toggle:after,.btn.btn-light-light.show.dropdown-toggle:after,.btn.btn-light-light:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-light:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-light:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-light.dropdown-toggle:after{color:var(--bs-light-inverse)}.btn.btn-bg-light{border-color:var(--bs-light);background-color:var(--bs-light)}.btn-check:active+.btn.btn-active-light,.btn-check:checked+.btn.btn-active-light,.btn.btn-active-light.active,.btn.btn-active-light.show,.btn.btn-active-light:active:not(.btn-active),.btn.btn-active-light:focus:not(.btn-active),.btn.btn-active-light:hover:not(.btn-active),.show>.btn.btn-active-light{color:var(--bs-light-inverse);border-color:var(--bs-light);background-color:var(--bs-light)!important}.btn-check:active+.btn.btn-active-light .svg-icon,.btn-check:active+.btn.btn-active-light i,.btn-check:checked+.btn.btn-active-light .svg-icon,.btn-check:checked+.btn.btn-active-light i,.btn.btn-active-light.active .svg-icon,.btn.btn-active-light.active i,.btn.btn-active-light.show .svg-icon,.btn.btn-active-light.show i,.btn.btn-active-light:active:not(.btn-active) .svg-icon,.btn.btn-active-light:active:not(.btn-active) i,.btn.btn-active-light:focus:not(.btn-active) .svg-icon,.btn.btn-active-light:focus:not(.btn-active) i,.btn.btn-active-light:hover:not(.btn-active) .svg-icon,.btn.btn-active-light:hover:not(.btn-active) i,.show>.btn.btn-active-light .svg-icon,.show>.btn.btn-active-light i{color:var(--bs-light-inverse)}.btn-check:active+.btn.btn-active-light.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light.dropdown-toggle:after,.btn.btn-active-light.active.dropdown-toggle:after,.btn.btn-active-light.show.dropdown-toggle:after,.btn.btn-active-light:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light.dropdown-toggle:after{color:var(--bs-light-inverse)}.btn-check:active+.btn.btn-active-light-light,.btn-check:checked+.btn.btn-active-light-light,.btn.btn-active-light-light.active,.btn.btn-active-light-light.show,.btn.btn-active-light-light:active:not(.btn-active),.btn.btn-active-light-light:focus:not(.btn-active),.btn.btn-active-light-light:hover:not(.btn-active),.show>.btn.btn-active-light-light{color:var(--bs-light);border-color:var(--bs-light-light);background-color:var(--bs-light-light)!important}.btn-check:active+.btn.btn-active-light-light .svg-icon,.btn-check:active+.btn.btn-active-light-light i,.btn-check:checked+.btn.btn-active-light-light .svg-icon,.btn-check:checked+.btn.btn-active-light-light i,.btn.btn-active-light-light.active .svg-icon,.btn.btn-active-light-light.active i,.btn.btn-active-light-light.show .svg-icon,.btn.btn-active-light-light.show i,.btn.btn-active-light-light:active:not(.btn-active) .svg-icon,.btn.btn-active-light-light:active:not(.btn-active) i,.btn.btn-active-light-light:focus:not(.btn-active) .svg-icon,.btn.btn-active-light-light:focus:not(.btn-active) i,.btn.btn-active-light-light:hover:not(.btn-active) .svg-icon,.btn.btn-active-light-light:hover:not(.btn-active) i,.show>.btn.btn-active-light-light .svg-icon,.show>.btn.btn-active-light-light i{color:var(--bs-light)}.btn-check:active+.btn.btn-active-light-light.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light-light.dropdown-toggle:after,.btn.btn-active-light-light.active.dropdown-toggle:after,.btn.btn-active-light-light.show.dropdown-toggle:after,.btn.btn-active-light-light:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-light:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-light:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light-light.dropdown-toggle:after{color:var(--bs-light)}.btn.btn-outline.btn-outline-light{color:var(--bs-light);border-color:var(--bs-light);background-color:transparent}.btn.btn-outline.btn-outline-light .svg-icon,.btn.btn-outline.btn-outline-light i{color:var(--bs-light)}.btn.btn-outline.btn-outline-light.dropdown-toggle:after{color:var(--bs-light)}.btn-check:active+.btn.btn-outline.btn-outline-light,.btn-check:checked+.btn.btn-outline.btn-outline-light,.btn.btn-outline.btn-outline-light.active,.btn.btn-outline.btn-outline-light.show,.btn.btn-outline.btn-outline-light:active:not(.btn-active),.btn.btn-outline.btn-outline-light:focus:not(.btn-active),.btn.btn-outline.btn-outline-light:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-light{color:var(--bs-light-active);border-color:var(--bs-light);background-color:var(--bs-light-light)!important}.btn-check:active+.btn.btn-outline.btn-outline-light .svg-icon,.btn-check:active+.btn.btn-outline.btn-outline-light i,.btn-check:checked+.btn.btn-outline.btn-outline-light .svg-icon,.btn-check:checked+.btn.btn-outline.btn-outline-light i,.btn.btn-outline.btn-outline-light.active .svg-icon,.btn.btn-outline.btn-outline-light.active i,.btn.btn-outline.btn-outline-light.show .svg-icon,.btn.btn-outline.btn-outline-light.show i,.btn.btn-outline.btn-outline-light:active:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-light:active:not(.btn-active) i,.btn.btn-outline.btn-outline-light:focus:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-light:focus:not(.btn-active) i,.btn.btn-outline.btn-outline-light:hover:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-light:hover:not(.btn-active) i,.show>.btn.btn-outline.btn-outline-light .svg-icon,.show>.btn.btn-outline.btn-outline-light i{color:var(--bs-light-active)}.btn-check:active+.btn.btn-outline.btn-outline-light.dropdown-toggle:after,.btn-check:checked+.btn.btn-outline.btn-outline-light.dropdown-toggle:after,.btn.btn-outline.btn-outline-light.active.dropdown-toggle:after,.btn.btn-outline.btn-outline-light.show.dropdown-toggle:after,.btn.btn-outline.btn-outline-light:active:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-light:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-light:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-outline.btn-outline-light.dropdown-toggle:after{color:var(--bs-light-active)}.btn.btn-primary{color:var(--bs-primary-inverse);border-color:var(--bs-primary);background-color:var(--bs-primary)}.btn.btn-primary .svg-icon,.btn.btn-primary i{color:var(--bs-primary-inverse)}.btn.btn-primary.dropdown-toggle:after{color:var(--bs-primary-inverse)}.btn-check:active+.btn.btn-primary,.btn-check:checked+.btn.btn-primary,.btn.btn-primary.active,.btn.btn-primary.show,.btn.btn-primary:active:not(.btn-active),.btn.btn-primary:focus:not(.btn-active),.btn.btn-primary:hover:not(.btn-active),.show>.btn.btn-primary{color:var(--bs-primary-inverse);border-color:var(--bs-primary-active);background-color:var(--bs-primary-active)!important}.btn-check:active+.btn.btn-primary .svg-icon,.btn-check:active+.btn.btn-primary i,.btn-check:checked+.btn.btn-primary .svg-icon,.btn-check:checked+.btn.btn-primary i,.btn.btn-primary.active .svg-icon,.btn.btn-primary.active i,.btn.btn-primary.show .svg-icon,.btn.btn-primary.show i,.btn.btn-primary:active:not(.btn-active) .svg-icon,.btn.btn-primary:active:not(.btn-active) i,.btn.btn-primary:focus:not(.btn-active) .svg-icon,.btn.btn-primary:focus:not(.btn-active) i,.btn.btn-primary:hover:not(.btn-active) .svg-icon,.btn.btn-primary:hover:not(.btn-active) i,.show>.btn.btn-primary .svg-icon,.show>.btn.btn-primary i{color:var(--bs-primary-inverse)}.btn-check:active+.btn.btn-primary.dropdown-toggle:after,.btn-check:checked+.btn.btn-primary.dropdown-toggle:after,.btn.btn-primary.active.dropdown-toggle:after,.btn.btn-primary.show.dropdown-toggle:after,.btn.btn-primary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-primary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-primary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-primary.dropdown-toggle:after{color:var(--bs-primary-inverse)}.btn.btn-light-primary{color:var(--bs-primary);border-color:var(--bs-primary-light);background-color:var(--bs-primary-light)}.btn.btn-light-primary .svg-icon,.btn.btn-light-primary i{color:var(--bs-primary)}.btn.btn-light-primary.dropdown-toggle:after{color:var(--bs-primary)}.btn-check:active+.btn.btn-light-primary,.btn-check:checked+.btn.btn-light-primary,.btn.btn-light-primary.active,.btn.btn-light-primary.show,.btn.btn-light-primary:active:not(.btn-active),.btn.btn-light-primary:focus:not(.btn-active),.btn.btn-light-primary:hover:not(.btn-active),.show>.btn.btn-light-primary{color:var(--bs-primary-inverse);border-color:var(--bs-primary);background-color:var(--bs-primary)!important}.btn-check:active+.btn.btn-light-primary .svg-icon,.btn-check:active+.btn.btn-light-primary i,.btn-check:checked+.btn.btn-light-primary .svg-icon,.btn-check:checked+.btn.btn-light-primary i,.btn.btn-light-primary.active .svg-icon,.btn.btn-light-primary.active i,.btn.btn-light-primary.show .svg-icon,.btn.btn-light-primary.show i,.btn.btn-light-primary:active:not(.btn-active) .svg-icon,.btn.btn-light-primary:active:not(.btn-active) i,.btn.btn-light-primary:focus:not(.btn-active) .svg-icon,.btn.btn-light-primary:focus:not(.btn-active) i,.btn.btn-light-primary:hover:not(.btn-active) .svg-icon,.btn.btn-light-primary:hover:not(.btn-active) i,.show>.btn.btn-light-primary .svg-icon,.show>.btn.btn-light-primary i{color:var(--bs-primary-inverse)}.btn-check:active+.btn.btn-light-primary.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-primary.dropdown-toggle:after,.btn.btn-light-primary.active.dropdown-toggle:after,.btn.btn-light-primary.show.dropdown-toggle:after,.btn.btn-light-primary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-primary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-primary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-primary.dropdown-toggle:after{color:var(--bs-primary-inverse)}.btn.btn-bg-primary{border-color:var(--bs-primary);background-color:var(--bs-primary)}.btn-check:active+.btn.btn-active-primary,.btn-check:checked+.btn.btn-active-primary,.btn.btn-active-primary.active,.btn.btn-active-primary.show,.btn.btn-active-primary:active:not(.btn-active),.btn.btn-active-primary:focus:not(.btn-active),.btn.btn-active-primary:hover:not(.btn-active),.show>.btn.btn-active-primary{color:var(--bs-primary-inverse);border-color:var(--bs-primary);background-color:var(--bs-primary)!important}.btn-check:active+.btn.btn-active-primary .svg-icon,.btn-check:active+.btn.btn-active-primary i,.btn-check:checked+.btn.btn-active-primary .svg-icon,.btn-check:checked+.btn.btn-active-primary i,.btn.btn-active-primary.active .svg-icon,.btn.btn-active-primary.active i,.btn.btn-active-primary.show .svg-icon,.btn.btn-active-primary.show i,.btn.btn-active-primary:active:not(.btn-active) .svg-icon,.btn.btn-active-primary:active:not(.btn-active) i,.btn.btn-active-primary:focus:not(.btn-active) .svg-icon,.btn.btn-active-primary:focus:not(.btn-active) i,.btn.btn-active-primary:hover:not(.btn-active) .svg-icon,.btn.btn-active-primary:hover:not(.btn-active) i,.show>.btn.btn-active-primary .svg-icon,.show>.btn.btn-active-primary i{color:var(--bs-primary-inverse)}.btn-check:active+.btn.btn-active-primary.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-primary.dropdown-toggle:after,.btn.btn-active-primary.active.dropdown-toggle:after,.btn.btn-active-primary.show.dropdown-toggle:after,.btn.btn-active-primary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-primary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-primary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-primary.dropdown-toggle:after{color:var(--bs-primary-inverse)}.btn-check:active+.btn.btn-active-light-primary,.btn-check:checked+.btn.btn-active-light-primary,.btn.btn-active-light-primary.active,.btn.btn-active-light-primary.show,.btn.btn-active-light-primary:active:not(.btn-active),.btn.btn-active-light-primary:focus:not(.btn-active),.btn.btn-active-light-primary:hover:not(.btn-active),.show>.btn.btn-active-light-primary{color:var(--bs-primary);border-color:var(--bs-primary-light);background-color:var(--bs-primary-light)!important}.btn-check:active+.btn.btn-active-light-primary .svg-icon,.btn-check:active+.btn.btn-active-light-primary i,.btn-check:checked+.btn.btn-active-light-primary .svg-icon,.btn-check:checked+.btn.btn-active-light-primary i,.btn.btn-active-light-primary.active .svg-icon,.btn.btn-active-light-primary.active i,.btn.btn-active-light-primary.show .svg-icon,.btn.btn-active-light-primary.show i,.btn.btn-active-light-primary:active:not(.btn-active) .svg-icon,.btn.btn-active-light-primary:active:not(.btn-active) i,.btn.btn-active-light-primary:focus:not(.btn-active) .svg-icon,.btn.btn-active-light-primary:focus:not(.btn-active) i,.btn.btn-active-light-primary:hover:not(.btn-active) .svg-icon,.btn.btn-active-light-primary:hover:not(.btn-active) i,.show>.btn.btn-active-light-primary .svg-icon,.show>.btn.btn-active-light-primary i{color:var(--bs-primary)}.btn-check:active+.btn.btn-active-light-primary.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light-primary.dropdown-toggle:after,.btn.btn-active-light-primary.active.dropdown-toggle:after,.btn.btn-active-light-primary.show.dropdown-toggle:after,.btn.btn-active-light-primary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-primary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-primary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light-primary.dropdown-toggle:after{color:var(--bs-primary)}.btn.btn-outline.btn-outline-primary{color:var(--bs-primary);border-color:var(--bs-primary);background-color:transparent}.btn.btn-outline.btn-outline-primary .svg-icon,.btn.btn-outline.btn-outline-primary i{color:var(--bs-primary)}.btn.btn-outline.btn-outline-primary.dropdown-toggle:after{color:var(--bs-primary)}.btn-check:active+.btn.btn-outline.btn-outline-primary,.btn-check:checked+.btn.btn-outline.btn-outline-primary,.btn.btn-outline.btn-outline-primary.active,.btn.btn-outline.btn-outline-primary.show,.btn.btn-outline.btn-outline-primary:active:not(.btn-active),.btn.btn-outline.btn-outline-primary:focus:not(.btn-active),.btn.btn-outline.btn-outline-primary:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-primary{color:var(--bs-primary-active);border-color:var(--bs-primary);background-color:var(--bs-primary-light)!important}.btn-check:active+.btn.btn-outline.btn-outline-primary .svg-icon,.btn-check:active+.btn.btn-outline.btn-outline-primary i,.btn-check:checked+.btn.btn-outline.btn-outline-primary .svg-icon,.btn-check:checked+.btn.btn-outline.btn-outline-primary i,.btn.btn-outline.btn-outline-primary.active .svg-icon,.btn.btn-outline.btn-outline-primary.active i,.btn.btn-outline.btn-outline-primary.show .svg-icon,.btn.btn-outline.btn-outline-primary.show i,.btn.btn-outline.btn-outline-primary:active:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-primary:active:not(.btn-active) i,.btn.btn-outline.btn-outline-primary:focus:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-primary:focus:not(.btn-active) i,.btn.btn-outline.btn-outline-primary:hover:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-primary:hover:not(.btn-active) i,.show>.btn.btn-outline.btn-outline-primary .svg-icon,.show>.btn.btn-outline.btn-outline-primary i{color:var(--bs-primary-active)}.btn-check:active+.btn.btn-outline.btn-outline-primary.dropdown-toggle:after,.btn-check:checked+.btn.btn-outline.btn-outline-primary.dropdown-toggle:after,.btn.btn-outline.btn-outline-primary.active.dropdown-toggle:after,.btn.btn-outline.btn-outline-primary.show.dropdown-toggle:after,.btn.btn-outline.btn-outline-primary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-primary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-primary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-outline.btn-outline-primary.dropdown-toggle:after{color:var(--bs-primary-active)}.btn.btn-secondary{color:var(--bs-secondary-inverse);border-color:var(--bs-secondary);background-color:var(--bs-secondary)}.btn.btn-secondary .svg-icon,.btn.btn-secondary i{color:var(--bs-secondary-inverse)}.btn.btn-secondary.dropdown-toggle:after{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-secondary,.btn-check:checked+.btn.btn-secondary,.btn.btn-secondary.active,.btn.btn-secondary.show,.btn.btn-secondary:active:not(.btn-active),.btn.btn-secondary:focus:not(.btn-active),.btn.btn-secondary:hover:not(.btn-active),.show>.btn.btn-secondary{color:var(--bs-secondary-inverse);border-color:var(--bs-secondary-active);background-color:var(--bs-secondary-active)!important}.btn-check:active+.btn.btn-secondary .svg-icon,.btn-check:active+.btn.btn-secondary i,.btn-check:checked+.btn.btn-secondary .svg-icon,.btn-check:checked+.btn.btn-secondary i,.btn.btn-secondary.active .svg-icon,.btn.btn-secondary.active i,.btn.btn-secondary.show .svg-icon,.btn.btn-secondary.show i,.btn.btn-secondary:active:not(.btn-active) .svg-icon,.btn.btn-secondary:active:not(.btn-active) i,.btn.btn-secondary:focus:not(.btn-active) .svg-icon,.btn.btn-secondary:focus:not(.btn-active) i,.btn.btn-secondary:hover:not(.btn-active) .svg-icon,.btn.btn-secondary:hover:not(.btn-active) i,.show>.btn.btn-secondary .svg-icon,.show>.btn.btn-secondary i{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-secondary.dropdown-toggle:after,.btn-check:checked+.btn.btn-secondary.dropdown-toggle:after,.btn.btn-secondary.active.dropdown-toggle:after,.btn.btn-secondary.show.dropdown-toggle:after,.btn.btn-secondary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-secondary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-secondary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-secondary.dropdown-toggle:after{color:var(--bs-secondary-inverse)}.btn.btn-light-secondary{color:var(--bs-secondary-inverse);border-color:var(--bs-secondary-light);background-color:var(--bs-secondary-light)}.btn.btn-light-secondary .svg-icon,.btn.btn-light-secondary i{color:var(--bs-secondary-inverse)}.btn.btn-light-secondary.dropdown-toggle:after{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-light-secondary,.btn-check:checked+.btn.btn-light-secondary,.btn.btn-light-secondary.active,.btn.btn-light-secondary.show,.btn.btn-light-secondary:active:not(.btn-active),.btn.btn-light-secondary:focus:not(.btn-active),.btn.btn-light-secondary:hover:not(.btn-active),.show>.btn.btn-light-secondary{color:var(--bs-secondary-inverse);border-color:var(--bs-secondary);background-color:var(--bs-secondary)!important}.btn-check:active+.btn.btn-light-secondary .svg-icon,.btn-check:active+.btn.btn-light-secondary i,.btn-check:checked+.btn.btn-light-secondary .svg-icon,.btn-check:checked+.btn.btn-light-secondary i,.btn.btn-light-secondary.active .svg-icon,.btn.btn-light-secondary.active i,.btn.btn-light-secondary.show .svg-icon,.btn.btn-light-secondary.show i,.btn.btn-light-secondary:active:not(.btn-active) .svg-icon,.btn.btn-light-secondary:active:not(.btn-active) i,.btn.btn-light-secondary:focus:not(.btn-active) .svg-icon,.btn.btn-light-secondary:focus:not(.btn-active) i,.btn.btn-light-secondary:hover:not(.btn-active) .svg-icon,.btn.btn-light-secondary:hover:not(.btn-active) i,.show>.btn.btn-light-secondary .svg-icon,.show>.btn.btn-light-secondary i{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-light-secondary.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-secondary.dropdown-toggle:after,.btn.btn-light-secondary.active.dropdown-toggle:after,.btn.btn-light-secondary.show.dropdown-toggle:after,.btn.btn-light-secondary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-secondary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-secondary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-secondary.dropdown-toggle:after{color:var(--bs-secondary-inverse)}.btn.btn-bg-secondary{border-color:var(--bs-secondary);background-color:var(--bs-secondary)}.btn-check:active+.btn.btn-active-secondary,.btn-check:checked+.btn.btn-active-secondary,.btn.btn-active-secondary.active,.btn.btn-active-secondary.show,.btn.btn-active-secondary:active:not(.btn-active),.btn.btn-active-secondary:focus:not(.btn-active),.btn.btn-active-secondary:hover:not(.btn-active),.show>.btn.btn-active-secondary{color:var(--bs-secondary-inverse);border-color:var(--bs-secondary);background-color:var(--bs-secondary)!important}.btn-check:active+.btn.btn-active-secondary .svg-icon,.btn-check:active+.btn.btn-active-secondary i,.btn-check:checked+.btn.btn-active-secondary .svg-icon,.btn-check:checked+.btn.btn-active-secondary i,.btn.btn-active-secondary.active .svg-icon,.btn.btn-active-secondary.active i,.btn.btn-active-secondary.show .svg-icon,.btn.btn-active-secondary.show i,.btn.btn-active-secondary:active:not(.btn-active) .svg-icon,.btn.btn-active-secondary:active:not(.btn-active) i,.btn.btn-active-secondary:focus:not(.btn-active) .svg-icon,.btn.btn-active-secondary:focus:not(.btn-active) i,.btn.btn-active-secondary:hover:not(.btn-active) .svg-icon,.btn.btn-active-secondary:hover:not(.btn-active) i,.show>.btn.btn-active-secondary .svg-icon,.show>.btn.btn-active-secondary i{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-active-secondary.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-secondary.dropdown-toggle:after,.btn.btn-active-secondary.active.dropdown-toggle:after,.btn.btn-active-secondary.show.dropdown-toggle:after,.btn.btn-active-secondary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-secondary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-secondary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-secondary.dropdown-toggle:after{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-active-light-secondary,.btn-check:checked+.btn.btn-active-light-secondary,.btn.btn-active-light-secondary.active,.btn.btn-active-light-secondary.show,.btn.btn-active-light-secondary:active:not(.btn-active),.btn.btn-active-light-secondary:focus:not(.btn-active),.btn.btn-active-light-secondary:hover:not(.btn-active),.show>.btn.btn-active-light-secondary{color:var(--bs-secondary-inverse);border-color:var(--bs-secondary-light);background-color:var(--bs-secondary-light)!important}.btn-check:active+.btn.btn-active-light-secondary .svg-icon,.btn-check:active+.btn.btn-active-light-secondary i,.btn-check:checked+.btn.btn-active-light-secondary .svg-icon,.btn-check:checked+.btn.btn-active-light-secondary i,.btn.btn-active-light-secondary.active .svg-icon,.btn.btn-active-light-secondary.active i,.btn.btn-active-light-secondary.show .svg-icon,.btn.btn-active-light-secondary.show i,.btn.btn-active-light-secondary:active:not(.btn-active) .svg-icon,.btn.btn-active-light-secondary:active:not(.btn-active) i,.btn.btn-active-light-secondary:focus:not(.btn-active) .svg-icon,.btn.btn-active-light-secondary:focus:not(.btn-active) i,.btn.btn-active-light-secondary:hover:not(.btn-active) .svg-icon,.btn.btn-active-light-secondary:hover:not(.btn-active) i,.show>.btn.btn-active-light-secondary .svg-icon,.show>.btn.btn-active-light-secondary i{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-active-light-secondary.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light-secondary.dropdown-toggle:after,.btn.btn-active-light-secondary.active.dropdown-toggle:after,.btn.btn-active-light-secondary.show.dropdown-toggle:after,.btn.btn-active-light-secondary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-secondary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-secondary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light-secondary.dropdown-toggle:after{color:var(--bs-secondary-inverse)}.btn.btn-outline.btn-outline-secondary{color:var(--bs-secondary-inverse);border-color:var(--bs-secondary-inverse);background-color:transparent}.btn.btn-outline.btn-outline-secondary .svg-icon,.btn.btn-outline.btn-outline-secondary i{color:var(--bs-secondary-inverse)}.btn.btn-outline.btn-outline-secondary.dropdown-toggle:after{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-outline.btn-outline-secondary,.btn-check:checked+.btn.btn-outline.btn-outline-secondary,.btn.btn-outline.btn-outline-secondary.active,.btn.btn-outline.btn-outline-secondary.show,.btn.btn-outline.btn-outline-secondary:active:not(.btn-active),.btn.btn-outline.btn-outline-secondary:focus:not(.btn-active),.btn.btn-outline.btn-outline-secondary:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-secondary{color:var(--bs-secondary-inverse);border-color:var(--bs-secondary-inverse);background-color:var(--bs-secondary-light)!important}.btn-check:active+.btn.btn-outline.btn-outline-secondary .svg-icon,.btn-check:active+.btn.btn-outline.btn-outline-secondary i,.btn-check:checked+.btn.btn-outline.btn-outline-secondary .svg-icon,.btn-check:checked+.btn.btn-outline.btn-outline-secondary i,.btn.btn-outline.btn-outline-secondary.active .svg-icon,.btn.btn-outline.btn-outline-secondary.active i,.btn.btn-outline.btn-outline-secondary.show .svg-icon,.btn.btn-outline.btn-outline-secondary.show i,.btn.btn-outline.btn-outline-secondary:active:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-secondary:active:not(.btn-active) i,.btn.btn-outline.btn-outline-secondary:focus:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-secondary:focus:not(.btn-active) i,.btn.btn-outline.btn-outline-secondary:hover:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-secondary:hover:not(.btn-active) i,.show>.btn.btn-outline.btn-outline-secondary .svg-icon,.show>.btn.btn-outline.btn-outline-secondary i{color:var(--bs-secondary-inverse)}.btn-check:active+.btn.btn-outline.btn-outline-secondary.dropdown-toggle:after,.btn-check:checked+.btn.btn-outline.btn-outline-secondary.dropdown-toggle:after,.btn.btn-outline.btn-outline-secondary.active.dropdown-toggle:after,.btn.btn-outline.btn-outline-secondary.show.dropdown-toggle:after,.btn.btn-outline.btn-outline-secondary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-secondary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-secondary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-outline.btn-outline-secondary.dropdown-toggle:after{color:var(--bs-secondary-inverse)}.btn.btn-success{color:var(--bs-success-inverse);border-color:var(--bs-success);background-color:var(--bs-success)}.btn.btn-success .svg-icon,.btn.btn-success i{color:var(--bs-success-inverse)}.btn.btn-success.dropdown-toggle:after{color:var(--bs-success-inverse)}.btn-check:active+.btn.btn-success,.btn-check:checked+.btn.btn-success,.btn.btn-success.active,.btn.btn-success.show,.btn.btn-success:active:not(.btn-active),.btn.btn-success:focus:not(.btn-active),.btn.btn-success:hover:not(.btn-active),.show>.btn.btn-success{color:var(--bs-success-inverse);border-color:var(--bs-success-active);background-color:var(--bs-success-active)!important}.btn-check:active+.btn.btn-success .svg-icon,.btn-check:active+.btn.btn-success i,.btn-check:checked+.btn.btn-success .svg-icon,.btn-check:checked+.btn.btn-success i,.btn.btn-success.active .svg-icon,.btn.btn-success.active i,.btn.btn-success.show .svg-icon,.btn.btn-success.show i,.btn.btn-success:active:not(.btn-active) .svg-icon,.btn.btn-success:active:not(.btn-active) i,.btn.btn-success:focus:not(.btn-active) .svg-icon,.btn.btn-success:focus:not(.btn-active) i,.btn.btn-success:hover:not(.btn-active) .svg-icon,.btn.btn-success:hover:not(.btn-active) i,.show>.btn.btn-success .svg-icon,.show>.btn.btn-success i{color:var(--bs-success-inverse)}.btn-check:active+.btn.btn-success.dropdown-toggle:after,.btn-check:checked+.btn.btn-success.dropdown-toggle:after,.btn.btn-success.active.dropdown-toggle:after,.btn.btn-success.show.dropdown-toggle:after,.btn.btn-success:active:not(.btn-active).dropdown-toggle:after,.btn.btn-success:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-success:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-success.dropdown-toggle:after{color:var(--bs-success-inverse)}.btn.btn-light-success{color:var(--bs-success);border-color:var(--bs-success-light);background-color:var(--bs-success-light)}.btn.btn-light-success .svg-icon,.btn.btn-light-success i{color:var(--bs-success)}.btn.btn-light-success.dropdown-toggle:after{color:var(--bs-success)}.btn-check:active+.btn.btn-light-success,.btn-check:checked+.btn.btn-light-success,.btn.btn-light-success.active,.btn.btn-light-success.show,.btn.btn-light-success:active:not(.btn-active),.btn.btn-light-success:focus:not(.btn-active),.btn.btn-light-success:hover:not(.btn-active),.show>.btn.btn-light-success{color:var(--bs-success-inverse);border-color:var(--bs-success);background-color:var(--bs-success)!important}.btn-check:active+.btn.btn-light-success .svg-icon,.btn-check:active+.btn.btn-light-success i,.btn-check:checked+.btn.btn-light-success .svg-icon,.btn-check:checked+.btn.btn-light-success i,.btn.btn-light-success.active .svg-icon,.btn.btn-light-success.active i,.btn.btn-light-success.show .svg-icon,.btn.btn-light-success.show i,.btn.btn-light-success:active:not(.btn-active) .svg-icon,.btn.btn-light-success:active:not(.btn-active) i,.btn.btn-light-success:focus:not(.btn-active) .svg-icon,.btn.btn-light-success:focus:not(.btn-active) i,.btn.btn-light-success:hover:not(.btn-active) .svg-icon,.btn.btn-light-success:hover:not(.btn-active) i,.show>.btn.btn-light-success .svg-icon,.show>.btn.btn-light-success i{color:var(--bs-success-inverse)}.btn-check:active+.btn.btn-light-success.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-success.dropdown-toggle:after,.btn.btn-light-success.active.dropdown-toggle:after,.btn.btn-light-success.show.dropdown-toggle:after,.btn.btn-light-success:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-success:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-success:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-success.dropdown-toggle:after{color:var(--bs-success-inverse)}.btn.btn-bg-success{border-color:var(--bs-success);background-color:var(--bs-success)}.btn-check:active+.btn.btn-active-success,.btn-check:checked+.btn.btn-active-success,.btn.btn-active-success.active,.btn.btn-active-success.show,.btn.btn-active-success:active:not(.btn-active),.btn.btn-active-success:focus:not(.btn-active),.btn.btn-active-success:hover:not(.btn-active),.show>.btn.btn-active-success{color:var(--bs-success-inverse);border-color:var(--bs-success);background-color:var(--bs-success)!important}.btn-check:active+.btn.btn-active-success .svg-icon,.btn-check:active+.btn.btn-active-success i,.btn-check:checked+.btn.btn-active-success .svg-icon,.btn-check:checked+.btn.btn-active-success i,.btn.btn-active-success.active .svg-icon,.btn.btn-active-success.active i,.btn.btn-active-success.show .svg-icon,.btn.btn-active-success.show i,.btn.btn-active-success:active:not(.btn-active) .svg-icon,.btn.btn-active-success:active:not(.btn-active) i,.btn.btn-active-success:focus:not(.btn-active) .svg-icon,.btn.btn-active-success:focus:not(.btn-active) i,.btn.btn-active-success:hover:not(.btn-active) .svg-icon,.btn.btn-active-success:hover:not(.btn-active) i,.show>.btn.btn-active-success .svg-icon,.show>.btn.btn-active-success i{color:var(--bs-success-inverse)}.btn-check:active+.btn.btn-active-success.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-success.dropdown-toggle:after,.btn.btn-active-success.active.dropdown-toggle:after,.btn.btn-active-success.show.dropdown-toggle:after,.btn.btn-active-success:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-success:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-success:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-success.dropdown-toggle:after{color:var(--bs-success-inverse)}.btn-check:active+.btn.btn-active-light-success,.btn-check:checked+.btn.btn-active-light-success,.btn.btn-active-light-success.active,.btn.btn-active-light-success.show,.btn.btn-active-light-success:active:not(.btn-active),.btn.btn-active-light-success:focus:not(.btn-active),.btn.btn-active-light-success:hover:not(.btn-active),.show>.btn.btn-active-light-success{color:var(--bs-success);border-color:var(--bs-success-light);background-color:var(--bs-success-light)!important}.btn-check:active+.btn.btn-active-light-success .svg-icon,.btn-check:active+.btn.btn-active-light-success i,.btn-check:checked+.btn.btn-active-light-success .svg-icon,.btn-check:checked+.btn.btn-active-light-success i,.btn.btn-active-light-success.active .svg-icon,.btn.btn-active-light-success.active i,.btn.btn-active-light-success.show .svg-icon,.btn.btn-active-light-success.show i,.btn.btn-active-light-success:active:not(.btn-active) .svg-icon,.btn.btn-active-light-success:active:not(.btn-active) i,.btn.btn-active-light-success:focus:not(.btn-active) .svg-icon,.btn.btn-active-light-success:focus:not(.btn-active) i,.btn.btn-active-light-success:hover:not(.btn-active) .svg-icon,.btn.btn-active-light-success:hover:not(.btn-active) i,.show>.btn.btn-active-light-success .svg-icon,.show>.btn.btn-active-light-success i{color:var(--bs-success)}.btn-check:active+.btn.btn-active-light-success.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light-success.dropdown-toggle:after,.btn.btn-active-light-success.active.dropdown-toggle:after,.btn.btn-active-light-success.show.dropdown-toggle:after,.btn.btn-active-light-success:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-success:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-success:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light-success.dropdown-toggle:after{color:var(--bs-success)}.btn.btn-outline.btn-outline-success{color:var(--bs-success);border-color:var(--bs-success);background-color:transparent}.btn.btn-outline.btn-outline-success .svg-icon,.btn.btn-outline.btn-outline-success i{color:var(--bs-success)}.btn.btn-outline.btn-outline-success.dropdown-toggle:after{color:var(--bs-success)}.btn-check:active+.btn.btn-outline.btn-outline-success,.btn-check:checked+.btn.btn-outline.btn-outline-success,.btn.btn-outline.btn-outline-success.active,.btn.btn-outline.btn-outline-success.show,.btn.btn-outline.btn-outline-success:active:not(.btn-active),.btn.btn-outline.btn-outline-success:focus:not(.btn-active),.btn.btn-outline.btn-outline-success:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-success{color:var(--bs-success-active);border-color:var(--bs-success);background-color:var(--bs-success-light)!important}.btn-check:active+.btn.btn-outline.btn-outline-success .svg-icon,.btn-check:active+.btn.btn-outline.btn-outline-success i,.btn-check:checked+.btn.btn-outline.btn-outline-success .svg-icon,.btn-check:checked+.btn.btn-outline.btn-outline-success i,.btn.btn-outline.btn-outline-success.active .svg-icon,.btn.btn-outline.btn-outline-success.active i,.btn.btn-outline.btn-outline-success.show .svg-icon,.btn.btn-outline.btn-outline-success.show i,.btn.btn-outline.btn-outline-success:active:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-success:active:not(.btn-active) i,.btn.btn-outline.btn-outline-success:focus:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-success:focus:not(.btn-active) i,.btn.btn-outline.btn-outline-success:hover:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-success:hover:not(.btn-active) i,.show>.btn.btn-outline.btn-outline-success .svg-icon,.show>.btn.btn-outline.btn-outline-success i{color:var(--bs-success-active)}.btn-check:active+.btn.btn-outline.btn-outline-success.dropdown-toggle:after,.btn-check:checked+.btn.btn-outline.btn-outline-success.dropdown-toggle:after,.btn.btn-outline.btn-outline-success.active.dropdown-toggle:after,.btn.btn-outline.btn-outline-success.show.dropdown-toggle:after,.btn.btn-outline.btn-outline-success:active:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-success:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-success:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-outline.btn-outline-success.dropdown-toggle:after{color:var(--bs-success-active)}.btn.btn-info{color:var(--bs-info-inverse);border-color:var(--bs-info);background-color:var(--bs-info)}.btn.btn-info .svg-icon,.btn.btn-info i{color:var(--bs-info-inverse)}.btn.btn-info.dropdown-toggle:after{color:var(--bs-info-inverse)}.btn-check:active+.btn.btn-info,.btn-check:checked+.btn.btn-info,.btn.btn-info.active,.btn.btn-info.show,.btn.btn-info:active:not(.btn-active),.btn.btn-info:focus:not(.btn-active),.btn.btn-info:hover:not(.btn-active),.show>.btn.btn-info{color:var(--bs-info-inverse);border-color:var(--bs-info-active);background-color:var(--bs-info-active)!important}.btn-check:active+.btn.btn-info .svg-icon,.btn-check:active+.btn.btn-info i,.btn-check:checked+.btn.btn-info .svg-icon,.btn-check:checked+.btn.btn-info i,.btn.btn-info.active .svg-icon,.btn.btn-info.active i,.btn.btn-info.show .svg-icon,.btn.btn-info.show i,.btn.btn-info:active:not(.btn-active) .svg-icon,.btn.btn-info:active:not(.btn-active) i,.btn.btn-info:focus:not(.btn-active) .svg-icon,.btn.btn-info:focus:not(.btn-active) i,.btn.btn-info:hover:not(.btn-active) .svg-icon,.btn.btn-info:hover:not(.btn-active) i,.show>.btn.btn-info .svg-icon,.show>.btn.btn-info i{color:var(--bs-info-inverse)}.btn-check:active+.btn.btn-info.dropdown-toggle:after,.btn-check:checked+.btn.btn-info.dropdown-toggle:after,.btn.btn-info.active.dropdown-toggle:after,.btn.btn-info.show.dropdown-toggle:after,.btn.btn-info:active:not(.btn-active).dropdown-toggle:after,.btn.btn-info:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-info:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-info.dropdown-toggle:after{color:var(--bs-info-inverse)}.btn.btn-light-info{color:var(--bs-info);border-color:var(--bs-info-light);background-color:var(--bs-info-light)}.btn.btn-light-info .svg-icon,.btn.btn-light-info i{color:var(--bs-info)}.btn.btn-light-info.dropdown-toggle:after{color:var(--bs-info)}.btn-check:active+.btn.btn-light-info,.btn-check:checked+.btn.btn-light-info,.btn.btn-light-info.active,.btn.btn-light-info.show,.btn.btn-light-info:active:not(.btn-active),.btn.btn-light-info:focus:not(.btn-active),.btn.btn-light-info:hover:not(.btn-active),.show>.btn.btn-light-info{color:var(--bs-info-inverse);border-color:var(--bs-info);background-color:var(--bs-info)!important}.btn-check:active+.btn.btn-light-info .svg-icon,.btn-check:active+.btn.btn-light-info i,.btn-check:checked+.btn.btn-light-info .svg-icon,.btn-check:checked+.btn.btn-light-info i,.btn.btn-light-info.active .svg-icon,.btn.btn-light-info.active i,.btn.btn-light-info.show .svg-icon,.btn.btn-light-info.show i,.btn.btn-light-info:active:not(.btn-active) .svg-icon,.btn.btn-light-info:active:not(.btn-active) i,.btn.btn-light-info:focus:not(.btn-active) .svg-icon,.btn.btn-light-info:focus:not(.btn-active) i,.btn.btn-light-info:hover:not(.btn-active) .svg-icon,.btn.btn-light-info:hover:not(.btn-active) i,.show>.btn.btn-light-info .svg-icon,.show>.btn.btn-light-info i{color:var(--bs-info-inverse)}.btn-check:active+.btn.btn-light-info.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-info.dropdown-toggle:after,.btn.btn-light-info.active.dropdown-toggle:after,.btn.btn-light-info.show.dropdown-toggle:after,.btn.btn-light-info:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-info:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-info:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-info.dropdown-toggle:after{color:var(--bs-info-inverse)}.btn.btn-bg-info{border-color:var(--bs-info);background-color:var(--bs-info)}.btn-check:active+.btn.btn-active-info,.btn-check:checked+.btn.btn-active-info,.btn.btn-active-info.active,.btn.btn-active-info.show,.btn.btn-active-info:active:not(.btn-active),.btn.btn-active-info:focus:not(.btn-active),.btn.btn-active-info:hover:not(.btn-active),.show>.btn.btn-active-info{color:var(--bs-info-inverse);border-color:var(--bs-info);background-color:var(--bs-info)!important}.btn-check:active+.btn.btn-active-info .svg-icon,.btn-check:active+.btn.btn-active-info i,.btn-check:checked+.btn.btn-active-info .svg-icon,.btn-check:checked+.btn.btn-active-info i,.btn.btn-active-info.active .svg-icon,.btn.btn-active-info.active i,.btn.btn-active-info.show .svg-icon,.btn.btn-active-info.show i,.btn.btn-active-info:active:not(.btn-active) .svg-icon,.btn.btn-active-info:active:not(.btn-active) i,.btn.btn-active-info:focus:not(.btn-active) .svg-icon,.btn.btn-active-info:focus:not(.btn-active) i,.btn.btn-active-info:hover:not(.btn-active) .svg-icon,.btn.btn-active-info:hover:not(.btn-active) i,.show>.btn.btn-active-info .svg-icon,.show>.btn.btn-active-info i{color:var(--bs-info-inverse)}.btn-check:active+.btn.btn-active-info.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-info.dropdown-toggle:after,.btn.btn-active-info.active.dropdown-toggle:after,.btn.btn-active-info.show.dropdown-toggle:after,.btn.btn-active-info:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-info:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-info:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-info.dropdown-toggle:after{color:var(--bs-info-inverse)}.btn-check:active+.btn.btn-active-light-info,.btn-check:checked+.btn.btn-active-light-info,.btn.btn-active-light-info.active,.btn.btn-active-light-info.show,.btn.btn-active-light-info:active:not(.btn-active),.btn.btn-active-light-info:focus:not(.btn-active),.btn.btn-active-light-info:hover:not(.btn-active),.show>.btn.btn-active-light-info{color:var(--bs-info);border-color:var(--bs-info-light);background-color:var(--bs-info-light)!important}.btn-check:active+.btn.btn-active-light-info .svg-icon,.btn-check:active+.btn.btn-active-light-info i,.btn-check:checked+.btn.btn-active-light-info .svg-icon,.btn-check:checked+.btn.btn-active-light-info i,.btn.btn-active-light-info.active .svg-icon,.btn.btn-active-light-info.active i,.btn.btn-active-light-info.show .svg-icon,.btn.btn-active-light-info.show i,.btn.btn-active-light-info:active:not(.btn-active) .svg-icon,.btn.btn-active-light-info:active:not(.btn-active) i,.btn.btn-active-light-info:focus:not(.btn-active) .svg-icon,.btn.btn-active-light-info:focus:not(.btn-active) i,.btn.btn-active-light-info:hover:not(.btn-active) .svg-icon,.btn.btn-active-light-info:hover:not(.btn-active) i,.show>.btn.btn-active-light-info .svg-icon,.show>.btn.btn-active-light-info i{color:var(--bs-info)}.btn-check:active+.btn.btn-active-light-info.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light-info.dropdown-toggle:after,.btn.btn-active-light-info.active.dropdown-toggle:after,.btn.btn-active-light-info.show.dropdown-toggle:after,.btn.btn-active-light-info:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-info:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-info:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light-info.dropdown-toggle:after{color:var(--bs-info)}.btn.btn-outline.btn-outline-info{color:var(--bs-info);border-color:var(--bs-info);background-color:transparent}.btn.btn-outline.btn-outline-info .svg-icon,.btn.btn-outline.btn-outline-info i{color:var(--bs-info)}.btn.btn-outline.btn-outline-info.dropdown-toggle:after{color:var(--bs-info)}.btn-check:active+.btn.btn-outline.btn-outline-info,.btn-check:checked+.btn.btn-outline.btn-outline-info,.btn.btn-outline.btn-outline-info.active,.btn.btn-outline.btn-outline-info.show,.btn.btn-outline.btn-outline-info:active:not(.btn-active),.btn.btn-outline.btn-outline-info:focus:not(.btn-active),.btn.btn-outline.btn-outline-info:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-info{color:var(--bs-info-active);border-color:var(--bs-info);background-color:var(--bs-info-light)!important}.btn-check:active+.btn.btn-outline.btn-outline-info .svg-icon,.btn-check:active+.btn.btn-outline.btn-outline-info i,.btn-check:checked+.btn.btn-outline.btn-outline-info .svg-icon,.btn-check:checked+.btn.btn-outline.btn-outline-info i,.btn.btn-outline.btn-outline-info.active .svg-icon,.btn.btn-outline.btn-outline-info.active i,.btn.btn-outline.btn-outline-info.show .svg-icon,.btn.btn-outline.btn-outline-info.show i,.btn.btn-outline.btn-outline-info:active:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-info:active:not(.btn-active) i,.btn.btn-outline.btn-outline-info:focus:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-info:focus:not(.btn-active) i,.btn.btn-outline.btn-outline-info:hover:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-info:hover:not(.btn-active) i,.show>.btn.btn-outline.btn-outline-info .svg-icon,.show>.btn.btn-outline.btn-outline-info i{color:var(--bs-info-active)}.btn-check:active+.btn.btn-outline.btn-outline-info.dropdown-toggle:after,.btn-check:checked+.btn.btn-outline.btn-outline-info.dropdown-toggle:after,.btn.btn-outline.btn-outline-info.active.dropdown-toggle:after,.btn.btn-outline.btn-outline-info.show.dropdown-toggle:after,.btn.btn-outline.btn-outline-info:active:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-info:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-info:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-outline.btn-outline-info.dropdown-toggle:after{color:var(--bs-info-active)}.btn.btn-warning{color:var(--bs-warning-inverse);border-color:var(--bs-warning);background-color:var(--bs-warning)}.btn.btn-warning .svg-icon,.btn.btn-warning i{color:var(--bs-warning-inverse)}.btn.btn-warning.dropdown-toggle:after{color:var(--bs-warning-inverse)}.btn-check:active+.btn.btn-warning,.btn-check:checked+.btn.btn-warning,.btn.btn-warning.active,.btn.btn-warning.show,.btn.btn-warning:active:not(.btn-active),.btn.btn-warning:focus:not(.btn-active),.btn.btn-warning:hover:not(.btn-active),.show>.btn.btn-warning{color:var(--bs-warning-inverse);border-color:var(--bs-warning-active);background-color:var(--bs-warning-active)!important}.btn-check:active+.btn.btn-warning .svg-icon,.btn-check:active+.btn.btn-warning i,.btn-check:checked+.btn.btn-warning .svg-icon,.btn-check:checked+.btn.btn-warning i,.btn.btn-warning.active .svg-icon,.btn.btn-warning.active i,.btn.btn-warning.show .svg-icon,.btn.btn-warning.show i,.btn.btn-warning:active:not(.btn-active) .svg-icon,.btn.btn-warning:active:not(.btn-active) i,.btn.btn-warning:focus:not(.btn-active) .svg-icon,.btn.btn-warning:focus:not(.btn-active) i,.btn.btn-warning:hover:not(.btn-active) .svg-icon,.btn.btn-warning:hover:not(.btn-active) i,.show>.btn.btn-warning .svg-icon,.show>.btn.btn-warning i{color:var(--bs-warning-inverse)}.btn-check:active+.btn.btn-warning.dropdown-toggle:after,.btn-check:checked+.btn.btn-warning.dropdown-toggle:after,.btn.btn-warning.active.dropdown-toggle:after,.btn.btn-warning.show.dropdown-toggle:after,.btn.btn-warning:active:not(.btn-active).dropdown-toggle:after,.btn.btn-warning:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-warning:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-warning.dropdown-toggle:after{color:var(--bs-warning-inverse)}.btn.btn-light-warning{color:var(--bs-warning);border-color:var(--bs-warning-light);background-color:var(--bs-warning-light)}.btn.btn-light-warning .svg-icon,.btn.btn-light-warning i{color:var(--bs-warning)}.btn.btn-light-warning.dropdown-toggle:after{color:var(--bs-warning)}.btn-check:active+.btn.btn-light-warning,.btn-check:checked+.btn.btn-light-warning,.btn.btn-light-warning.active,.btn.btn-light-warning.show,.btn.btn-light-warning:active:not(.btn-active),.btn.btn-light-warning:focus:not(.btn-active),.btn.btn-light-warning:hover:not(.btn-active),.show>.btn.btn-light-warning{color:var(--bs-warning-inverse);border-color:var(--bs-warning);background-color:var(--bs-warning)!important}.btn-check:active+.btn.btn-light-warning .svg-icon,.btn-check:active+.btn.btn-light-warning i,.btn-check:checked+.btn.btn-light-warning .svg-icon,.btn-check:checked+.btn.btn-light-warning i,.btn.btn-light-warning.active .svg-icon,.btn.btn-light-warning.active i,.btn.btn-light-warning.show .svg-icon,.btn.btn-light-warning.show i,.btn.btn-light-warning:active:not(.btn-active) .svg-icon,.btn.btn-light-warning:active:not(.btn-active) i,.btn.btn-light-warning:focus:not(.btn-active) .svg-icon,.btn.btn-light-warning:focus:not(.btn-active) i,.btn.btn-light-warning:hover:not(.btn-active) .svg-icon,.btn.btn-light-warning:hover:not(.btn-active) i,.show>.btn.btn-light-warning .svg-icon,.show>.btn.btn-light-warning i{color:var(--bs-warning-inverse)}.btn-check:active+.btn.btn-light-warning.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-warning.dropdown-toggle:after,.btn.btn-light-warning.active.dropdown-toggle:after,.btn.btn-light-warning.show.dropdown-toggle:after,.btn.btn-light-warning:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-warning:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-warning:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-warning.dropdown-toggle:after{color:var(--bs-warning-inverse)}.btn.btn-bg-warning{border-color:var(--bs-warning);background-color:var(--bs-warning)}.btn-check:active+.btn.btn-active-warning,.btn-check:checked+.btn.btn-active-warning,.btn.btn-active-warning.active,.btn.btn-active-warning.show,.btn.btn-active-warning:active:not(.btn-active),.btn.btn-active-warning:focus:not(.btn-active),.btn.btn-active-warning:hover:not(.btn-active),.show>.btn.btn-active-warning{color:var(--bs-warning-inverse);border-color:var(--bs-warning);background-color:var(--bs-warning)!important}.btn-check:active+.btn.btn-active-warning .svg-icon,.btn-check:active+.btn.btn-active-warning i,.btn-check:checked+.btn.btn-active-warning .svg-icon,.btn-check:checked+.btn.btn-active-warning i,.btn.btn-active-warning.active .svg-icon,.btn.btn-active-warning.active i,.btn.btn-active-warning.show .svg-icon,.btn.btn-active-warning.show i,.btn.btn-active-warning:active:not(.btn-active) .svg-icon,.btn.btn-active-warning:active:not(.btn-active) i,.btn.btn-active-warning:focus:not(.btn-active) .svg-icon,.btn.btn-active-warning:focus:not(.btn-active) i,.btn.btn-active-warning:hover:not(.btn-active) .svg-icon,.btn.btn-active-warning:hover:not(.btn-active) i,.show>.btn.btn-active-warning .svg-icon,.show>.btn.btn-active-warning i{color:var(--bs-warning-inverse)}.btn-check:active+.btn.btn-active-warning.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-warning.dropdown-toggle:after,.btn.btn-active-warning.active.dropdown-toggle:after,.btn.btn-active-warning.show.dropdown-toggle:after,.btn.btn-active-warning:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-warning:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-warning:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-warning.dropdown-toggle:after{color:var(--bs-warning-inverse)}.btn-check:active+.btn.btn-active-light-warning,.btn-check:checked+.btn.btn-active-light-warning,.btn.btn-active-light-warning.active,.btn.btn-active-light-warning.show,.btn.btn-active-light-warning:active:not(.btn-active),.btn.btn-active-light-warning:focus:not(.btn-active),.btn.btn-active-light-warning:hover:not(.btn-active),.show>.btn.btn-active-light-warning{color:var(--bs-warning);border-color:var(--bs-warning-light);background-color:var(--bs-warning-light)!important}.btn-check:active+.btn.btn-active-light-warning .svg-icon,.btn-check:active+.btn.btn-active-light-warning i,.btn-check:checked+.btn.btn-active-light-warning .svg-icon,.btn-check:checked+.btn.btn-active-light-warning i,.btn.btn-active-light-warning.active .svg-icon,.btn.btn-active-light-warning.active i,.btn.btn-active-light-warning.show .svg-icon,.btn.btn-active-light-warning.show i,.btn.btn-active-light-warning:active:not(.btn-active) .svg-icon,.btn.btn-active-light-warning:active:not(.btn-active) i,.btn.btn-active-light-warning:focus:not(.btn-active) .svg-icon,.btn.btn-active-light-warning:focus:not(.btn-active) i,.btn.btn-active-light-warning:hover:not(.btn-active) .svg-icon,.btn.btn-active-light-warning:hover:not(.btn-active) i,.show>.btn.btn-active-light-warning .svg-icon,.show>.btn.btn-active-light-warning i{color:var(--bs-warning)}.btn-check:active+.btn.btn-active-light-warning.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light-warning.dropdown-toggle:after,.btn.btn-active-light-warning.active.dropdown-toggle:after,.btn.btn-active-light-warning.show.dropdown-toggle:after,.btn.btn-active-light-warning:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-warning:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-warning:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light-warning.dropdown-toggle:after{color:var(--bs-warning)}.btn.btn-outline.btn-outline-warning{color:var(--bs-warning);border-color:var(--bs-warning);background-color:transparent}.btn.btn-outline.btn-outline-warning .svg-icon,.btn.btn-outline.btn-outline-warning i{color:var(--bs-warning)}.btn.btn-outline.btn-outline-warning.dropdown-toggle:after{color:var(--bs-warning)}.btn-check:active+.btn.btn-outline.btn-outline-warning,.btn-check:checked+.btn.btn-outline.btn-outline-warning,.btn.btn-outline.btn-outline-warning.active,.btn.btn-outline.btn-outline-warning.show,.btn.btn-outline.btn-outline-warning:active:not(.btn-active),.btn.btn-outline.btn-outline-warning:focus:not(.btn-active),.btn.btn-outline.btn-outline-warning:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-warning{color:var(--bs-warning-active);border-color:var(--bs-warning);background-color:var(--bs-warning-light)!important}.btn-check:active+.btn.btn-outline.btn-outline-warning .svg-icon,.btn-check:active+.btn.btn-outline.btn-outline-warning i,.btn-check:checked+.btn.btn-outline.btn-outline-warning .svg-icon,.btn-check:checked+.btn.btn-outline.btn-outline-warning i,.btn.btn-outline.btn-outline-warning.active .svg-icon,.btn.btn-outline.btn-outline-warning.active i,.btn.btn-outline.btn-outline-warning.show .svg-icon,.btn.btn-outline.btn-outline-warning.show i,.btn.btn-outline.btn-outline-warning:active:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-warning:active:not(.btn-active) i,.btn.btn-outline.btn-outline-warning:focus:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-warning:focus:not(.btn-active) i,.btn.btn-outline.btn-outline-warning:hover:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-warning:hover:not(.btn-active) i,.show>.btn.btn-outline.btn-outline-warning .svg-icon,.show>.btn.btn-outline.btn-outline-warning i{color:var(--bs-warning-active)}.btn-check:active+.btn.btn-outline.btn-outline-warning.dropdown-toggle:after,.btn-check:checked+.btn.btn-outline.btn-outline-warning.dropdown-toggle:after,.btn.btn-outline.btn-outline-warning.active.dropdown-toggle:after,.btn.btn-outline.btn-outline-warning.show.dropdown-toggle:after,.btn.btn-outline.btn-outline-warning:active:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-warning:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-warning:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-outline.btn-outline-warning.dropdown-toggle:after{color:var(--bs-warning-active)}.btn.btn-danger{color:var(--bs-danger-inverse);border-color:var(--bs-danger);background-color:var(--bs-danger)}.btn.btn-danger .svg-icon,.btn.btn-danger i{color:var(--bs-danger-inverse)}.btn.btn-danger.dropdown-toggle:after{color:var(--bs-danger-inverse)}.btn-check:active+.btn.btn-danger,.btn-check:checked+.btn.btn-danger,.btn.btn-danger.active,.btn.btn-danger.show,.btn.btn-danger:active:not(.btn-active),.btn.btn-danger:focus:not(.btn-active),.btn.btn-danger:hover:not(.btn-active),.show>.btn.btn-danger{color:var(--bs-danger-inverse);border-color:var(--bs-danger-active);background-color:var(--bs-danger-active)!important}.btn-check:active+.btn.btn-danger .svg-icon,.btn-check:active+.btn.btn-danger i,.btn-check:checked+.btn.btn-danger .svg-icon,.btn-check:checked+.btn.btn-danger i,.btn.btn-danger.active .svg-icon,.btn.btn-danger.active i,.btn.btn-danger.show .svg-icon,.btn.btn-danger.show i,.btn.btn-danger:active:not(.btn-active) .svg-icon,.btn.btn-danger:active:not(.btn-active) i,.btn.btn-danger:focus:not(.btn-active) .svg-icon,.btn.btn-danger:focus:not(.btn-active) i,.btn.btn-danger:hover:not(.btn-active) .svg-icon,.btn.btn-danger:hover:not(.btn-active) i,.show>.btn.btn-danger .svg-icon,.show>.btn.btn-danger i{color:var(--bs-danger-inverse)}.btn-check:active+.btn.btn-danger.dropdown-toggle:after,.btn-check:checked+.btn.btn-danger.dropdown-toggle:after,.btn.btn-danger.active.dropdown-toggle:after,.btn.btn-danger.show.dropdown-toggle:after,.btn.btn-danger:active:not(.btn-active).dropdown-toggle:after,.btn.btn-danger:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-danger:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-danger.dropdown-toggle:after{color:var(--bs-danger-inverse)}.btn.btn-light-danger{color:var(--bs-danger);border-color:var(--bs-danger-light);background-color:var(--bs-danger-light)}.btn.btn-light-danger .svg-icon,.btn.btn-light-danger i{color:var(--bs-danger)}.btn.btn-light-danger.dropdown-toggle:after{color:var(--bs-danger)}.btn-check:active+.btn.btn-light-danger,.btn-check:checked+.btn.btn-light-danger,.btn.btn-light-danger.active,.btn.btn-light-danger.show,.btn.btn-light-danger:active:not(.btn-active),.btn.btn-light-danger:focus:not(.btn-active),.btn.btn-light-danger:hover:not(.btn-active),.show>.btn.btn-light-danger{color:var(--bs-danger-inverse);border-color:var(--bs-danger);background-color:var(--bs-danger)!important}.btn-check:active+.btn.btn-light-danger .svg-icon,.btn-check:active+.btn.btn-light-danger i,.btn-check:checked+.btn.btn-light-danger .svg-icon,.btn-check:checked+.btn.btn-light-danger i,.btn.btn-light-danger.active .svg-icon,.btn.btn-light-danger.active i,.btn.btn-light-danger.show .svg-icon,.btn.btn-light-danger.show i,.btn.btn-light-danger:active:not(.btn-active) .svg-icon,.btn.btn-light-danger:active:not(.btn-active) i,.btn.btn-light-danger:focus:not(.btn-active) .svg-icon,.btn.btn-light-danger:focus:not(.btn-active) i,.btn.btn-light-danger:hover:not(.btn-active) .svg-icon,.btn.btn-light-danger:hover:not(.btn-active) i,.show>.btn.btn-light-danger .svg-icon,.show>.btn.btn-light-danger i{color:var(--bs-danger-inverse)}.btn-check:active+.btn.btn-light-danger.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-danger.dropdown-toggle:after,.btn.btn-light-danger.active.dropdown-toggle:after,.btn.btn-light-danger.show.dropdown-toggle:after,.btn.btn-light-danger:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-danger:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-danger:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-danger.dropdown-toggle:after{color:var(--bs-danger-inverse)}.btn.btn-bg-danger{border-color:var(--bs-danger);background-color:var(--bs-danger)}.btn-check:active+.btn.btn-active-danger,.btn-check:checked+.btn.btn-active-danger,.btn.btn-active-danger.active,.btn.btn-active-danger.show,.btn.btn-active-danger:active:not(.btn-active),.btn.btn-active-danger:focus:not(.btn-active),.btn.btn-active-danger:hover:not(.btn-active),.show>.btn.btn-active-danger{color:var(--bs-danger-inverse);border-color:var(--bs-danger);background-color:var(--bs-danger)!important}.btn-check:active+.btn.btn-active-danger .svg-icon,.btn-check:active+.btn.btn-active-danger i,.btn-check:checked+.btn.btn-active-danger .svg-icon,.btn-check:checked+.btn.btn-active-danger i,.btn.btn-active-danger.active .svg-icon,.btn.btn-active-danger.active i,.btn.btn-active-danger.show .svg-icon,.btn.btn-active-danger.show i,.btn.btn-active-danger:active:not(.btn-active) .svg-icon,.btn.btn-active-danger:active:not(.btn-active) i,.btn.btn-active-danger:focus:not(.btn-active) .svg-icon,.btn.btn-active-danger:focus:not(.btn-active) i,.btn.btn-active-danger:hover:not(.btn-active) .svg-icon,.btn.btn-active-danger:hover:not(.btn-active) i,.show>.btn.btn-active-danger .svg-icon,.show>.btn.btn-active-danger i{color:var(--bs-danger-inverse)}.btn-check:active+.btn.btn-active-danger.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-danger.dropdown-toggle:after,.btn.btn-active-danger.active.dropdown-toggle:after,.btn.btn-active-danger.show.dropdown-toggle:after,.btn.btn-active-danger:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-danger:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-danger:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-danger.dropdown-toggle:after{color:var(--bs-danger-inverse)}.btn-check:active+.btn.btn-active-light-danger,.btn-check:checked+.btn.btn-active-light-danger,.btn.btn-active-light-danger.active,.btn.btn-active-light-danger.show,.btn.btn-active-light-danger:active:not(.btn-active),.btn.btn-active-light-danger:focus:not(.btn-active),.btn.btn-active-light-danger:hover:not(.btn-active),.show>.btn.btn-active-light-danger{color:var(--bs-danger);border-color:var(--bs-danger-light);background-color:var(--bs-danger-light)!important}.btn-check:active+.btn.btn-active-light-danger .svg-icon,.btn-check:active+.btn.btn-active-light-danger i,.btn-check:checked+.btn.btn-active-light-danger .svg-icon,.btn-check:checked+.btn.btn-active-light-danger i,.btn.btn-active-light-danger.active .svg-icon,.btn.btn-active-light-danger.active i,.btn.btn-active-light-danger.show .svg-icon,.btn.btn-active-light-danger.show i,.btn.btn-active-light-danger:active:not(.btn-active) .svg-icon,.btn.btn-active-light-danger:active:not(.btn-active) i,.btn.btn-active-light-danger:focus:not(.btn-active) .svg-icon,.btn.btn-active-light-danger:focus:not(.btn-active) i,.btn.btn-active-light-danger:hover:not(.btn-active) .svg-icon,.btn.btn-active-light-danger:hover:not(.btn-active) i,.show>.btn.btn-active-light-danger .svg-icon,.show>.btn.btn-active-light-danger i{color:var(--bs-danger)}.btn-check:active+.btn.btn-active-light-danger.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light-danger.dropdown-toggle:after,.btn.btn-active-light-danger.active.dropdown-toggle:after,.btn.btn-active-light-danger.show.dropdown-toggle:after,.btn.btn-active-light-danger:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-danger:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-danger:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light-danger.dropdown-toggle:after{color:var(--bs-danger)}.btn.btn-outline.btn-outline-danger{color:var(--bs-danger);border-color:var(--bs-danger);background-color:transparent}.btn.btn-outline.btn-outline-danger .svg-icon,.btn.btn-outline.btn-outline-danger i{color:var(--bs-danger)}.btn.btn-outline.btn-outline-danger.dropdown-toggle:after{color:var(--bs-danger)}.btn-check:active+.btn.btn-outline.btn-outline-danger,.btn-check:checked+.btn.btn-outline.btn-outline-danger,.btn.btn-outline.btn-outline-danger.active,.btn.btn-outline.btn-outline-danger.show,.btn.btn-outline.btn-outline-danger:active:not(.btn-active),.btn.btn-outline.btn-outline-danger:focus:not(.btn-active),.btn.btn-outline.btn-outline-danger:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-danger{color:var(--bs-danger-active);border-color:var(--bs-danger);background-color:var(--bs-danger-light)!important}.btn-check:active+.btn.btn-outline.btn-outline-danger .svg-icon,.btn-check:active+.btn.btn-outline.btn-outline-danger i,.btn-check:checked+.btn.btn-outline.btn-outline-danger .svg-icon,.btn-check:checked+.btn.btn-outline.btn-outline-danger i,.btn.btn-outline.btn-outline-danger.active .svg-icon,.btn.btn-outline.btn-outline-danger.active i,.btn.btn-outline.btn-outline-danger.show .svg-icon,.btn.btn-outline.btn-outline-danger.show i,.btn.btn-outline.btn-outline-danger:active:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-danger:active:not(.btn-active) i,.btn.btn-outline.btn-outline-danger:focus:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-danger:focus:not(.btn-active) i,.btn.btn-outline.btn-outline-danger:hover:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-danger:hover:not(.btn-active) i,.show>.btn.btn-outline.btn-outline-danger .svg-icon,.show>.btn.btn-outline.btn-outline-danger i{color:var(--bs-danger-active)}.btn-check:active+.btn.btn-outline.btn-outline-danger.dropdown-toggle:after,.btn-check:checked+.btn.btn-outline.btn-outline-danger.dropdown-toggle:after,.btn.btn-outline.btn-outline-danger.active.dropdown-toggle:after,.btn.btn-outline.btn-outline-danger.show.dropdown-toggle:after,.btn.btn-outline.btn-outline-danger:active:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-danger:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-danger:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-outline.btn-outline-danger.dropdown-toggle:after{color:var(--bs-danger-active)}.btn.btn-dark{color:var(--bs-dark-inverse);border-color:var(--bs-dark);background-color:var(--bs-dark)}.btn.btn-dark .svg-icon,.btn.btn-dark i{color:var(--bs-dark-inverse)}.btn.btn-dark.dropdown-toggle:after{color:var(--bs-dark-inverse)}.btn-check:active+.btn.btn-dark,.btn-check:checked+.btn.btn-dark,.btn.btn-dark.active,.btn.btn-dark.show,.btn.btn-dark:active:not(.btn-active),.btn.btn-dark:focus:not(.btn-active),.btn.btn-dark:hover:not(.btn-active),.show>.btn.btn-dark{color:var(--bs-dark-inverse);border-color:var(--bs-dark-active);background-color:var(--bs-dark-active)!important}.btn-check:active+.btn.btn-dark .svg-icon,.btn-check:active+.btn.btn-dark i,.btn-check:checked+.btn.btn-dark .svg-icon,.btn-check:checked+.btn.btn-dark i,.btn.btn-dark.active .svg-icon,.btn.btn-dark.active i,.btn.btn-dark.show .svg-icon,.btn.btn-dark.show i,.btn.btn-dark:active:not(.btn-active) .svg-icon,.btn.btn-dark:active:not(.btn-active) i,.btn.btn-dark:focus:not(.btn-active) .svg-icon,.btn.btn-dark:focus:not(.btn-active) i,.btn.btn-dark:hover:not(.btn-active) .svg-icon,.btn.btn-dark:hover:not(.btn-active) i,.show>.btn.btn-dark .svg-icon,.show>.btn.btn-dark i{color:var(--bs-dark-inverse)}.btn-check:active+.btn.btn-dark.dropdown-toggle:after,.btn-check:checked+.btn.btn-dark.dropdown-toggle:after,.btn.btn-dark.active.dropdown-toggle:after,.btn.btn-dark.show.dropdown-toggle:after,.btn.btn-dark:active:not(.btn-active).dropdown-toggle:after,.btn.btn-dark:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-dark:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-dark.dropdown-toggle:after{color:var(--bs-dark-inverse)}.btn.btn-light-dark{color:var(--bs-dark);border-color:var(--bs-dark-light);background-color:var(--bs-dark-light)}.btn.btn-light-dark .svg-icon,.btn.btn-light-dark i{color:var(--bs-dark)}.btn.btn-light-dark.dropdown-toggle:after{color:var(--bs-dark)}.btn-check:active+.btn.btn-light-dark,.btn-check:checked+.btn.btn-light-dark,.btn.btn-light-dark.active,.btn.btn-light-dark.show,.btn.btn-light-dark:active:not(.btn-active),.btn.btn-light-dark:focus:not(.btn-active),.btn.btn-light-dark:hover:not(.btn-active),.show>.btn.btn-light-dark{color:var(--bs-dark-inverse);border-color:var(--bs-dark);background-color:var(--bs-dark)!important}.btn-check:active+.btn.btn-light-dark .svg-icon,.btn-check:active+.btn.btn-light-dark i,.btn-check:checked+.btn.btn-light-dark .svg-icon,.btn-check:checked+.btn.btn-light-dark i,.btn.btn-light-dark.active .svg-icon,.btn.btn-light-dark.active i,.btn.btn-light-dark.show .svg-icon,.btn.btn-light-dark.show i,.btn.btn-light-dark:active:not(.btn-active) .svg-icon,.btn.btn-light-dark:active:not(.btn-active) i,.btn.btn-light-dark:focus:not(.btn-active) .svg-icon,.btn.btn-light-dark:focus:not(.btn-active) i,.btn.btn-light-dark:hover:not(.btn-active) .svg-icon,.btn.btn-light-dark:hover:not(.btn-active) i,.show>.btn.btn-light-dark .svg-icon,.show>.btn.btn-light-dark i{color:var(--bs-dark-inverse)}.btn-check:active+.btn.btn-light-dark.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-dark.dropdown-toggle:after,.btn.btn-light-dark.active.dropdown-toggle:after,.btn.btn-light-dark.show.dropdown-toggle:after,.btn.btn-light-dark:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-dark:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-dark:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-dark.dropdown-toggle:after{color:var(--bs-dark-inverse)}.btn.btn-bg-dark{border-color:var(--bs-dark);background-color:var(--bs-dark)}.btn-check:active+.btn.btn-active-dark,.btn-check:checked+.btn.btn-active-dark,.btn.btn-active-dark.active,.btn.btn-active-dark.show,.btn.btn-active-dark:active:not(.btn-active),.btn.btn-active-dark:focus:not(.btn-active),.btn.btn-active-dark:hover:not(.btn-active),.show>.btn.btn-active-dark{color:var(--bs-dark-inverse);border-color:var(--bs-dark);background-color:var(--bs-dark)!important}.btn-check:active+.btn.btn-active-dark .svg-icon,.btn-check:active+.btn.btn-active-dark i,.btn-check:checked+.btn.btn-active-dark .svg-icon,.btn-check:checked+.btn.btn-active-dark i,.btn.btn-active-dark.active .svg-icon,.btn.btn-active-dark.active i,.btn.btn-active-dark.show .svg-icon,.btn.btn-active-dark.show i,.btn.btn-active-dark:active:not(.btn-active) .svg-icon,.btn.btn-active-dark:active:not(.btn-active) i,.btn.btn-active-dark:focus:not(.btn-active) .svg-icon,.btn.btn-active-dark:focus:not(.btn-active) i,.btn.btn-active-dark:hover:not(.btn-active) .svg-icon,.btn.btn-active-dark:hover:not(.btn-active) i,.show>.btn.btn-active-dark .svg-icon,.show>.btn.btn-active-dark i{color:var(--bs-dark-inverse)}.btn-check:active+.btn.btn-active-dark.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-dark.dropdown-toggle:after,.btn.btn-active-dark.active.dropdown-toggle:after,.btn.btn-active-dark.show.dropdown-toggle:after,.btn.btn-active-dark:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-dark:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-dark:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-dark.dropdown-toggle:after{color:var(--bs-dark-inverse)}.btn-check:active+.btn.btn-active-light-dark,.btn-check:checked+.btn.btn-active-light-dark,.btn.btn-active-light-dark.active,.btn.btn-active-light-dark.show,.btn.btn-active-light-dark:active:not(.btn-active),.btn.btn-active-light-dark:focus:not(.btn-active),.btn.btn-active-light-dark:hover:not(.btn-active),.show>.btn.btn-active-light-dark{color:var(--bs-dark);border-color:var(--bs-dark-light);background-color:var(--bs-dark-light)!important}.btn-check:active+.btn.btn-active-light-dark .svg-icon,.btn-check:active+.btn.btn-active-light-dark i,.btn-check:checked+.btn.btn-active-light-dark .svg-icon,.btn-check:checked+.btn.btn-active-light-dark i,.btn.btn-active-light-dark.active .svg-icon,.btn.btn-active-light-dark.active i,.btn.btn-active-light-dark.show .svg-icon,.btn.btn-active-light-dark.show i,.btn.btn-active-light-dark:active:not(.btn-active) .svg-icon,.btn.btn-active-light-dark:active:not(.btn-active) i,.btn.btn-active-light-dark:focus:not(.btn-active) .svg-icon,.btn.btn-active-light-dark:focus:not(.btn-active) i,.btn.btn-active-light-dark:hover:not(.btn-active) .svg-icon,.btn.btn-active-light-dark:hover:not(.btn-active) i,.show>.btn.btn-active-light-dark .svg-icon,.show>.btn.btn-active-light-dark i{color:var(--bs-dark)}.btn-check:active+.btn.btn-active-light-dark.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-light-dark.dropdown-toggle:after,.btn.btn-active-light-dark.active.dropdown-toggle:after,.btn.btn-active-light-dark.show.dropdown-toggle:after,.btn.btn-active-light-dark:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-dark:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-light-dark:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-light-dark.dropdown-toggle:after{color:var(--bs-dark)}.btn.btn-outline.btn-outline-dark{color:var(--bs-dark);border-color:var(--bs-dark);background-color:transparent}.btn.btn-outline.btn-outline-dark .svg-icon,.btn.btn-outline.btn-outline-dark i{color:var(--bs-dark)}.btn.btn-outline.btn-outline-dark.dropdown-toggle:after{color:var(--bs-dark)}.btn-check:active+.btn.btn-outline.btn-outline-dark,.btn-check:checked+.btn.btn-outline.btn-outline-dark,.btn.btn-outline.btn-outline-dark.active,.btn.btn-outline.btn-outline-dark.show,.btn.btn-outline.btn-outline-dark:active:not(.btn-active),.btn.btn-outline.btn-outline-dark:focus:not(.btn-active),.btn.btn-outline.btn-outline-dark:hover:not(.btn-active),.show>.btn.btn-outline.btn-outline-dark{color:var(--bs-dark-active);border-color:var(--bs-dark);background-color:var(--bs-dark-light)!important}.btn-check:active+.btn.btn-outline.btn-outline-dark .svg-icon,.btn-check:active+.btn.btn-outline.btn-outline-dark i,.btn-check:checked+.btn.btn-outline.btn-outline-dark .svg-icon,.btn-check:checked+.btn.btn-outline.btn-outline-dark i,.btn.btn-outline.btn-outline-dark.active .svg-icon,.btn.btn-outline.btn-outline-dark.active i,.btn.btn-outline.btn-outline-dark.show .svg-icon,.btn.btn-outline.btn-outline-dark.show i,.btn.btn-outline.btn-outline-dark:active:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-dark:active:not(.btn-active) i,.btn.btn-outline.btn-outline-dark:focus:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-dark:focus:not(.btn-active) i,.btn.btn-outline.btn-outline-dark:hover:not(.btn-active) .svg-icon,.btn.btn-outline.btn-outline-dark:hover:not(.btn-active) i,.show>.btn.btn-outline.btn-outline-dark .svg-icon,.show>.btn.btn-outline.btn-outline-dark i{color:var(--bs-dark-active)}.btn-check:active+.btn.btn-outline.btn-outline-dark.dropdown-toggle:after,.btn-check:checked+.btn.btn-outline.btn-outline-dark.dropdown-toggle:after,.btn.btn-outline.btn-outline-dark.active.dropdown-toggle:after,.btn.btn-outline.btn-outline-dark.show.dropdown-toggle:after,.btn.btn-outline.btn-outline-dark:active:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-dark:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-outline.btn-outline-dark:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-outline.btn-outline-dark.dropdown-toggle:after{color:var(--bs-dark-active)}.btn.btn-color-white{color:var(--bs-text-white)}.btn.btn-color-white .svg-icon,.btn.btn-color-white i{color:var(--bs-text-white)}.btn.btn-color-white.dropdown-toggle:after{color:var(--bs-text-white)}.btn-check:active+.btn.btn-active-color-white,.btn-check:checked+.btn.btn-active-color-white,.btn.btn-active-color-white.active,.btn.btn-active-color-white.show,.btn.btn-active-color-white:active:not(.btn-active),.btn.btn-active-color-white:focus:not(.btn-active),.btn.btn-active-color-white:hover:not(.btn-active),.show>.btn.btn-active-color-white{color:var(--bs-text-white)}.btn-check:active+.btn.btn-active-color-white .svg-icon,.btn-check:active+.btn.btn-active-color-white i,.btn-check:checked+.btn.btn-active-color-white .svg-icon,.btn-check:checked+.btn.btn-active-color-white i,.btn.btn-active-color-white.active .svg-icon,.btn.btn-active-color-white.active i,.btn.btn-active-color-white.show .svg-icon,.btn.btn-active-color-white.show i,.btn.btn-active-color-white:active:not(.btn-active) .svg-icon,.btn.btn-active-color-white:active:not(.btn-active) i,.btn.btn-active-color-white:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-white:focus:not(.btn-active) i,.btn.btn-active-color-white:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-white:hover:not(.btn-active) i,.show>.btn.btn-active-color-white .svg-icon,.show>.btn.btn-active-color-white i{color:var(--bs-text-white)}.btn-check:active+.btn.btn-active-color-white.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-white.dropdown-toggle:after,.btn.btn-active-color-white.active.dropdown-toggle:after,.btn.btn-active-color-white.show.dropdown-toggle:after,.btn.btn-active-color-white:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-white:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-white:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-white.dropdown-toggle:after{color:var(--bs-text-white)}.btn.btn-icon-white .svg-icon,.btn.btn-icon-white i{color:var(--bs-text-white)}.btn.btn-icon-white.dropdown-toggle:after{color:var(--bs-text-white)}.btn-check:active+.btn.btn-active-icon-white .svg-icon,.btn-check:active+.btn.btn-active-icon-white i,.btn-check:checked+.btn.btn-active-icon-white .svg-icon,.btn-check:checked+.btn.btn-active-icon-white i,.btn.btn-active-icon-white.active .svg-icon,.btn.btn-active-icon-white.active i,.btn.btn-active-icon-white.show .svg-icon,.btn.btn-active-icon-white.show i,.btn.btn-active-icon-white:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-white:active:not(.btn-active) i,.btn.btn-active-icon-white:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-white:focus:not(.btn-active) i,.btn.btn-active-icon-white:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-white:hover:not(.btn-active) i,.show>.btn.btn-active-icon-white .svg-icon,.show>.btn.btn-active-icon-white i{color:var(--bs-text-white)}.btn-check:active+.btn.btn-active-icon-white.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-white.dropdown-toggle:after,.btn.btn-active-icon-white.active.dropdown-toggle:after,.btn.btn-active-icon-white.show.dropdown-toggle:after,.btn.btn-active-icon-white:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-white:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-white:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-white.dropdown-toggle:after{color:var(--bs-text-white)}.btn.btn-text-white{color:var(--bs-text-white)}.btn-check:active+.btn.btn-active-text-white,.btn-check:checked+.btn.btn-active-text-white,.btn.btn-active-text-white.active,.btn.btn-active-text-white.show,.btn.btn-active-text-white:active:not(.btn-active),.btn.btn-active-text-white:focus:not(.btn-active),.btn.btn-active-text-white:hover:not(.btn-active),.show>.btn.btn-active-text-white{color:var(--bs-text-white)}.btn.btn-color-primary{color:var(--bs-text-primary)}.btn.btn-color-primary .svg-icon,.btn.btn-color-primary i{color:var(--bs-text-primary)}.btn.btn-color-primary.dropdown-toggle:after{color:var(--bs-text-primary)}.btn-check:active+.btn.btn-active-color-primary,.btn-check:checked+.btn.btn-active-color-primary,.btn.btn-active-color-primary.active,.btn.btn-active-color-primary.show,.btn.btn-active-color-primary:active:not(.btn-active),.btn.btn-active-color-primary:focus:not(.btn-active),.btn.btn-active-color-primary:hover:not(.btn-active),.show>.btn.btn-active-color-primary{color:var(--bs-text-primary)}.btn-check:active+.btn.btn-active-color-primary .svg-icon,.btn-check:active+.btn.btn-active-color-primary i,.btn-check:checked+.btn.btn-active-color-primary .svg-icon,.btn-check:checked+.btn.btn-active-color-primary i,.btn.btn-active-color-primary.active .svg-icon,.btn.btn-active-color-primary.active i,.btn.btn-active-color-primary.show .svg-icon,.btn.btn-active-color-primary.show i,.btn.btn-active-color-primary:active:not(.btn-active) .svg-icon,.btn.btn-active-color-primary:active:not(.btn-active) i,.btn.btn-active-color-primary:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-primary:focus:not(.btn-active) i,.btn.btn-active-color-primary:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-primary:hover:not(.btn-active) i,.show>.btn.btn-active-color-primary .svg-icon,.show>.btn.btn-active-color-primary i{color:var(--bs-text-primary)}.btn-check:active+.btn.btn-active-color-primary.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-primary.dropdown-toggle:after,.btn.btn-active-color-primary.active.dropdown-toggle:after,.btn.btn-active-color-primary.show.dropdown-toggle:after,.btn.btn-active-color-primary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-primary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-primary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-primary.dropdown-toggle:after{color:var(--bs-text-primary)}.btn.btn-icon-primary .svg-icon,.btn.btn-icon-primary i{color:var(--bs-text-primary)}.btn.btn-icon-primary.dropdown-toggle:after{color:var(--bs-text-primary)}.btn-check:active+.btn.btn-active-icon-primary .svg-icon,.btn-check:active+.btn.btn-active-icon-primary i,.btn-check:checked+.btn.btn-active-icon-primary .svg-icon,.btn-check:checked+.btn.btn-active-icon-primary i,.btn.btn-active-icon-primary.active .svg-icon,.btn.btn-active-icon-primary.active i,.btn.btn-active-icon-primary.show .svg-icon,.btn.btn-active-icon-primary.show i,.btn.btn-active-icon-primary:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-primary:active:not(.btn-active) i,.btn.btn-active-icon-primary:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-primary:focus:not(.btn-active) i,.btn.btn-active-icon-primary:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-primary:hover:not(.btn-active) i,.show>.btn.btn-active-icon-primary .svg-icon,.show>.btn.btn-active-icon-primary i{color:var(--bs-text-primary)}.btn-check:active+.btn.btn-active-icon-primary.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-primary.dropdown-toggle:after,.btn.btn-active-icon-primary.active.dropdown-toggle:after,.btn.btn-active-icon-primary.show.dropdown-toggle:after,.btn.btn-active-icon-primary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-primary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-primary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-primary.dropdown-toggle:after{color:var(--bs-text-primary)}.btn.btn-text-primary{color:var(--bs-text-primary)}.btn-check:active+.btn.btn-active-text-primary,.btn-check:checked+.btn.btn-active-text-primary,.btn.btn-active-text-primary.active,.btn.btn-active-text-primary.show,.btn.btn-active-text-primary:active:not(.btn-active),.btn.btn-active-text-primary:focus:not(.btn-active),.btn.btn-active-text-primary:hover:not(.btn-active),.show>.btn.btn-active-text-primary{color:var(--bs-text-primary)}.btn.btn-color-secondary{color:var(--bs-text-secondary)}.btn.btn-color-secondary .svg-icon,.btn.btn-color-secondary i{color:var(--bs-text-secondary)}.btn.btn-color-secondary.dropdown-toggle:after{color:var(--bs-text-secondary)}.btn-check:active+.btn.btn-active-color-secondary,.btn-check:checked+.btn.btn-active-color-secondary,.btn.btn-active-color-secondary.active,.btn.btn-active-color-secondary.show,.btn.btn-active-color-secondary:active:not(.btn-active),.btn.btn-active-color-secondary:focus:not(.btn-active),.btn.btn-active-color-secondary:hover:not(.btn-active),.show>.btn.btn-active-color-secondary{color:var(--bs-text-secondary)}.btn-check:active+.btn.btn-active-color-secondary .svg-icon,.btn-check:active+.btn.btn-active-color-secondary i,.btn-check:checked+.btn.btn-active-color-secondary .svg-icon,.btn-check:checked+.btn.btn-active-color-secondary i,.btn.btn-active-color-secondary.active .svg-icon,.btn.btn-active-color-secondary.active i,.btn.btn-active-color-secondary.show .svg-icon,.btn.btn-active-color-secondary.show i,.btn.btn-active-color-secondary:active:not(.btn-active) .svg-icon,.btn.btn-active-color-secondary:active:not(.btn-active) i,.btn.btn-active-color-secondary:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-secondary:focus:not(.btn-active) i,.btn.btn-active-color-secondary:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-secondary:hover:not(.btn-active) i,.show>.btn.btn-active-color-secondary .svg-icon,.show>.btn.btn-active-color-secondary i{color:var(--bs-text-secondary)}.btn-check:active+.btn.btn-active-color-secondary.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-secondary.dropdown-toggle:after,.btn.btn-active-color-secondary.active.dropdown-toggle:after,.btn.btn-active-color-secondary.show.dropdown-toggle:after,.btn.btn-active-color-secondary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-secondary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-secondary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-secondary.dropdown-toggle:after{color:var(--bs-text-secondary)}.btn.btn-icon-secondary .svg-icon,.btn.btn-icon-secondary i{color:var(--bs-text-secondary)}.btn.btn-icon-secondary.dropdown-toggle:after{color:var(--bs-text-secondary)}.btn-check:active+.btn.btn-active-icon-secondary .svg-icon,.btn-check:active+.btn.btn-active-icon-secondary i,.btn-check:checked+.btn.btn-active-icon-secondary .svg-icon,.btn-check:checked+.btn.btn-active-icon-secondary i,.btn.btn-active-icon-secondary.active .svg-icon,.btn.btn-active-icon-secondary.active i,.btn.btn-active-icon-secondary.show .svg-icon,.btn.btn-active-icon-secondary.show i,.btn.btn-active-icon-secondary:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-secondary:active:not(.btn-active) i,.btn.btn-active-icon-secondary:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-secondary:focus:not(.btn-active) i,.btn.btn-active-icon-secondary:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-secondary:hover:not(.btn-active) i,.show>.btn.btn-active-icon-secondary .svg-icon,.show>.btn.btn-active-icon-secondary i{color:var(--bs-text-secondary)}.btn-check:active+.btn.btn-active-icon-secondary.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-secondary.dropdown-toggle:after,.btn.btn-active-icon-secondary.active.dropdown-toggle:after,.btn.btn-active-icon-secondary.show.dropdown-toggle:after,.btn.btn-active-icon-secondary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-secondary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-secondary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-secondary.dropdown-toggle:after{color:var(--bs-text-secondary)}.btn.btn-text-secondary{color:var(--bs-text-secondary)}.btn-check:active+.btn.btn-active-text-secondary,.btn-check:checked+.btn.btn-active-text-secondary,.btn.btn-active-text-secondary.active,.btn.btn-active-text-secondary.show,.btn.btn-active-text-secondary:active:not(.btn-active),.btn.btn-active-text-secondary:focus:not(.btn-active),.btn.btn-active-text-secondary:hover:not(.btn-active),.show>.btn.btn-active-text-secondary{color:var(--bs-text-secondary)}.btn.btn-color-light{color:var(--bs-text-light)}.btn.btn-color-light .svg-icon,.btn.btn-color-light i{color:var(--bs-text-light)}.btn.btn-color-light.dropdown-toggle:after{color:var(--bs-text-light)}.btn-check:active+.btn.btn-active-color-light,.btn-check:checked+.btn.btn-active-color-light,.btn.btn-active-color-light.active,.btn.btn-active-color-light.show,.btn.btn-active-color-light:active:not(.btn-active),.btn.btn-active-color-light:focus:not(.btn-active),.btn.btn-active-color-light:hover:not(.btn-active),.show>.btn.btn-active-color-light{color:var(--bs-text-light)}.btn-check:active+.btn.btn-active-color-light .svg-icon,.btn-check:active+.btn.btn-active-color-light i,.btn-check:checked+.btn.btn-active-color-light .svg-icon,.btn-check:checked+.btn.btn-active-color-light i,.btn.btn-active-color-light.active .svg-icon,.btn.btn-active-color-light.active i,.btn.btn-active-color-light.show .svg-icon,.btn.btn-active-color-light.show i,.btn.btn-active-color-light:active:not(.btn-active) .svg-icon,.btn.btn-active-color-light:active:not(.btn-active) i,.btn.btn-active-color-light:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-light:focus:not(.btn-active) i,.btn.btn-active-color-light:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-light:hover:not(.btn-active) i,.show>.btn.btn-active-color-light .svg-icon,.show>.btn.btn-active-color-light i{color:var(--bs-text-light)}.btn-check:active+.btn.btn-active-color-light.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-light.dropdown-toggle:after,.btn.btn-active-color-light.active.dropdown-toggle:after,.btn.btn-active-color-light.show.dropdown-toggle:after,.btn.btn-active-color-light:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-light:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-light:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-light.dropdown-toggle:after{color:var(--bs-text-light)}.btn.btn-icon-light .svg-icon,.btn.btn-icon-light i{color:var(--bs-text-light)}.btn.btn-icon-light.dropdown-toggle:after{color:var(--bs-text-light)}.btn-check:active+.btn.btn-active-icon-light .svg-icon,.btn-check:active+.btn.btn-active-icon-light i,.btn-check:checked+.btn.btn-active-icon-light .svg-icon,.btn-check:checked+.btn.btn-active-icon-light i,.btn.btn-active-icon-light.active .svg-icon,.btn.btn-active-icon-light.active i,.btn.btn-active-icon-light.show .svg-icon,.btn.btn-active-icon-light.show i,.btn.btn-active-icon-light:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-light:active:not(.btn-active) i,.btn.btn-active-icon-light:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-light:focus:not(.btn-active) i,.btn.btn-active-icon-light:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-light:hover:not(.btn-active) i,.show>.btn.btn-active-icon-light .svg-icon,.show>.btn.btn-active-icon-light i{color:var(--bs-text-light)}.btn-check:active+.btn.btn-active-icon-light.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-light.dropdown-toggle:after,.btn.btn-active-icon-light.active.dropdown-toggle:after,.btn.btn-active-icon-light.show.dropdown-toggle:after,.btn.btn-active-icon-light:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-light:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-light:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-light.dropdown-toggle:after{color:var(--bs-text-light)}.btn.btn-text-light{color:var(--bs-text-light)}.btn-check:active+.btn.btn-active-text-light,.btn-check:checked+.btn.btn-active-text-light,.btn.btn-active-text-light.active,.btn.btn-active-text-light.show,.btn.btn-active-text-light:active:not(.btn-active),.btn.btn-active-text-light:focus:not(.btn-active),.btn.btn-active-text-light:hover:not(.btn-active),.show>.btn.btn-active-text-light{color:var(--bs-text-light)}.btn.btn-color-success{color:var(--bs-text-success)}.btn.btn-color-success .svg-icon,.btn.btn-color-success i{color:var(--bs-text-success)}.btn.btn-color-success.dropdown-toggle:after{color:var(--bs-text-success)}.btn-check:active+.btn.btn-active-color-success,.btn-check:checked+.btn.btn-active-color-success,.btn.btn-active-color-success.active,.btn.btn-active-color-success.show,.btn.btn-active-color-success:active:not(.btn-active),.btn.btn-active-color-success:focus:not(.btn-active),.btn.btn-active-color-success:hover:not(.btn-active),.show>.btn.btn-active-color-success{color:var(--bs-text-success)}.btn-check:active+.btn.btn-active-color-success .svg-icon,.btn-check:active+.btn.btn-active-color-success i,.btn-check:checked+.btn.btn-active-color-success .svg-icon,.btn-check:checked+.btn.btn-active-color-success i,.btn.btn-active-color-success.active .svg-icon,.btn.btn-active-color-success.active i,.btn.btn-active-color-success.show .svg-icon,.btn.btn-active-color-success.show i,.btn.btn-active-color-success:active:not(.btn-active) .svg-icon,.btn.btn-active-color-success:active:not(.btn-active) i,.btn.btn-active-color-success:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-success:focus:not(.btn-active) i,.btn.btn-active-color-success:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-success:hover:not(.btn-active) i,.show>.btn.btn-active-color-success .svg-icon,.show>.btn.btn-active-color-success i{color:var(--bs-text-success)}.btn-check:active+.btn.btn-active-color-success.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-success.dropdown-toggle:after,.btn.btn-active-color-success.active.dropdown-toggle:after,.btn.btn-active-color-success.show.dropdown-toggle:after,.btn.btn-active-color-success:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-success:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-success:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-success.dropdown-toggle:after{color:var(--bs-text-success)}.btn.btn-icon-success .svg-icon,.btn.btn-icon-success i{color:var(--bs-text-success)}.btn.btn-icon-success.dropdown-toggle:after{color:var(--bs-text-success)}.btn-check:active+.btn.btn-active-icon-success .svg-icon,.btn-check:active+.btn.btn-active-icon-success i,.btn-check:checked+.btn.btn-active-icon-success .svg-icon,.btn-check:checked+.btn.btn-active-icon-success i,.btn.btn-active-icon-success.active .svg-icon,.btn.btn-active-icon-success.active i,.btn.btn-active-icon-success.show .svg-icon,.btn.btn-active-icon-success.show i,.btn.btn-active-icon-success:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-success:active:not(.btn-active) i,.btn.btn-active-icon-success:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-success:focus:not(.btn-active) i,.btn.btn-active-icon-success:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-success:hover:not(.btn-active) i,.show>.btn.btn-active-icon-success .svg-icon,.show>.btn.btn-active-icon-success i{color:var(--bs-text-success)}.btn-check:active+.btn.btn-active-icon-success.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-success.dropdown-toggle:after,.btn.btn-active-icon-success.active.dropdown-toggle:after,.btn.btn-active-icon-success.show.dropdown-toggle:after,.btn.btn-active-icon-success:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-success:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-success:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-success.dropdown-toggle:after{color:var(--bs-text-success)}.btn.btn-text-success{color:var(--bs-text-success)}.btn-check:active+.btn.btn-active-text-success,.btn-check:checked+.btn.btn-active-text-success,.btn.btn-active-text-success.active,.btn.btn-active-text-success.show,.btn.btn-active-text-success:active:not(.btn-active),.btn.btn-active-text-success:focus:not(.btn-active),.btn.btn-active-text-success:hover:not(.btn-active),.show>.btn.btn-active-text-success{color:var(--bs-text-success)}.btn.btn-color-info{color:var(--bs-text-info)}.btn.btn-color-info .svg-icon,.btn.btn-color-info i{color:var(--bs-text-info)}.btn.btn-color-info.dropdown-toggle:after{color:var(--bs-text-info)}.btn-check:active+.btn.btn-active-color-info,.btn-check:checked+.btn.btn-active-color-info,.btn.btn-active-color-info.active,.btn.btn-active-color-info.show,.btn.btn-active-color-info:active:not(.btn-active),.btn.btn-active-color-info:focus:not(.btn-active),.btn.btn-active-color-info:hover:not(.btn-active),.show>.btn.btn-active-color-info{color:var(--bs-text-info)}.btn-check:active+.btn.btn-active-color-info .svg-icon,.btn-check:active+.btn.btn-active-color-info i,.btn-check:checked+.btn.btn-active-color-info .svg-icon,.btn-check:checked+.btn.btn-active-color-info i,.btn.btn-active-color-info.active .svg-icon,.btn.btn-active-color-info.active i,.btn.btn-active-color-info.show .svg-icon,.btn.btn-active-color-info.show i,.btn.btn-active-color-info:active:not(.btn-active) .svg-icon,.btn.btn-active-color-info:active:not(.btn-active) i,.btn.btn-active-color-info:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-info:focus:not(.btn-active) i,.btn.btn-active-color-info:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-info:hover:not(.btn-active) i,.show>.btn.btn-active-color-info .svg-icon,.show>.btn.btn-active-color-info i{color:var(--bs-text-info)}.btn-check:active+.btn.btn-active-color-info.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-info.dropdown-toggle:after,.btn.btn-active-color-info.active.dropdown-toggle:after,.btn.btn-active-color-info.show.dropdown-toggle:after,.btn.btn-active-color-info:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-info:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-info:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-info.dropdown-toggle:after{color:var(--bs-text-info)}.btn.btn-icon-info .svg-icon,.btn.btn-icon-info i{color:var(--bs-text-info)}.btn.btn-icon-info.dropdown-toggle:after{color:var(--bs-text-info)}.btn-check:active+.btn.btn-active-icon-info .svg-icon,.btn-check:active+.btn.btn-active-icon-info i,.btn-check:checked+.btn.btn-active-icon-info .svg-icon,.btn-check:checked+.btn.btn-active-icon-info i,.btn.btn-active-icon-info.active .svg-icon,.btn.btn-active-icon-info.active i,.btn.btn-active-icon-info.show .svg-icon,.btn.btn-active-icon-info.show i,.btn.btn-active-icon-info:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-info:active:not(.btn-active) i,.btn.btn-active-icon-info:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-info:focus:not(.btn-active) i,.btn.btn-active-icon-info:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-info:hover:not(.btn-active) i,.show>.btn.btn-active-icon-info .svg-icon,.show>.btn.btn-active-icon-info i{color:var(--bs-text-info)}.btn-check:active+.btn.btn-active-icon-info.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-info.dropdown-toggle:after,.btn.btn-active-icon-info.active.dropdown-toggle:after,.btn.btn-active-icon-info.show.dropdown-toggle:after,.btn.btn-active-icon-info:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-info:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-info:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-info.dropdown-toggle:after{color:var(--bs-text-info)}.btn.btn-text-info{color:var(--bs-text-info)}.btn-check:active+.btn.btn-active-text-info,.btn-check:checked+.btn.btn-active-text-info,.btn.btn-active-text-info.active,.btn.btn-active-text-info.show,.btn.btn-active-text-info:active:not(.btn-active),.btn.btn-active-text-info:focus:not(.btn-active),.btn.btn-active-text-info:hover:not(.btn-active),.show>.btn.btn-active-text-info{color:var(--bs-text-info)}.btn.btn-color-warning{color:var(--bs-text-warning)}.btn.btn-color-warning .svg-icon,.btn.btn-color-warning i{color:var(--bs-text-warning)}.btn.btn-color-warning.dropdown-toggle:after{color:var(--bs-text-warning)}.btn-check:active+.btn.btn-active-color-warning,.btn-check:checked+.btn.btn-active-color-warning,.btn.btn-active-color-warning.active,.btn.btn-active-color-warning.show,.btn.btn-active-color-warning:active:not(.btn-active),.btn.btn-active-color-warning:focus:not(.btn-active),.btn.btn-active-color-warning:hover:not(.btn-active),.show>.btn.btn-active-color-warning{color:var(--bs-text-warning)}.btn-check:active+.btn.btn-active-color-warning .svg-icon,.btn-check:active+.btn.btn-active-color-warning i,.btn-check:checked+.btn.btn-active-color-warning .svg-icon,.btn-check:checked+.btn.btn-active-color-warning i,.btn.btn-active-color-warning.active .svg-icon,.btn.btn-active-color-warning.active i,.btn.btn-active-color-warning.show .svg-icon,.btn.btn-active-color-warning.show i,.btn.btn-active-color-warning:active:not(.btn-active) .svg-icon,.btn.btn-active-color-warning:active:not(.btn-active) i,.btn.btn-active-color-warning:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-warning:focus:not(.btn-active) i,.btn.btn-active-color-warning:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-warning:hover:not(.btn-active) i,.show>.btn.btn-active-color-warning .svg-icon,.show>.btn.btn-active-color-warning i{color:var(--bs-text-warning)}.btn-check:active+.btn.btn-active-color-warning.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-warning.dropdown-toggle:after,.btn.btn-active-color-warning.active.dropdown-toggle:after,.btn.btn-active-color-warning.show.dropdown-toggle:after,.btn.btn-active-color-warning:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-warning:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-warning:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-warning.dropdown-toggle:after{color:var(--bs-text-warning)}.btn.btn-icon-warning .svg-icon,.btn.btn-icon-warning i{color:var(--bs-text-warning)}.btn.btn-icon-warning.dropdown-toggle:after{color:var(--bs-text-warning)}.btn-check:active+.btn.btn-active-icon-warning .svg-icon,.btn-check:active+.btn.btn-active-icon-warning i,.btn-check:checked+.btn.btn-active-icon-warning .svg-icon,.btn-check:checked+.btn.btn-active-icon-warning i,.btn.btn-active-icon-warning.active .svg-icon,.btn.btn-active-icon-warning.active i,.btn.btn-active-icon-warning.show .svg-icon,.btn.btn-active-icon-warning.show i,.btn.btn-active-icon-warning:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-warning:active:not(.btn-active) i,.btn.btn-active-icon-warning:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-warning:focus:not(.btn-active) i,.btn.btn-active-icon-warning:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-warning:hover:not(.btn-active) i,.show>.btn.btn-active-icon-warning .svg-icon,.show>.btn.btn-active-icon-warning i{color:var(--bs-text-warning)}.btn-check:active+.btn.btn-active-icon-warning.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-warning.dropdown-toggle:after,.btn.btn-active-icon-warning.active.dropdown-toggle:after,.btn.btn-active-icon-warning.show.dropdown-toggle:after,.btn.btn-active-icon-warning:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-warning:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-warning:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-warning.dropdown-toggle:after{color:var(--bs-text-warning)}.btn.btn-text-warning{color:var(--bs-text-warning)}.btn-check:active+.btn.btn-active-text-warning,.btn-check:checked+.btn.btn-active-text-warning,.btn.btn-active-text-warning.active,.btn.btn-active-text-warning.show,.btn.btn-active-text-warning:active:not(.btn-active),.btn.btn-active-text-warning:focus:not(.btn-active),.btn.btn-active-text-warning:hover:not(.btn-active),.show>.btn.btn-active-text-warning{color:var(--bs-text-warning)}.btn.btn-color-danger{color:var(--bs-text-danger)}.btn.btn-color-danger .svg-icon,.btn.btn-color-danger i{color:var(--bs-text-danger)}.btn.btn-color-danger.dropdown-toggle:after{color:var(--bs-text-danger)}.btn-check:active+.btn.btn-active-color-danger,.btn-check:checked+.btn.btn-active-color-danger,.btn.btn-active-color-danger.active,.btn.btn-active-color-danger.show,.btn.btn-active-color-danger:active:not(.btn-active),.btn.btn-active-color-danger:focus:not(.btn-active),.btn.btn-active-color-danger:hover:not(.btn-active),.show>.btn.btn-active-color-danger{color:var(--bs-text-danger)}.btn-check:active+.btn.btn-active-color-danger .svg-icon,.btn-check:active+.btn.btn-active-color-danger i,.btn-check:checked+.btn.btn-active-color-danger .svg-icon,.btn-check:checked+.btn.btn-active-color-danger i,.btn.btn-active-color-danger.active .svg-icon,.btn.btn-active-color-danger.active i,.btn.btn-active-color-danger.show .svg-icon,.btn.btn-active-color-danger.show i,.btn.btn-active-color-danger:active:not(.btn-active) .svg-icon,.btn.btn-active-color-danger:active:not(.btn-active) i,.btn.btn-active-color-danger:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-danger:focus:not(.btn-active) i,.btn.btn-active-color-danger:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-danger:hover:not(.btn-active) i,.show>.btn.btn-active-color-danger .svg-icon,.show>.btn.btn-active-color-danger i{color:var(--bs-text-danger)}.btn-check:active+.btn.btn-active-color-danger.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-danger.dropdown-toggle:after,.btn.btn-active-color-danger.active.dropdown-toggle:after,.btn.btn-active-color-danger.show.dropdown-toggle:after,.btn.btn-active-color-danger:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-danger:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-danger:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-danger.dropdown-toggle:after{color:var(--bs-text-danger)}.btn.btn-icon-danger .svg-icon,.btn.btn-icon-danger i{color:var(--bs-text-danger)}.btn.btn-icon-danger.dropdown-toggle:after{color:var(--bs-text-danger)}.btn-check:active+.btn.btn-active-icon-danger .svg-icon,.btn-check:active+.btn.btn-active-icon-danger i,.btn-check:checked+.btn.btn-active-icon-danger .svg-icon,.btn-check:checked+.btn.btn-active-icon-danger i,.btn.btn-active-icon-danger.active .svg-icon,.btn.btn-active-icon-danger.active i,.btn.btn-active-icon-danger.show .svg-icon,.btn.btn-active-icon-danger.show i,.btn.btn-active-icon-danger:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-danger:active:not(.btn-active) i,.btn.btn-active-icon-danger:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-danger:focus:not(.btn-active) i,.btn.btn-active-icon-danger:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-danger:hover:not(.btn-active) i,.show>.btn.btn-active-icon-danger .svg-icon,.show>.btn.btn-active-icon-danger i{color:var(--bs-text-danger)}.btn-check:active+.btn.btn-active-icon-danger.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-danger.dropdown-toggle:after,.btn.btn-active-icon-danger.active.dropdown-toggle:after,.btn.btn-active-icon-danger.show.dropdown-toggle:after,.btn.btn-active-icon-danger:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-danger:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-danger:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-danger.dropdown-toggle:after{color:var(--bs-text-danger)}.btn.btn-text-danger{color:var(--bs-text-danger)}.btn-check:active+.btn.btn-active-text-danger,.btn-check:checked+.btn.btn-active-text-danger,.btn.btn-active-text-danger.active,.btn.btn-active-text-danger.show,.btn.btn-active-text-danger:active:not(.btn-active),.btn.btn-active-text-danger:focus:not(.btn-active),.btn.btn-active-text-danger:hover:not(.btn-active),.show>.btn.btn-active-text-danger{color:var(--bs-text-danger)}.btn.btn-color-dark{color:var(--bs-text-dark)}.btn.btn-color-dark .svg-icon,.btn.btn-color-dark i{color:var(--bs-text-dark)}.btn.btn-color-dark.dropdown-toggle:after{color:var(--bs-text-dark)}.btn-check:active+.btn.btn-active-color-dark,.btn-check:checked+.btn.btn-active-color-dark,.btn.btn-active-color-dark.active,.btn.btn-active-color-dark.show,.btn.btn-active-color-dark:active:not(.btn-active),.btn.btn-active-color-dark:focus:not(.btn-active),.btn.btn-active-color-dark:hover:not(.btn-active),.show>.btn.btn-active-color-dark{color:var(--bs-text-dark)}.btn-check:active+.btn.btn-active-color-dark .svg-icon,.btn-check:active+.btn.btn-active-color-dark i,.btn-check:checked+.btn.btn-active-color-dark .svg-icon,.btn-check:checked+.btn.btn-active-color-dark i,.btn.btn-active-color-dark.active .svg-icon,.btn.btn-active-color-dark.active i,.btn.btn-active-color-dark.show .svg-icon,.btn.btn-active-color-dark.show i,.btn.btn-active-color-dark:active:not(.btn-active) .svg-icon,.btn.btn-active-color-dark:active:not(.btn-active) i,.btn.btn-active-color-dark:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-dark:focus:not(.btn-active) i,.btn.btn-active-color-dark:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-dark:hover:not(.btn-active) i,.show>.btn.btn-active-color-dark .svg-icon,.show>.btn.btn-active-color-dark i{color:var(--bs-text-dark)}.btn-check:active+.btn.btn-active-color-dark.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-dark.dropdown-toggle:after,.btn.btn-active-color-dark.active.dropdown-toggle:after,.btn.btn-active-color-dark.show.dropdown-toggle:after,.btn.btn-active-color-dark:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-dark:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-dark:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-dark.dropdown-toggle:after{color:var(--bs-text-dark)}.btn.btn-icon-dark .svg-icon,.btn.btn-icon-dark i{color:var(--bs-text-dark)}.btn.btn-icon-dark.dropdown-toggle:after{color:var(--bs-text-dark)}.btn-check:active+.btn.btn-active-icon-dark .svg-icon,.btn-check:active+.btn.btn-active-icon-dark i,.btn-check:checked+.btn.btn-active-icon-dark .svg-icon,.btn-check:checked+.btn.btn-active-icon-dark i,.btn.btn-active-icon-dark.active .svg-icon,.btn.btn-active-icon-dark.active i,.btn.btn-active-icon-dark.show .svg-icon,.btn.btn-active-icon-dark.show i,.btn.btn-active-icon-dark:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-dark:active:not(.btn-active) i,.btn.btn-active-icon-dark:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-dark:focus:not(.btn-active) i,.btn.btn-active-icon-dark:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-dark:hover:not(.btn-active) i,.show>.btn.btn-active-icon-dark .svg-icon,.show>.btn.btn-active-icon-dark i{color:var(--bs-text-dark)}.btn-check:active+.btn.btn-active-icon-dark.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-dark.dropdown-toggle:after,.btn.btn-active-icon-dark.active.dropdown-toggle:after,.btn.btn-active-icon-dark.show.dropdown-toggle:after,.btn.btn-active-icon-dark:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-dark:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-dark:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-dark.dropdown-toggle:after{color:var(--bs-text-dark)}.btn.btn-text-dark{color:var(--bs-text-dark)}.btn-check:active+.btn.btn-active-text-dark,.btn-check:checked+.btn.btn-active-text-dark,.btn.btn-active-text-dark.active,.btn.btn-active-text-dark.show,.btn.btn-active-text-dark:active:not(.btn-active),.btn.btn-active-text-dark:focus:not(.btn-active),.btn.btn-active-text-dark:hover:not(.btn-active),.show>.btn.btn-active-text-dark{color:var(--bs-text-dark)}.btn.btn-color-muted{color:var(--bs-text-muted)}.btn.btn-color-muted .svg-icon,.btn.btn-color-muted i{color:var(--bs-text-muted)}.btn.btn-color-muted.dropdown-toggle:after{color:var(--bs-text-muted)}.btn-check:active+.btn.btn-active-color-muted,.btn-check:checked+.btn.btn-active-color-muted,.btn.btn-active-color-muted.active,.btn.btn-active-color-muted.show,.btn.btn-active-color-muted:active:not(.btn-active),.btn.btn-active-color-muted:focus:not(.btn-active),.btn.btn-active-color-muted:hover:not(.btn-active),.show>.btn.btn-active-color-muted{color:var(--bs-text-muted)}.btn-check:active+.btn.btn-active-color-muted .svg-icon,.btn-check:active+.btn.btn-active-color-muted i,.btn-check:checked+.btn.btn-active-color-muted .svg-icon,.btn-check:checked+.btn.btn-active-color-muted i,.btn.btn-active-color-muted.active .svg-icon,.btn.btn-active-color-muted.active i,.btn.btn-active-color-muted.show .svg-icon,.btn.btn-active-color-muted.show i,.btn.btn-active-color-muted:active:not(.btn-active) .svg-icon,.btn.btn-active-color-muted:active:not(.btn-active) i,.btn.btn-active-color-muted:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-muted:focus:not(.btn-active) i,.btn.btn-active-color-muted:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-muted:hover:not(.btn-active) i,.show>.btn.btn-active-color-muted .svg-icon,.show>.btn.btn-active-color-muted i{color:var(--bs-text-muted)}.btn-check:active+.btn.btn-active-color-muted.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-muted.dropdown-toggle:after,.btn.btn-active-color-muted.active.dropdown-toggle:after,.btn.btn-active-color-muted.show.dropdown-toggle:after,.btn.btn-active-color-muted:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-muted:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-muted:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-muted.dropdown-toggle:after{color:var(--bs-text-muted)}.btn.btn-icon-muted .svg-icon,.btn.btn-icon-muted i{color:var(--bs-text-muted)}.btn.btn-icon-muted.dropdown-toggle:after{color:var(--bs-text-muted)}.btn-check:active+.btn.btn-active-icon-muted .svg-icon,.btn-check:active+.btn.btn-active-icon-muted i,.btn-check:checked+.btn.btn-active-icon-muted .svg-icon,.btn-check:checked+.btn.btn-active-icon-muted i,.btn.btn-active-icon-muted.active .svg-icon,.btn.btn-active-icon-muted.active i,.btn.btn-active-icon-muted.show .svg-icon,.btn.btn-active-icon-muted.show i,.btn.btn-active-icon-muted:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-muted:active:not(.btn-active) i,.btn.btn-active-icon-muted:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-muted:focus:not(.btn-active) i,.btn.btn-active-icon-muted:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-muted:hover:not(.btn-active) i,.show>.btn.btn-active-icon-muted .svg-icon,.show>.btn.btn-active-icon-muted i{color:var(--bs-text-muted)}.btn-check:active+.btn.btn-active-icon-muted.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-muted.dropdown-toggle:after,.btn.btn-active-icon-muted.active.dropdown-toggle:after,.btn.btn-active-icon-muted.show.dropdown-toggle:after,.btn.btn-active-icon-muted:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-muted:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-muted:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-muted.dropdown-toggle:after{color:var(--bs-text-muted)}.btn.btn-text-muted{color:var(--bs-text-muted)}.btn-check:active+.btn.btn-active-text-muted,.btn-check:checked+.btn.btn-active-text-muted,.btn.btn-active-text-muted.active,.btn.btn-active-text-muted.show,.btn.btn-active-text-muted:active:not(.btn-active),.btn.btn-active-text-muted:focus:not(.btn-active),.btn.btn-active-text-muted:hover:not(.btn-active),.show>.btn.btn-active-text-muted{color:var(--bs-text-muted)}.btn.btn-color-gray-100{color:var(--bs-text-gray-100)}.btn.btn-color-gray-100 .svg-icon,.btn.btn-color-gray-100 i{color:var(--bs-text-gray-100)}.btn.btn-color-gray-100.dropdown-toggle:after{color:var(--bs-text-gray-100)}.btn-check:active+.btn.btn-active-color-gray-100,.btn-check:checked+.btn.btn-active-color-gray-100,.btn.btn-active-color-gray-100.active,.btn.btn-active-color-gray-100.show,.btn.btn-active-color-gray-100:active:not(.btn-active),.btn.btn-active-color-gray-100:focus:not(.btn-active),.btn.btn-active-color-gray-100:hover:not(.btn-active),.show>.btn.btn-active-color-gray-100{color:var(--bs-text-gray-100)}.btn-check:active+.btn.btn-active-color-gray-100 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-100 i,.btn-check:checked+.btn.btn-active-color-gray-100 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-100 i,.btn.btn-active-color-gray-100.active .svg-icon,.btn.btn-active-color-gray-100.active i,.btn.btn-active-color-gray-100.show .svg-icon,.btn.btn-active-color-gray-100.show i,.btn.btn-active-color-gray-100:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-100:active:not(.btn-active) i,.btn.btn-active-color-gray-100:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-100:focus:not(.btn-active) i,.btn.btn-active-color-gray-100:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-100:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-100 .svg-icon,.show>.btn.btn-active-color-gray-100 i{color:var(--bs-text-gray-100)}.btn-check:active+.btn.btn-active-color-gray-100.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-100.dropdown-toggle:after,.btn.btn-active-color-gray-100.active.dropdown-toggle:after,.btn.btn-active-color-gray-100.show.dropdown-toggle:after,.btn.btn-active-color-gray-100:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-100:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-100:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-100.dropdown-toggle:after{color:var(--bs-text-gray-100)}.btn.btn-icon-gray-100 .svg-icon,.btn.btn-icon-gray-100 i{color:var(--bs-text-gray-100)}.btn.btn-icon-gray-100.dropdown-toggle:after{color:var(--bs-text-gray-100)}.btn-check:active+.btn.btn-active-icon-gray-100 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-100 i,.btn-check:checked+.btn.btn-active-icon-gray-100 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-100 i,.btn.btn-active-icon-gray-100.active .svg-icon,.btn.btn-active-icon-gray-100.active i,.btn.btn-active-icon-gray-100.show .svg-icon,.btn.btn-active-icon-gray-100.show i,.btn.btn-active-icon-gray-100:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-100:active:not(.btn-active) i,.btn.btn-active-icon-gray-100:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-100:focus:not(.btn-active) i,.btn.btn-active-icon-gray-100:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-100:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-100 .svg-icon,.show>.btn.btn-active-icon-gray-100 i{color:var(--bs-text-gray-100)}.btn-check:active+.btn.btn-active-icon-gray-100.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-100.dropdown-toggle:after,.btn.btn-active-icon-gray-100.active.dropdown-toggle:after,.btn.btn-active-icon-gray-100.show.dropdown-toggle:after,.btn.btn-active-icon-gray-100:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-100:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-100:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-100.dropdown-toggle:after{color:var(--bs-text-gray-100)}.btn.btn-text-gray-100{color:var(--bs-text-gray-100)}.btn-check:active+.btn.btn-active-text-gray-100,.btn-check:checked+.btn.btn-active-text-gray-100,.btn.btn-active-text-gray-100.active,.btn.btn-active-text-gray-100.show,.btn.btn-active-text-gray-100:active:not(.btn-active),.btn.btn-active-text-gray-100:focus:not(.btn-active),.btn.btn-active-text-gray-100:hover:not(.btn-active),.show>.btn.btn-active-text-gray-100{color:var(--bs-text-gray-100)}.btn.btn-color-gray-200{color:var(--bs-text-gray-200)}.btn.btn-color-gray-200 .svg-icon,.btn.btn-color-gray-200 i{color:var(--bs-text-gray-200)}.btn.btn-color-gray-200.dropdown-toggle:after{color:var(--bs-text-gray-200)}.btn-check:active+.btn.btn-active-color-gray-200,.btn-check:checked+.btn.btn-active-color-gray-200,.btn.btn-active-color-gray-200.active,.btn.btn-active-color-gray-200.show,.btn.btn-active-color-gray-200:active:not(.btn-active),.btn.btn-active-color-gray-200:focus:not(.btn-active),.btn.btn-active-color-gray-200:hover:not(.btn-active),.show>.btn.btn-active-color-gray-200{color:var(--bs-text-gray-200)}.btn-check:active+.btn.btn-active-color-gray-200 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-200 i,.btn-check:checked+.btn.btn-active-color-gray-200 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-200 i,.btn.btn-active-color-gray-200.active .svg-icon,.btn.btn-active-color-gray-200.active i,.btn.btn-active-color-gray-200.show .svg-icon,.btn.btn-active-color-gray-200.show i,.btn.btn-active-color-gray-200:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-200:active:not(.btn-active) i,.btn.btn-active-color-gray-200:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-200:focus:not(.btn-active) i,.btn.btn-active-color-gray-200:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-200:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-200 .svg-icon,.show>.btn.btn-active-color-gray-200 i{color:var(--bs-text-gray-200)}.btn-check:active+.btn.btn-active-color-gray-200.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-200.dropdown-toggle:after,.btn.btn-active-color-gray-200.active.dropdown-toggle:after,.btn.btn-active-color-gray-200.show.dropdown-toggle:after,.btn.btn-active-color-gray-200:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-200:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-200:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-200.dropdown-toggle:after{color:var(--bs-text-gray-200)}.btn.btn-icon-gray-200 .svg-icon,.btn.btn-icon-gray-200 i{color:var(--bs-text-gray-200)}.btn.btn-icon-gray-200.dropdown-toggle:after{color:var(--bs-text-gray-200)}.btn-check:active+.btn.btn-active-icon-gray-200 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-200 i,.btn-check:checked+.btn.btn-active-icon-gray-200 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-200 i,.btn.btn-active-icon-gray-200.active .svg-icon,.btn.btn-active-icon-gray-200.active i,.btn.btn-active-icon-gray-200.show .svg-icon,.btn.btn-active-icon-gray-200.show i,.btn.btn-active-icon-gray-200:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-200:active:not(.btn-active) i,.btn.btn-active-icon-gray-200:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-200:focus:not(.btn-active) i,.btn.btn-active-icon-gray-200:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-200:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-200 .svg-icon,.show>.btn.btn-active-icon-gray-200 i{color:var(--bs-text-gray-200)}.btn-check:active+.btn.btn-active-icon-gray-200.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-200.dropdown-toggle:after,.btn.btn-active-icon-gray-200.active.dropdown-toggle:after,.btn.btn-active-icon-gray-200.show.dropdown-toggle:after,.btn.btn-active-icon-gray-200:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-200:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-200:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-200.dropdown-toggle:after{color:var(--bs-text-gray-200)}.btn.btn-text-gray-200{color:var(--bs-text-gray-200)}.btn-check:active+.btn.btn-active-text-gray-200,.btn-check:checked+.btn.btn-active-text-gray-200,.btn.btn-active-text-gray-200.active,.btn.btn-active-text-gray-200.show,.btn.btn-active-text-gray-200:active:not(.btn-active),.btn.btn-active-text-gray-200:focus:not(.btn-active),.btn.btn-active-text-gray-200:hover:not(.btn-active),.show>.btn.btn-active-text-gray-200{color:var(--bs-text-gray-200)}.btn.btn-color-gray-300{color:var(--bs-text-gray-300)}.btn.btn-color-gray-300 .svg-icon,.btn.btn-color-gray-300 i{color:var(--bs-text-gray-300)}.btn.btn-color-gray-300.dropdown-toggle:after{color:var(--bs-text-gray-300)}.btn-check:active+.btn.btn-active-color-gray-300,.btn-check:checked+.btn.btn-active-color-gray-300,.btn.btn-active-color-gray-300.active,.btn.btn-active-color-gray-300.show,.btn.btn-active-color-gray-300:active:not(.btn-active),.btn.btn-active-color-gray-300:focus:not(.btn-active),.btn.btn-active-color-gray-300:hover:not(.btn-active),.show>.btn.btn-active-color-gray-300{color:var(--bs-text-gray-300)}.btn-check:active+.btn.btn-active-color-gray-300 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-300 i,.btn-check:checked+.btn.btn-active-color-gray-300 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-300 i,.btn.btn-active-color-gray-300.active .svg-icon,.btn.btn-active-color-gray-300.active i,.btn.btn-active-color-gray-300.show .svg-icon,.btn.btn-active-color-gray-300.show i,.btn.btn-active-color-gray-300:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-300:active:not(.btn-active) i,.btn.btn-active-color-gray-300:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-300:focus:not(.btn-active) i,.btn.btn-active-color-gray-300:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-300:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-300 .svg-icon,.show>.btn.btn-active-color-gray-300 i{color:var(--bs-text-gray-300)}.btn-check:active+.btn.btn-active-color-gray-300.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-300.dropdown-toggle:after,.btn.btn-active-color-gray-300.active.dropdown-toggle:after,.btn.btn-active-color-gray-300.show.dropdown-toggle:after,.btn.btn-active-color-gray-300:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-300:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-300:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-300.dropdown-toggle:after{color:var(--bs-text-gray-300)}.btn.btn-icon-gray-300 .svg-icon,.btn.btn-icon-gray-300 i{color:var(--bs-text-gray-300)}.btn.btn-icon-gray-300.dropdown-toggle:after{color:var(--bs-text-gray-300)}.btn-check:active+.btn.btn-active-icon-gray-300 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-300 i,.btn-check:checked+.btn.btn-active-icon-gray-300 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-300 i,.btn.btn-active-icon-gray-300.active .svg-icon,.btn.btn-active-icon-gray-300.active i,.btn.btn-active-icon-gray-300.show .svg-icon,.btn.btn-active-icon-gray-300.show i,.btn.btn-active-icon-gray-300:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-300:active:not(.btn-active) i,.btn.btn-active-icon-gray-300:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-300:focus:not(.btn-active) i,.btn.btn-active-icon-gray-300:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-300:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-300 .svg-icon,.show>.btn.btn-active-icon-gray-300 i{color:var(--bs-text-gray-300)}.btn-check:active+.btn.btn-active-icon-gray-300.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-300.dropdown-toggle:after,.btn.btn-active-icon-gray-300.active.dropdown-toggle:after,.btn.btn-active-icon-gray-300.show.dropdown-toggle:after,.btn.btn-active-icon-gray-300:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-300:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-300:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-300.dropdown-toggle:after{color:var(--bs-text-gray-300)}.btn.btn-text-gray-300{color:var(--bs-text-gray-300)}.btn-check:active+.btn.btn-active-text-gray-300,.btn-check:checked+.btn.btn-active-text-gray-300,.btn.btn-active-text-gray-300.active,.btn.btn-active-text-gray-300.show,.btn.btn-active-text-gray-300:active:not(.btn-active),.btn.btn-active-text-gray-300:focus:not(.btn-active),.btn.btn-active-text-gray-300:hover:not(.btn-active),.show>.btn.btn-active-text-gray-300{color:var(--bs-text-gray-300)}.btn.btn-color-gray-400{color:var(--bs-text-gray-400)}.btn.btn-color-gray-400 .svg-icon,.btn.btn-color-gray-400 i{color:var(--bs-text-gray-400)}.btn.btn-color-gray-400.dropdown-toggle:after{color:var(--bs-text-gray-400)}.btn-check:active+.btn.btn-active-color-gray-400,.btn-check:checked+.btn.btn-active-color-gray-400,.btn.btn-active-color-gray-400.active,.btn.btn-active-color-gray-400.show,.btn.btn-active-color-gray-400:active:not(.btn-active),.btn.btn-active-color-gray-400:focus:not(.btn-active),.btn.btn-active-color-gray-400:hover:not(.btn-active),.show>.btn.btn-active-color-gray-400{color:var(--bs-text-gray-400)}.btn-check:active+.btn.btn-active-color-gray-400 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-400 i,.btn-check:checked+.btn.btn-active-color-gray-400 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-400 i,.btn.btn-active-color-gray-400.active .svg-icon,.btn.btn-active-color-gray-400.active i,.btn.btn-active-color-gray-400.show .svg-icon,.btn.btn-active-color-gray-400.show i,.btn.btn-active-color-gray-400:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-400:active:not(.btn-active) i,.btn.btn-active-color-gray-400:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-400:focus:not(.btn-active) i,.btn.btn-active-color-gray-400:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-400:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-400 .svg-icon,.show>.btn.btn-active-color-gray-400 i{color:var(--bs-text-gray-400)}.btn-check:active+.btn.btn-active-color-gray-400.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-400.dropdown-toggle:after,.btn.btn-active-color-gray-400.active.dropdown-toggle:after,.btn.btn-active-color-gray-400.show.dropdown-toggle:after,.btn.btn-active-color-gray-400:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-400:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-400:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-400.dropdown-toggle:after{color:var(--bs-text-gray-400)}.btn.btn-icon-gray-400 .svg-icon,.btn.btn-icon-gray-400 i{color:var(--bs-text-gray-400)}.btn.btn-icon-gray-400.dropdown-toggle:after{color:var(--bs-text-gray-400)}.btn-check:active+.btn.btn-active-icon-gray-400 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-400 i,.btn-check:checked+.btn.btn-active-icon-gray-400 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-400 i,.btn.btn-active-icon-gray-400.active .svg-icon,.btn.btn-active-icon-gray-400.active i,.btn.btn-active-icon-gray-400.show .svg-icon,.btn.btn-active-icon-gray-400.show i,.btn.btn-active-icon-gray-400:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-400:active:not(.btn-active) i,.btn.btn-active-icon-gray-400:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-400:focus:not(.btn-active) i,.btn.btn-active-icon-gray-400:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-400:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-400 .svg-icon,.show>.btn.btn-active-icon-gray-400 i{color:var(--bs-text-gray-400)}.btn-check:active+.btn.btn-active-icon-gray-400.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-400.dropdown-toggle:after,.btn.btn-active-icon-gray-400.active.dropdown-toggle:after,.btn.btn-active-icon-gray-400.show.dropdown-toggle:after,.btn.btn-active-icon-gray-400:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-400:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-400:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-400.dropdown-toggle:after{color:var(--bs-text-gray-400)}.btn.btn-text-gray-400{color:var(--bs-text-gray-400)}.btn-check:active+.btn.btn-active-text-gray-400,.btn-check:checked+.btn.btn-active-text-gray-400,.btn.btn-active-text-gray-400.active,.btn.btn-active-text-gray-400.show,.btn.btn-active-text-gray-400:active:not(.btn-active),.btn.btn-active-text-gray-400:focus:not(.btn-active),.btn.btn-active-text-gray-400:hover:not(.btn-active),.show>.btn.btn-active-text-gray-400{color:var(--bs-text-gray-400)}.btn.btn-color-gray-500{color:var(--bs-text-gray-500)}.btn.btn-color-gray-500 .svg-icon,.btn.btn-color-gray-500 i{color:var(--bs-text-gray-500)}.btn.btn-color-gray-500.dropdown-toggle:after{color:var(--bs-text-gray-500)}.btn-check:active+.btn.btn-active-color-gray-500,.btn-check:checked+.btn.btn-active-color-gray-500,.btn.btn-active-color-gray-500.active,.btn.btn-active-color-gray-500.show,.btn.btn-active-color-gray-500:active:not(.btn-active),.btn.btn-active-color-gray-500:focus:not(.btn-active),.btn.btn-active-color-gray-500:hover:not(.btn-active),.show>.btn.btn-active-color-gray-500{color:var(--bs-text-gray-500)}.btn-check:active+.btn.btn-active-color-gray-500 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-500 i,.btn-check:checked+.btn.btn-active-color-gray-500 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-500 i,.btn.btn-active-color-gray-500.active .svg-icon,.btn.btn-active-color-gray-500.active i,.btn.btn-active-color-gray-500.show .svg-icon,.btn.btn-active-color-gray-500.show i,.btn.btn-active-color-gray-500:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-500:active:not(.btn-active) i,.btn.btn-active-color-gray-500:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-500:focus:not(.btn-active) i,.btn.btn-active-color-gray-500:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-500:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-500 .svg-icon,.show>.btn.btn-active-color-gray-500 i{color:var(--bs-text-gray-500)}.btn-check:active+.btn.btn-active-color-gray-500.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-500.dropdown-toggle:after,.btn.btn-active-color-gray-500.active.dropdown-toggle:after,.btn.btn-active-color-gray-500.show.dropdown-toggle:after,.btn.btn-active-color-gray-500:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-500:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-500:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-500.dropdown-toggle:after{color:var(--bs-text-gray-500)}.btn.btn-icon-gray-500 .svg-icon,.btn.btn-icon-gray-500 i{color:var(--bs-text-gray-500)}.btn.btn-icon-gray-500.dropdown-toggle:after{color:var(--bs-text-gray-500)}.btn-check:active+.btn.btn-active-icon-gray-500 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-500 i,.btn-check:checked+.btn.btn-active-icon-gray-500 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-500 i,.btn.btn-active-icon-gray-500.active .svg-icon,.btn.btn-active-icon-gray-500.active i,.btn.btn-active-icon-gray-500.show .svg-icon,.btn.btn-active-icon-gray-500.show i,.btn.btn-active-icon-gray-500:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-500:active:not(.btn-active) i,.btn.btn-active-icon-gray-500:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-500:focus:not(.btn-active) i,.btn.btn-active-icon-gray-500:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-500:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-500 .svg-icon,.show>.btn.btn-active-icon-gray-500 i{color:var(--bs-text-gray-500)}.btn-check:active+.btn.btn-active-icon-gray-500.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-500.dropdown-toggle:after,.btn.btn-active-icon-gray-500.active.dropdown-toggle:after,.btn.btn-active-icon-gray-500.show.dropdown-toggle:after,.btn.btn-active-icon-gray-500:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-500:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-500:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-500.dropdown-toggle:after{color:var(--bs-text-gray-500)}.btn.btn-text-gray-500{color:var(--bs-text-gray-500)}.btn-check:active+.btn.btn-active-text-gray-500,.btn-check:checked+.btn.btn-active-text-gray-500,.btn.btn-active-text-gray-500.active,.btn.btn-active-text-gray-500.show,.btn.btn-active-text-gray-500:active:not(.btn-active),.btn.btn-active-text-gray-500:focus:not(.btn-active),.btn.btn-active-text-gray-500:hover:not(.btn-active),.show>.btn.btn-active-text-gray-500{color:var(--bs-text-gray-500)}.btn.btn-color-gray-600{color:var(--bs-text-gray-600)}.btn.btn-color-gray-600 .svg-icon,.btn.btn-color-gray-600 i{color:var(--bs-text-gray-600)}.btn.btn-color-gray-600.dropdown-toggle:after{color:var(--bs-text-gray-600)}.btn-check:active+.btn.btn-active-color-gray-600,.btn-check:checked+.btn.btn-active-color-gray-600,.btn.btn-active-color-gray-600.active,.btn.btn-active-color-gray-600.show,.btn.btn-active-color-gray-600:active:not(.btn-active),.btn.btn-active-color-gray-600:focus:not(.btn-active),.btn.btn-active-color-gray-600:hover:not(.btn-active),.show>.btn.btn-active-color-gray-600{color:var(--bs-text-gray-600)}.btn-check:active+.btn.btn-active-color-gray-600 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-600 i,.btn-check:checked+.btn.btn-active-color-gray-600 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-600 i,.btn.btn-active-color-gray-600.active .svg-icon,.btn.btn-active-color-gray-600.active i,.btn.btn-active-color-gray-600.show .svg-icon,.btn.btn-active-color-gray-600.show i,.btn.btn-active-color-gray-600:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-600:active:not(.btn-active) i,.btn.btn-active-color-gray-600:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-600:focus:not(.btn-active) i,.btn.btn-active-color-gray-600:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-600:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-600 .svg-icon,.show>.btn.btn-active-color-gray-600 i{color:var(--bs-text-gray-600)}.btn-check:active+.btn.btn-active-color-gray-600.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-600.dropdown-toggle:after,.btn.btn-active-color-gray-600.active.dropdown-toggle:after,.btn.btn-active-color-gray-600.show.dropdown-toggle:after,.btn.btn-active-color-gray-600:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-600:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-600:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-600.dropdown-toggle:after{color:var(--bs-text-gray-600)}.btn.btn-icon-gray-600 .svg-icon,.btn.btn-icon-gray-600 i{color:var(--bs-text-gray-600)}.btn.btn-icon-gray-600.dropdown-toggle:after{color:var(--bs-text-gray-600)}.btn-check:active+.btn.btn-active-icon-gray-600 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-600 i,.btn-check:checked+.btn.btn-active-icon-gray-600 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-600 i,.btn.btn-active-icon-gray-600.active .svg-icon,.btn.btn-active-icon-gray-600.active i,.btn.btn-active-icon-gray-600.show .svg-icon,.btn.btn-active-icon-gray-600.show i,.btn.btn-active-icon-gray-600:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-600:active:not(.btn-active) i,.btn.btn-active-icon-gray-600:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-600:focus:not(.btn-active) i,.btn.btn-active-icon-gray-600:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-600:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-600 .svg-icon,.show>.btn.btn-active-icon-gray-600 i{color:var(--bs-text-gray-600)}.btn-check:active+.btn.btn-active-icon-gray-600.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-600.dropdown-toggle:after,.btn.btn-active-icon-gray-600.active.dropdown-toggle:after,.btn.btn-active-icon-gray-600.show.dropdown-toggle:after,.btn.btn-active-icon-gray-600:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-600:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-600:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-600.dropdown-toggle:after{color:var(--bs-text-gray-600)}.btn.btn-text-gray-600{color:var(--bs-text-gray-600)}.btn-check:active+.btn.btn-active-text-gray-600,.btn-check:checked+.btn.btn-active-text-gray-600,.btn.btn-active-text-gray-600.active,.btn.btn-active-text-gray-600.show,.btn.btn-active-text-gray-600:active:not(.btn-active),.btn.btn-active-text-gray-600:focus:not(.btn-active),.btn.btn-active-text-gray-600:hover:not(.btn-active),.show>.btn.btn-active-text-gray-600{color:var(--bs-text-gray-600)}.btn.btn-color-gray-700{color:var(--bs-text-gray-700)}.btn.btn-color-gray-700 .svg-icon,.btn.btn-color-gray-700 i{color:var(--bs-text-gray-700)}.btn.btn-color-gray-700.dropdown-toggle:after{color:var(--bs-text-gray-700)}.btn-check:active+.btn.btn-active-color-gray-700,.btn-check:checked+.btn.btn-active-color-gray-700,.btn.btn-active-color-gray-700.active,.btn.btn-active-color-gray-700.show,.btn.btn-active-color-gray-700:active:not(.btn-active),.btn.btn-active-color-gray-700:focus:not(.btn-active),.btn.btn-active-color-gray-700:hover:not(.btn-active),.show>.btn.btn-active-color-gray-700{color:var(--bs-text-gray-700)}.btn-check:active+.btn.btn-active-color-gray-700 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-700 i,.btn-check:checked+.btn.btn-active-color-gray-700 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-700 i,.btn.btn-active-color-gray-700.active .svg-icon,.btn.btn-active-color-gray-700.active i,.btn.btn-active-color-gray-700.show .svg-icon,.btn.btn-active-color-gray-700.show i,.btn.btn-active-color-gray-700:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-700:active:not(.btn-active) i,.btn.btn-active-color-gray-700:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-700:focus:not(.btn-active) i,.btn.btn-active-color-gray-700:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-700:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-700 .svg-icon,.show>.btn.btn-active-color-gray-700 i{color:var(--bs-text-gray-700)}.btn-check:active+.btn.btn-active-color-gray-700.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-700.dropdown-toggle:after,.btn.btn-active-color-gray-700.active.dropdown-toggle:after,.btn.btn-active-color-gray-700.show.dropdown-toggle:after,.btn.btn-active-color-gray-700:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-700:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-700:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-700.dropdown-toggle:after{color:var(--bs-text-gray-700)}.btn.btn-icon-gray-700 .svg-icon,.btn.btn-icon-gray-700 i{color:var(--bs-text-gray-700)}.btn.btn-icon-gray-700.dropdown-toggle:after{color:var(--bs-text-gray-700)}.btn-check:active+.btn.btn-active-icon-gray-700 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-700 i,.btn-check:checked+.btn.btn-active-icon-gray-700 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-700 i,.btn.btn-active-icon-gray-700.active .svg-icon,.btn.btn-active-icon-gray-700.active i,.btn.btn-active-icon-gray-700.show .svg-icon,.btn.btn-active-icon-gray-700.show i,.btn.btn-active-icon-gray-700:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-700:active:not(.btn-active) i,.btn.btn-active-icon-gray-700:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-700:focus:not(.btn-active) i,.btn.btn-active-icon-gray-700:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-700:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-700 .svg-icon,.show>.btn.btn-active-icon-gray-700 i{color:var(--bs-text-gray-700)}.btn-check:active+.btn.btn-active-icon-gray-700.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-700.dropdown-toggle:after,.btn.btn-active-icon-gray-700.active.dropdown-toggle:after,.btn.btn-active-icon-gray-700.show.dropdown-toggle:after,.btn.btn-active-icon-gray-700:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-700:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-700:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-700.dropdown-toggle:after{color:var(--bs-text-gray-700)}.btn.btn-text-gray-700{color:var(--bs-text-gray-700)}.btn-check:active+.btn.btn-active-text-gray-700,.btn-check:checked+.btn.btn-active-text-gray-700,.btn.btn-active-text-gray-700.active,.btn.btn-active-text-gray-700.show,.btn.btn-active-text-gray-700:active:not(.btn-active),.btn.btn-active-text-gray-700:focus:not(.btn-active),.btn.btn-active-text-gray-700:hover:not(.btn-active),.show>.btn.btn-active-text-gray-700{color:var(--bs-text-gray-700)}.btn.btn-color-gray-800{color:var(--bs-text-gray-800)}.btn.btn-color-gray-800 .svg-icon,.btn.btn-color-gray-800 i{color:var(--bs-text-gray-800)}.btn.btn-color-gray-800.dropdown-toggle:after{color:var(--bs-text-gray-800)}.btn-check:active+.btn.btn-active-color-gray-800,.btn-check:checked+.btn.btn-active-color-gray-800,.btn.btn-active-color-gray-800.active,.btn.btn-active-color-gray-800.show,.btn.btn-active-color-gray-800:active:not(.btn-active),.btn.btn-active-color-gray-800:focus:not(.btn-active),.btn.btn-active-color-gray-800:hover:not(.btn-active),.show>.btn.btn-active-color-gray-800{color:var(--bs-text-gray-800)}.btn-check:active+.btn.btn-active-color-gray-800 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-800 i,.btn-check:checked+.btn.btn-active-color-gray-800 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-800 i,.btn.btn-active-color-gray-800.active .svg-icon,.btn.btn-active-color-gray-800.active i,.btn.btn-active-color-gray-800.show .svg-icon,.btn.btn-active-color-gray-800.show i,.btn.btn-active-color-gray-800:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-800:active:not(.btn-active) i,.btn.btn-active-color-gray-800:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-800:focus:not(.btn-active) i,.btn.btn-active-color-gray-800:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-800:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-800 .svg-icon,.show>.btn.btn-active-color-gray-800 i{color:var(--bs-text-gray-800)}.btn-check:active+.btn.btn-active-color-gray-800.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-800.dropdown-toggle:after,.btn.btn-active-color-gray-800.active.dropdown-toggle:after,.btn.btn-active-color-gray-800.show.dropdown-toggle:after,.btn.btn-active-color-gray-800:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-800:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-800:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-800.dropdown-toggle:after{color:var(--bs-text-gray-800)}.btn.btn-icon-gray-800 .svg-icon,.btn.btn-icon-gray-800 i{color:var(--bs-text-gray-800)}.btn.btn-icon-gray-800.dropdown-toggle:after{color:var(--bs-text-gray-800)}.btn-check:active+.btn.btn-active-icon-gray-800 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-800 i,.btn-check:checked+.btn.btn-active-icon-gray-800 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-800 i,.btn.btn-active-icon-gray-800.active .svg-icon,.btn.btn-active-icon-gray-800.active i,.btn.btn-active-icon-gray-800.show .svg-icon,.btn.btn-active-icon-gray-800.show i,.btn.btn-active-icon-gray-800:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-800:active:not(.btn-active) i,.btn.btn-active-icon-gray-800:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-800:focus:not(.btn-active) i,.btn.btn-active-icon-gray-800:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-800:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-800 .svg-icon,.show>.btn.btn-active-icon-gray-800 i{color:var(--bs-text-gray-800)}.btn-check:active+.btn.btn-active-icon-gray-800.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-800.dropdown-toggle:after,.btn.btn-active-icon-gray-800.active.dropdown-toggle:after,.btn.btn-active-icon-gray-800.show.dropdown-toggle:after,.btn.btn-active-icon-gray-800:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-800:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-800:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-800.dropdown-toggle:after{color:var(--bs-text-gray-800)}.btn.btn-text-gray-800{color:var(--bs-text-gray-800)}.btn-check:active+.btn.btn-active-text-gray-800,.btn-check:checked+.btn.btn-active-text-gray-800,.btn.btn-active-text-gray-800.active,.btn.btn-active-text-gray-800.show,.btn.btn-active-text-gray-800:active:not(.btn-active),.btn.btn-active-text-gray-800:focus:not(.btn-active),.btn.btn-active-text-gray-800:hover:not(.btn-active),.show>.btn.btn-active-text-gray-800{color:var(--bs-text-gray-800)}.btn.btn-color-gray-900{color:var(--bs-text-gray-900)}.btn.btn-color-gray-900 .svg-icon,.btn.btn-color-gray-900 i{color:var(--bs-text-gray-900)}.btn.btn-color-gray-900.dropdown-toggle:after{color:var(--bs-text-gray-900)}.btn-check:active+.btn.btn-active-color-gray-900,.btn-check:checked+.btn.btn-active-color-gray-900,.btn.btn-active-color-gray-900.active,.btn.btn-active-color-gray-900.show,.btn.btn-active-color-gray-900:active:not(.btn-active),.btn.btn-active-color-gray-900:focus:not(.btn-active),.btn.btn-active-color-gray-900:hover:not(.btn-active),.show>.btn.btn-active-color-gray-900{color:var(--bs-text-gray-900)}.btn-check:active+.btn.btn-active-color-gray-900 .svg-icon,.btn-check:active+.btn.btn-active-color-gray-900 i,.btn-check:checked+.btn.btn-active-color-gray-900 .svg-icon,.btn-check:checked+.btn.btn-active-color-gray-900 i,.btn.btn-active-color-gray-900.active .svg-icon,.btn.btn-active-color-gray-900.active i,.btn.btn-active-color-gray-900.show .svg-icon,.btn.btn-active-color-gray-900.show i,.btn.btn-active-color-gray-900:active:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-900:active:not(.btn-active) i,.btn.btn-active-color-gray-900:focus:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-900:focus:not(.btn-active) i,.btn.btn-active-color-gray-900:hover:not(.btn-active) .svg-icon,.btn.btn-active-color-gray-900:hover:not(.btn-active) i,.show>.btn.btn-active-color-gray-900 .svg-icon,.show>.btn.btn-active-color-gray-900 i{color:var(--bs-text-gray-900)}.btn-check:active+.btn.btn-active-color-gray-900.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-color-gray-900.dropdown-toggle:after,.btn.btn-active-color-gray-900.active.dropdown-toggle:after,.btn.btn-active-color-gray-900.show.dropdown-toggle:after,.btn.btn-active-color-gray-900:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-900:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-color-gray-900:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-color-gray-900.dropdown-toggle:after{color:var(--bs-text-gray-900)}.btn.btn-icon-gray-900 .svg-icon,.btn.btn-icon-gray-900 i{color:var(--bs-text-gray-900)}.btn.btn-icon-gray-900.dropdown-toggle:after{color:var(--bs-text-gray-900)}.btn-check:active+.btn.btn-active-icon-gray-900 .svg-icon,.btn-check:active+.btn.btn-active-icon-gray-900 i,.btn-check:checked+.btn.btn-active-icon-gray-900 .svg-icon,.btn-check:checked+.btn.btn-active-icon-gray-900 i,.btn.btn-active-icon-gray-900.active .svg-icon,.btn.btn-active-icon-gray-900.active i,.btn.btn-active-icon-gray-900.show .svg-icon,.btn.btn-active-icon-gray-900.show i,.btn.btn-active-icon-gray-900:active:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-900:active:not(.btn-active) i,.btn.btn-active-icon-gray-900:focus:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-900:focus:not(.btn-active) i,.btn.btn-active-icon-gray-900:hover:not(.btn-active) .svg-icon,.btn.btn-active-icon-gray-900:hover:not(.btn-active) i,.show>.btn.btn-active-icon-gray-900 .svg-icon,.show>.btn.btn-active-icon-gray-900 i{color:var(--bs-text-gray-900)}.btn-check:active+.btn.btn-active-icon-gray-900.dropdown-toggle:after,.btn-check:checked+.btn.btn-active-icon-gray-900.dropdown-toggle:after,.btn.btn-active-icon-gray-900.active.dropdown-toggle:after,.btn.btn-active-icon-gray-900.show.dropdown-toggle:after,.btn.btn-active-icon-gray-900:active:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-900:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-active-icon-gray-900:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-active-icon-gray-900.dropdown-toggle:after{color:var(--bs-text-gray-900)}.btn.btn-text-gray-900{color:var(--bs-text-gray-900)}.btn-check:active+.btn.btn-active-text-gray-900,.btn-check:checked+.btn.btn-active-text-gray-900,.btn.btn-active-text-gray-900.active,.btn.btn-active-text-gray-900.show,.btn.btn-active-text-gray-900:active:not(.btn-active),.btn.btn-active-text-gray-900:focus:not(.btn-active),.btn.btn-active-text-gray-900:hover:not(.btn-active),.show>.btn.btn-active-text-gray-900{color:var(--bs-text-gray-900)}.btn.btn-facebook{color:#fff;border-color:#3b5998;background-color:#3b5998}.btn.btn-facebook .svg-icon,.btn.btn-facebook i{color:#fff}.btn.btn-facebook.dropdown-toggle:after{color:#fff}.btn-check:active+.btn.btn-facebook,.btn-check:checked+.btn.btn-facebook,.btn.btn-facebook.active,.btn.btn-facebook.show,.btn.btn-facebook:active:not(.btn-active),.btn.btn-facebook:focus:not(.btn-active),.btn.btn-facebook:hover:not(.btn-active),.show>.btn.btn-facebook{border-color:#30497c;background-color:#30497c!important}.btn.btn-light-facebook{color:var(--bs-facebook);color:#3b5998;border-color:rgba(59,89,152,.1);background-color:rgba(59,89,152,.1)}.btn.btn-light-facebook .svg-icon,.btn.btn-light-facebook i{color:#3b5998}.btn.btn-light-facebook.dropdown-toggle:after{color:#3b5998}.btn-check:active+.btn.btn-light-facebook,.btn-check:checked+.btn.btn-light-facebook,.btn.btn-light-facebook.active,.btn.btn-light-facebook.show,.btn.btn-light-facebook:active:not(.btn-active),.btn.btn-light-facebook:focus:not(.btn-active),.btn.btn-light-facebook:hover:not(.btn-active),.show>.btn.btn-light-facebook{color:#fff;border-color:#3b5998;background-color:#3b5998!important}.btn-check:active+.btn.btn-light-facebook .svg-icon,.btn-check:active+.btn.btn-light-facebook i,.btn-check:checked+.btn.btn-light-facebook .svg-icon,.btn-check:checked+.btn.btn-light-facebook i,.btn.btn-light-facebook.active .svg-icon,.btn.btn-light-facebook.active i,.btn.btn-light-facebook.show .svg-icon,.btn.btn-light-facebook.show i,.btn.btn-light-facebook:active:not(.btn-active) .svg-icon,.btn.btn-light-facebook:active:not(.btn-active) i,.btn.btn-light-facebook:focus:not(.btn-active) .svg-icon,.btn.btn-light-facebook:focus:not(.btn-active) i,.btn.btn-light-facebook:hover:not(.btn-active) .svg-icon,.btn.btn-light-facebook:hover:not(.btn-active) i,.show>.btn.btn-light-facebook .svg-icon,.show>.btn.btn-light-facebook i{color:#fff}.btn-check:active+.btn.btn-light-facebook.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-facebook.dropdown-toggle:after,.btn.btn-light-facebook.active.dropdown-toggle:after,.btn.btn-light-facebook.show.dropdown-toggle:after,.btn.btn-light-facebook:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-facebook:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-facebook:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-facebook.dropdown-toggle:after{color:#fff}.btn.btn-google{color:#fff;border-color:#dd4b39;background-color:#dd4b39}.btn.btn-google .svg-icon,.btn.btn-google i{color:#fff}.btn.btn-google.dropdown-toggle:after{color:#fff}.btn-check:active+.btn.btn-google,.btn-check:checked+.btn.btn-google,.btn.btn-google.active,.btn.btn-google.show,.btn.btn-google:active:not(.btn-active),.btn.btn-google:focus:not(.btn-active),.btn.btn-google:hover:not(.btn-active),.show>.btn.btn-google{border-color:#cd3623;background-color:#cd3623!important}.btn.btn-light-google{color:var(--bs-google);color:#dd4b39;border-color:rgba(221,75,57,.1);background-color:rgba(221,75,57,.1)}.btn.btn-light-google .svg-icon,.btn.btn-light-google i{color:#dd4b39}.btn.btn-light-google.dropdown-toggle:after{color:#dd4b39}.btn-check:active+.btn.btn-light-google,.btn-check:checked+.btn.btn-light-google,.btn.btn-light-google.active,.btn.btn-light-google.show,.btn.btn-light-google:active:not(.btn-active),.btn.btn-light-google:focus:not(.btn-active),.btn.btn-light-google:hover:not(.btn-active),.show>.btn.btn-light-google{color:#fff;border-color:#dd4b39;background-color:#dd4b39!important}.btn-check:active+.btn.btn-light-google .svg-icon,.btn-check:active+.btn.btn-light-google i,.btn-check:checked+.btn.btn-light-google .svg-icon,.btn-check:checked+.btn.btn-light-google i,.btn.btn-light-google.active .svg-icon,.btn.btn-light-google.active i,.btn.btn-light-google.show .svg-icon,.btn.btn-light-google.show i,.btn.btn-light-google:active:not(.btn-active) .svg-icon,.btn.btn-light-google:active:not(.btn-active) i,.btn.btn-light-google:focus:not(.btn-active) .svg-icon,.btn.btn-light-google:focus:not(.btn-active) i,.btn.btn-light-google:hover:not(.btn-active) .svg-icon,.btn.btn-light-google:hover:not(.btn-active) i,.show>.btn.btn-light-google .svg-icon,.show>.btn.btn-light-google i{color:#fff}.btn-check:active+.btn.btn-light-google.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-google.dropdown-toggle:after,.btn.btn-light-google.active.dropdown-toggle:after,.btn.btn-light-google.show.dropdown-toggle:after,.btn.btn-light-google:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-google:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-google:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-google.dropdown-toggle:after{color:#fff}.btn.btn-twitter{color:#fff;border-color:#1da1f2;background-color:#1da1f2}.btn.btn-twitter .svg-icon,.btn.btn-twitter i{color:#fff}.btn.btn-twitter.dropdown-toggle:after{color:#fff}.btn-check:active+.btn.btn-twitter,.btn-check:checked+.btn.btn-twitter,.btn.btn-twitter.active,.btn.btn-twitter.show,.btn.btn-twitter:active:not(.btn-active),.btn.btn-twitter:focus:not(.btn-active),.btn.btn-twitter:hover:not(.btn-active),.show>.btn.btn-twitter{border-color:#0d8ddc;background-color:#0d8ddc!important}.btn.btn-light-twitter{color:var(--bs-twitter);color:#1da1f2;border-color:rgba(29,161,242,.1);background-color:rgba(29,161,242,.1)}.btn.btn-light-twitter .svg-icon,.btn.btn-light-twitter i{color:#1da1f2}.btn.btn-light-twitter.dropdown-toggle:after{color:#1da1f2}.btn-check:active+.btn.btn-light-twitter,.btn-check:checked+.btn.btn-light-twitter,.btn.btn-light-twitter.active,.btn.btn-light-twitter.show,.btn.btn-light-twitter:active:not(.btn-active),.btn.btn-light-twitter:focus:not(.btn-active),.btn.btn-light-twitter:hover:not(.btn-active),.show>.btn.btn-light-twitter{color:#fff;border-color:#1da1f2;background-color:#1da1f2!important}.btn-check:active+.btn.btn-light-twitter .svg-icon,.btn-check:active+.btn.btn-light-twitter i,.btn-check:checked+.btn.btn-light-twitter .svg-icon,.btn-check:checked+.btn.btn-light-twitter i,.btn.btn-light-twitter.active .svg-icon,.btn.btn-light-twitter.active i,.btn.btn-light-twitter.show .svg-icon,.btn.btn-light-twitter.show i,.btn.btn-light-twitter:active:not(.btn-active) .svg-icon,.btn.btn-light-twitter:active:not(.btn-active) i,.btn.btn-light-twitter:focus:not(.btn-active) .svg-icon,.btn.btn-light-twitter:focus:not(.btn-active) i,.btn.btn-light-twitter:hover:not(.btn-active) .svg-icon,.btn.btn-light-twitter:hover:not(.btn-active) i,.show>.btn.btn-light-twitter .svg-icon,.show>.btn.btn-light-twitter i{color:#fff}.btn-check:active+.btn.btn-light-twitter.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-twitter.dropdown-toggle:after,.btn.btn-light-twitter.active.dropdown-toggle:after,.btn.btn-light-twitter.show.dropdown-toggle:after,.btn.btn-light-twitter:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-twitter:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-twitter:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-twitter.dropdown-toggle:after{color:#fff}.btn.btn-instagram{color:#fff;border-color:#e1306c;background-color:#e1306c}.btn.btn-instagram .svg-icon,.btn.btn-instagram i{color:#fff}.btn.btn-instagram.dropdown-toggle:after{color:#fff}.btn-check:active+.btn.btn-instagram,.btn-check:checked+.btn.btn-instagram,.btn.btn-instagram.active,.btn.btn-instagram.show,.btn.btn-instagram:active:not(.btn-active),.btn.btn-instagram:focus:not(.btn-active),.btn.btn-instagram:hover:not(.btn-active),.show>.btn.btn-instagram{border-color:#cd1e59;background-color:#cd1e59!important}.btn.btn-light-instagram{color:var(--bs-instagram);color:#e1306c;border-color:rgba(225,48,108,.1);background-color:rgba(225,48,108,.1)}.btn.btn-light-instagram .svg-icon,.btn.btn-light-instagram i{color:#e1306c}.btn.btn-light-instagram.dropdown-toggle:after{color:#e1306c}.btn-check:active+.btn.btn-light-instagram,.btn-check:checked+.btn.btn-light-instagram,.btn.btn-light-instagram.active,.btn.btn-light-instagram.show,.btn.btn-light-instagram:active:not(.btn-active),.btn.btn-light-instagram:focus:not(.btn-active),.btn.btn-light-instagram:hover:not(.btn-active),.show>.btn.btn-light-instagram{color:#fff;border-color:#e1306c;background-color:#e1306c!important}.btn-check:active+.btn.btn-light-instagram .svg-icon,.btn-check:active+.btn.btn-light-instagram i,.btn-check:checked+.btn.btn-light-instagram .svg-icon,.btn-check:checked+.btn.btn-light-instagram i,.btn.btn-light-instagram.active .svg-icon,.btn.btn-light-instagram.active i,.btn.btn-light-instagram.show .svg-icon,.btn.btn-light-instagram.show i,.btn.btn-light-instagram:active:not(.btn-active) .svg-icon,.btn.btn-light-instagram:active:not(.btn-active) i,.btn.btn-light-instagram:focus:not(.btn-active) .svg-icon,.btn.btn-light-instagram:focus:not(.btn-active) i,.btn.btn-light-instagram:hover:not(.btn-active) .svg-icon,.btn.btn-light-instagram:hover:not(.btn-active) i,.show>.btn.btn-light-instagram .svg-icon,.show>.btn.btn-light-instagram i{color:#fff}.btn-check:active+.btn.btn-light-instagram.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-instagram.dropdown-toggle:after,.btn.btn-light-instagram.active.dropdown-toggle:after,.btn.btn-light-instagram.show.dropdown-toggle:after,.btn.btn-light-instagram:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-instagram:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-instagram:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-instagram.dropdown-toggle:after{color:#fff}.btn.btn-youtube{color:#fff;border-color:red;background-color:red}.btn.btn-youtube .svg-icon,.btn.btn-youtube i{color:#fff}.btn.btn-youtube.dropdown-toggle:after{color:#fff}.btn-check:active+.btn.btn-youtube,.btn-check:checked+.btn.btn-youtube,.btn.btn-youtube.active,.btn.btn-youtube.show,.btn.btn-youtube:active:not(.btn-active),.btn.btn-youtube:focus:not(.btn-active),.btn.btn-youtube:hover:not(.btn-active),.show>.btn.btn-youtube{border-color:#d90000;background-color:#d90000!important}.btn.btn-light-youtube{color:var(--bs-youtube);color:red;border-color:rgba(255,0,0,.1);background-color:rgba(255,0,0,.1)}.btn.btn-light-youtube .svg-icon,.btn.btn-light-youtube i{color:red}.btn.btn-light-youtube.dropdown-toggle:after{color:red}.btn-check:active+.btn.btn-light-youtube,.btn-check:checked+.btn.btn-light-youtube,.btn.btn-light-youtube.active,.btn.btn-light-youtube.show,.btn.btn-light-youtube:active:not(.btn-active),.btn.btn-light-youtube:focus:not(.btn-active),.btn.btn-light-youtube:hover:not(.btn-active),.show>.btn.btn-light-youtube{color:#fff;border-color:red;background-color:red!important}.btn-check:active+.btn.btn-light-youtube .svg-icon,.btn-check:active+.btn.btn-light-youtube i,.btn-check:checked+.btn.btn-light-youtube .svg-icon,.btn-check:checked+.btn.btn-light-youtube i,.btn.btn-light-youtube.active .svg-icon,.btn.btn-light-youtube.active i,.btn.btn-light-youtube.show .svg-icon,.btn.btn-light-youtube.show i,.btn.btn-light-youtube:active:not(.btn-active) .svg-icon,.btn.btn-light-youtube:active:not(.btn-active) i,.btn.btn-light-youtube:focus:not(.btn-active) .svg-icon,.btn.btn-light-youtube:focus:not(.btn-active) i,.btn.btn-light-youtube:hover:not(.btn-active) .svg-icon,.btn.btn-light-youtube:hover:not(.btn-active) i,.show>.btn.btn-light-youtube .svg-icon,.show>.btn.btn-light-youtube i{color:#fff}.btn-check:active+.btn.btn-light-youtube.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-youtube.dropdown-toggle:after,.btn.btn-light-youtube.active.dropdown-toggle:after,.btn.btn-light-youtube.show.dropdown-toggle:after,.btn.btn-light-youtube:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-youtube:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-youtube:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-youtube.dropdown-toggle:after{color:#fff}.btn.btn-linkedin{color:#fff;border-color:#0077b5;background-color:#0077b5}.btn.btn-linkedin .svg-icon,.btn.btn-linkedin i{color:#fff}.btn.btn-linkedin.dropdown-toggle:after{color:#fff}.btn-check:active+.btn.btn-linkedin,.btn-check:checked+.btn.btn-linkedin,.btn.btn-linkedin.active,.btn.btn-linkedin.show,.btn.btn-linkedin:active:not(.btn-active),.btn.btn-linkedin:focus:not(.btn-active),.btn.btn-linkedin:hover:not(.btn-active),.show>.btn.btn-linkedin{border-color:#005e8f;background-color:#005e8f!important}.btn.btn-light-linkedin{color:var(--bs-linkedin);color:#0077b5;border-color:rgba(0,119,181,.1);background-color:rgba(0,119,181,.1)}.btn.btn-light-linkedin .svg-icon,.btn.btn-light-linkedin i{color:#0077b5}.btn.btn-light-linkedin.dropdown-toggle:after{color:#0077b5}.btn-check:active+.btn.btn-light-linkedin,.btn-check:checked+.btn.btn-light-linkedin,.btn.btn-light-linkedin.active,.btn.btn-light-linkedin.show,.btn.btn-light-linkedin:active:not(.btn-active),.btn.btn-light-linkedin:focus:not(.btn-active),.btn.btn-light-linkedin:hover:not(.btn-active),.show>.btn.btn-light-linkedin{color:#fff;border-color:#0077b5;background-color:#0077b5!important}.btn-check:active+.btn.btn-light-linkedin .svg-icon,.btn-check:active+.btn.btn-light-linkedin i,.btn-check:checked+.btn.btn-light-linkedin .svg-icon,.btn-check:checked+.btn.btn-light-linkedin i,.btn.btn-light-linkedin.active .svg-icon,.btn.btn-light-linkedin.active i,.btn.btn-light-linkedin.show .svg-icon,.btn.btn-light-linkedin.show i,.btn.btn-light-linkedin:active:not(.btn-active) .svg-icon,.btn.btn-light-linkedin:active:not(.btn-active) i,.btn.btn-light-linkedin:focus:not(.btn-active) .svg-icon,.btn.btn-light-linkedin:focus:not(.btn-active) i,.btn.btn-light-linkedin:hover:not(.btn-active) .svg-icon,.btn.btn-light-linkedin:hover:not(.btn-active) i,.show>.btn.btn-light-linkedin .svg-icon,.show>.btn.btn-light-linkedin i{color:#fff}.btn-check:active+.btn.btn-light-linkedin.dropdown-toggle:after,.btn-check:checked+.btn.btn-light-linkedin.dropdown-toggle:after,.btn.btn-light-linkedin.active.dropdown-toggle:after,.btn.btn-light-linkedin.show.dropdown-toggle:after,.btn.btn-light-linkedin:active:not(.btn-active).dropdown-toggle:after,.btn.btn-light-linkedin:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-light-linkedin:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-light-linkedin.dropdown-toggle:after{color:#fff}[data-bs-theme=dark] .btn.btn-dark{color:#b5b7c8;background-color:#464852}[data-bs-theme=dark] .btn.btn-dark .svg-icon,[data-bs-theme=dark] .btn.btn-dark i{color:#b5b7c8}[data-bs-theme=dark] .btn.btn-dark.dropdown-toggle:after{color:#b5b7c8}.btn-check:active+[data-bs-theme=dark] .btn.btn-dark,.btn-check:checked+[data-bs-theme=dark] .btn.btn-dark,.show>[data-bs-theme=dark] .btn.btn-dark,[data-bs-theme=dark] .btn.btn-dark.active,[data-bs-theme=dark] .btn.btn-dark.show,[data-bs-theme=dark] .btn.btn-dark:active:not(.btn-active),[data-bs-theme=dark] .btn.btn-dark:focus:not(.btn-active),[data-bs-theme=dark] .btn.btn-dark:hover:not(.btn-active){color:#bec0cf;background-color:#4d4f5a!important}.btn-check:active+[data-bs-theme=dark] .btn.btn-dark .svg-icon,.btn-check:active+[data-bs-theme=dark] .btn.btn-dark i,.btn-check:checked+[data-bs-theme=dark] .btn.btn-dark .svg-icon,.btn-check:checked+[data-bs-theme=dark] .btn.btn-dark i,.show>[data-bs-theme=dark] .btn.btn-dark .svg-icon,.show>[data-bs-theme=dark] .btn.btn-dark i,[data-bs-theme=dark] .btn.btn-dark.active .svg-icon,[data-bs-theme=dark] .btn.btn-dark.active i,[data-bs-theme=dark] .btn.btn-dark.show .svg-icon,[data-bs-theme=dark] .btn.btn-dark.show i,[data-bs-theme=dark] .btn.btn-dark:active:not(.btn-active) .svg-icon,[data-bs-theme=dark] .btn.btn-dark:active:not(.btn-active) i,[data-bs-theme=dark] .btn.btn-dark:focus:not(.btn-active) .svg-icon,[data-bs-theme=dark] .btn.btn-dark:focus:not(.btn-active) i,[data-bs-theme=dark] .btn.btn-dark:hover:not(.btn-active) .svg-icon,[data-bs-theme=dark] .btn.btn-dark:hover:not(.btn-active) i{color:#bec0cf}.btn-check:active+[data-bs-theme=dark] .btn.btn-dark.dropdown-toggle:after,.btn-check:checked+[data-bs-theme=dark] .btn.btn-dark.dropdown-toggle:after,.show>[data-bs-theme=dark] .btn.btn-dark.dropdown-toggle:after,[data-bs-theme=dark] .btn.btn-dark.active.dropdown-toggle:after,[data-bs-theme=dark] .btn.btn-dark.show.dropdown-toggle:after,[data-bs-theme=dark] .btn.btn-dark:active:not(.btn-active).dropdown-toggle:after,[data-bs-theme=dark] .btn.btn-dark:focus:not(.btn-active).dropdown-toggle:after,[data-bs-theme=dark] .btn.btn-dark:hover:not(.btn-active).dropdown-toggle:after{color:#bec0cf}.modal-rounded{border-radius:.475rem!important}.modal-header{justify-content:space-between}code:not([class*=language-]){font-weight:400;color:var(--bs-code-color);border:1px solid var(--bs-code-border-color);background-color:var(--bs-code-bg);border-radius:.3rem;line-height:inherit;font-size:1rem;padding:.1rem .4rem;margin:0 .5rem;box-shadow:0 3px 9px rgba(0,0,0,.08)}code:not([class*=language-]).code-light{color:var(--bs-light);background-color:var(--bs-light-light);border:1px solid var(--bs-light)}code:not([class*=language-]).code-primary{color:var(--bs-primary);background-color:var(--bs-primary-light);border:1px solid var(--bs-primary)}code:not([class*=language-]).code-secondary{color:var(--bs-secondary);background-color:var(--bs-secondary-light);border:1px solid var(--bs-secondary)}code:not([class*=language-]).code-success{color:var(--bs-success);background-color:var(--bs-success-light);border:1px solid var(--bs-success)}code:not([class*=language-]).code-info{color:var(--bs-info);background-color:var(--bs-info-light);border:1px solid var(--bs-info)}code:not([class*=language-]).code-warning{color:var(--bs-warning);background-color:var(--bs-warning-light);border:1px solid var(--bs-warning)}code:not([class*=language-]).code-danger{color:var(--bs-danger);background-color:var(--bs-danger-light);border:1px solid var(--bs-danger)}code:not([class*=language-]).code-dark{color:var(--bs-dark);background-color:var(--bs-dark-light);border:1px solid var(--bs-dark)}.col-form-label{font-size:1.05rem}.form-control.form-control-transparent{background-color:transparent;border-color:transparent}.dropdown.show>.form-control.form-control-transparent,.form-control.form-control-transparent.active,.form-control.form-control-transparent.focus,.form-control.form-control-transparent:active,.form-control.form-control-transparent:focus{background-color:transparent;border-color:transparent}.form-control.form-control-flush{border:0;background-color:transparent;outline:0!important;box-shadow:none;border-radius:0}.form-control.form-control-solid{background-color:var(--bs-gray-100);border-color:var(--bs-gray-100);color:var(--bs-gray-700);transition:color .2s ease}.form-control.form-control-solid::placeholder{color:var(--bs-gray-500)}.form-control.form-control-solid::-moz-placeholder{color:var(--bs-gray-500);opacity:1}.dropdown.show>.form-control.form-control-solid,.form-control.form-control-solid.active,.form-control.form-control-solid.focus,.form-control.form-control-solid:active,.form-control.form-control-solid:focus{background-color:var(--bs-gray-200);border-color:var(--bs-gray-200);color:var(--bs-gray-700);transition:color .2s ease}.form-control-solid-bg{background-color:var(--bs-gray-100)}.form-control-plaintext{color:var(--bs-gray-700)}.placeholder-gray-500::placeholder{color:var(--bs-gray-500)}.placeholder-gray-500::-moz-placeholder{color:var(--bs-gray-500);opacity:1}.placeholder-white::placeholder{color:#fff}.placeholder-white::-moz-placeholder{color:#fff;opacity:1}.resize-none{resize:none}.form-floating .form-control.form-control-solid::placeholder{color:transparent}.form-floating.form-control-solid-bg label::after,.form-floating>:disabled~label::after,.form-floating>:focus~label::after{background-color:transparent!important}.form-select{appearance:none}.form-select:focus{border-color:var(--bs-gray-400);box-shadow:false,0 0 0 .25rem rgba(var(--bs-component-active-bg),.25)}.form-select:disabled{color:var(--bs-gray-500);background-color:var(--bs-gray-200);border-color:var(--bs-gray-300)}.form-select:-moz-focusring{text-shadow:0 0 0 var(--bs-gray-700)}.form-select.form-select-solid{background-color:var(--bs-gray-100);border-color:var(--bs-gray-100);color:var(--bs-gray-700);transition:color .2s ease}.form-select.form-select-solid::placeholder{color:var(--bs-gray-500)}.form-select.form-select-solid::-moz-placeholder{color:var(--bs-gray-500);opacity:1}.dropdown.show>.form-select.form-select-solid,.form-select.form-select-solid.active,.form-select.form-select-solid.focus,.form-select.form-select-solid:active,.form-select.form-select-solid:focus{background-color:var(--bs-gray-200);border-color:var(--bs-gray-200)!important;color:var(--bs-gray-700);transition:color .2s ease}.form-select.form-select-transparent{background-color:transparent;border-color:transparent;color:var(--bs-gray-700)}.form-select.form-select-transparent::placeholder{color:var(--bs-gray-500)}.form-select.form-select-transparent::-moz-placeholder{color:var(--bs-gray-500);opacity:1}.dropdown.show>.form-select.form-select-transparent,.form-select.form-select-transparent.active,.form-select.form-select-transparent.focus,.form-select.form-select-transparent:active,.form-select.form-select-transparent:focus{background-color:transparent;border-color:transparent!important;color:var(--bs-gray-700)}.form-check:not(.form-switch) .form-check-input[type=checkbox]{background-size:60% 60%}.form-check.form-check-sm .form-check-input{height:1.55rem;width:1.55rem}.form-check.form-check-lg .form-check-input{height:2.25rem;width:2.25rem}.form-check.form-check-inline{display:inline-block;margin-right:1rem}.form-check.form-check-solid .form-check-input{border:0}.form-check.form-check-solid .form-check-input:not(:checked){background-color:var(--bs-gray-200)}.form-check.form-check-solid .form-check-input[type=checkbox]:indeterminate{background-color:#0069e0}.form-check.form-check-success .form-check-input:checked{background-color:var(--bs-success)}.form-check.form-check-danger .form-check-input:checked{background-color:var(--bs-danger)}.form-check.form-check-warning .form-check-input:checked{background-color:var(--bs-warning)}.form-check-custom{display:flex;align-items:center;padding-left:0;margin:0}.form-check-custom .form-check-input{margin:0;float:none;flex-shrink:0}.form-check-custom .form-check-label{margin-left:.55rem}.form-switch.form-check-custom .form-check-input{height:2.25rem}.form-switch.form-check-custom.form-switch-sm .form-check-input{height:1.5rem;width:2.5rem}.form-switch.form-check-custom.form-switch-lg .form-check-input{height:2.75rem;width:3.75rem}.form-switch.form-check-solid .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='%23ffffff'/%3e%3c/svg%3e")}.form-switch.form-check-solid .form-check-input:not(:checked){background-color:var(--bs-gray-200)}[data-bs-theme=dark] .form-switch .form-check-input:focus:not(:checked){--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-check-image{position:relative;overflow:hidden}.form-check-image img{max-width:100%}.form-check-image .form-check-wrapper{border-radius:.625rem;border:2px solid transparent;transition:all .2s ease-in-out;cursor:pointer;overflow:hidden;margin-bottom:.75rem}.form-check-image .form-check-rounded{border-radius:.625rem}.form-check-image .form-check-label{font-weight:600;margin-left:.5rem}.form-check-image.active:not(.form-check-success):not(.form-check-danger) .form-check-wrapper{border-color:var(--bs-primary)!important}.form-check-image.form-check-success.active .form-check-wrapper{border-color:var(--bs-success)!important}.form-check-image.form-check-danger.active .form-check-wrapper{border-color:var(--bs-danger)!important}.form-check-image.disabled{opacity:.65}.input-group.input-group-solid{border-radius:.475rem}.input-group.input-group-solid.input-group-sm{border-radius:.425rem}.input-group.input-group-solid.input-group-lg{border-radius:.625rem}.input-group.input-group-solid .input-group-text{background-color:var(--bs-gray-100);border-color:var(--bs-gray-100)}.input-group.input-group-solid .input-group-text+.form-control{border-left-color:var(--bs-gray-300)}.input-group.input-group-solid .form-control{background-color:var(--bs-gray-100);border-color:var(--bs-gray-100)}.input-group.input-group-solid .form-control+.input-group-text{border-left-color:var(--bs-gray-300)}.form-floating .form-control.form-control-solid::placeholder{color:transparent}.form-floating.form-control-solid-bg label::after,.form-floating>:disabled~label::after,.form-floating>:focus~label::after{background-color:transparent!important}.required:after{content:"*";position:relative;font-size:inherit;color:var(--bs-danger);padding-left:.25rem;font-weight:600}.progress-vertical{display:flex;align-items:stretch;justify-content:space-between}.progress-vertical .progress{height:100%;border-radius:.475rem;display:flex;align-items:flex-end;margin-right:1rem}.progress-vertical .progress:last-child{margin-right:0}.progress-vertical .progress .progress-bar{width:8px;border-radius:.475rem}.table:not(.table-bordered)>:not(:first-child){border-color:transparent;border-width:0;border-style:none}.table:not(.table-bordered)>:not(:last-child)>:last-child>*{border-bottom-color:inherit}.table:not(.table-bordered) td,.table:not(.table-bordered) th,.table:not(.table-bordered) tr{border-color:inherit;border-width:inherit;border-style:inherit;text-transform:inherit;font-weight:inherit;font-size:inherit;color:inherit;height:inherit;min-height:inherit}.table:not(.table-bordered) td:first-child,.table:not(.table-bordered) th:first-child,.table:not(.table-bordered) tr:first-child{padding-left:0}.table:not(.table-bordered) td:last-child,.table:not(.table-bordered) th:last-child,.table:not(.table-bordered) tr:last-child{padding-right:0}.table:not(.table-bordered) tbody tr:last-child,.table:not(.table-bordered) tfoot tr:last-child{border-bottom:0!important}.table:not(.table-bordered) tbody tr:last-child td,.table:not(.table-bordered) tbody tr:last-child th,.table:not(.table-bordered) tfoot tr:last-child td,.table:not(.table-bordered) tfoot tr:last-child th{border-bottom:0!important}.table:not(.table-bordered) tfoot td,.table:not(.table-bordered) tfoot th{border-top:inherit}.table:not(.table-bordered).table-rounded{border-radius:.475rem;border-spacing:0;border-collapse:separate}.table:not(.table-bordered).table-rows-rounded td:first-child,.table:not(.table-bordered).table-rows-rounded th:first-child{border-top-left-radius:6px;border-bottom-left-radius:6px}.table:not(.table-bordered).table-rows-rounded td:last-child,.table:not(.table-bordered).table-rows-rounded th:last-child{border-top-right-radius:6px;border-bottom-right-radius:6px}.table:not(.table-bordered).table-flush td,.table:not(.table-bordered).table-flush th,.table:not(.table-bordered).table-flush tr{padding:inherit}.table:not(.table-bordered).table-row-bordered tr{border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:var(--bs-border-color)}.table:not(.table-bordered).table-row-bordered tfoot td,.table:not(.table-bordered).table-row-bordered tfoot th{border-top-width:1px!important}.table:not(.table-bordered).table-row-dashed tr{border-bottom-width:1px;border-bottom-style:dashed;border-bottom-color:var(--bs-border-color)}.table:not(.table-bordered).table-row-dashed tfoot td,.table:not(.table-bordered).table-row-dashed tfoot th{border-top-width:1px!important}.table:not(.table-bordered).table-row-gray-100 tr{border-bottom-color:var(--bs-gray-100)}.table:not(.table-bordered).table-row-gray-200 tr{border-bottom-color:var(--bs-gray-200)}.table:not(.table-bordered).table-row-gray-300 tr{border-bottom-color:var(--bs-gray-300)}.table:not(.table-bordered).table-row-gray-400 tr{border-bottom-color:var(--bs-gray-400)}.table:not(.table-bordered).table-row-gray-500 tr{border-bottom-color:var(--bs-gray-500)}.table:not(.table-bordered).table-row-gray-600 tr{border-bottom-color:var(--bs-gray-600)}.table:not(.table-bordered).table-row-gray-700 tr{border-bottom-color:var(--bs-gray-700)}.table:not(.table-bordered).table-row-gray-800 tr{border-bottom-color:var(--bs-gray-800)}.table:not(.table-bordered).table-row-gray-900 tr{border-bottom-color:var(--bs-gray-900)}.table-layout-fixed{table-layout:fixed}.table-sort:after{opacity:0}.table-sort,.table-sort-asc,.table-sort-desc{vertical-align:middle}.table-sort-asc:after,.table-sort-desc:after,.table-sort:after{position:relative;display:inline-block;width:.75rem;height:.75rem;content:" ";bottom:auto;right:auto;left:auto;margin-left:.5rem}.table-sort-asc:after{opacity:1;mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-muted);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M3.23571 2.72011L4.97917 4.46358C5.15176 4.63618 5.43158 4.63617 5.60417 4.46358C5.77676 4.29099 5.77676 4.01118 5.60417 3.83861L3.29463 1.52904C3.13192 1.36629 2.86809 1.36629 2.70538 1.52904L0.395812 3.83861C0.22325 4.01117 0.22325 4.29099 0.395812 4.46358C0.568437 4.63617 0.84825 4.63617 1.02081 4.46358L2.76429 2.72011C2.89446 2.58994 3.10554 2.58994 3.23571 2.72011Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M3.23571 2.72011L4.97917 4.46358C5.15176 4.63618 5.43158 4.63617 5.60417 4.46358C5.77676 4.29099 5.77676 4.01118 5.60417 3.83861L3.29463 1.52904C3.13192 1.36629 2.86809 1.36629 2.70538 1.52904L0.395812 3.83861C0.22325 4.01117 0.22325 4.29099 0.395812 4.46358C0.568437 4.63617 0.84825 4.63617 1.02081 4.46358L2.76429 2.72011C2.89446 2.58994 3.10554 2.58994 3.23571 2.72011Z'/%3e%3c/svg%3e")}.table-sort-desc:after{opacity:1;mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-text-muted);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M2.76429 3.27989L1.02083 1.53642C0.848244 1.36382 0.568419 1.36383 0.395831 1.53642C0.223244 1.70901 0.223244 1.98882 0.395831 2.16139L2.70537 4.47096C2.86808 4.63371 3.13191 4.63371 3.29462 4.47096L5.60419 2.16139C5.77675 1.98883 5.77675 1.70901 5.60419 1.53642C5.43156 1.36383 5.15175 1.36383 4.97919 1.53642L3.23571 3.27989C3.10554 3.41006 2.89446 3.41006 2.76429 3.27989Z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6' fill='var%28--bs-text-muted%29'%3e%3cpath d='M2.76429 3.27989L1.02083 1.53642C0.848244 1.36382 0.568419 1.36383 0.395831 1.53642C0.223244 1.70901 0.223244 1.98882 0.395831 2.16139L2.70537 4.47096C2.86808 4.63371 3.13191 4.63371 3.29462 4.47096L5.60419 2.16139C5.77675 1.98883 5.77675 1.70901 5.60419 1.53642C5.43156 1.36383 5.15175 1.36383 4.97919 1.53642L3.23571 3.27989C3.10554 3.41006 2.89446 3.41006 2.76429 3.27989Z'/%3e%3c/svg%3e")}.table-loading-message{display:none;position:absolute;top:50%;left:50%;border-radius:.475rem;box-shadow:var(--bs-table-loading-message-box-shadow);background-color:var(--bs-body-bg);color:var(--bs-gray-700);font-weight:600;margin:0!important;width:auto;padding:.85rem 2rem!important;transform:translateX(-50%) translateY(-50%)}.table-loading{position:relative}.table-loading .table-loading-message{display:block}.table.g-0 td,.table.g-0 th{padding:0}.table.g-0 td.dtr-control,.table.g-0 th.dtr-control{padding-left:0!important}.table.gy-0 td,.table.gy-0 th{padding-top:0;padding-bottom:0}.table.gx-0 td,.table.gx-0 th{padding-left:0;padding-right:0}.table.gx-0 td.dtr-control,.table.gx-0 th.dtr-control{padding-left:0!important}.table.gs-0 td:first-child,.table.gs-0 th:first-child{padding-left:0}.table.gs-0 td:last-child,.table.gs-0 th:last-child{padding-right:0}.table.gs-0 td.dtr-control:first-child,.table.gs-0 th.dtr-control:first-child{padding-left:0!important}.table.g-1 td,.table.g-1 th{padding:.25rem}.table.g-1 td.dtr-control,.table.g-1 th.dtr-control{padding-left:.25rem!important}.table.gy-1 td,.table.gy-1 th{padding-top:.25rem;padding-bottom:.25rem}.table.gx-1 td,.table.gx-1 th{padding-left:.25rem;padding-right:.25rem}.table.gx-1 td.dtr-control,.table.gx-1 th.dtr-control{padding-left:.25rem!important}.table.gs-1 td:first-child,.table.gs-1 th:first-child{padding-left:.25rem}.table.gs-1 td:last-child,.table.gs-1 th:last-child{padding-right:.25rem}.table.gs-1 td.dtr-control:first-child,.table.gs-1 th.dtr-control:first-child{padding-left:.25rem!important}.table.g-2 td,.table.g-2 th{padding:.5rem}.table.g-2 td.dtr-control,.table.g-2 th.dtr-control{padding-left:.5rem!important}.table.gy-2 td,.table.gy-2 th{padding-top:.5rem;padding-bottom:.5rem}.table.gx-2 td,.table.gx-2 th{padding-left:.5rem;padding-right:.5rem}.table.gx-2 td.dtr-control,.table.gx-2 th.dtr-control{padding-left:.5rem!important}.table.gs-2 td:first-child,.table.gs-2 th:first-child{padding-left:.5rem}.table.gs-2 td:last-child,.table.gs-2 th:last-child{padding-right:.5rem}.table.gs-2 td.dtr-control:first-child,.table.gs-2 th.dtr-control:first-child{padding-left:.5rem!important}.table.g-3 td,.table.g-3 th{padding:.75rem}.table.g-3 td.dtr-control,.table.g-3 th.dtr-control{padding-left:.75rem!important}.table.gy-3 td,.table.gy-3 th{padding-top:.75rem;padding-bottom:.75rem}.table.gx-3 td,.table.gx-3 th{padding-left:.75rem;padding-right:.75rem}.table.gx-3 td.dtr-control,.table.gx-3 th.dtr-control{padding-left:.75rem!important}.table.gs-3 td:first-child,.table.gs-3 th:first-child{padding-left:.75rem}.table.gs-3 td:last-child,.table.gs-3 th:last-child{padding-right:.75rem}.table.gs-3 td.dtr-control:first-child,.table.gs-3 th.dtr-control:first-child{padding-left:.75rem!important}.table.g-4 td,.table.g-4 th{padding:1rem}.table.g-4 td.dtr-control,.table.g-4 th.dtr-control{padding-left:1rem!important}.table.gy-4 td,.table.gy-4 th{padding-top:1rem;padding-bottom:1rem}.table.gx-4 td,.table.gx-4 th{padding-left:1rem;padding-right:1rem}.table.gx-4 td.dtr-control,.table.gx-4 th.dtr-control{padding-left:1rem!important}.table.gs-4 td:first-child,.table.gs-4 th:first-child{padding-left:1rem}.table.gs-4 td:last-child,.table.gs-4 th:last-child{padding-right:1rem}.table.gs-4 td.dtr-control:first-child,.table.gs-4 th.dtr-control:first-child{padding-left:1rem!important}.table.g-5 td,.table.g-5 th{padding:1.25rem}.table.g-5 td.dtr-control,.table.g-5 th.dtr-control{padding-left:1.25rem!important}.table.gy-5 td,.table.gy-5 th{padding-top:1.25rem;padding-bottom:1.25rem}.table.gx-5 td,.table.gx-5 th{padding-left:1.25rem;padding-right:1.25rem}.table.gx-5 td.dtr-control,.table.gx-5 th.dtr-control{padding-left:1.25rem!important}.table.gs-5 td:first-child,.table.gs-5 th:first-child{padding-left:1.25rem}.table.gs-5 td:last-child,.table.gs-5 th:last-child{padding-right:1.25rem}.table.gs-5 td.dtr-control:first-child,.table.gs-5 th.dtr-control:first-child{padding-left:1.25rem!important}.table.g-6 td,.table.g-6 th{padding:1.5rem}.table.g-6 td.dtr-control,.table.g-6 th.dtr-control{padding-left:1.5rem!important}.table.gy-6 td,.table.gy-6 th{padding-top:1.5rem;padding-bottom:1.5rem}.table.gx-6 td,.table.gx-6 th{padding-left:1.5rem;padding-right:1.5rem}.table.gx-6 td.dtr-control,.table.gx-6 th.dtr-control{padding-left:1.5rem!important}.table.gs-6 td:first-child,.table.gs-6 th:first-child{padding-left:1.5rem}.table.gs-6 td:last-child,.table.gs-6 th:last-child{padding-right:1.5rem}.table.gs-6 td.dtr-control:first-child,.table.gs-6 th.dtr-control:first-child{padding-left:1.5rem!important}.table.g-7 td,.table.g-7 th{padding:1.75rem}.table.g-7 td.dtr-control,.table.g-7 th.dtr-control{padding-left:1.75rem!important}.table.gy-7 td,.table.gy-7 th{padding-top:1.75rem;padding-bottom:1.75rem}.table.gx-7 td,.table.gx-7 th{padding-left:1.75rem;padding-right:1.75rem}.table.gx-7 td.dtr-control,.table.gx-7 th.dtr-control{padding-left:1.75rem!important}.table.gs-7 td:first-child,.table.gs-7 th:first-child{padding-left:1.75rem}.table.gs-7 td:last-child,.table.gs-7 th:last-child{padding-right:1.75rem}.table.gs-7 td.dtr-control:first-child,.table.gs-7 th.dtr-control:first-child{padding-left:1.75rem!important}.table.g-8 td,.table.g-8 th{padding:2rem}.table.g-8 td.dtr-control,.table.g-8 th.dtr-control{padding-left:2rem!important}.table.gy-8 td,.table.gy-8 th{padding-top:2rem;padding-bottom:2rem}.table.gx-8 td,.table.gx-8 th{padding-left:2rem;padding-right:2rem}.table.gx-8 td.dtr-control,.table.gx-8 th.dtr-control{padding-left:2rem!important}.table.gs-8 td:first-child,.table.gs-8 th:first-child{padding-left:2rem}.table.gs-8 td:last-child,.table.gs-8 th:last-child{padding-right:2rem}.table.gs-8 td.dtr-control:first-child,.table.gs-8 th.dtr-control:first-child{padding-left:2rem!important}.table.g-9 td,.table.g-9 th{padding:2.25rem}.table.g-9 td.dtr-control,.table.g-9 th.dtr-control{padding-left:2.25rem!important}.table.gy-9 td,.table.gy-9 th{padding-top:2.25rem;padding-bottom:2.25rem}.table.gx-9 td,.table.gx-9 th{padding-left:2.25rem;padding-right:2.25rem}.table.gx-9 td.dtr-control,.table.gx-9 th.dtr-control{padding-left:2.25rem!important}.table.gs-9 td:first-child,.table.gs-9 th:first-child{padding-left:2.25rem}.table.gs-9 td:last-child,.table.gs-9 th:last-child{padding-right:2.25rem}.table.gs-9 td.dtr-control:first-child,.table.gs-9 th.dtr-control:first-child{padding-left:2.25rem!important}.table.g-10 td,.table.g-10 th{padding:2.5rem}.table.g-10 td.dtr-control,.table.g-10 th.dtr-control{padding-left:2.5rem!important}.table.gy-10 td,.table.gy-10 th{padding-top:2.5rem;padding-bottom:2.5rem}.table.gx-10 td,.table.gx-10 th{padding-left:2.5rem;padding-right:2.5rem}.table.gx-10 td.dtr-control,.table.gx-10 th.dtr-control{padding-left:2.5rem!important}.table.gs-10 td:first-child,.table.gs-10 th:first-child{padding-left:2.5rem}.table.gs-10 td:last-child,.table.gs-10 th:last-child{padding-right:2.5rem}.table.gs-10 td.dtr-control:first-child,.table.gs-10 th.dtr-control:first-child{padding-left:2.5rem!important}@media (min-width:576px){.table.g-sm-0 td,.table.g-sm-0 th{padding:0}.table.g-sm-0 td.dtr-control,.table.g-sm-0 th.dtr-control{padding-left:0!important}.table.gy-sm-0 td,.table.gy-sm-0 th{padding-top:0;padding-bottom:0}.table.gx-sm-0 td,.table.gx-sm-0 th{padding-left:0;padding-right:0}.table.gx-sm-0 td.dtr-control,.table.gx-sm-0 th.dtr-control{padding-left:0!important}.table.gs-sm-0 td:first-child,.table.gs-sm-0 th:first-child{padding-left:0}.table.gs-sm-0 td:last-child,.table.gs-sm-0 th:last-child{padding-right:0}.table.gs-sm-0 td.dtr-control:first-child,.table.gs-sm-0 th.dtr-control:first-child{padding-left:0!important}.table.g-sm-1 td,.table.g-sm-1 th{padding:.25rem}.table.g-sm-1 td.dtr-control,.table.g-sm-1 th.dtr-control{padding-left:.25rem!important}.table.gy-sm-1 td,.table.gy-sm-1 th{padding-top:.25rem;padding-bottom:.25rem}.table.gx-sm-1 td,.table.gx-sm-1 th{padding-left:.25rem;padding-right:.25rem}.table.gx-sm-1 td.dtr-control,.table.gx-sm-1 th.dtr-control{padding-left:.25rem!important}.table.gs-sm-1 td:first-child,.table.gs-sm-1 th:first-child{padding-left:.25rem}.table.gs-sm-1 td:last-child,.table.gs-sm-1 th:last-child{padding-right:.25rem}.table.gs-sm-1 td.dtr-control:first-child,.table.gs-sm-1 th.dtr-control:first-child{padding-left:.25rem!important}.table.g-sm-2 td,.table.g-sm-2 th{padding:.5rem}.table.g-sm-2 td.dtr-control,.table.g-sm-2 th.dtr-control{padding-left:.5rem!important}.table.gy-sm-2 td,.table.gy-sm-2 th{padding-top:.5rem;padding-bottom:.5rem}.table.gx-sm-2 td,.table.gx-sm-2 th{padding-left:.5rem;padding-right:.5rem}.table.gx-sm-2 td.dtr-control,.table.gx-sm-2 th.dtr-control{padding-left:.5rem!important}.table.gs-sm-2 td:first-child,.table.gs-sm-2 th:first-child{padding-left:.5rem}.table.gs-sm-2 td:last-child,.table.gs-sm-2 th:last-child{padding-right:.5rem}.table.gs-sm-2 td.dtr-control:first-child,.table.gs-sm-2 th.dtr-control:first-child{padding-left:.5rem!important}.table.g-sm-3 td,.table.g-sm-3 th{padding:.75rem}.table.g-sm-3 td.dtr-control,.table.g-sm-3 th.dtr-control{padding-left:.75rem!important}.table.gy-sm-3 td,.table.gy-sm-3 th{padding-top:.75rem;padding-bottom:.75rem}.table.gx-sm-3 td,.table.gx-sm-3 th{padding-left:.75rem;padding-right:.75rem}.table.gx-sm-3 td.dtr-control,.table.gx-sm-3 th.dtr-control{padding-left:.75rem!important}.table.gs-sm-3 td:first-child,.table.gs-sm-3 th:first-child{padding-left:.75rem}.table.gs-sm-3 td:last-child,.table.gs-sm-3 th:last-child{padding-right:.75rem}.table.gs-sm-3 td.dtr-control:first-child,.table.gs-sm-3 th.dtr-control:first-child{padding-left:.75rem!important}.table.g-sm-4 td,.table.g-sm-4 th{padding:1rem}.table.g-sm-4 td.dtr-control,.table.g-sm-4 th.dtr-control{padding-left:1rem!important}.table.gy-sm-4 td,.table.gy-sm-4 th{padding-top:1rem;padding-bottom:1rem}.table.gx-sm-4 td,.table.gx-sm-4 th{padding-left:1rem;padding-right:1rem}.table.gx-sm-4 td.dtr-control,.table.gx-sm-4 th.dtr-control{padding-left:1rem!important}.table.gs-sm-4 td:first-child,.table.gs-sm-4 th:first-child{padding-left:1rem}.table.gs-sm-4 td:last-child,.table.gs-sm-4 th:last-child{padding-right:1rem}.table.gs-sm-4 td.dtr-control:first-child,.table.gs-sm-4 th.dtr-control:first-child{padding-left:1rem!important}.table.g-sm-5 td,.table.g-sm-5 th{padding:1.25rem}.table.g-sm-5 td.dtr-control,.table.g-sm-5 th.dtr-control{padding-left:1.25rem!important}.table.gy-sm-5 td,.table.gy-sm-5 th{padding-top:1.25rem;padding-bottom:1.25rem}.table.gx-sm-5 td,.table.gx-sm-5 th{padding-left:1.25rem;padding-right:1.25rem}.table.gx-sm-5 td.dtr-control,.table.gx-sm-5 th.dtr-control{padding-left:1.25rem!important}.table.gs-sm-5 td:first-child,.table.gs-sm-5 th:first-child{padding-left:1.25rem}.table.gs-sm-5 td:last-child,.table.gs-sm-5 th:last-child{padding-right:1.25rem}.table.gs-sm-5 td.dtr-control:first-child,.table.gs-sm-5 th.dtr-control:first-child{padding-left:1.25rem!important}.table.g-sm-6 td,.table.g-sm-6 th{padding:1.5rem}.table.g-sm-6 td.dtr-control,.table.g-sm-6 th.dtr-control{padding-left:1.5rem!important}.table.gy-sm-6 td,.table.gy-sm-6 th{padding-top:1.5rem;padding-bottom:1.5rem}.table.gx-sm-6 td,.table.gx-sm-6 th{padding-left:1.5rem;padding-right:1.5rem}.table.gx-sm-6 td.dtr-control,.table.gx-sm-6 th.dtr-control{padding-left:1.5rem!important}.table.gs-sm-6 td:first-child,.table.gs-sm-6 th:first-child{padding-left:1.5rem}.table.gs-sm-6 td:last-child,.table.gs-sm-6 th:last-child{padding-right:1.5rem}.table.gs-sm-6 td.dtr-control:first-child,.table.gs-sm-6 th.dtr-control:first-child{padding-left:1.5rem!important}.table.g-sm-7 td,.table.g-sm-7 th{padding:1.75rem}.table.g-sm-7 td.dtr-control,.table.g-sm-7 th.dtr-control{padding-left:1.75rem!important}.table.gy-sm-7 td,.table.gy-sm-7 th{padding-top:1.75rem;padding-bottom:1.75rem}.table.gx-sm-7 td,.table.gx-sm-7 th{padding-left:1.75rem;padding-right:1.75rem}.table.gx-sm-7 td.dtr-control,.table.gx-sm-7 th.dtr-control{padding-left:1.75rem!important}.table.gs-sm-7 td:first-child,.table.gs-sm-7 th:first-child{padding-left:1.75rem}.table.gs-sm-7 td:last-child,.table.gs-sm-7 th:last-child{padding-right:1.75rem}.table.gs-sm-7 td.dtr-control:first-child,.table.gs-sm-7 th.dtr-control:first-child{padding-left:1.75rem!important}.table.g-sm-8 td,.table.g-sm-8 th{padding:2rem}.table.g-sm-8 td.dtr-control,.table.g-sm-8 th.dtr-control{padding-left:2rem!important}.table.gy-sm-8 td,.table.gy-sm-8 th{padding-top:2rem;padding-bottom:2rem}.table.gx-sm-8 td,.table.gx-sm-8 th{padding-left:2rem;padding-right:2rem}.table.gx-sm-8 td.dtr-control,.table.gx-sm-8 th.dtr-control{padding-left:2rem!important}.table.gs-sm-8 td:first-child,.table.gs-sm-8 th:first-child{padding-left:2rem}.table.gs-sm-8 td:last-child,.table.gs-sm-8 th:last-child{padding-right:2rem}.table.gs-sm-8 td.dtr-control:first-child,.table.gs-sm-8 th.dtr-control:first-child{padding-left:2rem!important}.table.g-sm-9 td,.table.g-sm-9 th{padding:2.25rem}.table.g-sm-9 td.dtr-control,.table.g-sm-9 th.dtr-control{padding-left:2.25rem!important}.table.gy-sm-9 td,.table.gy-sm-9 th{padding-top:2.25rem;padding-bottom:2.25rem}.table.gx-sm-9 td,.table.gx-sm-9 th{padding-left:2.25rem;padding-right:2.25rem}.table.gx-sm-9 td.dtr-control,.table.gx-sm-9 th.dtr-control{padding-left:2.25rem!important}.table.gs-sm-9 td:first-child,.table.gs-sm-9 th:first-child{padding-left:2.25rem}.table.gs-sm-9 td:last-child,.table.gs-sm-9 th:last-child{padding-right:2.25rem}.table.gs-sm-9 td.dtr-control:first-child,.table.gs-sm-9 th.dtr-control:first-child{padding-left:2.25rem!important}.table.g-sm-10 td,.table.g-sm-10 th{padding:2.5rem}.table.g-sm-10 td.dtr-control,.table.g-sm-10 th.dtr-control{padding-left:2.5rem!important}.table.gy-sm-10 td,.table.gy-sm-10 th{padding-top:2.5rem;padding-bottom:2.5rem}.table.gx-sm-10 td,.table.gx-sm-10 th{padding-left:2.5rem;padding-right:2.5rem}.table.gx-sm-10 td.dtr-control,.table.gx-sm-10 th.dtr-control{padding-left:2.5rem!important}.table.gs-sm-10 td:first-child,.table.gs-sm-10 th:first-child{padding-left:2.5rem}.table.gs-sm-10 td:last-child,.table.gs-sm-10 th:last-child{padding-right:2.5rem}.table.gs-sm-10 td.dtr-control:first-child,.table.gs-sm-10 th.dtr-control:first-child{padding-left:2.5rem!important}}@media (min-width:768px){.table.g-md-0 td,.table.g-md-0 th{padding:0}.table.g-md-0 td.dtr-control,.table.g-md-0 th.dtr-control{padding-left:0!important}.table.gy-md-0 td,.table.gy-md-0 th{padding-top:0;padding-bottom:0}.table.gx-md-0 td,.table.gx-md-0 th{padding-left:0;padding-right:0}.table.gx-md-0 td.dtr-control,.table.gx-md-0 th.dtr-control{padding-left:0!important}.table.gs-md-0 td:first-child,.table.gs-md-0 th:first-child{padding-left:0}.table.gs-md-0 td:last-child,.table.gs-md-0 th:last-child{padding-right:0}.table.gs-md-0 td.dtr-control:first-child,.table.gs-md-0 th.dtr-control:first-child{padding-left:0!important}.table.g-md-1 td,.table.g-md-1 th{padding:.25rem}.table.g-md-1 td.dtr-control,.table.g-md-1 th.dtr-control{padding-left:.25rem!important}.table.gy-md-1 td,.table.gy-md-1 th{padding-top:.25rem;padding-bottom:.25rem}.table.gx-md-1 td,.table.gx-md-1 th{padding-left:.25rem;padding-right:.25rem}.table.gx-md-1 td.dtr-control,.table.gx-md-1 th.dtr-control{padding-left:.25rem!important}.table.gs-md-1 td:first-child,.table.gs-md-1 th:first-child{padding-left:.25rem}.table.gs-md-1 td:last-child,.table.gs-md-1 th:last-child{padding-right:.25rem}.table.gs-md-1 td.dtr-control:first-child,.table.gs-md-1 th.dtr-control:first-child{padding-left:.25rem!important}.table.g-md-2 td,.table.g-md-2 th{padding:.5rem}.table.g-md-2 td.dtr-control,.table.g-md-2 th.dtr-control{padding-left:.5rem!important}.table.gy-md-2 td,.table.gy-md-2 th{padding-top:.5rem;padding-bottom:.5rem}.table.gx-md-2 td,.table.gx-md-2 th{padding-left:.5rem;padding-right:.5rem}.table.gx-md-2 td.dtr-control,.table.gx-md-2 th.dtr-control{padding-left:.5rem!important}.table.gs-md-2 td:first-child,.table.gs-md-2 th:first-child{padding-left:.5rem}.table.gs-md-2 td:last-child,.table.gs-md-2 th:last-child{padding-right:.5rem}.table.gs-md-2 td.dtr-control:first-child,.table.gs-md-2 th.dtr-control:first-child{padding-left:.5rem!important}.table.g-md-3 td,.table.g-md-3 th{padding:.75rem}.table.g-md-3 td.dtr-control,.table.g-md-3 th.dtr-control{padding-left:.75rem!important}.table.gy-md-3 td,.table.gy-md-3 th{padding-top:.75rem;padding-bottom:.75rem}.table.gx-md-3 td,.table.gx-md-3 th{padding-left:.75rem;padding-right:.75rem}.table.gx-md-3 td.dtr-control,.table.gx-md-3 th.dtr-control{padding-left:.75rem!important}.table.gs-md-3 td:first-child,.table.gs-md-3 th:first-child{padding-left:.75rem}.table.gs-md-3 td:last-child,.table.gs-md-3 th:last-child{padding-right:.75rem}.table.gs-md-3 td.dtr-control:first-child,.table.gs-md-3 th.dtr-control:first-child{padding-left:.75rem!important}.table.g-md-4 td,.table.g-md-4 th{padding:1rem}.table.g-md-4 td.dtr-control,.table.g-md-4 th.dtr-control{padding-left:1rem!important}.table.gy-md-4 td,.table.gy-md-4 th{padding-top:1rem;padding-bottom:1rem}.table.gx-md-4 td,.table.gx-md-4 th{padding-left:1rem;padding-right:1rem}.table.gx-md-4 td.dtr-control,.table.gx-md-4 th.dtr-control{padding-left:1rem!important}.table.gs-md-4 td:first-child,.table.gs-md-4 th:first-child{padding-left:1rem}.table.gs-md-4 td:last-child,.table.gs-md-4 th:last-child{padding-right:1rem}.table.gs-md-4 td.dtr-control:first-child,.table.gs-md-4 th.dtr-control:first-child{padding-left:1rem!important}.table.g-md-5 td,.table.g-md-5 th{padding:1.25rem}.table.g-md-5 td.dtr-control,.table.g-md-5 th.dtr-control{padding-left:1.25rem!important}.table.gy-md-5 td,.table.gy-md-5 th{padding-top:1.25rem;padding-bottom:1.25rem}.table.gx-md-5 td,.table.gx-md-5 th{padding-left:1.25rem;padding-right:1.25rem}.table.gx-md-5 td.dtr-control,.table.gx-md-5 th.dtr-control{padding-left:1.25rem!important}.table.gs-md-5 td:first-child,.table.gs-md-5 th:first-child{padding-left:1.25rem}.table.gs-md-5 td:last-child,.table.gs-md-5 th:last-child{padding-right:1.25rem}.table.gs-md-5 td.dtr-control:first-child,.table.gs-md-5 th.dtr-control:first-child{padding-left:1.25rem!important}.table.g-md-6 td,.table.g-md-6 th{padding:1.5rem}.table.g-md-6 td.dtr-control,.table.g-md-6 th.dtr-control{padding-left:1.5rem!important}.table.gy-md-6 td,.table.gy-md-6 th{padding-top:1.5rem;padding-bottom:1.5rem}.table.gx-md-6 td,.table.gx-md-6 th{padding-left:1.5rem;padding-right:1.5rem}.table.gx-md-6 td.dtr-control,.table.gx-md-6 th.dtr-control{padding-left:1.5rem!important}.table.gs-md-6 td:first-child,.table.gs-md-6 th:first-child{padding-left:1.5rem}.table.gs-md-6 td:last-child,.table.gs-md-6 th:last-child{padding-right:1.5rem}.table.gs-md-6 td.dtr-control:first-child,.table.gs-md-6 th.dtr-control:first-child{padding-left:1.5rem!important}.table.g-md-7 td,.table.g-md-7 th{padding:1.75rem}.table.g-md-7 td.dtr-control,.table.g-md-7 th.dtr-control{padding-left:1.75rem!important}.table.gy-md-7 td,.table.gy-md-7 th{padding-top:1.75rem;padding-bottom:1.75rem}.table.gx-md-7 td,.table.gx-md-7 th{padding-left:1.75rem;padding-right:1.75rem}.table.gx-md-7 td.dtr-control,.table.gx-md-7 th.dtr-control{padding-left:1.75rem!important}.table.gs-md-7 td:first-child,.table.gs-md-7 th:first-child{padding-left:1.75rem}.table.gs-md-7 td:last-child,.table.gs-md-7 th:last-child{padding-right:1.75rem}.table.gs-md-7 td.dtr-control:first-child,.table.gs-md-7 th.dtr-control:first-child{padding-left:1.75rem!important}.table.g-md-8 td,.table.g-md-8 th{padding:2rem}.table.g-md-8 td.dtr-control,.table.g-md-8 th.dtr-control{padding-left:2rem!important}.table.gy-md-8 td,.table.gy-md-8 th{padding-top:2rem;padding-bottom:2rem}.table.gx-md-8 td,.table.gx-md-8 th{padding-left:2rem;padding-right:2rem}.table.gx-md-8 td.dtr-control,.table.gx-md-8 th.dtr-control{padding-left:2rem!important}.table.gs-md-8 td:first-child,.table.gs-md-8 th:first-child{padding-left:2rem}.table.gs-md-8 td:last-child,.table.gs-md-8 th:last-child{padding-right:2rem}.table.gs-md-8 td.dtr-control:first-child,.table.gs-md-8 th.dtr-control:first-child{padding-left:2rem!important}.table.g-md-9 td,.table.g-md-9 th{padding:2.25rem}.table.g-md-9 td.dtr-control,.table.g-md-9 th.dtr-control{padding-left:2.25rem!important}.table.gy-md-9 td,.table.gy-md-9 th{padding-top:2.25rem;padding-bottom:2.25rem}.table.gx-md-9 td,.table.gx-md-9 th{padding-left:2.25rem;padding-right:2.25rem}.table.gx-md-9 td.dtr-control,.table.gx-md-9 th.dtr-control{padding-left:2.25rem!important}.table.gs-md-9 td:first-child,.table.gs-md-9 th:first-child{padding-left:2.25rem}.table.gs-md-9 td:last-child,.table.gs-md-9 th:last-child{padding-right:2.25rem}.table.gs-md-9 td.dtr-control:first-child,.table.gs-md-9 th.dtr-control:first-child{padding-left:2.25rem!important}.table.g-md-10 td,.table.g-md-10 th{padding:2.5rem}.table.g-md-10 td.dtr-control,.table.g-md-10 th.dtr-control{padding-left:2.5rem!important}.table.gy-md-10 td,.table.gy-md-10 th{padding-top:2.5rem;padding-bottom:2.5rem}.table.gx-md-10 td,.table.gx-md-10 th{padding-left:2.5rem;padding-right:2.5rem}.table.gx-md-10 td.dtr-control,.table.gx-md-10 th.dtr-control{padding-left:2.5rem!important}.table.gs-md-10 td:first-child,.table.gs-md-10 th:first-child{padding-left:2.5rem}.table.gs-md-10 td:last-child,.table.gs-md-10 th:last-child{padding-right:2.5rem}.table.gs-md-10 td.dtr-control:first-child,.table.gs-md-10 th.dtr-control:first-child{padding-left:2.5rem!important}}@media (min-width:992px){.table.g-lg-0 td,.table.g-lg-0 th{padding:0}.table.g-lg-0 td.dtr-control,.table.g-lg-0 th.dtr-control{padding-left:0!important}.table.gy-lg-0 td,.table.gy-lg-0 th{padding-top:0;padding-bottom:0}.table.gx-lg-0 td,.table.gx-lg-0 th{padding-left:0;padding-right:0}.table.gx-lg-0 td.dtr-control,.table.gx-lg-0 th.dtr-control{padding-left:0!important}.table.gs-lg-0 td:first-child,.table.gs-lg-0 th:first-child{padding-left:0}.table.gs-lg-0 td:last-child,.table.gs-lg-0 th:last-child{padding-right:0}.table.gs-lg-0 td.dtr-control:first-child,.table.gs-lg-0 th.dtr-control:first-child{padding-left:0!important}.table.g-lg-1 td,.table.g-lg-1 th{padding:.25rem}.table.g-lg-1 td.dtr-control,.table.g-lg-1 th.dtr-control{padding-left:.25rem!important}.table.gy-lg-1 td,.table.gy-lg-1 th{padding-top:.25rem;padding-bottom:.25rem}.table.gx-lg-1 td,.table.gx-lg-1 th{padding-left:.25rem;padding-right:.25rem}.table.gx-lg-1 td.dtr-control,.table.gx-lg-1 th.dtr-control{padding-left:.25rem!important}.table.gs-lg-1 td:first-child,.table.gs-lg-1 th:first-child{padding-left:.25rem}.table.gs-lg-1 td:last-child,.table.gs-lg-1 th:last-child{padding-right:.25rem}.table.gs-lg-1 td.dtr-control:first-child,.table.gs-lg-1 th.dtr-control:first-child{padding-left:.25rem!important}.table.g-lg-2 td,.table.g-lg-2 th{padding:.5rem}.table.g-lg-2 td.dtr-control,.table.g-lg-2 th.dtr-control{padding-left:.5rem!important}.table.gy-lg-2 td,.table.gy-lg-2 th{padding-top:.5rem;padding-bottom:.5rem}.table.gx-lg-2 td,.table.gx-lg-2 th{padding-left:.5rem;padding-right:.5rem}.table.gx-lg-2 td.dtr-control,.table.gx-lg-2 th.dtr-control{padding-left:.5rem!important}.table.gs-lg-2 td:first-child,.table.gs-lg-2 th:first-child{padding-left:.5rem}.table.gs-lg-2 td:last-child,.table.gs-lg-2 th:last-child{padding-right:.5rem}.table.gs-lg-2 td.dtr-control:first-child,.table.gs-lg-2 th.dtr-control:first-child{padding-left:.5rem!important}.table.g-lg-3 td,.table.g-lg-3 th{padding:.75rem}.table.g-lg-3 td.dtr-control,.table.g-lg-3 th.dtr-control{padding-left:.75rem!important}.table.gy-lg-3 td,.table.gy-lg-3 th{padding-top:.75rem;padding-bottom:.75rem}.table.gx-lg-3 td,.table.gx-lg-3 th{padding-left:.75rem;padding-right:.75rem}.table.gx-lg-3 td.dtr-control,.table.gx-lg-3 th.dtr-control{padding-left:.75rem!important}.table.gs-lg-3 td:first-child,.table.gs-lg-3 th:first-child{padding-left:.75rem}.table.gs-lg-3 td:last-child,.table.gs-lg-3 th:last-child{padding-right:.75rem}.table.gs-lg-3 td.dtr-control:first-child,.table.gs-lg-3 th.dtr-control:first-child{padding-left:.75rem!important}.table.g-lg-4 td,.table.g-lg-4 th{padding:1rem}.table.g-lg-4 td.dtr-control,.table.g-lg-4 th.dtr-control{padding-left:1rem!important}.table.gy-lg-4 td,.table.gy-lg-4 th{padding-top:1rem;padding-bottom:1rem}.table.gx-lg-4 td,.table.gx-lg-4 th{padding-left:1rem;padding-right:1rem}.table.gx-lg-4 td.dtr-control,.table.gx-lg-4 th.dtr-control{padding-left:1rem!important}.table.gs-lg-4 td:first-child,.table.gs-lg-4 th:first-child{padding-left:1rem}.table.gs-lg-4 td:last-child,.table.gs-lg-4 th:last-child{padding-right:1rem}.table.gs-lg-4 td.dtr-control:first-child,.table.gs-lg-4 th.dtr-control:first-child{padding-left:1rem!important}.table.g-lg-5 td,.table.g-lg-5 th{padding:1.25rem}.table.g-lg-5 td.dtr-control,.table.g-lg-5 th.dtr-control{padding-left:1.25rem!important}.table.gy-lg-5 td,.table.gy-lg-5 th{padding-top:1.25rem;padding-bottom:1.25rem}.table.gx-lg-5 td,.table.gx-lg-5 th{padding-left:1.25rem;padding-right:1.25rem}.table.gx-lg-5 td.dtr-control,.table.gx-lg-5 th.dtr-control{padding-left:1.25rem!important}.table.gs-lg-5 td:first-child,.table.gs-lg-5 th:first-child{padding-left:1.25rem}.table.gs-lg-5 td:last-child,.table.gs-lg-5 th:last-child{padding-right:1.25rem}.table.gs-lg-5 td.dtr-control:first-child,.table.gs-lg-5 th.dtr-control:first-child{padding-left:1.25rem!important}.table.g-lg-6 td,.table.g-lg-6 th{padding:1.5rem}.table.g-lg-6 td.dtr-control,.table.g-lg-6 th.dtr-control{padding-left:1.5rem!important}.table.gy-lg-6 td,.table.gy-lg-6 th{padding-top:1.5rem;padding-bottom:1.5rem}.table.gx-lg-6 td,.table.gx-lg-6 th{padding-left:1.5rem;padding-right:1.5rem}.table.gx-lg-6 td.dtr-control,.table.gx-lg-6 th.dtr-control{padding-left:1.5rem!important}.table.gs-lg-6 td:first-child,.table.gs-lg-6 th:first-child{padding-left:1.5rem}.table.gs-lg-6 td:last-child,.table.gs-lg-6 th:last-child{padding-right:1.5rem}.table.gs-lg-6 td.dtr-control:first-child,.table.gs-lg-6 th.dtr-control:first-child{padding-left:1.5rem!important}.table.g-lg-7 td,.table.g-lg-7 th{padding:1.75rem}.table.g-lg-7 td.dtr-control,.table.g-lg-7 th.dtr-control{padding-left:1.75rem!important}.table.gy-lg-7 td,.table.gy-lg-7 th{padding-top:1.75rem;padding-bottom:1.75rem}.table.gx-lg-7 td,.table.gx-lg-7 th{padding-left:1.75rem;padding-right:1.75rem}.table.gx-lg-7 td.dtr-control,.table.gx-lg-7 th.dtr-control{padding-left:1.75rem!important}.table.gs-lg-7 td:first-child,.table.gs-lg-7 th:first-child{padding-left:1.75rem}.table.gs-lg-7 td:last-child,.table.gs-lg-7 th:last-child{padding-right:1.75rem}.table.gs-lg-7 td.dtr-control:first-child,.table.gs-lg-7 th.dtr-control:first-child{padding-left:1.75rem!important}.table.g-lg-8 td,.table.g-lg-8 th{padding:2rem}.table.g-lg-8 td.dtr-control,.table.g-lg-8 th.dtr-control{padding-left:2rem!important}.table.gy-lg-8 td,.table.gy-lg-8 th{padding-top:2rem;padding-bottom:2rem}.table.gx-lg-8 td,.table.gx-lg-8 th{padding-left:2rem;padding-right:2rem}.table.gx-lg-8 td.dtr-control,.table.gx-lg-8 th.dtr-control{padding-left:2rem!important}.table.gs-lg-8 td:first-child,.table.gs-lg-8 th:first-child{padding-left:2rem}.table.gs-lg-8 td:last-child,.table.gs-lg-8 th:last-child{padding-right:2rem}.table.gs-lg-8 td.dtr-control:first-child,.table.gs-lg-8 th.dtr-control:first-child{padding-left:2rem!important}.table.g-lg-9 td,.table.g-lg-9 th{padding:2.25rem}.table.g-lg-9 td.dtr-control,.table.g-lg-9 th.dtr-control{padding-left:2.25rem!important}.table.gy-lg-9 td,.table.gy-lg-9 th{padding-top:2.25rem;padding-bottom:2.25rem}.table.gx-lg-9 td,.table.gx-lg-9 th{padding-left:2.25rem;padding-right:2.25rem}.table.gx-lg-9 td.dtr-control,.table.gx-lg-9 th.dtr-control{padding-left:2.25rem!important}.table.gs-lg-9 td:first-child,.table.gs-lg-9 th:first-child{padding-left:2.25rem}.table.gs-lg-9 td:last-child,.table.gs-lg-9 th:last-child{padding-right:2.25rem}.table.gs-lg-9 td.dtr-control:first-child,.table.gs-lg-9 th.dtr-control:first-child{padding-left:2.25rem!important}.table.g-lg-10 td,.table.g-lg-10 th{padding:2.5rem}.table.g-lg-10 td.dtr-control,.table.g-lg-10 th.dtr-control{padding-left:2.5rem!important}.table.gy-lg-10 td,.table.gy-lg-10 th{padding-top:2.5rem;padding-bottom:2.5rem}.table.gx-lg-10 td,.table.gx-lg-10 th{padding-left:2.5rem;padding-right:2.5rem}.table.gx-lg-10 td.dtr-control,.table.gx-lg-10 th.dtr-control{padding-left:2.5rem!important}.table.gs-lg-10 td:first-child,.table.gs-lg-10 th:first-child{padding-left:2.5rem}.table.gs-lg-10 td:last-child,.table.gs-lg-10 th:last-child{padding-right:2.5rem}.table.gs-lg-10 td.dtr-control:first-child,.table.gs-lg-10 th.dtr-control:first-child{padding-left:2.5rem!important}}@media (min-width:1200px){.table.g-xl-0 td,.table.g-xl-0 th{padding:0}.table.g-xl-0 td.dtr-control,.table.g-xl-0 th.dtr-control{padding-left:0!important}.table.gy-xl-0 td,.table.gy-xl-0 th{padding-top:0;padding-bottom:0}.table.gx-xl-0 td,.table.gx-xl-0 th{padding-left:0;padding-right:0}.table.gx-xl-0 td.dtr-control,.table.gx-xl-0 th.dtr-control{padding-left:0!important}.table.gs-xl-0 td:first-child,.table.gs-xl-0 th:first-child{padding-left:0}.table.gs-xl-0 td:last-child,.table.gs-xl-0 th:last-child{padding-right:0}.table.gs-xl-0 td.dtr-control:first-child,.table.gs-xl-0 th.dtr-control:first-child{padding-left:0!important}.table.g-xl-1 td,.table.g-xl-1 th{padding:.25rem}.table.g-xl-1 td.dtr-control,.table.g-xl-1 th.dtr-control{padding-left:.25rem!important}.table.gy-xl-1 td,.table.gy-xl-1 th{padding-top:.25rem;padding-bottom:.25rem}.table.gx-xl-1 td,.table.gx-xl-1 th{padding-left:.25rem;padding-right:.25rem}.table.gx-xl-1 td.dtr-control,.table.gx-xl-1 th.dtr-control{padding-left:.25rem!important}.table.gs-xl-1 td:first-child,.table.gs-xl-1 th:first-child{padding-left:.25rem}.table.gs-xl-1 td:last-child,.table.gs-xl-1 th:last-child{padding-right:.25rem}.table.gs-xl-1 td.dtr-control:first-child,.table.gs-xl-1 th.dtr-control:first-child{padding-left:.25rem!important}.table.g-xl-2 td,.table.g-xl-2 th{padding:.5rem}.table.g-xl-2 td.dtr-control,.table.g-xl-2 th.dtr-control{padding-left:.5rem!important}.table.gy-xl-2 td,.table.gy-xl-2 th{padding-top:.5rem;padding-bottom:.5rem}.table.gx-xl-2 td,.table.gx-xl-2 th{padding-left:.5rem;padding-right:.5rem}.table.gx-xl-2 td.dtr-control,.table.gx-xl-2 th.dtr-control{padding-left:.5rem!important}.table.gs-xl-2 td:first-child,.table.gs-xl-2 th:first-child{padding-left:.5rem}.table.gs-xl-2 td:last-child,.table.gs-xl-2 th:last-child{padding-right:.5rem}.table.gs-xl-2 td.dtr-control:first-child,.table.gs-xl-2 th.dtr-control:first-child{padding-left:.5rem!important}.table.g-xl-3 td,.table.g-xl-3 th{padding:.75rem}.table.g-xl-3 td.dtr-control,.table.g-xl-3 th.dtr-control{padding-left:.75rem!important}.table.gy-xl-3 td,.table.gy-xl-3 th{padding-top:.75rem;padding-bottom:.75rem}.table.gx-xl-3 td,.table.gx-xl-3 th{padding-left:.75rem;padding-right:.75rem}.table.gx-xl-3 td.dtr-control,.table.gx-xl-3 th.dtr-control{padding-left:.75rem!important}.table.gs-xl-3 td:first-child,.table.gs-xl-3 th:first-child{padding-left:.75rem}.table.gs-xl-3 td:last-child,.table.gs-xl-3 th:last-child{padding-right:.75rem}.table.gs-xl-3 td.dtr-control:first-child,.table.gs-xl-3 th.dtr-control:first-child{padding-left:.75rem!important}.table.g-xl-4 td,.table.g-xl-4 th{padding:1rem}.table.g-xl-4 td.dtr-control,.table.g-xl-4 th.dtr-control{padding-left:1rem!important}.table.gy-xl-4 td,.table.gy-xl-4 th{padding-top:1rem;padding-bottom:1rem}.table.gx-xl-4 td,.table.gx-xl-4 th{padding-left:1rem;padding-right:1rem}.table.gx-xl-4 td.dtr-control,.table.gx-xl-4 th.dtr-control{padding-left:1rem!important}.table.gs-xl-4 td:first-child,.table.gs-xl-4 th:first-child{padding-left:1rem}.table.gs-xl-4 td:last-child,.table.gs-xl-4 th:last-child{padding-right:1rem}.table.gs-xl-4 td.dtr-control:first-child,.table.gs-xl-4 th.dtr-control:first-child{padding-left:1rem!important}.table.g-xl-5 td,.table.g-xl-5 th{padding:1.25rem}.table.g-xl-5 td.dtr-control,.table.g-xl-5 th.dtr-control{padding-left:1.25rem!important}.table.gy-xl-5 td,.table.gy-xl-5 th{padding-top:1.25rem;padding-bottom:1.25rem}.table.gx-xl-5 td,.table.gx-xl-5 th{padding-left:1.25rem;padding-right:1.25rem}.table.gx-xl-5 td.dtr-control,.table.gx-xl-5 th.dtr-control{padding-left:1.25rem!important}.table.gs-xl-5 td:first-child,.table.gs-xl-5 th:first-child{padding-left:1.25rem}.table.gs-xl-5 td:last-child,.table.gs-xl-5 th:last-child{padding-right:1.25rem}.table.gs-xl-5 td.dtr-control:first-child,.table.gs-xl-5 th.dtr-control:first-child{padding-left:1.25rem!important}.table.g-xl-6 td,.table.g-xl-6 th{padding:1.5rem}.table.g-xl-6 td.dtr-control,.table.g-xl-6 th.dtr-control{padding-left:1.5rem!important}.table.gy-xl-6 td,.table.gy-xl-6 th{padding-top:1.5rem;padding-bottom:1.5rem}.table.gx-xl-6 td,.table.gx-xl-6 th{padding-left:1.5rem;padding-right:1.5rem}.table.gx-xl-6 td.dtr-control,.table.gx-xl-6 th.dtr-control{padding-left:1.5rem!important}.table.gs-xl-6 td:first-child,.table.gs-xl-6 th:first-child{padding-left:1.5rem}.table.gs-xl-6 td:last-child,.table.gs-xl-6 th:last-child{padding-right:1.5rem}.table.gs-xl-6 td.dtr-control:first-child,.table.gs-xl-6 th.dtr-control:first-child{padding-left:1.5rem!important}.table.g-xl-7 td,.table.g-xl-7 th{padding:1.75rem}.table.g-xl-7 td.dtr-control,.table.g-xl-7 th.dtr-control{padding-left:1.75rem!important}.table.gy-xl-7 td,.table.gy-xl-7 th{padding-top:1.75rem;padding-bottom:1.75rem}.table.gx-xl-7 td,.table.gx-xl-7 th{padding-left:1.75rem;padding-right:1.75rem}.table.gx-xl-7 td.dtr-control,.table.gx-xl-7 th.dtr-control{padding-left:1.75rem!important}.table.gs-xl-7 td:first-child,.table.gs-xl-7 th:first-child{padding-left:1.75rem}.table.gs-xl-7 td:last-child,.table.gs-xl-7 th:last-child{padding-right:1.75rem}.table.gs-xl-7 td.dtr-control:first-child,.table.gs-xl-7 th.dtr-control:first-child{padding-left:1.75rem!important}.table.g-xl-8 td,.table.g-xl-8 th{padding:2rem}.table.g-xl-8 td.dtr-control,.table.g-xl-8 th.dtr-control{padding-left:2rem!important}.table.gy-xl-8 td,.table.gy-xl-8 th{padding-top:2rem;padding-bottom:2rem}.table.gx-xl-8 td,.table.gx-xl-8 th{padding-left:2rem;padding-right:2rem}.table.gx-xl-8 td.dtr-control,.table.gx-xl-8 th.dtr-control{padding-left:2rem!important}.table.gs-xl-8 td:first-child,.table.gs-xl-8 th:first-child{padding-left:2rem}.table.gs-xl-8 td:last-child,.table.gs-xl-8 th:last-child{padding-right:2rem}.table.gs-xl-8 td.dtr-control:first-child,.table.gs-xl-8 th.dtr-control:first-child{padding-left:2rem!important}.table.g-xl-9 td,.table.g-xl-9 th{padding:2.25rem}.table.g-xl-9 td.dtr-control,.table.g-xl-9 th.dtr-control{padding-left:2.25rem!important}.table.gy-xl-9 td,.table.gy-xl-9 th{padding-top:2.25rem;padding-bottom:2.25rem}.table.gx-xl-9 td,.table.gx-xl-9 th{padding-left:2.25rem;padding-right:2.25rem}.table.gx-xl-9 td.dtr-control,.table.gx-xl-9 th.dtr-control{padding-left:2.25rem!important}.table.gs-xl-9 td:first-child,.table.gs-xl-9 th:first-child{padding-left:2.25rem}.table.gs-xl-9 td:last-child,.table.gs-xl-9 th:last-child{padding-right:2.25rem}.table.gs-xl-9 td.dtr-control:first-child,.table.gs-xl-9 th.dtr-control:first-child{padding-left:2.25rem!important}.table.g-xl-10 td,.table.g-xl-10 th{padding:2.5rem}.table.g-xl-10 td.dtr-control,.table.g-xl-10 th.dtr-control{padding-left:2.5rem!important}.table.gy-xl-10 td,.table.gy-xl-10 th{padding-top:2.5rem;padding-bottom:2.5rem}.table.gx-xl-10 td,.table.gx-xl-10 th{padding-left:2.5rem;padding-right:2.5rem}.table.gx-xl-10 td.dtr-control,.table.gx-xl-10 th.dtr-control{padding-left:2.5rem!important}.table.gs-xl-10 td:first-child,.table.gs-xl-10 th:first-child{padding-left:2.5rem}.table.gs-xl-10 td:last-child,.table.gs-xl-10 th:last-child{padding-right:2.5rem}.table.gs-xl-10 td.dtr-control:first-child,.table.gs-xl-10 th.dtr-control:first-child{padding-left:2.5rem!important}}@media (min-width:1400px){.table.g-xxl-0 td,.table.g-xxl-0 th{padding:0}.table.g-xxl-0 td.dtr-control,.table.g-xxl-0 th.dtr-control{padding-left:0!important}.table.gy-xxl-0 td,.table.gy-xxl-0 th{padding-top:0;padding-bottom:0}.table.gx-xxl-0 td,.table.gx-xxl-0 th{padding-left:0;padding-right:0}.table.gx-xxl-0 td.dtr-control,.table.gx-xxl-0 th.dtr-control{padding-left:0!important}.table.gs-xxl-0 td:first-child,.table.gs-xxl-0 th:first-child{padding-left:0}.table.gs-xxl-0 td:last-child,.table.gs-xxl-0 th:last-child{padding-right:0}.table.gs-xxl-0 td.dtr-control:first-child,.table.gs-xxl-0 th.dtr-control:first-child{padding-left:0!important}.table.g-xxl-1 td,.table.g-xxl-1 th{padding:.25rem}.table.g-xxl-1 td.dtr-control,.table.g-xxl-1 th.dtr-control{padding-left:.25rem!important}.table.gy-xxl-1 td,.table.gy-xxl-1 th{padding-top:.25rem;padding-bottom:.25rem}.table.gx-xxl-1 td,.table.gx-xxl-1 th{padding-left:.25rem;padding-right:.25rem}.table.gx-xxl-1 td.dtr-control,.table.gx-xxl-1 th.dtr-control{padding-left:.25rem!important}.table.gs-xxl-1 td:first-child,.table.gs-xxl-1 th:first-child{padding-left:.25rem}.table.gs-xxl-1 td:last-child,.table.gs-xxl-1 th:last-child{padding-right:.25rem}.table.gs-xxl-1 td.dtr-control:first-child,.table.gs-xxl-1 th.dtr-control:first-child{padding-left:.25rem!important}.table.g-xxl-2 td,.table.g-xxl-2 th{padding:.5rem}.table.g-xxl-2 td.dtr-control,.table.g-xxl-2 th.dtr-control{padding-left:.5rem!important}.table.gy-xxl-2 td,.table.gy-xxl-2 th{padding-top:.5rem;padding-bottom:.5rem}.table.gx-xxl-2 td,.table.gx-xxl-2 th{padding-left:.5rem;padding-right:.5rem}.table.gx-xxl-2 td.dtr-control,.table.gx-xxl-2 th.dtr-control{padding-left:.5rem!important}.table.gs-xxl-2 td:first-child,.table.gs-xxl-2 th:first-child{padding-left:.5rem}.table.gs-xxl-2 td:last-child,.table.gs-xxl-2 th:last-child{padding-right:.5rem}.table.gs-xxl-2 td.dtr-control:first-child,.table.gs-xxl-2 th.dtr-control:first-child{padding-left:.5rem!important}.table.g-xxl-3 td,.table.g-xxl-3 th{padding:.75rem}.table.g-xxl-3 td.dtr-control,.table.g-xxl-3 th.dtr-control{padding-left:.75rem!important}.table.gy-xxl-3 td,.table.gy-xxl-3 th{padding-top:.75rem;padding-bottom:.75rem}.table.gx-xxl-3 td,.table.gx-xxl-3 th{padding-left:.75rem;padding-right:.75rem}.table.gx-xxl-3 td.dtr-control,.table.gx-xxl-3 th.dtr-control{padding-left:.75rem!important}.table.gs-xxl-3 td:first-child,.table.gs-xxl-3 th:first-child{padding-left:.75rem}.table.gs-xxl-3 td:last-child,.table.gs-xxl-3 th:last-child{padding-right:.75rem}.table.gs-xxl-3 td.dtr-control:first-child,.table.gs-xxl-3 th.dtr-control:first-child{padding-left:.75rem!important}.table.g-xxl-4 td,.table.g-xxl-4 th{padding:1rem}.table.g-xxl-4 td.dtr-control,.table.g-xxl-4 th.dtr-control{padding-left:1rem!important}.table.gy-xxl-4 td,.table.gy-xxl-4 th{padding-top:1rem;padding-bottom:1rem}.table.gx-xxl-4 td,.table.gx-xxl-4 th{padding-left:1rem;padding-right:1rem}.table.gx-xxl-4 td.dtr-control,.table.gx-xxl-4 th.dtr-control{padding-left:1rem!important}.table.gs-xxl-4 td:first-child,.table.gs-xxl-4 th:first-child{padding-left:1rem}.table.gs-xxl-4 td:last-child,.table.gs-xxl-4 th:last-child{padding-right:1rem}.table.gs-xxl-4 td.dtr-control:first-child,.table.gs-xxl-4 th.dtr-control:first-child{padding-left:1rem!important}.table.g-xxl-5 td,.table.g-xxl-5 th{padding:1.25rem}.table.g-xxl-5 td.dtr-control,.table.g-xxl-5 th.dtr-control{padding-left:1.25rem!important}.table.gy-xxl-5 td,.table.gy-xxl-5 th{padding-top:1.25rem;padding-bottom:1.25rem}.table.gx-xxl-5 td,.table.gx-xxl-5 th{padding-left:1.25rem;padding-right:1.25rem}.table.gx-xxl-5 td.dtr-control,.table.gx-xxl-5 th.dtr-control{padding-left:1.25rem!important}.table.gs-xxl-5 td:first-child,.table.gs-xxl-5 th:first-child{padding-left:1.25rem}.table.gs-xxl-5 td:last-child,.table.gs-xxl-5 th:last-child{padding-right:1.25rem}.table.gs-xxl-5 td.dtr-control:first-child,.table.gs-xxl-5 th.dtr-control:first-child{padding-left:1.25rem!important}.table.g-xxl-6 td,.table.g-xxl-6 th{padding:1.5rem}.table.g-xxl-6 td.dtr-control,.table.g-xxl-6 th.dtr-control{padding-left:1.5rem!important}.table.gy-xxl-6 td,.table.gy-xxl-6 th{padding-top:1.5rem;padding-bottom:1.5rem}.table.gx-xxl-6 td,.table.gx-xxl-6 th{padding-left:1.5rem;padding-right:1.5rem}.table.gx-xxl-6 td.dtr-control,.table.gx-xxl-6 th.dtr-control{padding-left:1.5rem!important}.table.gs-xxl-6 td:first-child,.table.gs-xxl-6 th:first-child{padding-left:1.5rem}.table.gs-xxl-6 td:last-child,.table.gs-xxl-6 th:last-child{padding-right:1.5rem}.table.gs-xxl-6 td.dtr-control:first-child,.table.gs-xxl-6 th.dtr-control:first-child{padding-left:1.5rem!important}.table.g-xxl-7 td,.table.g-xxl-7 th{padding:1.75rem}.table.g-xxl-7 td.dtr-control,.table.g-xxl-7 th.dtr-control{padding-left:1.75rem!important}.table.gy-xxl-7 td,.table.gy-xxl-7 th{padding-top:1.75rem;padding-bottom:1.75rem}.table.gx-xxl-7 td,.table.gx-xxl-7 th{padding-left:1.75rem;padding-right:1.75rem}.table.gx-xxl-7 td.dtr-control,.table.gx-xxl-7 th.dtr-control{padding-left:1.75rem!important}.table.gs-xxl-7 td:first-child,.table.gs-xxl-7 th:first-child{padding-left:1.75rem}.table.gs-xxl-7 td:last-child,.table.gs-xxl-7 th:last-child{padding-right:1.75rem}.table.gs-xxl-7 td.dtr-control:first-child,.table.gs-xxl-7 th.dtr-control:first-child{padding-left:1.75rem!important}.table.g-xxl-8 td,.table.g-xxl-8 th{padding:2rem}.table.g-xxl-8 td.dtr-control,.table.g-xxl-8 th.dtr-control{padding-left:2rem!important}.table.gy-xxl-8 td,.table.gy-xxl-8 th{padding-top:2rem;padding-bottom:2rem}.table.gx-xxl-8 td,.table.gx-xxl-8 th{padding-left:2rem;padding-right:2rem}.table.gx-xxl-8 td.dtr-control,.table.gx-xxl-8 th.dtr-control{padding-left:2rem!important}.table.gs-xxl-8 td:first-child,.table.gs-xxl-8 th:first-child{padding-left:2rem}.table.gs-xxl-8 td:last-child,.table.gs-xxl-8 th:last-child{padding-right:2rem}.table.gs-xxl-8 td.dtr-control:first-child,.table.gs-xxl-8 th.dtr-control:first-child{padding-left:2rem!important}.table.g-xxl-9 td,.table.g-xxl-9 th{padding:2.25rem}.table.g-xxl-9 td.dtr-control,.table.g-xxl-9 th.dtr-control{padding-left:2.25rem!important}.table.gy-xxl-9 td,.table.gy-xxl-9 th{padding-top:2.25rem;padding-bottom:2.25rem}.table.gx-xxl-9 td,.table.gx-xxl-9 th{padding-left:2.25rem;padding-right:2.25rem}.table.gx-xxl-9 td.dtr-control,.table.gx-xxl-9 th.dtr-control{padding-left:2.25rem!important}.table.gs-xxl-9 td:first-child,.table.gs-xxl-9 th:first-child{padding-left:2.25rem}.table.gs-xxl-9 td:last-child,.table.gs-xxl-9 th:last-child{padding-right:2.25rem}.table.gs-xxl-9 td.dtr-control:first-child,.table.gs-xxl-9 th.dtr-control:first-child{padding-left:2.25rem!important}.table.g-xxl-10 td,.table.g-xxl-10 th{padding:2.5rem}.table.g-xxl-10 td.dtr-control,.table.g-xxl-10 th.dtr-control{padding-left:2.5rem!important}.table.gy-xxl-10 td,.table.gy-xxl-10 th{padding-top:2.5rem;padding-bottom:2.5rem}.table.gx-xxl-10 td,.table.gx-xxl-10 th{padding-left:2.5rem;padding-right:2.5rem}.table.gx-xxl-10 td.dtr-control,.table.gx-xxl-10 th.dtr-control{padding-left:2.5rem!important}.table.gs-xxl-10 td:first-child,.table.gs-xxl-10 th:first-child{padding-left:2.5rem}.table.gs-xxl-10 td:last-child,.table.gs-xxl-10 th:last-child{padding-right:2.5rem}.table.gs-xxl-10 td.dtr-control:first-child,.table.gs-xxl-10 th.dtr-control:first-child{padding-left:2.5rem!important}}.popover{--bs-popover-header-border-color:#F1F1F4}.popover .popover-header{font-size:1rem;font-weight:500;border-bottom:1px solid var(--bs-popover-header-border-color)}.popover .popover-dismiss{position:absolute;top:.85rem;right:.85rem;height:1.25rem;width:1.25rem;mask-repeat:no-repeat;mask-position:center;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;background-color:var(--bs-gray-500);-webkit-mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='var%28--bs-gray-500%29'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='var%28--bs-gray-500%29'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e");mask-size:50%;-webkit-mask-size:50%}.popover .popover-dismiss:hover{background-color:var(--bs-primary)}.popover .popover-dismiss+.popover-header{padding-right:2.5rem}.popover-inverse{--bs-popover-bg:var(--bs-gray-900);--bs-popover-border-color:var(--bs-gray-900);--bs-popover-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.3);--bs-popover-header-color:var(--bs-gray-200);--bs-popover-header-bg:var(--bs-gray-900);--bs-popover-body-color:var(--bs-gray-400);--bs-popover-arrow-border:transparent;--bs-popover-header-border-color:var(--bs-gray-800)}[data-bs-theme=dark] .popover:not(.popover-inverse){--bs-popover-bg:#26272F;--bs-popover-border-color:#26272F;--bs-popover-header-bg:#26272F;--bs-popover-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.3);--bs-popover-header-border-color:#363843}.tooltip .tooltip-inner{box-shadow:var(--bs-tooltip-box-shadow)}.tooltip.tooltop-auto-width .tooltip-inner{white-space:nowrap;max-width:none}.tooltip.tooltip-inverse{--bs-tooltip-color:var(--bs-dark-inverse);--bs-tooltip-bg:var(--bs-dark)}[data-bs-theme=dark] .tooltip:not(.tooltip-inverse){--bs-tooltip-bg:#26272F;--bs-tooltip-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.15)}.accordion .accordion-header{cursor:pointer}.accordion.accordion-icon-toggle .accordion-icon{display:flex;flex-shrink:0;transition:all .2s ease-in-out;transform:rotate(90deg);align-items:center;justify-content:center}.accordion.accordion-icon-toggle .accordion-icon .svg-icon,.accordion.accordion-icon-toggle .accordion-icon i{color:var(--bs-primary)}.accordion.accordion-icon-toggle .collapsed .accordion-icon{transition:all .2s ease-in-out;transform:rotate(0)}.accordion.accordion-icon-toggle .collapsed .accordion-icon .svg-icon,.accordion.accordion-icon-toggle .collapsed .accordion-icon i{color:var(--bs-text-muted)}.accordion.accordion-icon-collapse .accordion-icon{display:flex;flex-shrink:0;align-items:center;justify-content:center;transition:all .2s ease-in-out}.accordion.accordion-icon-collapse .accordion-icon .accordion-icon-on{display:inline-flex}.accordion.accordion-icon-collapse .accordion-icon .accordion-icon-off{display:none}.accordion.accordion-icon-collapse .accordion-icon .svg-icon,.accordion.accordion-icon-collapse .accordion-icon i{color:var(--bs-primary)}.accordion.accordion-icon-collapse .collapsed .accordion-icon{transition:all .2s ease-in-out}.accordion.accordion-icon-collapse .collapsed .accordion-icon .accordion-icon-on{display:none}.accordion.accordion-icon-collapse .collapsed .accordion-icon .accordion-icon-off{display:inline-flex}.accordion.accordion-icon-collapse .collapsed .accordion-icon .svg-icon,.accordion.accordion-icon-collapse .collapsed .accordion-icon i{color:var(--bs-text-muted)}.accordion.accordion-borderless .accordion-item{border:0}.accordion.accordion-flush .accordion-item{background-color:transparent;border:0;border-radius:0;padding-left:0;padding-right:0}.image-input{position:relative;display:inline-block;border-radius:.475rem;background-repeat:no-repeat;background-size:cover}.image-input:not(.image-input-empty){background-image:none!important}.image-input .image-input-wrapper{width:120px;height:120px;border-radius:.475rem;background-repeat:no-repeat;background-size:cover}.image-input [data-kt-image-input-action]{cursor:pointer;position:absolute;transform:translate(-50%,-50%)}.image-input [data-kt-image-input-action=change]{left:100%;top:0}.image-input [data-kt-image-input-action=change] input{width:0!important;height:0!important;overflow:hidden;opacity:0}.image-input [data-kt-image-input-action=cancel],.image-input [data-kt-image-input-action=remove]{position:absolute;left:100%;top:100%}.image-input [data-kt-image-input-action=cancel]{display:none}.image-input.image-input-changed [data-kt-image-input-action=cancel]{display:flex}.image-input.image-input-changed [data-kt-image-input-action=remove]{display:none}.image-input.image-input-empty [data-kt-image-input-action=cancel],.image-input.image-input-empty [data-kt-image-input-action=remove]{display:none}.image-input.image-input-circle{border-radius:50%}.image-input.image-input-circle .image-input-wrapper{border-radius:50%}.image-input.image-input-circle [data-kt-image-input-action=change]{left:100%;top:0;transform:translate(-100%,0)}.image-input.image-input-circle [data-kt-image-input-action=cancel],.image-input.image-input-circle [data-kt-image-input-action=remove]{left:100%;top:100%;transform:translate(-100%,-100%)}.image-input.image-input-outline .image-input-wrapper{border:3px solid var(--bs-body-bg);box-shadow:var(--bs-box-shadow)}.symbol{display:inline-block;flex-shrink:0;position:relative;border-radius:.475rem}.symbol .symbol-label{display:flex;align-items:center;justify-content:center;font-weight:500;color:var(--bs-symbol-label-color);background-color:var(--bs-symbol-label-bg);background-repeat:no-repeat;background-position:center center;background-size:cover;border-radius:.475rem}.symbol .symbol-label:after{border-radius:.475rem}.symbol .symbol-badge{position:absolute;border-radius:100%;top:0;left:50%;transform:translateX(-50%) translateY(-50%)!important}.symbol>img{width:100%;flex-shrink:0;display:inline-block;border-radius:.475rem}.symbol.symbol-square,.symbol.symbol-square .symbol-label,.symbol.symbol-square>img{border-radius:0!important}.symbol.symbol-circle,.symbol.symbol-circle .symbol-label,.symbol.symbol-circle>img{border-radius:50%}.symbol.symbol-circle .symbol-label:after,.symbol.symbol-circle:after,.symbol.symbol-circle>img:after{border-radius:50%}.symbol>img{width:50px;height:50px}.symbol .symbol-label{width:50px;height:50px}.symbol.symbol-fixed .symbol-label{width:50px;height:50px}.symbol.symbol-fixed>img{width:50px;height:50px;max-width:none}.symbol.symbol-2by3 .symbol-label{height:50px;width:75px}.symbol.symbol-2by3>img{height:50px;width:75px;max-width:none}.symbol.symbol-20px>img{width:20px;height:20px}.symbol.symbol-20px .symbol-label{width:20px;height:20px}.symbol.symbol-20px.symbol-fixed .symbol-label{width:20px;height:20px}.symbol.symbol-20px.symbol-fixed>img{width:20px;height:20px;max-width:none}.symbol.symbol-20px.symbol-2by3 .symbol-label{height:20px;width:30px}.symbol.symbol-20px.symbol-2by3>img{height:20px;width:30px;max-width:none}.symbol.symbol-25px>img{width:25px;height:25px}.symbol.symbol-25px .symbol-label{width:25px;height:25px}.symbol.symbol-25px.symbol-fixed .symbol-label{width:25px;height:25px}.symbol.symbol-25px.symbol-fixed>img{width:25px;height:25px;max-width:none}.symbol.symbol-25px.symbol-2by3 .symbol-label{height:25px;width:37.5px}.symbol.symbol-25px.symbol-2by3>img{height:25px;width:37.5px;max-width:none}.symbol.symbol-30px>img{width:30px;height:30px}.symbol.symbol-30px .symbol-label{width:30px;height:30px}.symbol.symbol-30px.symbol-fixed .symbol-label{width:30px;height:30px}.symbol.symbol-30px.symbol-fixed>img{width:30px;height:30px;max-width:none}.symbol.symbol-30px.symbol-2by3 .symbol-label{height:30px;width:45px}.symbol.symbol-30px.symbol-2by3>img{height:30px;width:45px;max-width:none}.symbol.symbol-35px>img{width:35px;height:35px}.symbol.symbol-35px .symbol-label{width:35px;height:35px}.symbol.symbol-35px.symbol-fixed .symbol-label{width:35px;height:35px}.symbol.symbol-35px.symbol-fixed>img{width:35px;height:35px;max-width:none}.symbol.symbol-35px.symbol-2by3 .symbol-label{height:35px;width:52.5px}.symbol.symbol-35px.symbol-2by3>img{height:35px;width:52.5px;max-width:none}.symbol.symbol-40px>img{width:40px;height:40px}.symbol.symbol-40px .symbol-label{width:40px;height:40px}.symbol.symbol-40px.symbol-fixed .symbol-label{width:40px;height:40px}.symbol.symbol-40px.symbol-fixed>img{width:40px;height:40px;max-width:none}.symbol.symbol-40px.symbol-2by3 .symbol-label{height:40px;width:60px}.symbol.symbol-40px.symbol-2by3>img{height:40px;width:60px;max-width:none}.symbol.symbol-45px>img{width:45px;height:45px}.symbol.symbol-45px .symbol-label{width:45px;height:45px}.symbol.symbol-45px.symbol-fixed .symbol-label{width:45px;height:45px}.symbol.symbol-45px.symbol-fixed>img{width:45px;height:45px;max-width:none}.symbol.symbol-45px.symbol-2by3 .symbol-label{height:45px;width:67.5px}.symbol.symbol-45px.symbol-2by3>img{height:45px;width:67.5px;max-width:none}.symbol.symbol-50px>img{width:50px;height:50px}.symbol.symbol-50px .symbol-label{width:50px;height:50px}.symbol.symbol-50px.symbol-fixed .symbol-label{width:50px;height:50px}.symbol.symbol-50px.symbol-fixed>img{width:50px;height:50px;max-width:none}.symbol.symbol-50px.symbol-2by3 .symbol-label{height:50px;width:75px}.symbol.symbol-50px.symbol-2by3>img{height:50px;width:75px;max-width:none}.symbol.symbol-55px>img{width:55px;height:55px}.symbol.symbol-55px .symbol-label{width:55px;height:55px}.symbol.symbol-55px.symbol-fixed .symbol-label{width:55px;height:55px}.symbol.symbol-55px.symbol-fixed>img{width:55px;height:55px;max-width:none}.symbol.symbol-55px.symbol-2by3 .symbol-label{height:55px;width:82.5px}.symbol.symbol-55px.symbol-2by3>img{height:55px;width:82.5px;max-width:none}.symbol.symbol-60px>img{width:60px;height:60px}.symbol.symbol-60px .symbol-label{width:60px;height:60px}.symbol.symbol-60px.symbol-fixed .symbol-label{width:60px;height:60px}.symbol.symbol-60px.symbol-fixed>img{width:60px;height:60px;max-width:none}.symbol.symbol-60px.symbol-2by3 .symbol-label{height:60px;width:90px}.symbol.symbol-60px.symbol-2by3>img{height:60px;width:90px;max-width:none}.symbol.symbol-65px>img{width:65px;height:65px}.symbol.symbol-65px .symbol-label{width:65px;height:65px}.symbol.symbol-65px.symbol-fixed .symbol-label{width:65px;height:65px}.symbol.symbol-65px.symbol-fixed>img{width:65px;height:65px;max-width:none}.symbol.symbol-65px.symbol-2by3 .symbol-label{height:65px;width:97.5px}.symbol.symbol-65px.symbol-2by3>img{height:65px;width:97.5px;max-width:none}.symbol.symbol-70px>img{width:70px;height:70px}.symbol.symbol-70px .symbol-label{width:70px;height:70px}.symbol.symbol-70px.symbol-fixed .symbol-label{width:70px;height:70px}.symbol.symbol-70px.symbol-fixed>img{width:70px;height:70px;max-width:none}.symbol.symbol-70px.symbol-2by3 .symbol-label{height:70px;width:105px}.symbol.symbol-70px.symbol-2by3>img{height:70px;width:105px;max-width:none}.symbol.symbol-75px>img{width:75px;height:75px}.symbol.symbol-75px .symbol-label{width:75px;height:75px}.symbol.symbol-75px.symbol-fixed .symbol-label{width:75px;height:75px}.symbol.symbol-75px.symbol-fixed>img{width:75px;height:75px;max-width:none}.symbol.symbol-75px.symbol-2by3 .symbol-label{height:75px;width:112.5px}.symbol.symbol-75px.symbol-2by3>img{height:75px;width:112.5px;max-width:none}.symbol.symbol-90px>img{width:90px;height:90px}.symbol.symbol-90px .symbol-label{width:90px;height:90px}.symbol.symbol-90px.symbol-fixed .symbol-label{width:90px;height:90px}.symbol.symbol-90px.symbol-fixed>img{width:90px;height:90px;max-width:none}.symbol.symbol-90px.symbol-2by3 .symbol-label{height:90px;width:135px}.symbol.symbol-90px.symbol-2by3>img{height:90px;width:135px;max-width:none}.symbol.symbol-100px>img{width:100px;height:100px}.symbol.symbol-100px .symbol-label{width:100px;height:100px}.symbol.symbol-100px.symbol-fixed .symbol-label{width:100px;height:100px}.symbol.symbol-100px.symbol-fixed>img{width:100px;height:100px;max-width:none}.symbol.symbol-100px.symbol-2by3 .symbol-label{height:100px;width:150px}.symbol.symbol-100px.symbol-2by3>img{height:100px;width:150px;max-width:none}.symbol.symbol-125px>img{width:125px;height:125px}.symbol.symbol-125px .symbol-label{width:125px;height:125px}.symbol.symbol-125px.symbol-fixed .symbol-label{width:125px;height:125px}.symbol.symbol-125px.symbol-fixed>img{width:125px;height:125px;max-width:none}.symbol.symbol-125px.symbol-2by3 .symbol-label{height:125px;width:187.5px}.symbol.symbol-125px.symbol-2by3>img{height:125px;width:187.5px;max-width:none}.symbol.symbol-150px>img{width:150px;height:150px}.symbol.symbol-150px .symbol-label{width:150px;height:150px}.symbol.symbol-150px.symbol-fixed .symbol-label{width:150px;height:150px}.symbol.symbol-150px.symbol-fixed>img{width:150px;height:150px;max-width:none}.symbol.symbol-150px.symbol-2by3 .symbol-label{height:150px;width:225px}.symbol.symbol-150px.symbol-2by3>img{height:150px;width:225px;max-width:none}.symbol.symbol-160px>img{width:160px;height:160px}.symbol.symbol-160px .symbol-label{width:160px;height:160px}.symbol.symbol-160px.symbol-fixed .symbol-label{width:160px;height:160px}.symbol.symbol-160px.symbol-fixed>img{width:160px;height:160px;max-width:none}.symbol.symbol-160px.symbol-2by3 .symbol-label{height:160px;width:240px}.symbol.symbol-160px.symbol-2by3>img{height:160px;width:240px;max-width:none}.symbol.symbol-175px>img{width:175px;height:175px}.symbol.symbol-175px .symbol-label{width:175px;height:175px}.symbol.symbol-175px.symbol-fixed .symbol-label{width:175px;height:175px}.symbol.symbol-175px.symbol-fixed>img{width:175px;height:175px;max-width:none}.symbol.symbol-175px.symbol-2by3 .symbol-label{height:175px;width:262.5px}.symbol.symbol-175px.symbol-2by3>img{height:175px;width:262.5px;max-width:none}.symbol.symbol-200px>img{width:200px;height:200px}.symbol.symbol-200px .symbol-label{width:200px;height:200px}.symbol.symbol-200px.symbol-fixed .symbol-label{width:200px;height:200px}.symbol.symbol-200px.symbol-fixed>img{width:200px;height:200px;max-width:none}.symbol.symbol-200px.symbol-2by3 .symbol-label{height:200px;width:300px}.symbol.symbol-200px.symbol-2by3>img{height:200px;width:300px;max-width:none}@media (min-width:576px){.symbol.symbol-sm-20px>img{width:20px;height:20px}.symbol.symbol-sm-20px .symbol-label{width:20px;height:20px}.symbol.symbol-sm-20px.symbol-fixed .symbol-label{width:20px;height:20px}.symbol.symbol-sm-20px.symbol-fixed>img{width:20px;height:20px;max-width:none}.symbol.symbol-sm-20px.symbol-2by3 .symbol-label{height:20px;width:30px}.symbol.symbol-sm-20px.symbol-2by3>img{height:20px;width:30px;max-width:none}.symbol.symbol-sm-25px>img{width:25px;height:25px}.symbol.symbol-sm-25px .symbol-label{width:25px;height:25px}.symbol.symbol-sm-25px.symbol-fixed .symbol-label{width:25px;height:25px}.symbol.symbol-sm-25px.symbol-fixed>img{width:25px;height:25px;max-width:none}.symbol.symbol-sm-25px.symbol-2by3 .symbol-label{height:25px;width:37.5px}.symbol.symbol-sm-25px.symbol-2by3>img{height:25px;width:37.5px;max-width:none}.symbol.symbol-sm-30px>img{width:30px;height:30px}.symbol.symbol-sm-30px .symbol-label{width:30px;height:30px}.symbol.symbol-sm-30px.symbol-fixed .symbol-label{width:30px;height:30px}.symbol.symbol-sm-30px.symbol-fixed>img{width:30px;height:30px;max-width:none}.symbol.symbol-sm-30px.symbol-2by3 .symbol-label{height:30px;width:45px}.symbol.symbol-sm-30px.symbol-2by3>img{height:30px;width:45px;max-width:none}.symbol.symbol-sm-35px>img{width:35px;height:35px}.symbol.symbol-sm-35px .symbol-label{width:35px;height:35px}.symbol.symbol-sm-35px.symbol-fixed .symbol-label{width:35px;height:35px}.symbol.symbol-sm-35px.symbol-fixed>img{width:35px;height:35px;max-width:none}.symbol.symbol-sm-35px.symbol-2by3 .symbol-label{height:35px;width:52.5px}.symbol.symbol-sm-35px.symbol-2by3>img{height:35px;width:52.5px;max-width:none}.symbol.symbol-sm-40px>img{width:40px;height:40px}.symbol.symbol-sm-40px .symbol-label{width:40px;height:40px}.symbol.symbol-sm-40px.symbol-fixed .symbol-label{width:40px;height:40px}.symbol.symbol-sm-40px.symbol-fixed>img{width:40px;height:40px;max-width:none}.symbol.symbol-sm-40px.symbol-2by3 .symbol-label{height:40px;width:60px}.symbol.symbol-sm-40px.symbol-2by3>img{height:40px;width:60px;max-width:none}.symbol.symbol-sm-45px>img{width:45px;height:45px}.symbol.symbol-sm-45px .symbol-label{width:45px;height:45px}.symbol.symbol-sm-45px.symbol-fixed .symbol-label{width:45px;height:45px}.symbol.symbol-sm-45px.symbol-fixed>img{width:45px;height:45px;max-width:none}.symbol.symbol-sm-45px.symbol-2by3 .symbol-label{height:45px;width:67.5px}.symbol.symbol-sm-45px.symbol-2by3>img{height:45px;width:67.5px;max-width:none}.symbol.symbol-sm-50px>img{width:50px;height:50px}.symbol.symbol-sm-50px .symbol-label{width:50px;height:50px}.symbol.symbol-sm-50px.symbol-fixed .symbol-label{width:50px;height:50px}.symbol.symbol-sm-50px.symbol-fixed>img{width:50px;height:50px;max-width:none}.symbol.symbol-sm-50px.symbol-2by3 .symbol-label{height:50px;width:75px}.symbol.symbol-sm-50px.symbol-2by3>img{height:50px;width:75px;max-width:none}.symbol.symbol-sm-55px>img{width:55px;height:55px}.symbol.symbol-sm-55px .symbol-label{width:55px;height:55px}.symbol.symbol-sm-55px.symbol-fixed .symbol-label{width:55px;height:55px}.symbol.symbol-sm-55px.symbol-fixed>img{width:55px;height:55px;max-width:none}.symbol.symbol-sm-55px.symbol-2by3 .symbol-label{height:55px;width:82.5px}.symbol.symbol-sm-55px.symbol-2by3>img{height:55px;width:82.5px;max-width:none}.symbol.symbol-sm-60px>img{width:60px;height:60px}.symbol.symbol-sm-60px .symbol-label{width:60px;height:60px}.symbol.symbol-sm-60px.symbol-fixed .symbol-label{width:60px;height:60px}.symbol.symbol-sm-60px.symbol-fixed>img{width:60px;height:60px;max-width:none}.symbol.symbol-sm-60px.symbol-2by3 .symbol-label{height:60px;width:90px}.symbol.symbol-sm-60px.symbol-2by3>img{height:60px;width:90px;max-width:none}.symbol.symbol-sm-65px>img{width:65px;height:65px}.symbol.symbol-sm-65px .symbol-label{width:65px;height:65px}.symbol.symbol-sm-65px.symbol-fixed .symbol-label{width:65px;height:65px}.symbol.symbol-sm-65px.symbol-fixed>img{width:65px;height:65px;max-width:none}.symbol.symbol-sm-65px.symbol-2by3 .symbol-label{height:65px;width:97.5px}.symbol.symbol-sm-65px.symbol-2by3>img{height:65px;width:97.5px;max-width:none}.symbol.symbol-sm-70px>img{width:70px;height:70px}.symbol.symbol-sm-70px .symbol-label{width:70px;height:70px}.symbol.symbol-sm-70px.symbol-fixed .symbol-label{width:70px;height:70px}.symbol.symbol-sm-70px.symbol-fixed>img{width:70px;height:70px;max-width:none}.symbol.symbol-sm-70px.symbol-2by3 .symbol-label{height:70px;width:105px}.symbol.symbol-sm-70px.symbol-2by3>img{height:70px;width:105px;max-width:none}.symbol.symbol-sm-75px>img{width:75px;height:75px}.symbol.symbol-sm-75px .symbol-label{width:75px;height:75px}.symbol.symbol-sm-75px.symbol-fixed .symbol-label{width:75px;height:75px}.symbol.symbol-sm-75px.symbol-fixed>img{width:75px;height:75px;max-width:none}.symbol.symbol-sm-75px.symbol-2by3 .symbol-label{height:75px;width:112.5px}.symbol.symbol-sm-75px.symbol-2by3>img{height:75px;width:112.5px;max-width:none}.symbol.symbol-sm-90px>img{width:90px;height:90px}.symbol.symbol-sm-90px .symbol-label{width:90px;height:90px}.symbol.symbol-sm-90px.symbol-fixed .symbol-label{width:90px;height:90px}.symbol.symbol-sm-90px.symbol-fixed>img{width:90px;height:90px;max-width:none}.symbol.symbol-sm-90px.symbol-2by3 .symbol-label{height:90px;width:135px}.symbol.symbol-sm-90px.symbol-2by3>img{height:90px;width:135px;max-width:none}.symbol.symbol-sm-100px>img{width:100px;height:100px}.symbol.symbol-sm-100px .symbol-label{width:100px;height:100px}.symbol.symbol-sm-100px.symbol-fixed .symbol-label{width:100px;height:100px}.symbol.symbol-sm-100px.symbol-fixed>img{width:100px;height:100px;max-width:none}.symbol.symbol-sm-100px.symbol-2by3 .symbol-label{height:100px;width:150px}.symbol.symbol-sm-100px.symbol-2by3>img{height:100px;width:150px;max-width:none}.symbol.symbol-sm-125px>img{width:125px;height:125px}.symbol.symbol-sm-125px .symbol-label{width:125px;height:125px}.symbol.symbol-sm-125px.symbol-fixed .symbol-label{width:125px;height:125px}.symbol.symbol-sm-125px.symbol-fixed>img{width:125px;height:125px;max-width:none}.symbol.symbol-sm-125px.symbol-2by3 .symbol-label{height:125px;width:187.5px}.symbol.symbol-sm-125px.symbol-2by3>img{height:125px;width:187.5px;max-width:none}.symbol.symbol-sm-150px>img{width:150px;height:150px}.symbol.symbol-sm-150px .symbol-label{width:150px;height:150px}.symbol.symbol-sm-150px.symbol-fixed .symbol-label{width:150px;height:150px}.symbol.symbol-sm-150px.symbol-fixed>img{width:150px;height:150px;max-width:none}.symbol.symbol-sm-150px.symbol-2by3 .symbol-label{height:150px;width:225px}.symbol.symbol-sm-150px.symbol-2by3>img{height:150px;width:225px;max-width:none}.symbol.symbol-sm-160px>img{width:160px;height:160px}.symbol.symbol-sm-160px .symbol-label{width:160px;height:160px}.symbol.symbol-sm-160px.symbol-fixed .symbol-label{width:160px;height:160px}.symbol.symbol-sm-160px.symbol-fixed>img{width:160px;height:160px;max-width:none}.symbol.symbol-sm-160px.symbol-2by3 .symbol-label{height:160px;width:240px}.symbol.symbol-sm-160px.symbol-2by3>img{height:160px;width:240px;max-width:none}.symbol.symbol-sm-175px>img{width:175px;height:175px}.symbol.symbol-sm-175px .symbol-label{width:175px;height:175px}.symbol.symbol-sm-175px.symbol-fixed .symbol-label{width:175px;height:175px}.symbol.symbol-sm-175px.symbol-fixed>img{width:175px;height:175px;max-width:none}.symbol.symbol-sm-175px.symbol-2by3 .symbol-label{height:175px;width:262.5px}.symbol.symbol-sm-175px.symbol-2by3>img{height:175px;width:262.5px;max-width:none}.symbol.symbol-sm-200px>img{width:200px;height:200px}.symbol.symbol-sm-200px .symbol-label{width:200px;height:200px}.symbol.symbol-sm-200px.symbol-fixed .symbol-label{width:200px;height:200px}.symbol.symbol-sm-200px.symbol-fixed>img{width:200px;height:200px;max-width:none}.symbol.symbol-sm-200px.symbol-2by3 .symbol-label{height:200px;width:300px}.symbol.symbol-sm-200px.symbol-2by3>img{height:200px;width:300px;max-width:none}}@media (min-width:768px){.symbol.symbol-md-20px>img{width:20px;height:20px}.symbol.symbol-md-20px .symbol-label{width:20px;height:20px}.symbol.symbol-md-20px.symbol-fixed .symbol-label{width:20px;height:20px}.symbol.symbol-md-20px.symbol-fixed>img{width:20px;height:20px;max-width:none}.symbol.symbol-md-20px.symbol-2by3 .symbol-label{height:20px;width:30px}.symbol.symbol-md-20px.symbol-2by3>img{height:20px;width:30px;max-width:none}.symbol.symbol-md-25px>img{width:25px;height:25px}.symbol.symbol-md-25px .symbol-label{width:25px;height:25px}.symbol.symbol-md-25px.symbol-fixed .symbol-label{width:25px;height:25px}.symbol.symbol-md-25px.symbol-fixed>img{width:25px;height:25px;max-width:none}.symbol.symbol-md-25px.symbol-2by3 .symbol-label{height:25px;width:37.5px}.symbol.symbol-md-25px.symbol-2by3>img{height:25px;width:37.5px;max-width:none}.symbol.symbol-md-30px>img{width:30px;height:30px}.symbol.symbol-md-30px .symbol-label{width:30px;height:30px}.symbol.symbol-md-30px.symbol-fixed .symbol-label{width:30px;height:30px}.symbol.symbol-md-30px.symbol-fixed>img{width:30px;height:30px;max-width:none}.symbol.symbol-md-30px.symbol-2by3 .symbol-label{height:30px;width:45px}.symbol.symbol-md-30px.symbol-2by3>img{height:30px;width:45px;max-width:none}.symbol.symbol-md-35px>img{width:35px;height:35px}.symbol.symbol-md-35px .symbol-label{width:35px;height:35px}.symbol.symbol-md-35px.symbol-fixed .symbol-label{width:35px;height:35px}.symbol.symbol-md-35px.symbol-fixed>img{width:35px;height:35px;max-width:none}.symbol.symbol-md-35px.symbol-2by3 .symbol-label{height:35px;width:52.5px}.symbol.symbol-md-35px.symbol-2by3>img{height:35px;width:52.5px;max-width:none}.symbol.symbol-md-40px>img{width:40px;height:40px}.symbol.symbol-md-40px .symbol-label{width:40px;height:40px}.symbol.symbol-md-40px.symbol-fixed .symbol-label{width:40px;height:40px}.symbol.symbol-md-40px.symbol-fixed>img{width:40px;height:40px;max-width:none}.symbol.symbol-md-40px.symbol-2by3 .symbol-label{height:40px;width:60px}.symbol.symbol-md-40px.symbol-2by3>img{height:40px;width:60px;max-width:none}.symbol.symbol-md-45px>img{width:45px;height:45px}.symbol.symbol-md-45px .symbol-label{width:45px;height:45px}.symbol.symbol-md-45px.symbol-fixed .symbol-label{width:45px;height:45px}.symbol.symbol-md-45px.symbol-fixed>img{width:45px;height:45px;max-width:none}.symbol.symbol-md-45px.symbol-2by3 .symbol-label{height:45px;width:67.5px}.symbol.symbol-md-45px.symbol-2by3>img{height:45px;width:67.5px;max-width:none}.symbol.symbol-md-50px>img{width:50px;height:50px}.symbol.symbol-md-50px .symbol-label{width:50px;height:50px}.symbol.symbol-md-50px.symbol-fixed .symbol-label{width:50px;height:50px}.symbol.symbol-md-50px.symbol-fixed>img{width:50px;height:50px;max-width:none}.symbol.symbol-md-50px.symbol-2by3 .symbol-label{height:50px;width:75px}.symbol.symbol-md-50px.symbol-2by3>img{height:50px;width:75px;max-width:none}.symbol.symbol-md-55px>img{width:55px;height:55px}.symbol.symbol-md-55px .symbol-label{width:55px;height:55px}.symbol.symbol-md-55px.symbol-fixed .symbol-label{width:55px;height:55px}.symbol.symbol-md-55px.symbol-fixed>img{width:55px;height:55px;max-width:none}.symbol.symbol-md-55px.symbol-2by3 .symbol-label{height:55px;width:82.5px}.symbol.symbol-md-55px.symbol-2by3>img{height:55px;width:82.5px;max-width:none}.symbol.symbol-md-60px>img{width:60px;height:60px}.symbol.symbol-md-60px .symbol-label{width:60px;height:60px}.symbol.symbol-md-60px.symbol-fixed .symbol-label{width:60px;height:60px}.symbol.symbol-md-60px.symbol-fixed>img{width:60px;height:60px;max-width:none}.symbol.symbol-md-60px.symbol-2by3 .symbol-label{height:60px;width:90px}.symbol.symbol-md-60px.symbol-2by3>img{height:60px;width:90px;max-width:none}.symbol.symbol-md-65px>img{width:65px;height:65px}.symbol.symbol-md-65px .symbol-label{width:65px;height:65px}.symbol.symbol-md-65px.symbol-fixed .symbol-label{width:65px;height:65px}.symbol.symbol-md-65px.symbol-fixed>img{width:65px;height:65px;max-width:none}.symbol.symbol-md-65px.symbol-2by3 .symbol-label{height:65px;width:97.5px}.symbol.symbol-md-65px.symbol-2by3>img{height:65px;width:97.5px;max-width:none}.symbol.symbol-md-70px>img{width:70px;height:70px}.symbol.symbol-md-70px .symbol-label{width:70px;height:70px}.symbol.symbol-md-70px.symbol-fixed .symbol-label{width:70px;height:70px}.symbol.symbol-md-70px.symbol-fixed>img{width:70px;height:70px;max-width:none}.symbol.symbol-md-70px.symbol-2by3 .symbol-label{height:70px;width:105px}.symbol.symbol-md-70px.symbol-2by3>img{height:70px;width:105px;max-width:none}.symbol.symbol-md-75px>img{width:75px;height:75px}.symbol.symbol-md-75px .symbol-label{width:75px;height:75px}.symbol.symbol-md-75px.symbol-fixed .symbol-label{width:75px;height:75px}.symbol.symbol-md-75px.symbol-fixed>img{width:75px;height:75px;max-width:none}.symbol.symbol-md-75px.symbol-2by3 .symbol-label{height:75px;width:112.5px}.symbol.symbol-md-75px.symbol-2by3>img{height:75px;width:112.5px;max-width:none}.symbol.symbol-md-90px>img{width:90px;height:90px}.symbol.symbol-md-90px .symbol-label{width:90px;height:90px}.symbol.symbol-md-90px.symbol-fixed .symbol-label{width:90px;height:90px}.symbol.symbol-md-90px.symbol-fixed>img{width:90px;height:90px;max-width:none}.symbol.symbol-md-90px.symbol-2by3 .symbol-label{height:90px;width:135px}.symbol.symbol-md-90px.symbol-2by3>img{height:90px;width:135px;max-width:none}.symbol.symbol-md-100px>img{width:100px;height:100px}.symbol.symbol-md-100px .symbol-label{width:100px;height:100px}.symbol.symbol-md-100px.symbol-fixed .symbol-label{width:100px;height:100px}.symbol.symbol-md-100px.symbol-fixed>img{width:100px;height:100px;max-width:none}.symbol.symbol-md-100px.symbol-2by3 .symbol-label{height:100px;width:150px}.symbol.symbol-md-100px.symbol-2by3>img{height:100px;width:150px;max-width:none}.symbol.symbol-md-125px>img{width:125px;height:125px}.symbol.symbol-md-125px .symbol-label{width:125px;height:125px}.symbol.symbol-md-125px.symbol-fixed .symbol-label{width:125px;height:125px}.symbol.symbol-md-125px.symbol-fixed>img{width:125px;height:125px;max-width:none}.symbol.symbol-md-125px.symbol-2by3 .symbol-label{height:125px;width:187.5px}.symbol.symbol-md-125px.symbol-2by3>img{height:125px;width:187.5px;max-width:none}.symbol.symbol-md-150px>img{width:150px;height:150px}.symbol.symbol-md-150px .symbol-label{width:150px;height:150px}.symbol.symbol-md-150px.symbol-fixed .symbol-label{width:150px;height:150px}.symbol.symbol-md-150px.symbol-fixed>img{width:150px;height:150px;max-width:none}.symbol.symbol-md-150px.symbol-2by3 .symbol-label{height:150px;width:225px}.symbol.symbol-md-150px.symbol-2by3>img{height:150px;width:225px;max-width:none}.symbol.symbol-md-160px>img{width:160px;height:160px}.symbol.symbol-md-160px .symbol-label{width:160px;height:160px}.symbol.symbol-md-160px.symbol-fixed .symbol-label{width:160px;height:160px}.symbol.symbol-md-160px.symbol-fixed>img{width:160px;height:160px;max-width:none}.symbol.symbol-md-160px.symbol-2by3 .symbol-label{height:160px;width:240px}.symbol.symbol-md-160px.symbol-2by3>img{height:160px;width:240px;max-width:none}.symbol.symbol-md-175px>img{width:175px;height:175px}.symbol.symbol-md-175px .symbol-label{width:175px;height:175px}.symbol.symbol-md-175px.symbol-fixed .symbol-label{width:175px;height:175px}.symbol.symbol-md-175px.symbol-fixed>img{width:175px;height:175px;max-width:none}.symbol.symbol-md-175px.symbol-2by3 .symbol-label{height:175px;width:262.5px}.symbol.symbol-md-175px.symbol-2by3>img{height:175px;width:262.5px;max-width:none}.symbol.symbol-md-200px>img{width:200px;height:200px}.symbol.symbol-md-200px .symbol-label{width:200px;height:200px}.symbol.symbol-md-200px.symbol-fixed .symbol-label{width:200px;height:200px}.symbol.symbol-md-200px.symbol-fixed>img{width:200px;height:200px;max-width:none}.symbol.symbol-md-200px.symbol-2by3 .symbol-label{height:200px;width:300px}.symbol.symbol-md-200px.symbol-2by3>img{height:200px;width:300px;max-width:none}}@media (min-width:992px){.symbol.symbol-lg-20px>img{width:20px;height:20px}.symbol.symbol-lg-20px .symbol-label{width:20px;height:20px}.symbol.symbol-lg-20px.symbol-fixed .symbol-label{width:20px;height:20px}.symbol.symbol-lg-20px.symbol-fixed>img{width:20px;height:20px;max-width:none}.symbol.symbol-lg-20px.symbol-2by3 .symbol-label{height:20px;width:30px}.symbol.symbol-lg-20px.symbol-2by3>img{height:20px;width:30px;max-width:none}.symbol.symbol-lg-25px>img{width:25px;height:25px}.symbol.symbol-lg-25px .symbol-label{width:25px;height:25px}.symbol.symbol-lg-25px.symbol-fixed .symbol-label{width:25px;height:25px}.symbol.symbol-lg-25px.symbol-fixed>img{width:25px;height:25px;max-width:none}.symbol.symbol-lg-25px.symbol-2by3 .symbol-label{height:25px;width:37.5px}.symbol.symbol-lg-25px.symbol-2by3>img{height:25px;width:37.5px;max-width:none}.symbol.symbol-lg-30px>img{width:30px;height:30px}.symbol.symbol-lg-30px .symbol-label{width:30px;height:30px}.symbol.symbol-lg-30px.symbol-fixed .symbol-label{width:30px;height:30px}.symbol.symbol-lg-30px.symbol-fixed>img{width:30px;height:30px;max-width:none}.symbol.symbol-lg-30px.symbol-2by3 .symbol-label{height:30px;width:45px}.symbol.symbol-lg-30px.symbol-2by3>img{height:30px;width:45px;max-width:none}.symbol.symbol-lg-35px>img{width:35px;height:35px}.symbol.symbol-lg-35px .symbol-label{width:35px;height:35px}.symbol.symbol-lg-35px.symbol-fixed .symbol-label{width:35px;height:35px}.symbol.symbol-lg-35px.symbol-fixed>img{width:35px;height:35px;max-width:none}.symbol.symbol-lg-35px.symbol-2by3 .symbol-label{height:35px;width:52.5px}.symbol.symbol-lg-35px.symbol-2by3>img{height:35px;width:52.5px;max-width:none}.symbol.symbol-lg-40px>img{width:40px;height:40px}.symbol.symbol-lg-40px .symbol-label{width:40px;height:40px}.symbol.symbol-lg-40px.symbol-fixed .symbol-label{width:40px;height:40px}.symbol.symbol-lg-40px.symbol-fixed>img{width:40px;height:40px;max-width:none}.symbol.symbol-lg-40px.symbol-2by3 .symbol-label{height:40px;width:60px}.symbol.symbol-lg-40px.symbol-2by3>img{height:40px;width:60px;max-width:none}.symbol.symbol-lg-45px>img{width:45px;height:45px}.symbol.symbol-lg-45px .symbol-label{width:45px;height:45px}.symbol.symbol-lg-45px.symbol-fixed .symbol-label{width:45px;height:45px}.symbol.symbol-lg-45px.symbol-fixed>img{width:45px;height:45px;max-width:none}.symbol.symbol-lg-45px.symbol-2by3 .symbol-label{height:45px;width:67.5px}.symbol.symbol-lg-45px.symbol-2by3>img{height:45px;width:67.5px;max-width:none}.symbol.symbol-lg-50px>img{width:50px;height:50px}.symbol.symbol-lg-50px .symbol-label{width:50px;height:50px}.symbol.symbol-lg-50px.symbol-fixed .symbol-label{width:50px;height:50px}.symbol.symbol-lg-50px.symbol-fixed>img{width:50px;height:50px;max-width:none}.symbol.symbol-lg-50px.symbol-2by3 .symbol-label{height:50px;width:75px}.symbol.symbol-lg-50px.symbol-2by3>img{height:50px;width:75px;max-width:none}.symbol.symbol-lg-55px>img{width:55px;height:55px}.symbol.symbol-lg-55px .symbol-label{width:55px;height:55px}.symbol.symbol-lg-55px.symbol-fixed .symbol-label{width:55px;height:55px}.symbol.symbol-lg-55px.symbol-fixed>img{width:55px;height:55px;max-width:none}.symbol.symbol-lg-55px.symbol-2by3 .symbol-label{height:55px;width:82.5px}.symbol.symbol-lg-55px.symbol-2by3>img{height:55px;width:82.5px;max-width:none}.symbol.symbol-lg-60px>img{width:60px;height:60px}.symbol.symbol-lg-60px .symbol-label{width:60px;height:60px}.symbol.symbol-lg-60px.symbol-fixed .symbol-label{width:60px;height:60px}.symbol.symbol-lg-60px.symbol-fixed>img{width:60px;height:60px;max-width:none}.symbol.symbol-lg-60px.symbol-2by3 .symbol-label{height:60px;width:90px}.symbol.symbol-lg-60px.symbol-2by3>img{height:60px;width:90px;max-width:none}.symbol.symbol-lg-65px>img{width:65px;height:65px}.symbol.symbol-lg-65px .symbol-label{width:65px;height:65px}.symbol.symbol-lg-65px.symbol-fixed .symbol-label{width:65px;height:65px}.symbol.symbol-lg-65px.symbol-fixed>img{width:65px;height:65px;max-width:none}.symbol.symbol-lg-65px.symbol-2by3 .symbol-label{height:65px;width:97.5px}.symbol.symbol-lg-65px.symbol-2by3>img{height:65px;width:97.5px;max-width:none}.symbol.symbol-lg-70px>img{width:70px;height:70px}.symbol.symbol-lg-70px .symbol-label{width:70px;height:70px}.symbol.symbol-lg-70px.symbol-fixed .symbol-label{width:70px;height:70px}.symbol.symbol-lg-70px.symbol-fixed>img{width:70px;height:70px;max-width:none}.symbol.symbol-lg-70px.symbol-2by3 .symbol-label{height:70px;width:105px}.symbol.symbol-lg-70px.symbol-2by3>img{height:70px;width:105px;max-width:none}.symbol.symbol-lg-75px>img{width:75px;height:75px}.symbol.symbol-lg-75px .symbol-label{width:75px;height:75px}.symbol.symbol-lg-75px.symbol-fixed .symbol-label{width:75px;height:75px}.symbol.symbol-lg-75px.symbol-fixed>img{width:75px;height:75px;max-width:none}.symbol.symbol-lg-75px.symbol-2by3 .symbol-label{height:75px;width:112.5px}.symbol.symbol-lg-75px.symbol-2by3>img{height:75px;width:112.5px;max-width:none}.symbol.symbol-lg-90px>img{width:90px;height:90px}.symbol.symbol-lg-90px .symbol-label{width:90px;height:90px}.symbol.symbol-lg-90px.symbol-fixed .symbol-label{width:90px;height:90px}.symbol.symbol-lg-90px.symbol-fixed>img{width:90px;height:90px;max-width:none}.symbol.symbol-lg-90px.symbol-2by3 .symbol-label{height:90px;width:135px}.symbol.symbol-lg-90px.symbol-2by3>img{height:90px;width:135px;max-width:none}.symbol.symbol-lg-100px>img{width:100px;height:100px}.symbol.symbol-lg-100px .symbol-label{width:100px;height:100px}.symbol.symbol-lg-100px.symbol-fixed .symbol-label{width:100px;height:100px}.symbol.symbol-lg-100px.symbol-fixed>img{width:100px;height:100px;max-width:none}.symbol.symbol-lg-100px.symbol-2by3 .symbol-label{height:100px;width:150px}.symbol.symbol-lg-100px.symbol-2by3>img{height:100px;width:150px;max-width:none}.symbol.symbol-lg-125px>img{width:125px;height:125px}.symbol.symbol-lg-125px .symbol-label{width:125px;height:125px}.symbol.symbol-lg-125px.symbol-fixed .symbol-label{width:125px;height:125px}.symbol.symbol-lg-125px.symbol-fixed>img{width:125px;height:125px;max-width:none}.symbol.symbol-lg-125px.symbol-2by3 .symbol-label{height:125px;width:187.5px}.symbol.symbol-lg-125px.symbol-2by3>img{height:125px;width:187.5px;max-width:none}.symbol.symbol-lg-150px>img{width:150px;height:150px}.symbol.symbol-lg-150px .symbol-label{width:150px;height:150px}.symbol.symbol-lg-150px.symbol-fixed .symbol-label{width:150px;height:150px}.symbol.symbol-lg-150px.symbol-fixed>img{width:150px;height:150px;max-width:none}.symbol.symbol-lg-150px.symbol-2by3 .symbol-label{height:150px;width:225px}.symbol.symbol-lg-150px.symbol-2by3>img{height:150px;width:225px;max-width:none}.symbol.symbol-lg-160px>img{width:160px;height:160px}.symbol.symbol-lg-160px .symbol-label{width:160px;height:160px}.symbol.symbol-lg-160px.symbol-fixed .symbol-label{width:160px;height:160px}.symbol.symbol-lg-160px.symbol-fixed>img{width:160px;height:160px;max-width:none}.symbol.symbol-lg-160px.symbol-2by3 .symbol-label{height:160px;width:240px}.symbol.symbol-lg-160px.symbol-2by3>img{height:160px;width:240px;max-width:none}.symbol.symbol-lg-175px>img{width:175px;height:175px}.symbol.symbol-lg-175px .symbol-label{width:175px;height:175px}.symbol.symbol-lg-175px.symbol-fixed .symbol-label{width:175px;height:175px}.symbol.symbol-lg-175px.symbol-fixed>img{width:175px;height:175px;max-width:none}.symbol.symbol-lg-175px.symbol-2by3 .symbol-label{height:175px;width:262.5px}.symbol.symbol-lg-175px.symbol-2by3>img{height:175px;width:262.5px;max-width:none}.symbol.symbol-lg-200px>img{width:200px;height:200px}.symbol.symbol-lg-200px .symbol-label{width:200px;height:200px}.symbol.symbol-lg-200px.symbol-fixed .symbol-label{width:200px;height:200px}.symbol.symbol-lg-200px.symbol-fixed>img{width:200px;height:200px;max-width:none}.symbol.symbol-lg-200px.symbol-2by3 .symbol-label{height:200px;width:300px}.symbol.symbol-lg-200px.symbol-2by3>img{height:200px;width:300px;max-width:none}}@media (min-width:1200px){.symbol.symbol-xl-20px>img{width:20px;height:20px}.symbol.symbol-xl-20px .symbol-label{width:20px;height:20px}.symbol.symbol-xl-20px.symbol-fixed .symbol-label{width:20px;height:20px}.symbol.symbol-xl-20px.symbol-fixed>img{width:20px;height:20px;max-width:none}.symbol.symbol-xl-20px.symbol-2by3 .symbol-label{height:20px;width:30px}.symbol.symbol-xl-20px.symbol-2by3>img{height:20px;width:30px;max-width:none}.symbol.symbol-xl-25px>img{width:25px;height:25px}.symbol.symbol-xl-25px .symbol-label{width:25px;height:25px}.symbol.symbol-xl-25px.symbol-fixed .symbol-label{width:25px;height:25px}.symbol.symbol-xl-25px.symbol-fixed>img{width:25px;height:25px;max-width:none}.symbol.symbol-xl-25px.symbol-2by3 .symbol-label{height:25px;width:37.5px}.symbol.symbol-xl-25px.symbol-2by3>img{height:25px;width:37.5px;max-width:none}.symbol.symbol-xl-30px>img{width:30px;height:30px}.symbol.symbol-xl-30px .symbol-label{width:30px;height:30px}.symbol.symbol-xl-30px.symbol-fixed .symbol-label{width:30px;height:30px}.symbol.symbol-xl-30px.symbol-fixed>img{width:30px;height:30px;max-width:none}.symbol.symbol-xl-30px.symbol-2by3 .symbol-label{height:30px;width:45px}.symbol.symbol-xl-30px.symbol-2by3>img{height:30px;width:45px;max-width:none}.symbol.symbol-xl-35px>img{width:35px;height:35px}.symbol.symbol-xl-35px .symbol-label{width:35px;height:35px}.symbol.symbol-xl-35px.symbol-fixed .symbol-label{width:35px;height:35px}.symbol.symbol-xl-35px.symbol-fixed>img{width:35px;height:35px;max-width:none}.symbol.symbol-xl-35px.symbol-2by3 .symbol-label{height:35px;width:52.5px}.symbol.symbol-xl-35px.symbol-2by3>img{height:35px;width:52.5px;max-width:none}.symbol.symbol-xl-40px>img{width:40px;height:40px}.symbol.symbol-xl-40px .symbol-label{width:40px;height:40px}.symbol.symbol-xl-40px.symbol-fixed .symbol-label{width:40px;height:40px}.symbol.symbol-xl-40px.symbol-fixed>img{width:40px;height:40px;max-width:none}.symbol.symbol-xl-40px.symbol-2by3 .symbol-label{height:40px;width:60px}.symbol.symbol-xl-40px.symbol-2by3>img{height:40px;width:60px;max-width:none}.symbol.symbol-xl-45px>img{width:45px;height:45px}.symbol.symbol-xl-45px .symbol-label{width:45px;height:45px}.symbol.symbol-xl-45px.symbol-fixed .symbol-label{width:45px;height:45px}.symbol.symbol-xl-45px.symbol-fixed>img{width:45px;height:45px;max-width:none}.symbol.symbol-xl-45px.symbol-2by3 .symbol-label{height:45px;width:67.5px}.symbol.symbol-xl-45px.symbol-2by3>img{height:45px;width:67.5px;max-width:none}.symbol.symbol-xl-50px>img{width:50px;height:50px}.symbol.symbol-xl-50px .symbol-label{width:50px;height:50px}.symbol.symbol-xl-50px.symbol-fixed .symbol-label{width:50px;height:50px}.symbol.symbol-xl-50px.symbol-fixed>img{width:50px;height:50px;max-width:none}.symbol.symbol-xl-50px.symbol-2by3 .symbol-label{height:50px;width:75px}.symbol.symbol-xl-50px.symbol-2by3>img{height:50px;width:75px;max-width:none}.symbol.symbol-xl-55px>img{width:55px;height:55px}.symbol.symbol-xl-55px .symbol-label{width:55px;height:55px}.symbol.symbol-xl-55px.symbol-fixed .symbol-label{width:55px;height:55px}.symbol.symbol-xl-55px.symbol-fixed>img{width:55px;height:55px;max-width:none}.symbol.symbol-xl-55px.symbol-2by3 .symbol-label{height:55px;width:82.5px}.symbol.symbol-xl-55px.symbol-2by3>img{height:55px;width:82.5px;max-width:none}.symbol.symbol-xl-60px>img{width:60px;height:60px}.symbol.symbol-xl-60px .symbol-label{width:60px;height:60px}.symbol.symbol-xl-60px.symbol-fixed .symbol-label{width:60px;height:60px}.symbol.symbol-xl-60px.symbol-fixed>img{width:60px;height:60px;max-width:none}.symbol.symbol-xl-60px.symbol-2by3 .symbol-label{height:60px;width:90px}.symbol.symbol-xl-60px.symbol-2by3>img{height:60px;width:90px;max-width:none}.symbol.symbol-xl-65px>img{width:65px;height:65px}.symbol.symbol-xl-65px .symbol-label{width:65px;height:65px}.symbol.symbol-xl-65px.symbol-fixed .symbol-label{width:65px;height:65px}.symbol.symbol-xl-65px.symbol-fixed>img{width:65px;height:65px;max-width:none}.symbol.symbol-xl-65px.symbol-2by3 .symbol-label{height:65px;width:97.5px}.symbol.symbol-xl-65px.symbol-2by3>img{height:65px;width:97.5px;max-width:none}.symbol.symbol-xl-70px>img{width:70px;height:70px}.symbol.symbol-xl-70px .symbol-label{width:70px;height:70px}.symbol.symbol-xl-70px.symbol-fixed .symbol-label{width:70px;height:70px}.symbol.symbol-xl-70px.symbol-fixed>img{width:70px;height:70px;max-width:none}.symbol.symbol-xl-70px.symbol-2by3 .symbol-label{height:70px;width:105px}.symbol.symbol-xl-70px.symbol-2by3>img{height:70px;width:105px;max-width:none}.symbol.symbol-xl-75px>img{width:75px;height:75px}.symbol.symbol-xl-75px .symbol-label{width:75px;height:75px}.symbol.symbol-xl-75px.symbol-fixed .symbol-label{width:75px;height:75px}.symbol.symbol-xl-75px.symbol-fixed>img{width:75px;height:75px;max-width:none}.symbol.symbol-xl-75px.symbol-2by3 .symbol-label{height:75px;width:112.5px}.symbol.symbol-xl-75px.symbol-2by3>img{height:75px;width:112.5px;max-width:none}.symbol.symbol-xl-90px>img{width:90px;height:90px}.symbol.symbol-xl-90px .symbol-label{width:90px;height:90px}.symbol.symbol-xl-90px.symbol-fixed .symbol-label{width:90px;height:90px}.symbol.symbol-xl-90px.symbol-fixed>img{width:90px;height:90px;max-width:none}.symbol.symbol-xl-90px.symbol-2by3 .symbol-label{height:90px;width:135px}.symbol.symbol-xl-90px.symbol-2by3>img{height:90px;width:135px;max-width:none}.symbol.symbol-xl-100px>img{width:100px;height:100px}.symbol.symbol-xl-100px .symbol-label{width:100px;height:100px}.symbol.symbol-xl-100px.symbol-fixed .symbol-label{width:100px;height:100px}.symbol.symbol-xl-100px.symbol-fixed>img{width:100px;height:100px;max-width:none}.symbol.symbol-xl-100px.symbol-2by3 .symbol-label{height:100px;width:150px}.symbol.symbol-xl-100px.symbol-2by3>img{height:100px;width:150px;max-width:none}.symbol.symbol-xl-125px>img{width:125px;height:125px}.symbol.symbol-xl-125px .symbol-label{width:125px;height:125px}.symbol.symbol-xl-125px.symbol-fixed .symbol-label{width:125px;height:125px}.symbol.symbol-xl-125px.symbol-fixed>img{width:125px;height:125px;max-width:none}.symbol.symbol-xl-125px.symbol-2by3 .symbol-label{height:125px;width:187.5px}.symbol.symbol-xl-125px.symbol-2by3>img{height:125px;width:187.5px;max-width:none}.symbol.symbol-xl-150px>img{width:150px;height:150px}.symbol.symbol-xl-150px .symbol-label{width:150px;height:150px}.symbol.symbol-xl-150px.symbol-fixed .symbol-label{width:150px;height:150px}.symbol.symbol-xl-150px.symbol-fixed>img{width:150px;height:150px;max-width:none}.symbol.symbol-xl-150px.symbol-2by3 .symbol-label{height:150px;width:225px}.symbol.symbol-xl-150px.symbol-2by3>img{height:150px;width:225px;max-width:none}.symbol.symbol-xl-160px>img{width:160px;height:160px}.symbol.symbol-xl-160px .symbol-label{width:160px;height:160px}.symbol.symbol-xl-160px.symbol-fixed .symbol-label{width:160px;height:160px}.symbol.symbol-xl-160px.symbol-fixed>img{width:160px;height:160px;max-width:none}.symbol.symbol-xl-160px.symbol-2by3 .symbol-label{height:160px;width:240px}.symbol.symbol-xl-160px.symbol-2by3>img{height:160px;width:240px;max-width:none}.symbol.symbol-xl-175px>img{width:175px;height:175px}.symbol.symbol-xl-175px .symbol-label{width:175px;height:175px}.symbol.symbol-xl-175px.symbol-fixed .symbol-label{width:175px;height:175px}.symbol.symbol-xl-175px.symbol-fixed>img{width:175px;height:175px;max-width:none}.symbol.symbol-xl-175px.symbol-2by3 .symbol-label{height:175px;width:262.5px}.symbol.symbol-xl-175px.symbol-2by3>img{height:175px;width:262.5px;max-width:none}.symbol.symbol-xl-200px>img{width:200px;height:200px}.symbol.symbol-xl-200px .symbol-label{width:200px;height:200px}.symbol.symbol-xl-200px.symbol-fixed .symbol-label{width:200px;height:200px}.symbol.symbol-xl-200px.symbol-fixed>img{width:200px;height:200px;max-width:none}.symbol.symbol-xl-200px.symbol-2by3 .symbol-label{height:200px;width:300px}.symbol.symbol-xl-200px.symbol-2by3>img{height:200px;width:300px;max-width:none}}@media (min-width:1400px){.symbol.symbol-xxl-20px>img{width:20px;height:20px}.symbol.symbol-xxl-20px .symbol-label{width:20px;height:20px}.symbol.symbol-xxl-20px.symbol-fixed .symbol-label{width:20px;height:20px}.symbol.symbol-xxl-20px.symbol-fixed>img{width:20px;height:20px;max-width:none}.symbol.symbol-xxl-20px.symbol-2by3 .symbol-label{height:20px;width:30px}.symbol.symbol-xxl-20px.symbol-2by3>img{height:20px;width:30px;max-width:none}.symbol.symbol-xxl-25px>img{width:25px;height:25px}.symbol.symbol-xxl-25px .symbol-label{width:25px;height:25px}.symbol.symbol-xxl-25px.symbol-fixed .symbol-label{width:25px;height:25px}.symbol.symbol-xxl-25px.symbol-fixed>img{width:25px;height:25px;max-width:none}.symbol.symbol-xxl-25px.symbol-2by3 .symbol-label{height:25px;width:37.5px}.symbol.symbol-xxl-25px.symbol-2by3>img{height:25px;width:37.5px;max-width:none}.symbol.symbol-xxl-30px>img{width:30px;height:30px}.symbol.symbol-xxl-30px .symbol-label{width:30px;height:30px}.symbol.symbol-xxl-30px.symbol-fixed .symbol-label{width:30px;height:30px}.symbol.symbol-xxl-30px.symbol-fixed>img{width:30px;height:30px;max-width:none}.symbol.symbol-xxl-30px.symbol-2by3 .symbol-label{height:30px;width:45px}.symbol.symbol-xxl-30px.symbol-2by3>img{height:30px;width:45px;max-width:none}.symbol.symbol-xxl-35px>img{width:35px;height:35px}.symbol.symbol-xxl-35px .symbol-label{width:35px;height:35px}.symbol.symbol-xxl-35px.symbol-fixed .symbol-label{width:35px;height:35px}.symbol.symbol-xxl-35px.symbol-fixed>img{width:35px;height:35px;max-width:none}.symbol.symbol-xxl-35px.symbol-2by3 .symbol-label{height:35px;width:52.5px}.symbol.symbol-xxl-35px.symbol-2by3>img{height:35px;width:52.5px;max-width:none}.symbol.symbol-xxl-40px>img{width:40px;height:40px}.symbol.symbol-xxl-40px .symbol-label{width:40px;height:40px}.symbol.symbol-xxl-40px.symbol-fixed .symbol-label{width:40px;height:40px}.symbol.symbol-xxl-40px.symbol-fixed>img{width:40px;height:40px;max-width:none}.symbol.symbol-xxl-40px.symbol-2by3 .symbol-label{height:40px;width:60px}.symbol.symbol-xxl-40px.symbol-2by3>img{height:40px;width:60px;max-width:none}.symbol.symbol-xxl-45px>img{width:45px;height:45px}.symbol.symbol-xxl-45px .symbol-label{width:45px;height:45px}.symbol.symbol-xxl-45px.symbol-fixed .symbol-label{width:45px;height:45px}.symbol.symbol-xxl-45px.symbol-fixed>img{width:45px;height:45px;max-width:none}.symbol.symbol-xxl-45px.symbol-2by3 .symbol-label{height:45px;width:67.5px}.symbol.symbol-xxl-45px.symbol-2by3>img{height:45px;width:67.5px;max-width:none}.symbol.symbol-xxl-50px>img{width:50px;height:50px}.symbol.symbol-xxl-50px .symbol-label{width:50px;height:50px}.symbol.symbol-xxl-50px.symbol-fixed .symbol-label{width:50px;height:50px}.symbol.symbol-xxl-50px.symbol-fixed>img{width:50px;height:50px;max-width:none}.symbol.symbol-xxl-50px.symbol-2by3 .symbol-label{height:50px;width:75px}.symbol.symbol-xxl-50px.symbol-2by3>img{height:50px;width:75px;max-width:none}.symbol.symbol-xxl-55px>img{width:55px;height:55px}.symbol.symbol-xxl-55px .symbol-label{width:55px;height:55px}.symbol.symbol-xxl-55px.symbol-fixed .symbol-label{width:55px;height:55px}.symbol.symbol-xxl-55px.symbol-fixed>img{width:55px;height:55px;max-width:none}.symbol.symbol-xxl-55px.symbol-2by3 .symbol-label{height:55px;width:82.5px}.symbol.symbol-xxl-55px.symbol-2by3>img{height:55px;width:82.5px;max-width:none}.symbol.symbol-xxl-60px>img{width:60px;height:60px}.symbol.symbol-xxl-60px .symbol-label{width:60px;height:60px}.symbol.symbol-xxl-60px.symbol-fixed .symbol-label{width:60px;height:60px}.symbol.symbol-xxl-60px.symbol-fixed>img{width:60px;height:60px;max-width:none}.symbol.symbol-xxl-60px.symbol-2by3 .symbol-label{height:60px;width:90px}.symbol.symbol-xxl-60px.symbol-2by3>img{height:60px;width:90px;max-width:none}.symbol.symbol-xxl-65px>img{width:65px;height:65px}.symbol.symbol-xxl-65px .symbol-label{width:65px;height:65px}.symbol.symbol-xxl-65px.symbol-fixed .symbol-label{width:65px;height:65px}.symbol.symbol-xxl-65px.symbol-fixed>img{width:65px;height:65px;max-width:none}.symbol.symbol-xxl-65px.symbol-2by3 .symbol-label{height:65px;width:97.5px}.symbol.symbol-xxl-65px.symbol-2by3>img{height:65px;width:97.5px;max-width:none}.symbol.symbol-xxl-70px>img{width:70px;height:70px}.symbol.symbol-xxl-70px .symbol-label{width:70px;height:70px}.symbol.symbol-xxl-70px.symbol-fixed .symbol-label{width:70px;height:70px}.symbol.symbol-xxl-70px.symbol-fixed>img{width:70px;height:70px;max-width:none}.symbol.symbol-xxl-70px.symbol-2by3 .symbol-label{height:70px;width:105px}.symbol.symbol-xxl-70px.symbol-2by3>img{height:70px;width:105px;max-width:none}.symbol.symbol-xxl-75px>img{width:75px;height:75px}.symbol.symbol-xxl-75px .symbol-label{width:75px;height:75px}.symbol.symbol-xxl-75px.symbol-fixed .symbol-label{width:75px;height:75px}.symbol.symbol-xxl-75px.symbol-fixed>img{width:75px;height:75px;max-width:none}.symbol.symbol-xxl-75px.symbol-2by3 .symbol-label{height:75px;width:112.5px}.symbol.symbol-xxl-75px.symbol-2by3>img{height:75px;width:112.5px;max-width:none}.symbol.symbol-xxl-90px>img{width:90px;height:90px}.symbol.symbol-xxl-90px .symbol-label{width:90px;height:90px}.symbol.symbol-xxl-90px.symbol-fixed .symbol-label{width:90px;height:90px}.symbol.symbol-xxl-90px.symbol-fixed>img{width:90px;height:90px;max-width:none}.symbol.symbol-xxl-90px.symbol-2by3 .symbol-label{height:90px;width:135px}.symbol.symbol-xxl-90px.symbol-2by3>img{height:90px;width:135px;max-width:none}.symbol.symbol-xxl-100px>img{width:100px;height:100px}.symbol.symbol-xxl-100px .symbol-label{width:100px;height:100px}.symbol.symbol-xxl-100px.symbol-fixed .symbol-label{width:100px;height:100px}.symbol.symbol-xxl-100px.symbol-fixed>img{width:100px;height:100px;max-width:none}.symbol.symbol-xxl-100px.symbol-2by3 .symbol-label{height:100px;width:150px}.symbol.symbol-xxl-100px.symbol-2by3>img{height:100px;width:150px;max-width:none}.symbol.symbol-xxl-125px>img{width:125px;height:125px}.symbol.symbol-xxl-125px .symbol-label{width:125px;height:125px}.symbol.symbol-xxl-125px.symbol-fixed .symbol-label{width:125px;height:125px}.symbol.symbol-xxl-125px.symbol-fixed>img{width:125px;height:125px;max-width:none}.symbol.symbol-xxl-125px.symbol-2by3 .symbol-label{height:125px;width:187.5px}.symbol.symbol-xxl-125px.symbol-2by3>img{height:125px;width:187.5px;max-width:none}.symbol.symbol-xxl-150px>img{width:150px;height:150px}.symbol.symbol-xxl-150px .symbol-label{width:150px;height:150px}.symbol.symbol-xxl-150px.symbol-fixed .symbol-label{width:150px;height:150px}.symbol.symbol-xxl-150px.symbol-fixed>img{width:150px;height:150px;max-width:none}.symbol.symbol-xxl-150px.symbol-2by3 .symbol-label{height:150px;width:225px}.symbol.symbol-xxl-150px.symbol-2by3>img{height:150px;width:225px;max-width:none}.symbol.symbol-xxl-160px>img{width:160px;height:160px}.symbol.symbol-xxl-160px .symbol-label{width:160px;height:160px}.symbol.symbol-xxl-160px.symbol-fixed .symbol-label{width:160px;height:160px}.symbol.symbol-xxl-160px.symbol-fixed>img{width:160px;height:160px;max-width:none}.symbol.symbol-xxl-160px.symbol-2by3 .symbol-label{height:160px;width:240px}.symbol.symbol-xxl-160px.symbol-2by3>img{height:160px;width:240px;max-width:none}.symbol.symbol-xxl-175px>img{width:175px;height:175px}.symbol.symbol-xxl-175px .symbol-label{width:175px;height:175px}.symbol.symbol-xxl-175px.symbol-fixed .symbol-label{width:175px;height:175px}.symbol.symbol-xxl-175px.symbol-fixed>img{width:175px;height:175px;max-width:none}.symbol.symbol-xxl-175px.symbol-2by3 .symbol-label{height:175px;width:262.5px}.symbol.symbol-xxl-175px.symbol-2by3>img{height:175px;width:262.5px;max-width:none}.symbol.symbol-xxl-200px>img{width:200px;height:200px}.symbol.symbol-xxl-200px .symbol-label{width:200px;height:200px}.symbol.symbol-xxl-200px.symbol-fixed .symbol-label{width:200px;height:200px}.symbol.symbol-xxl-200px.symbol-fixed>img{width:200px;height:200px;max-width:none}.symbol.symbol-xxl-200px.symbol-2by3 .symbol-label{height:200px;width:300px}.symbol.symbol-xxl-200px.symbol-2by3>img{height:200px;width:300px;max-width:none}}.symbol-group{display:flex;flex-wrap:wrap;align-items:center;margin-left:10px}.symbol-group .symbol{position:relative;z-index:0;margin-left:-10px;transition:all .3s ease}.symbol-group .symbol:hover{transition:all .3s ease;z-index:1}.symbol-group .symbol-badge{border:2px solid var(--bs-body-bg)}.symbol-group .symbol-label{position:relative}.symbol-group .symbol-label:after{display:block;content:" ";border-radius:inherit;position:absolute;top:0;right:0;left:0;bottom:0;border:2px solid var(--bs-symbol-border-color);-webkit-background-clip:padding-box;background-clip:padding-box}.symbol-group.symbol-hover .symbol{cursor:pointer}.pulse{position:relative}.pulse.pulse-light .pulse-ring{border-color:var(--bs-light)}.pulse.pulse-primary .pulse-ring{border-color:var(--bs-primary)}.pulse.pulse-secondary .pulse-ring{border-color:var(--bs-secondary)}.pulse.pulse-success .pulse-ring{border-color:var(--bs-success)}.pulse.pulse-info .pulse-ring{border-color:var(--bs-info)}.pulse.pulse-warning .pulse-ring{border-color:var(--bs-warning)}.pulse.pulse-danger .pulse-ring{border-color:var(--bs-danger)}.pulse.pulse-dark .pulse-ring{border-color:var(--bs-dark)}.pulse-ring{display:block;border-radius:40px;height:40px;width:40px;position:absolute;animation:animation-pulse 3.5s ease-out;animation-iteration-count:infinite;opacity:0;border-width:3px;border-style:solid;border-color:var(--bs-gray-500)}@keyframes animation-pulse{0%{-webkit-transform:scale(.1,.1);opacity:0}60%{-webkit-transform:scale(.1,.1);opacity:0}65%{opacity:1}100%{-webkit-transform:scale(1.2,1.2);opacity:0}}.page-loading *,[data-kt-app-page-loading=on] *{transition:none!important}.page-loader{background-color:var(--bs-body-bg);position:fixed;top:0;bottom:0;left:0;right:0;z-index:10000;display:none}.page-loading .page-loader,[data-kt-app-page-loading=on] .page-loader{display:flex;justify-content:center;align-items:center}.scrolltop{position:fixed;display:none;cursor:pointer;z-index:105;justify-content:center;align-items:center;width:36px;height:36px;bottom:43px;right:7px;background-color:var(--bs-scrolltop-bg-color);box-shadow:var(--bs-scrolltop-box-shadow);opacity:0;transition:color .2s ease;border-radius:.475rem}.scrolltop .svg-icon{color:var(--bs-scrolltop-icon-color)}.scrolltop .svg-icon svg{height:24px;width:24px}.scrolltop>i{font-size:1.3rem;color:var(--bs-scrolltop-icon-color)}.scrolltop:hover{background-color:var(--bs-scrolltop-bg-color-hover)}.scrolltop:hover .svg-icon,.scrolltop:hover i{color:var(--bs-scrolltop-icon-color-hover)}[data-kt-scrolltop=on] .scrolltop{opacity:var(--bs-scrolltop-opacity-on);animation:animation-scrolltop .4s ease-out 1;display:flex}[data-kt-scrolltop=on] .scrolltop:hover{transition:color .2s ease;opacity:var(--bs-scrolltop-opacity-hover)}@media (max-width:991.98px){.scrolltop{bottom:23px;right:5px;width:30px;height:30px}}@keyframes animation-scrolltop{from{margin-bottom:-15px}to{margin-bottom:0}}.svg-icon{line-height:1;color:var(--bs-text-muted)}.svg-icon svg{height:1.15rem;width:1.15rem}.svg-icon.svg-icon-white{color:var(--bs-text-white)}.svg-icon.svg-icon-primary{color:var(--bs-text-primary)}.svg-icon.svg-icon-secondary{color:var(--bs-text-secondary)}.svg-icon.svg-icon-light{color:var(--bs-text-light)}.svg-icon.svg-icon-success{color:var(--bs-text-success)}.svg-icon.svg-icon-info{color:var(--bs-text-info)}.svg-icon.svg-icon-warning{color:var(--bs-text-warning)}.svg-icon.svg-icon-danger{color:var(--bs-text-danger)}.svg-icon.svg-icon-dark{color:var(--bs-text-dark)}.svg-icon.svg-icon-muted{color:var(--bs-text-muted)}.svg-icon.svg-icon-gray-100{color:var(--bs-text-gray-100)}.svg-icon.svg-icon-gray-200{color:var(--bs-text-gray-200)}.svg-icon.svg-icon-gray-300{color:var(--bs-text-gray-300)}.svg-icon.svg-icon-gray-400{color:var(--bs-text-gray-400)}.svg-icon.svg-icon-gray-500{color:var(--bs-text-gray-500)}.svg-icon.svg-icon-gray-600{color:var(--bs-text-gray-600)}.svg-icon.svg-icon-gray-700{color:var(--bs-text-gray-700)}.svg-icon.svg-icon-gray-800{color:var(--bs-text-gray-800)}.svg-icon.svg-icon-gray-900{color:var(--bs-text-gray-900)}.svg-icon.svg-icon-1 svg{height:1.75rem!important;width:1.75rem!important}.svg-icon.svg-icon-2 svg{height:1.5rem!important;width:1.5rem!important}.svg-icon.svg-icon-3 svg{height:1.35rem!important;width:1.35rem!important}.svg-icon.svg-icon-4 svg{height:1.25rem!important;width:1.25rem!important}.svg-icon.svg-icon-5 svg{height:1.15rem!important;width:1.15rem!important}.svg-icon.svg-icon-6 svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-7 svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-8 svg{height:.85rem!important;width:.85rem!important}.svg-icon.svg-icon-9 svg{height:.75rem!important;width:.75rem!important}.svg-icon.svg-icon-10 svg{height:.5rem!important;width:.5rem!important}.svg-icon.svg-icon-sm svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-base svg{height:1rem!important;width:1rem!important}.svg-icon.svg-icon-lg svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-xl svg{height:1.21rem!important;width:1.21rem!important}.svg-icon.svg-icon-fluid svg{height:100%!important;width:100%!important}.svg-icon.svg-icon-2x svg{height:2rem!important;width:2rem!important}.svg-icon.svg-icon-2qx svg{height:2.25rem!important;width:2.25rem!important}.svg-icon.svg-icon-2hx svg{height:2.5rem!important;width:2.5rem!important}.svg-icon.svg-icon-2tx svg{height:2.75rem!important;width:2.75rem!important}.svg-icon.svg-icon-3x svg{height:3rem!important;width:3rem!important}.svg-icon.svg-icon-3qx svg{height:3.25rem!important;width:3.25rem!important}.svg-icon.svg-icon-3hx svg{height:3.5rem!important;width:3.5rem!important}.svg-icon.svg-icon-3tx svg{height:3.75rem!important;width:3.75rem!important}.svg-icon.svg-icon-4x svg{height:4rem!important;width:4rem!important}.svg-icon.svg-icon-4qx svg{height:4.25rem!important;width:4.25rem!important}.svg-icon.svg-icon-4hx svg{height:4.5rem!important;width:4.5rem!important}.svg-icon.svg-icon-4tx svg{height:4.75rem!important;width:4.75rem!important}.svg-icon.svg-icon-5x svg{height:5rem!important;width:5rem!important}.svg-icon.svg-icon-5qx svg{height:5.25rem!important;width:5.25rem!important}.svg-icon.svg-icon-5hx svg{height:5.5rem!important;width:5.5rem!important}.svg-icon.svg-icon-5tx svg{height:5.75rem!important;width:5.75rem!important}.svg-icon.svg-icon-6x svg{height:6rem!important;width:6rem!important}.svg-icon.svg-icon-6qx svg{height:6.25rem!important;width:6.25rem!important}.svg-icon.svg-icon-6hx svg{height:6.5rem!important;width:6.5rem!important}.svg-icon.svg-icon-6tx svg{height:6.75rem!important;width:6.75rem!important}.svg-icon.svg-icon-7x svg{height:7rem!important;width:7rem!important}.svg-icon.svg-icon-7qx svg{height:7.25rem!important;width:7.25rem!important}.svg-icon.svg-icon-7hx svg{height:7.5rem!important;width:7.5rem!important}.svg-icon.svg-icon-7tx svg{height:7.75rem!important;width:7.75rem!important}@media (min-width:576px){.svg-icon.svg-icon-sm-1 svg{height:1.75rem!important;width:1.75rem!important}.svg-icon.svg-icon-sm-2 svg{height:1.5rem!important;width:1.5rem!important}.svg-icon.svg-icon-sm-3 svg{height:1.35rem!important;width:1.35rem!important}.svg-icon.svg-icon-sm-4 svg{height:1.25rem!important;width:1.25rem!important}.svg-icon.svg-icon-sm-5 svg{height:1.15rem!important;width:1.15rem!important}.svg-icon.svg-icon-sm-6 svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-sm-7 svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-sm-8 svg{height:.85rem!important;width:.85rem!important}.svg-icon.svg-icon-sm-9 svg{height:.75rem!important;width:.75rem!important}.svg-icon.svg-icon-sm-10 svg{height:.5rem!important;width:.5rem!important}.svg-icon.svg-icon-sm-sm svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-sm-base svg{height:1rem!important;width:1rem!important}.svg-icon.svg-icon-sm-lg svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-sm-xl svg{height:1.21rem!important;width:1.21rem!important}.svg-icon.svg-icon-sm-fluid svg{height:100%!important;width:100%!important}.svg-icon.svg-icon-sm-2x svg{height:2rem!important;width:2rem!important}.svg-icon.svg-icon-sm-2qx svg{height:2.25rem!important;width:2.25rem!important}.svg-icon.svg-icon-sm-2hx svg{height:2.5rem!important;width:2.5rem!important}.svg-icon.svg-icon-sm-2tx svg{height:2.75rem!important;width:2.75rem!important}.svg-icon.svg-icon-sm-3x svg{height:3rem!important;width:3rem!important}.svg-icon.svg-icon-sm-3qx svg{height:3.25rem!important;width:3.25rem!important}.svg-icon.svg-icon-sm-3hx svg{height:3.5rem!important;width:3.5rem!important}.svg-icon.svg-icon-sm-3tx svg{height:3.75rem!important;width:3.75rem!important}.svg-icon.svg-icon-sm-4x svg{height:4rem!important;width:4rem!important}.svg-icon.svg-icon-sm-4qx svg{height:4.25rem!important;width:4.25rem!important}.svg-icon.svg-icon-sm-4hx svg{height:4.5rem!important;width:4.5rem!important}.svg-icon.svg-icon-sm-4tx svg{height:4.75rem!important;width:4.75rem!important}.svg-icon.svg-icon-sm-5x svg{height:5rem!important;width:5rem!important}.svg-icon.svg-icon-sm-5qx svg{height:5.25rem!important;width:5.25rem!important}.svg-icon.svg-icon-sm-5hx svg{height:5.5rem!important;width:5.5rem!important}.svg-icon.svg-icon-sm-5tx svg{height:5.75rem!important;width:5.75rem!important}.svg-icon.svg-icon-sm-6x svg{height:6rem!important;width:6rem!important}.svg-icon.svg-icon-sm-6qx svg{height:6.25rem!important;width:6.25rem!important}.svg-icon.svg-icon-sm-6hx svg{height:6.5rem!important;width:6.5rem!important}.svg-icon.svg-icon-sm-6tx svg{height:6.75rem!important;width:6.75rem!important}.svg-icon.svg-icon-sm-7x svg{height:7rem!important;width:7rem!important}.svg-icon.svg-icon-sm-7qx svg{height:7.25rem!important;width:7.25rem!important}.svg-icon.svg-icon-sm-7hx svg{height:7.5rem!important;width:7.5rem!important}.svg-icon.svg-icon-sm-7tx svg{height:7.75rem!important;width:7.75rem!important}}@media (min-width:768px){.svg-icon.svg-icon-md-1 svg{height:1.75rem!important;width:1.75rem!important}.svg-icon.svg-icon-md-2 svg{height:1.5rem!important;width:1.5rem!important}.svg-icon.svg-icon-md-3 svg{height:1.35rem!important;width:1.35rem!important}.svg-icon.svg-icon-md-4 svg{height:1.25rem!important;width:1.25rem!important}.svg-icon.svg-icon-md-5 svg{height:1.15rem!important;width:1.15rem!important}.svg-icon.svg-icon-md-6 svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-md-7 svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-md-8 svg{height:.85rem!important;width:.85rem!important}.svg-icon.svg-icon-md-9 svg{height:.75rem!important;width:.75rem!important}.svg-icon.svg-icon-md-10 svg{height:.5rem!important;width:.5rem!important}.svg-icon.svg-icon-md-sm svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-md-base svg{height:1rem!important;width:1rem!important}.svg-icon.svg-icon-md-lg svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-md-xl svg{height:1.21rem!important;width:1.21rem!important}.svg-icon.svg-icon-md-fluid svg{height:100%!important;width:100%!important}.svg-icon.svg-icon-md-2x svg{height:2rem!important;width:2rem!important}.svg-icon.svg-icon-md-2qx svg{height:2.25rem!important;width:2.25rem!important}.svg-icon.svg-icon-md-2hx svg{height:2.5rem!important;width:2.5rem!important}.svg-icon.svg-icon-md-2tx svg{height:2.75rem!important;width:2.75rem!important}.svg-icon.svg-icon-md-3x svg{height:3rem!important;width:3rem!important}.svg-icon.svg-icon-md-3qx svg{height:3.25rem!important;width:3.25rem!important}.svg-icon.svg-icon-md-3hx svg{height:3.5rem!important;width:3.5rem!important}.svg-icon.svg-icon-md-3tx svg{height:3.75rem!important;width:3.75rem!important}.svg-icon.svg-icon-md-4x svg{height:4rem!important;width:4rem!important}.svg-icon.svg-icon-md-4qx svg{height:4.25rem!important;width:4.25rem!important}.svg-icon.svg-icon-md-4hx svg{height:4.5rem!important;width:4.5rem!important}.svg-icon.svg-icon-md-4tx svg{height:4.75rem!important;width:4.75rem!important}.svg-icon.svg-icon-md-5x svg{height:5rem!important;width:5rem!important}.svg-icon.svg-icon-md-5qx svg{height:5.25rem!important;width:5.25rem!important}.svg-icon.svg-icon-md-5hx svg{height:5.5rem!important;width:5.5rem!important}.svg-icon.svg-icon-md-5tx svg{height:5.75rem!important;width:5.75rem!important}.svg-icon.svg-icon-md-6x svg{height:6rem!important;width:6rem!important}.svg-icon.svg-icon-md-6qx svg{height:6.25rem!important;width:6.25rem!important}.svg-icon.svg-icon-md-6hx svg{height:6.5rem!important;width:6.5rem!important}.svg-icon.svg-icon-md-6tx svg{height:6.75rem!important;width:6.75rem!important}.svg-icon.svg-icon-md-7x svg{height:7rem!important;width:7rem!important}.svg-icon.svg-icon-md-7qx svg{height:7.25rem!important;width:7.25rem!important}.svg-icon.svg-icon-md-7hx svg{height:7.5rem!important;width:7.5rem!important}.svg-icon.svg-icon-md-7tx svg{height:7.75rem!important;width:7.75rem!important}}@media (min-width:992px){.svg-icon.svg-icon-lg-1 svg{height:1.75rem!important;width:1.75rem!important}.svg-icon.svg-icon-lg-2 svg{height:1.5rem!important;width:1.5rem!important}.svg-icon.svg-icon-lg-3 svg{height:1.35rem!important;width:1.35rem!important}.svg-icon.svg-icon-lg-4 svg{height:1.25rem!important;width:1.25rem!important}.svg-icon.svg-icon-lg-5 svg{height:1.15rem!important;width:1.15rem!important}.svg-icon.svg-icon-lg-6 svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-lg-7 svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-lg-8 svg{height:.85rem!important;width:.85rem!important}.svg-icon.svg-icon-lg-9 svg{height:.75rem!important;width:.75rem!important}.svg-icon.svg-icon-lg-10 svg{height:.5rem!important;width:.5rem!important}.svg-icon.svg-icon-lg-sm svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-lg-base svg{height:1rem!important;width:1rem!important}.svg-icon.svg-icon-lg-lg svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-lg-xl svg{height:1.21rem!important;width:1.21rem!important}.svg-icon.svg-icon-lg-fluid svg{height:100%!important;width:100%!important}.svg-icon.svg-icon-lg-2x svg{height:2rem!important;width:2rem!important}.svg-icon.svg-icon-lg-2qx svg{height:2.25rem!important;width:2.25rem!important}.svg-icon.svg-icon-lg-2hx svg{height:2.5rem!important;width:2.5rem!important}.svg-icon.svg-icon-lg-2tx svg{height:2.75rem!important;width:2.75rem!important}.svg-icon.svg-icon-lg-3x svg{height:3rem!important;width:3rem!important}.svg-icon.svg-icon-lg-3qx svg{height:3.25rem!important;width:3.25rem!important}.svg-icon.svg-icon-lg-3hx svg{height:3.5rem!important;width:3.5rem!important}.svg-icon.svg-icon-lg-3tx svg{height:3.75rem!important;width:3.75rem!important}.svg-icon.svg-icon-lg-4x svg{height:4rem!important;width:4rem!important}.svg-icon.svg-icon-lg-4qx svg{height:4.25rem!important;width:4.25rem!important}.svg-icon.svg-icon-lg-4hx svg{height:4.5rem!important;width:4.5rem!important}.svg-icon.svg-icon-lg-4tx svg{height:4.75rem!important;width:4.75rem!important}.svg-icon.svg-icon-lg-5x svg{height:5rem!important;width:5rem!important}.svg-icon.svg-icon-lg-5qx svg{height:5.25rem!important;width:5.25rem!important}.svg-icon.svg-icon-lg-5hx svg{height:5.5rem!important;width:5.5rem!important}.svg-icon.svg-icon-lg-5tx svg{height:5.75rem!important;width:5.75rem!important}.svg-icon.svg-icon-lg-6x svg{height:6rem!important;width:6rem!important}.svg-icon.svg-icon-lg-6qx svg{height:6.25rem!important;width:6.25rem!important}.svg-icon.svg-icon-lg-6hx svg{height:6.5rem!important;width:6.5rem!important}.svg-icon.svg-icon-lg-6tx svg{height:6.75rem!important;width:6.75rem!important}.svg-icon.svg-icon-lg-7x svg{height:7rem!important;width:7rem!important}.svg-icon.svg-icon-lg-7qx svg{height:7.25rem!important;width:7.25rem!important}.svg-icon.svg-icon-lg-7hx svg{height:7.5rem!important;width:7.5rem!important}.svg-icon.svg-icon-lg-7tx svg{height:7.75rem!important;width:7.75rem!important}}@media (min-width:1200px){.svg-icon.svg-icon-xl-1 svg{height:1.75rem!important;width:1.75rem!important}.svg-icon.svg-icon-xl-2 svg{height:1.5rem!important;width:1.5rem!important}.svg-icon.svg-icon-xl-3 svg{height:1.35rem!important;width:1.35rem!important}.svg-icon.svg-icon-xl-4 svg{height:1.25rem!important;width:1.25rem!important}.svg-icon.svg-icon-xl-5 svg{height:1.15rem!important;width:1.15rem!important}.svg-icon.svg-icon-xl-6 svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-xl-7 svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-xl-8 svg{height:.85rem!important;width:.85rem!important}.svg-icon.svg-icon-xl-9 svg{height:.75rem!important;width:.75rem!important}.svg-icon.svg-icon-xl-10 svg{height:.5rem!important;width:.5rem!important}.svg-icon.svg-icon-xl-sm svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-xl-base svg{height:1rem!important;width:1rem!important}.svg-icon.svg-icon-xl-lg svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-xl-xl svg{height:1.21rem!important;width:1.21rem!important}.svg-icon.svg-icon-xl-fluid svg{height:100%!important;width:100%!important}.svg-icon.svg-icon-xl-2x svg{height:2rem!important;width:2rem!important}.svg-icon.svg-icon-xl-2qx svg{height:2.25rem!important;width:2.25rem!important}.svg-icon.svg-icon-xl-2hx svg{height:2.5rem!important;width:2.5rem!important}.svg-icon.svg-icon-xl-2tx svg{height:2.75rem!important;width:2.75rem!important}.svg-icon.svg-icon-xl-3x svg{height:3rem!important;width:3rem!important}.svg-icon.svg-icon-xl-3qx svg{height:3.25rem!important;width:3.25rem!important}.svg-icon.svg-icon-xl-3hx svg{height:3.5rem!important;width:3.5rem!important}.svg-icon.svg-icon-xl-3tx svg{height:3.75rem!important;width:3.75rem!important}.svg-icon.svg-icon-xl-4x svg{height:4rem!important;width:4rem!important}.svg-icon.svg-icon-xl-4qx svg{height:4.25rem!important;width:4.25rem!important}.svg-icon.svg-icon-xl-4hx svg{height:4.5rem!important;width:4.5rem!important}.svg-icon.svg-icon-xl-4tx svg{height:4.75rem!important;width:4.75rem!important}.svg-icon.svg-icon-xl-5x svg{height:5rem!important;width:5rem!important}.svg-icon.svg-icon-xl-5qx svg{height:5.25rem!important;width:5.25rem!important}.svg-icon.svg-icon-xl-5hx svg{height:5.5rem!important;width:5.5rem!important}.svg-icon.svg-icon-xl-5tx svg{height:5.75rem!important;width:5.75rem!important}.svg-icon.svg-icon-xl-6x svg{height:6rem!important;width:6rem!important}.svg-icon.svg-icon-xl-6qx svg{height:6.25rem!important;width:6.25rem!important}.svg-icon.svg-icon-xl-6hx svg{height:6.5rem!important;width:6.5rem!important}.svg-icon.svg-icon-xl-6tx svg{height:6.75rem!important;width:6.75rem!important}.svg-icon.svg-icon-xl-7x svg{height:7rem!important;width:7rem!important}.svg-icon.svg-icon-xl-7qx svg{height:7.25rem!important;width:7.25rem!important}.svg-icon.svg-icon-xl-7hx svg{height:7.5rem!important;width:7.5rem!important}.svg-icon.svg-icon-xl-7tx svg{height:7.75rem!important;width:7.75rem!important}}@media (min-width:1400px){.svg-icon.svg-icon-xxl-1 svg{height:1.75rem!important;width:1.75rem!important}.svg-icon.svg-icon-xxl-2 svg{height:1.5rem!important;width:1.5rem!important}.svg-icon.svg-icon-xxl-3 svg{height:1.35rem!important;width:1.35rem!important}.svg-icon.svg-icon-xxl-4 svg{height:1.25rem!important;width:1.25rem!important}.svg-icon.svg-icon-xxl-5 svg{height:1.15rem!important;width:1.15rem!important}.svg-icon.svg-icon-xxl-6 svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-xxl-7 svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-xxl-8 svg{height:.85rem!important;width:.85rem!important}.svg-icon.svg-icon-xxl-9 svg{height:.75rem!important;width:.75rem!important}.svg-icon.svg-icon-xxl-10 svg{height:.5rem!important;width:.5rem!important}.svg-icon.svg-icon-xxl-sm svg{height:.95rem!important;width:.95rem!important}.svg-icon.svg-icon-xxl-base svg{height:1rem!important;width:1rem!important}.svg-icon.svg-icon-xxl-lg svg{height:1.075rem!important;width:1.075rem!important}.svg-icon.svg-icon-xxl-xl svg{height:1.21rem!important;width:1.21rem!important}.svg-icon.svg-icon-xxl-fluid svg{height:100%!important;width:100%!important}.svg-icon.svg-icon-xxl-2x svg{height:2rem!important;width:2rem!important}.svg-icon.svg-icon-xxl-2qx svg{height:2.25rem!important;width:2.25rem!important}.svg-icon.svg-icon-xxl-2hx svg{height:2.5rem!important;width:2.5rem!important}.svg-icon.svg-icon-xxl-2tx svg{height:2.75rem!important;width:2.75rem!important}.svg-icon.svg-icon-xxl-3x svg{height:3rem!important;width:3rem!important}.svg-icon.svg-icon-xxl-3qx svg{height:3.25rem!important;width:3.25rem!important}.svg-icon.svg-icon-xxl-3hx svg{height:3.5rem!important;width:3.5rem!important}.svg-icon.svg-icon-xxl-3tx svg{height:3.75rem!important;width:3.75rem!important}.svg-icon.svg-icon-xxl-4x svg{height:4rem!important;width:4rem!important}.svg-icon.svg-icon-xxl-4qx svg{height:4.25rem!important;width:4.25rem!important}.svg-icon.svg-icon-xxl-4hx svg{height:4.5rem!important;width:4.5rem!important}.svg-icon.svg-icon-xxl-4tx svg{height:4.75rem!important;width:4.75rem!important}.svg-icon.svg-icon-xxl-5x svg{height:5rem!important;width:5rem!important}.svg-icon.svg-icon-xxl-5qx svg{height:5.25rem!important;width:5.25rem!important}.svg-icon.svg-icon-xxl-5hx svg{height:5.5rem!important;width:5.5rem!important}.svg-icon.svg-icon-xxl-5tx svg{height:5.75rem!important;width:5.75rem!important}.svg-icon.svg-icon-xxl-6x svg{height:6rem!important;width:6rem!important}.svg-icon.svg-icon-xxl-6qx svg{height:6.25rem!important;width:6.25rem!important}.svg-icon.svg-icon-xxl-6hx svg{height:6.5rem!important;width:6.5rem!important}.svg-icon.svg-icon-xxl-6tx svg{height:6.75rem!important;width:6.75rem!important}.svg-icon.svg-icon-xxl-7x svg{height:7rem!important;width:7rem!important}.svg-icon.svg-icon-xxl-7qx svg{height:7.25rem!important;width:7.25rem!important}.svg-icon.svg-icon-xxl-7hx svg{height:7.5rem!important;width:7.5rem!important}.svg-icon.svg-icon-xxl-7tx svg{height:7.75rem!important;width:7.75rem!important}}.fixed-top{position:fixed;z-index:101;top:0;left:0;right:0}@media (min-width:576px){.fixed-top-sm{position:fixed;z-index:101;top:0;left:0;right:0}}@media (min-width:768px){.fixed-top-md{position:fixed;z-index:101;top:0;left:0;right:0}}@media (min-width:992px){.fixed-top-lg{position:fixed;z-index:101;top:0;left:0;right:0}}@media (min-width:1200px){.fixed-top-xl{position:fixed;z-index:101;top:0;left:0;right:0}}@media (min-width:1400px){.fixed-top-xxl{position:fixed;z-index:101;top:0;left:0;right:0}}.timeline{--bs-timeline-icon-size:38px;--bs-timeline-icon-space:0.35rem}.timeline .timeline-item{position:relative;padding:0;margin:0;display:flex;align-items:flex-start}.timeline .timeline-item:last-child .timeline-line{bottom:100%}.timeline .timeline-line{display:block;content:" ";justify-content:center;position:absolute;z-index:0;left:0;top:var(--bs-timeline-icon-size);bottom:0;transform:translate(50%);border-left-width:1px;border-left-style:solid;border-left-color:var(--bs-gray-300);width:var(--bs-timeline-icon-size);margin-top:var(--bs-timeline-icon-space);margin-bottom:var(--bs-timeline-icon-space)}.timeline .timeline-icon{z-index:1;flex-shrink:0;margin-right:1rem;width:var(--bs-timeline-icon-size);height:var(--bs-timeline-icon-size);display:flex;text-align:center;align-items:center;justify-content:center;border:1px solid var(--bs-gray-300);border-radius:50%}.timeline .timeline-content{width:100%;overflow:auto;margin-bottom:1.5rem}.timeline.timeline-center .timeline-item{align-items:center}.timeline.timeline-center .timeline-item:first-child .timeline-line{top:50%}.timeline.timeline-center .timeline-item:last-child .timeline-line{bottom:50%}.timeline.timeline-border-dashed .timeline-line{border-left-style:dashed!important}.timeline.timeline-border-dashed .timeline-icon{border-style:dashed!important}.timeline-label{position:relative}.timeline-label:before{content:"";position:absolute;left:51px;width:3px;top:0;bottom:0;background-color:var(--bs-gray-200)}.timeline-label .timeline-item{display:flex;align-items:flex-start;position:relative;margin-bottom:1.7rem}.timeline-label .timeline-item:last-child{margin-bottom:0}.timeline-label .timeline-label{width:50px;flex-shrink:0;position:relative;color:var(--bs-gray-800)}.timeline-label .timeline-badge{flex-shrink:0;background-color:var(--bs-body-bg);width:1rem;height:1rem;display:flex;justify-content:center;align-items:center;z-index:1;position:relative;margin-top:1px;margin-left:-.5rem;padding:3px!important;border:6px solid var(--bs-body-bg)!important}.timeline-label .timeline-content{flex-grow:1}.overlay{position:relative}.overlay .overlay-layer{position:absolute;top:0;bottom:0;left:0;right:0;display:flex;justify-content:center;align-items:center;background-color:var(--bs-overlay-bg);transition:all .3s ease;opacity:0}.overlay.overlay-block .overlay-layer,.overlay.overlay-show .overlay-layer,.overlay:hover .overlay-layer{transition:all .3s ease;opacity:1}.overlay.overlay-block{cursor:wait}.bullet{display:inline-block;background-color:var(--bs-bullet-bg-color);border-radius:6px;width:8px;height:4px;flex-shrink:0}.bullet-dot{width:4px;height:4px;border-radius:100%!important}.bullet-vertical{width:4px;height:8px}.bullet-line{width:5px;height:1px;border-radius:0}.drawer{display:flex!important;overflow:auto;z-index:110;position:fixed;top:0;bottom:0;background-color:var(--bs-drawer-bg-color);transition:transform .3s ease-in-out!important}.drawer.drawer-start{left:0;transform:translateX(-100%)}.drawer.drawer-end{right:0;transform:translateX(100%)}.drawer.drawer-bottom{bottom:0;top:auto;left:0;right:0;transform:translateY(100%)}.drawer.drawer-top{top:0;bottom:auto;left:0;right:0;transform:translateY(-100%)}.drawer.drawer-on{transform:none;box-shadow:var(--bs-drawer-box-shadow);transition:transform .3s ease-in-out!important}.drawer-overlay{position:fixed;top:0;left:0;bottom:0;right:0;overflow:hidden;z-index:109;background-color:var(--bs-drawer-overlay-bg-color);animation:animation-drawer-fade-in .3s ease-in-out 1}[data-kt-drawer=true]{display:none}@keyframes animation-drawer-fade-in{from{opacity:0}to{opacity:1}}@media (max-width:991.98px){body[data-kt-drawer=on]{overflow:hidden}}.badge{display:inline-flex;align-items:center}.badge.badge-circle,.badge.badge-square{display:inline-flex;align-items:center;justify-content:center;height:1.75rem;min-width:1.75rem;padding:0 .1rem;line-height:0}.badge.badge-circle{border-radius:50%;padding:0;min-width:unset;width:1.75rem}.badge.badge-sm{min-width:1.5rem;font-size:.8rem}.badge.badge-sm.badge-square{height:1.5rem}.badge.badge-sm.badge-circle{width:1.5rem;height:1.5rem}.badge.badge-lg{min-width:2rem;font-size:1rem}.badge.badge-lg.badge-square{height:2rem}.badge.badge-lg.badge-circle{width:2rem;height:2rem}.badge-light{color:var(--bs-light-inverse);background-color:var(--bs-light)}.badge-light.badge-outline{border:1px solid var(--bs-light);background-color:transparent;color:var(--bs-light)}.badge-light-light{background-color:var(--bs-light-light);color:var(--bs-light)}.badge-primary{color:var(--bs-primary-inverse);background-color:var(--bs-primary)}.badge-primary.badge-outline{border:1px solid var(--bs-primary);background-color:transparent;color:var(--bs-primary)}.badge-light-primary{background-color:var(--bs-primary-light);color:var(--bs-primary)}.badge-secondary{color:var(--bs-secondary-inverse);background-color:var(--bs-secondary)}.badge-secondary.badge-outline{border:1px solid var(--bs-secondary);background-color:transparent;color:var(--bs-secondary-inverse)}.badge-light-secondary{background-color:var(--bs-secondary-light);color:var(--bs-secondary-inverse)}.badge-success{color:var(--bs-success-inverse);background-color:var(--bs-success)}.badge-success.badge-outline{border:1px solid var(--bs-success);background-color:transparent;color:var(--bs-success)}.badge-light-success{background-color:var(--bs-success-light);color:var(--bs-success)}.badge-info{color:var(--bs-info-inverse);background-color:var(--bs-info)}.badge-info.badge-outline{border:1px solid var(--bs-info);background-color:transparent;color:var(--bs-info)}.badge-light-info{background-color:var(--bs-info-light);color:var(--bs-info)}.badge-warning{color:var(--bs-warning-inverse);background-color:var(--bs-warning)}.badge-warning.badge-outline{border:1px solid var(--bs-warning);background-color:transparent;color:var(--bs-warning)}.badge-light-warning{background-color:var(--bs-warning-light);color:var(--bs-warning)}.badge-danger{color:var(--bs-danger-inverse);background-color:var(--bs-danger)}.badge-danger.badge-outline{border:1px solid var(--bs-danger);background-color:transparent;color:var(--bs-danger)}.badge-light-danger{background-color:var(--bs-danger-light);color:var(--bs-danger)}.badge-dark{color:var(--bs-dark-inverse);background-color:var(--bs-dark)}.badge-dark.badge-outline{border:1px solid var(--bs-dark);background-color:transparent;color:var(--bs-dark)}.badge-light-dark{background-color:var(--bs-dark-light);color:var(--bs-dark)}.indicator-progress{display:none}[data-kt-indicator=on]>.indicator-progress{display:inline-block}[data-kt-indicator=on]>.indicator-label{display:none}.hover-elevate-up{transition:transform .3s ease}.hover-elevate-up:hover{transform:translateY(-2.5%);transition:transform .3s ease;will-change:transform}.hover-elevate-down{transition:transform .3s ease}.hover-elevate-down:hover{transform:translateY(2.5%);transition:transform .3s ease;will-change:transform}.hover-scale{transition:transform .3s ease}.hover-scale:hover{transform:scale(1.1);transition:transform .3s ease;will-change:transform}.hover-rotate-end{transition:transform .3s ease}.hover-rotate-end:hover{transform:rotate(4deg);transition:transform .3s ease;will-change:transform}.hover-rotate-start{transition:transform .3s ease}.hover-rotate-start:hover{transform:rotate(-4deg);transition:transform .3s ease;will-change:transform}.rotate{display:inline-flex;align-items:center}.rotate-90{transition:transform .3s ease;backface-visibility:hidden;will-change:transform}.active>.rotate-90,.collapsible:not(.collapsed)>.rotate-90,.show>.rotate-90{transform:rotateZ(90deg);transition:transform .3s ease}[direction=rtl] .active>.rotate-90,[direction=rtl] .collapsible:not(.collapsed)>.rotate-90,[direction=rtl] .show>.rotate-90{transform:rotateZ(-90deg)}.rotate-n90{transition:transform .3s ease;backface-visibility:hidden;will-change:transform}.active>.rotate-n90,.collapsible:not(.collapsed)>.rotate-n90,.show>.rotate-n90{transform:rotateZ(-90deg);transition:transform .3s ease}[direction=rtl] .active>.rotate-n90,[direction=rtl] .collapsible:not(.collapsed)>.rotate-n90,[direction=rtl] .show>.rotate-n90{transform:rotateZ(90deg)}.rotate-180{transition:transform .3s ease;backface-visibility:hidden;will-change:transform}.active>.rotate-180,.collapsible:not(.collapsed)>.rotate-180,.show>.rotate-180{transform:rotateZ(180deg);transition:transform .3s ease}[direction=rtl] .active>.rotate-180,[direction=rtl] .collapsible:not(.collapsed)>.rotate-180,[direction=rtl] .show>.rotate-180{transform:rotateZ(-180deg)}.rotate-n180{transition:transform .3s ease;backface-visibility:hidden;will-change:transform}.active>.rotate-n180,.collapsible:not(.collapsed)>.rotate-n180,.show>.rotate-n180{transform:rotateZ(-180deg);transition:transform .3s ease}[direction=rtl] .active>.rotate-n180,[direction=rtl] .collapsible:not(.collapsed)>.rotate-n180,[direction=rtl] .show>.rotate-n180{transform:rotateZ(180deg)}.rotate-270{transition:transform .3s ease;backface-visibility:hidden;will-change:transform}.active>.rotate-270,.collapsible:not(.collapsed)>.rotate-270,.show>.rotate-270{transform:rotateZ(270deg);transition:transform .3s ease}[direction=rtl] .active>.rotate-270,[direction=rtl] .collapsible:not(.collapsed)>.rotate-270,[direction=rtl] .show>.rotate-270{transform:rotateZ(-270deg)}.rotate-n270{transition:transform .3s ease;backface-visibility:hidden;will-change:transform}.active>.rotate-n270,.collapsible:not(.collapsed)>.rotate-n270,.show>.rotate-n270{transform:rotateZ(-270deg);transition:transform .3s ease}[direction=rtl] .active>.rotate-n270,[direction=rtl] .collapsible:not(.collapsed)>.rotate-n270,[direction=rtl] .show>.rotate-n270{transform:rotateZ(270deg)}@media (min-width:992px){div,main,ol,pre,span,ul{scrollbar-width:thin;scrollbar-color:var(--bs-scrollbar-color) transparent}div::-webkit-scrollbar,main::-webkit-scrollbar,ol::-webkit-scrollbar,pre::-webkit-scrollbar,span::-webkit-scrollbar,ul::-webkit-scrollbar{width:var(--bs-scrollbar-size);height:var(--bs-scrollbar-size)}div ::-webkit-scrollbar-track,main ::-webkit-scrollbar-track,ol ::-webkit-scrollbar-track,pre ::-webkit-scrollbar-track,span ::-webkit-scrollbar-track,ul ::-webkit-scrollbar-track{background-color:transparent}div ::-webkit-scrollbar-thumb,main ::-webkit-scrollbar-thumb,ol ::-webkit-scrollbar-thumb,pre ::-webkit-scrollbar-thumb,span ::-webkit-scrollbar-thumb,ul ::-webkit-scrollbar-thumb{border-radius:var(--bs-scrollbar-size)}div::-webkit-scrollbar-thumb,main::-webkit-scrollbar-thumb,ol::-webkit-scrollbar-thumb,pre::-webkit-scrollbar-thumb,span::-webkit-scrollbar-thumb,ul::-webkit-scrollbar-thumb{background-color:var(--bs-scrollbar-color)}div::-webkit-scrollbar-corner,main::-webkit-scrollbar-corner,ol::-webkit-scrollbar-corner,pre::-webkit-scrollbar-corner,span::-webkit-scrollbar-corner,ul::-webkit-scrollbar-corner{background-color:transparent}div:hover,main:hover,ol:hover,pre:hover,span:hover,ul:hover{scrollbar-color:var(--bs-scrollbar-hover-color) transparent}div:hover::-webkit-scrollbar-thumb,main:hover::-webkit-scrollbar-thumb,ol:hover::-webkit-scrollbar-thumb,pre:hover::-webkit-scrollbar-thumb,span:hover::-webkit-scrollbar-thumb,ul:hover::-webkit-scrollbar-thumb{background-color:var(--bs-scrollbar-hover-color)}div:hover::-webkit-scrollbar-corner,main:hover::-webkit-scrollbar-corner,ol:hover::-webkit-scrollbar-corner,pre:hover::-webkit-scrollbar-corner,span:hover::-webkit-scrollbar-corner,ul:hover::-webkit-scrollbar-corner{background-color:transparent}}.hover-scroll,.hover-scroll-overlay,.scroll{overflow:scroll;position:relative}@media (max-width:991.98px){.hover-scroll,.hover-scroll-overlay,.scroll{overflow:auto}}.hover-scroll-overlay-x,.hover-scroll-x,.scroll-x{overflow-x:scroll;position:relative}@media (max-width:991.98px){.hover-scroll-overlay-x,.hover-scroll-x,.scroll-x{overflow-x:auto}}.hover-scroll-overlay-y,.hover-scroll-y,.scroll-y{overflow-y:scroll;position:relative}@media (max-width:991.98px){.hover-scroll-overlay-y,.hover-scroll-y,.scroll-y{overflow-y:auto}}.hover-scroll,.hover-scroll-overlay,.hover-scroll-overlay-x,.hover-scroll-overlay-y,.hover-scroll-x,.hover-scroll-y{scrollbar-color:transparent transparent}.hover-scroll-overlay-x::-webkit-scrollbar-thumb,.hover-scroll-overlay-y::-webkit-scrollbar-thumb,.hover-scroll-overlay::-webkit-scrollbar-thumb,.hover-scroll-x::-webkit-scrollbar-thumb,.hover-scroll-y::-webkit-scrollbar-thumb,.hover-scroll::-webkit-scrollbar-thumb{background-color:transparent}.hover-scroll-overlay-x::-webkit-scrollbar-corner,.hover-scroll-overlay-y::-webkit-scrollbar-corner,.hover-scroll-overlay::-webkit-scrollbar-corner,.hover-scroll-x::-webkit-scrollbar-corner,.hover-scroll-y::-webkit-scrollbar-corner,.hover-scroll::-webkit-scrollbar-corner{background-color:transparent}.hover-scroll-overlay-x:hover,.hover-scroll-overlay-y:hover,.hover-scroll-overlay:hover,.hover-scroll-x:hover,.hover-scroll-y:hover,.hover-scroll:hover{scrollbar-color:var(--bs-scrollbar-color) transparent}.hover-scroll-overlay-x:hover::-webkit-scrollbar-thumb,.hover-scroll-overlay-y:hover::-webkit-scrollbar-thumb,.hover-scroll-overlay:hover::-webkit-scrollbar-thumb,.hover-scroll-x:hover::-webkit-scrollbar-thumb,.hover-scroll-y:hover::-webkit-scrollbar-thumb,.hover-scroll:hover::-webkit-scrollbar-thumb{background-color:var(--bs-scrollbar-color)}.hover-scroll-overlay-x:hover::-webkit-scrollbar-corner,.hover-scroll-overlay-y:hover::-webkit-scrollbar-corner,.hover-scroll-overlay:hover::-webkit-scrollbar-corner,.hover-scroll-x:hover::-webkit-scrollbar-corner,.hover-scroll-y:hover::-webkit-scrollbar-corner,.hover-scroll:hover::-webkit-scrollbar-corner{background-color:transparent}@supports (-webkit-hyphens:none){.hover-scroll,.hover-scroll-overlay,.scroll{overflow:auto}.hover-scroll-overlay-x,.hover-scroll-x,.scroll-x{overflow-x:auto}.hover-scroll-overlay-y,.hover-scroll-y,.scroll-y{overflow-y:auto}}.scroll-ps{padding-left:var(--bs-scrollbar-size)!important}.scroll-ms{margin-left:var(--bs-scrollbar-size)!important}.scroll-mb{margin-bottom:var(--bs-scrollbar-size)!important}.scroll-pe{padding-right:var(--bs-scrollbar-size)!important}.scroll-me{margin-right:var(--bs-scrollbar-size)!important}.scroll-px{padding-left:var(--bs-scrollbar-size)!important;padding-right:var(--bs-scrollbar-size)!important}.scroll-mx{margin-left:var(--bs-scrollbar-size)!important;margin-right:var(--bs-scrollbar-size)!important}@media (min-width:576px){.scroll-sm-ps{padding-left:var(--bs-scrollbar-size)!important}.scroll-sm-ms{margin-left:var(--bs-scrollbar-size)!important}.scroll-sm-mb{margin-bottom:var(--bs-scrollbar-size)!important}.scroll-sm-pe{padding-right:var(--bs-scrollbar-size)!important}.scroll-sm-me{margin-right:var(--bs-scrollbar-size)!important}.scroll-sm-px{padding-left:var(--bs-scrollbar-size)!important;padding-right:var(--bs-scrollbar-size)!important}.scroll-sm-mx{margin-left:var(--bs-scrollbar-size)!important;margin-right:var(--bs-scrollbar-size)!important}}@media (min-width:768px){.scroll-md-ps{padding-left:var(--bs-scrollbar-size)!important}.scroll-md-ms{margin-left:var(--bs-scrollbar-size)!important}.scroll-md-mb{margin-bottom:var(--bs-scrollbar-size)!important}.scroll-md-pe{padding-right:var(--bs-scrollbar-size)!important}.scroll-md-me{margin-right:var(--bs-scrollbar-size)!important}.scroll-md-px{padding-left:var(--bs-scrollbar-size)!important;padding-right:var(--bs-scrollbar-size)!important}.scroll-md-mx{margin-left:var(--bs-scrollbar-size)!important;margin-right:var(--bs-scrollbar-size)!important}}@media (min-width:992px){.scroll-lg-ps{padding-left:var(--bs-scrollbar-size)!important}.scroll-lg-ms{margin-left:var(--bs-scrollbar-size)!important}.scroll-lg-mb{margin-bottom:var(--bs-scrollbar-size)!important}.scroll-lg-pe{padding-right:var(--bs-scrollbar-size)!important}.scroll-lg-me{margin-right:var(--bs-scrollbar-size)!important}.scroll-lg-px{padding-left:var(--bs-scrollbar-size)!important;padding-right:var(--bs-scrollbar-size)!important}.scroll-lg-mx{margin-left:var(--bs-scrollbar-size)!important;margin-right:var(--bs-scrollbar-size)!important}}@media (min-width:1200px){.scroll-xl-ps{padding-left:var(--bs-scrollbar-size)!important}.scroll-xl-ms{margin-left:var(--bs-scrollbar-size)!important}.scroll-xl-mb{margin-bottom:var(--bs-scrollbar-size)!important}.scroll-xl-pe{padding-right:var(--bs-scrollbar-size)!important}.scroll-xl-me{margin-right:var(--bs-scrollbar-size)!important}.scroll-xl-px{padding-left:var(--bs-scrollbar-size)!important;padding-right:var(--bs-scrollbar-size)!important}.scroll-xl-mx{margin-left:var(--bs-scrollbar-size)!important;margin-right:var(--bs-scrollbar-size)!important}}@media (min-width:1400px){.scroll-xxl-ps{padding-left:var(--bs-scrollbar-size)!important}.scroll-xxl-ms{margin-left:var(--bs-scrollbar-size)!important}.scroll-xxl-mb{margin-bottom:var(--bs-scrollbar-size)!important}.scroll-xxl-pe{padding-right:var(--bs-scrollbar-size)!important}.scroll-xxl-me{margin-right:var(--bs-scrollbar-size)!important}.scroll-xxl-px{padding-left:var(--bs-scrollbar-size)!important;padding-right:var(--bs-scrollbar-size)!important}.scroll-xxl-mx{margin-left:var(--bs-scrollbar-size)!important;margin-right:var(--bs-scrollbar-size)!important}}.rating{display:flex;align-items:center}.rating-input{position:absolute!important;left:-9999px!important}.rating-input[disabled]{display:none}.rating-label{padding:0;margin:0}.rating-label>.svg-icon,.rating-label>i{line-height:1;color:var(--bs-rating-color-default)}label.rating-label{cursor:pointer}div.rating-label.checked>.svg-icon,div.rating-label.checked>i,label.rating-label>.svg-icon,label.rating-label>i{color:var(--bs-rating-color-active)}.rating-input:checked~.rating-label>.svg-icon,.rating-input:checked~.rating-label>i{color:var(--bs-rating-color-default)}.rating:hover label.rating-label>.svg-icon,.rating:hover label.rating-label>i{color:var(--bs-rating-color-active)}label.rating-label:hover~.rating-label{color:var(--bs-rating-color-default)}label.rating-label:hover~.rating-label>.svg-icon,label.rating-label:hover~.rating-label>i{color:var(--bs-rating-color-default)}.stepper [data-kt-stepper-element=content],.stepper [data-kt-stepper-element=info]{display:none}.stepper [data-kt-stepper-element=content].current,.stepper [data-kt-stepper-element=info].current{display:flex}.stepper .stepper-item[data-kt-stepper-action=step]{cursor:pointer}.stepper [data-kt-stepper-action=final]{display:none}.stepper [data-kt-stepper-action=previous]{display:none}.stepper [data-kt-stepper-action=next]{display:inline-block}.stepper [data-kt-stepper-action=submit]{display:none}.stepper.first [data-kt-stepper-action=previous]{display:none}.stepper.first [data-kt-stepper-action=next]{display:inline-block}.stepper.first [data-kt-stepper-action=submit]{display:none}.stepper.between [data-kt-stepper-action=previous]{display:inline-block}.stepper.between [data-kt-stepper-action=next]{display:inline-block}.stepper.between [data-kt-stepper-action=submit]{display:none}.stepper.last [data-kt-stepper-action=final]{display:inline-block}.stepper.last [data-kt-stepper-action=final].btn-flex{display:flex}.stepper.last [data-kt-stepper-action=previous]{display:inline-block}.stepper.last [data-kt-stepper-action=previous].btn-flex{display:flex}.stepper.last [data-kt-stepper-action=previous][data-kt-stepper-state=hide-on-last-step]{display:none!important}.stepper.last [data-kt-stepper-action=next]{display:none}.stepper.last [data-kt-stepper-action=next].btn-flex{display:flex}.stepper.last [data-kt-stepper-action=submit]{display:inline-block}.stepper.last [data-kt-stepper-action=submit].btn-flex{display:flex}.stepper.stepper-pills{--bs-stepper-pills-size:40px;--bs-stepper-icon-border-radius:9px;--bs-stepper-icon-check-size:1rem;--bs-stepper-icon-bg-color:var(--bs-primary-light);--bs-stepper-icon-bg-color-current:var(--bs-primary);--bs-stepper-icon-bg-color-completed:var(--bs-primary-light);--bs-stepper-icon-border:0;--bs-stepper-icon-border-current:0;--bs-stepper-icon-border-completed:0;--bs-stepper-icon-number-color:var(--bs-primary);--bs-stepper-icon-number-color-current:var(--bs-white);--bs-stepper-icon-check-color-completed:var(--bs-primary);--bs-stepper-label-title-opacity:1;--bs-stepper-label-title-opacity-current:1;--bs-stepper-label-title-opacity-completed:1;--bs-stepper-label-title-color:var(--bs-gray-800);--bs-stepper-label-title-color-current:var(--bs-gray-600);--bs-stepper-label-title-color-completed:var(--bs-text-muted);--bs-stepper-label-desc-opacity:1;--bs-stepper-label-desc-opacity-current:1;--bs-stepper-label-desc-opacity-completed:1;--bs-stepper-label-desc-color:var(--bs-text-muted);--bs-stepper-label-desc-color-current:var(--bs-gray-500);--bs-stepper-label-desc-color-completed:var(--bs-gray-500);--bs-stepper-line-border:1px dashed var(--bs-gray-300)}.stepper.stepper-pills .stepper-nav{display:flex}.stepper.stepper-pills .stepper-item{display:flex;align-items:center;transition:color .2s ease}.stepper.stepper-pills .stepper-item .stepper-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:color .2s ease;width:var(--bs-stepper-pills-size);height:var(--bs-stepper-pills-size);border-radius:var(--bs-stepper-icon-border-radius);background-color:var(--bs-stepper-icon-bg-color);border:var(--bs-stepper-icon-border);margin-right:1.5rem}.stepper.stepper-pills .stepper-item .stepper-icon .stepper-check{display:none;font-size:var(--bs-stepper-icon-check-size)}.stepper.stepper-pills .stepper-item .stepper-icon .stepper-number{font-weight:600;color:var(--bs-stepper-icon-number-color);font-size:1.25rem}.stepper.stepper-pills .stepper-item .stepper-label{display:flex;flex-direction:column;justify-content:center}.stepper.stepper-pills .stepper-item .stepper-label .stepper-title{color:var(--bs-stepper-label-title-color);opacity:var(--bs-stepper-label-title-opacity);font-weight:600;font-size:1.25rem;margin-bottom:.3rem}.stepper.stepper-pills .stepper-item .stepper-label .stepper-desc{opacity:var(--bs-stepper-label-desc-opacity);color:var(--bs-stepper-label-desc-color)}.stepper.stepper-pills .stepper-item.current{transition:color .2s ease}.stepper.stepper-pills .stepper-item.current .stepper-icon{transition:color .2s ease;background-color:var(--bs-stepper-icon-bg-color-current);border:var(--bs-stepper-icon-border-current)}.stepper.stepper-pills .stepper-item.current .stepper-icon .stepper-check{display:none}.stepper.stepper-pills .stepper-item.current .stepper-icon .stepper-number{color:var(--bs-stepper-icon-number-color-current);font-size:1.35rem}.stepper.stepper-pills .stepper-item.current .stepper-label .stepper-title{opacity:var(--bs-stepper-label-title-opacity-current);color:var(--bs-stepper-label-title-color-current)}.stepper.stepper-pills .stepper-item.current .stepper-label .stepper-desc{opacity:var(--bs-stepper-label-desc-opacity-current);color:var(--bs-stepper-label-desc-color-current)}.stepper.stepper-pills .stepper-item.completed .stepper-icon,.stepper.stepper-pills .stepper-item.current.mark-completed:last-child .stepper-icon{transition:color .2s ease;background-color:var(--bs-stepper-icon-bg-color-completed);border:var(--bs-stepper-icon-border-completed)}.stepper.stepper-pills .stepper-item.completed .stepper-icon .stepper-check,.stepper.stepper-pills .stepper-item.current.mark-completed:last-child .stepper-icon .stepper-check{color:var(--bs-stepper-icon-check-color-completed);display:inline-block}.stepper.stepper-pills .stepper-item.completed .stepper-icon .stepper-number,.stepper.stepper-pills .stepper-item.current.mark-completed:last-child .stepper-icon .stepper-number{display:none}.stepper.stepper-pills .stepper-item.completed .stepper-label .stepper-title,.stepper.stepper-pills .stepper-item.current.mark-completed:last-child .stepper-label .stepper-title{opacity:var(--bs-stepper-label-title-opacity-completed);color:var(--bs-stepper-label-title-color-completed)}.stepper.stepper-pills .stepper-item.completed .stepper-label .stepper-desc,.stepper.stepper-pills .stepper-item.current.mark-completed:last-child .stepper-label .stepper-desc{opacity:var(--bs-stepper-label-desc-opacity-completed);color:var(--bs-stepper-label-desc-color-completed)}.stepper.stepper-pills.stepper-column .stepper-nav{flex-direction:column;align-items:start}.stepper.stepper-pills.stepper-column .stepper-item{flex-direction:column;justify-content:start;align-items:stretch;padding:0;margin:0}.stepper.stepper-pills.stepper-column .stepper-wrapper{display:flex;align-items:center}.stepper.stepper-pills.stepper-column .stepper-icon{z-index:1}.stepper.stepper-pills.stepper-column .stepper-line{display:block;flex-grow:1;margin-left:calc(var(--bs-stepper-pills-size)/ 2);border-left:var(--bs-stepper-line-border);margin-top:2px;margin-bottom:2px}.stepper.stepper-links .stepper-nav{display:flex;margin:0 auto;justify-content:center;align-items:center;flex-wrap:wrap}.stepper.stepper-links .stepper-nav .stepper-item{position:relative;flex-shrink:0;margin:1rem 1.5rem}.stepper.stepper-links .stepper-nav .stepper-item:after{content:" ";position:absolute;top:2.3rem;left:0;height:2px;width:100%;background-color:transparent;transition:color .2s ease}.stepper.stepper-links .stepper-nav .stepper-item .stepper-title{color:var(--bs-gray-900);font-weight:600;font-size:1.25rem}.stepper.stepper-links .stepper-nav .stepper-item.current{transition:color .2s ease}.stepper.stepper-links .stepper-nav .stepper-item.current .stepper-title{color:var(--bs-primary)}.stepper.stepper-links .stepper-nav .stepper-item.current:after{background-color:var(--bs-primary)}.stepper.stepper-links .stepper-nav .stepper-item.completed .stepper-title,.stepper.stepper-links .stepper-nav .stepper-item.current.mark-completed:last-child .stepper-title{color:var(--bs-gray-500)}.toggle.active .toggle-off,.toggle.collapsible:not(.collapsed) .toggle-off{display:none}.toggle.collapsible.collapsed .toggle-on,.toggle:not(.collapsible):not(.active) .toggle-on{display:none}.xehagon{clip-path:polygon(45% 1.3397459622%,46.5797985667% .6030737921%,48.2635182233% .1519224699%,50% 0,51.7364817767% .1519224699%,53.4202014333% .6030737921%,55% 1.3397459622%,89.6410161514% 21.3397459622%,91.0688922482% 22.3395555688%,92.3014605826% 23.5721239031%,93.3012701892% 25%,94.0379423592% 26.5797985667%,94.4890936815% 28.2635182233%,94.6410161514% 30%,94.6410161514% 70%,94.4890936815% 71.7364817767%,94.0379423592% 73.4202014333%,93.3012701892% 75%,92.3014605826% 76.4278760969%,91.0688922482% 77.6604444312%,89.6410161514% 78.6602540378%,55% 98.6602540378%,53.4202014333% 99.3969262079%,51.7364817767% 99.8480775301%,50% 100%,48.2635182233% 99.8480775301%,46.5797985667% 99.3969262079%,45% 98.6602540378%,10.3589838486% 78.6602540378%,8.9311077518% 77.6604444312%,7.6985394174% 76.4278760969%,6.6987298108% 75%,5.9620576408% 73.4202014333%,5.5109063185% 71.7364817767%,5.3589838486% 70%,5.3589838486% 30%,5.5109063185% 28.2635182233%,5.9620576408% 26.5797985667%,6.6987298108% 25%,7.6985394174% 23.5721239031%,8.9311077518% 22.3395555688%,10.3589838486% 21.3397459622%)}.octagon{clip-path:polygon(46.1731656763% .7612046749%,47.411809549% .3407417371%,48.6947380778% .0855513863%,50% 0,51.3052619222% .0855513863%,52.588190451% .3407417371%,53.8268343237% .7612046749%,82.1111055711% 12.4769334274%,83.2842712475% 13.0554747147%,84.3718855375% 13.7821953496%,85.3553390593% 14.6446609407%,86.2178046504% 15.6281144625%,86.9445252853% 16.7157287525%,87.5230665726% 17.8888944289%,99.2387953251% 46.1731656763%,99.6592582629% 47.411809549%,99.9144486137% 48.6947380778%,100% 50%,99.9144486137% 51.3052619222%,99.6592582629% 52.588190451%,99.2387953251% 53.8268343237%,87.5230665726% 82.1111055711%,86.9445252853% 83.2842712475%,86.2178046504% 84.3718855375%,85.3553390593% 85.3553390593%,84.3718855375% 86.2178046504%,83.2842712475% 86.9445252853%,82.1111055711% 87.5230665726%,53.8268343237% 99.2387953251%,52.588190451% 99.6592582629%,51.3052619222% 99.9144486137%,50% 100%,48.6947380778% 99.9144486137%,47.411809549% 99.6592582629%,46.1731656763% 99.2387953251%,17.8888944289% 87.5230665726%,16.7157287525% 86.9445252853%,15.6281144625% 86.2178046504%,14.6446609407% 85.3553390593%,13.7821953496% 84.3718855375%,13.0554747147% 83.2842712475%,12.4769334274% 82.1111055711%,.7612046749% 53.8268343237%,.3407417371% 52.588190451%,.0855513863% 51.3052619222%,0 50%,.0855513863% 48.6947380778%,.3407417371% 47.411809549%,.7612046749% 46.1731656763%,12.4769334274% 17.8888944289%,13.0554747147% 16.7157287525%,13.7821953496% 15.6281144625%,14.6446609407% 14.6446609407%,15.6281144625% 13.7821953496%,16.7157287525% 13.0554747147%,17.8888944289% 12.4769334274%)}.ribbon{position:relative}.ribbon .ribbon-label{display:flex;justify-content:center;align-items:center;padding:5px 10px;position:absolute;z-index:1;background-color:var(--bs-ribbon-label-bg);box-shadow:var(--bs-ribbon-label-box-shadow);color:var(--bs-primary-inverse);top:50%;right:0;transform:translateX(5px) translateY(-50%)}.ribbon .ribbon-label>.ribbon-inner{z-index:-1;position:absolute;padding:0;width:100%;height:100%;top:0;left:0}.ribbon .ribbon-label:after{border-color:var(--bs-ribbon-label-border-color)}.ribbon-vertical .ribbon-label{padding:5px 10px;min-width:36px;min-height:46px;text-align:center}.ribbon.ribbon-top .ribbon-label{top:0;transform:translateX(-15px) translateY(-4px);border-bottom-right-radius:.475rem;border-bottom-left-radius:.475rem}.ribbon.ribbon-bottom .ribbon-label{border-top-right-radius:.475rem;border-top-left-radius:.475rem}.ribbon.ribbon-start .ribbon-label{top:50%;left:0;right:auto;transform:translateX(-5px) translateY(-50%);border-top-right-radius:.475rem;border-bottom-right-radius:.475rem}.ribbon.ribbon-end .ribbon-label{border-top-left-radius:.475rem;border-bottom-left-radius:.475rem}.ribbon.ribbon-clip.ribbon-start .ribbon-label{left:-5px}.ribbon.ribbon-clip.ribbon-start .ribbon-label .ribbon-inner{border-top-right-radius:.475rem;border-bottom-right-radius:.475rem}.ribbon.ribbon-clip.ribbon-start .ribbon-label .ribbon-inner:after,.ribbon.ribbon-clip.ribbon-start .ribbon-label .ribbon-inner:before{content:"";position:absolute;border-style:solid;border-color:transparent!important;bottom:-10px}.ribbon.ribbon-clip.ribbon-start .ribbon-label .ribbon-inner:before{border-width:0 10px 10px 0;border-right-color:var(--bs-ribbon-clip-bg)!important;left:0}.ribbon.ribbon-clip.ribbon-end .ribbon-label{right:-5px}.ribbon.ribbon-clip.ribbon-end .ribbon-label .ribbon-inner{border-top-left-radius:.475rem;border-bottom-left-radius:.475rem}.ribbon.ribbon-clip.ribbon-end .ribbon-label .ribbon-inner:after,.ribbon.ribbon-clip.ribbon-end .ribbon-label .ribbon-inner:before{content:"";position:absolute;border-style:solid;border-color:transparent!important;bottom:-10px}.ribbon.ribbon-clip.ribbon-end .ribbon-label .ribbon-inner:before{border-width:0 0 10px 10px;border-left-color:var(--bs-ribbon-clip-bg)!important;right:0}.ribbon.ribbon-triangle{position:absolute;z-index:1;display:flex;align-items:flex-start;justify-content:flex-start}.ribbon.ribbon-triangle.ribbon-top-start{top:0;left:0;width:4rem;height:4rem;border-bottom:solid 2rem transparent!important;border-left:solid 2rem transparent;border-right:solid 2rem transparent!important;border-top:solid 2rem transparent}.ribbon.ribbon-triangle.ribbon-top-end{top:0;right:0;width:4rem;height:4rem;border-bottom:solid 2rem transparent!important;border-left:solid 2rem transparent!important;border-right:solid 2rem transparent;border-top:solid 2rem transparent}.ribbon.ribbon-triangle.ribbon-bottom-start{bottom:0;left:0;width:4rem;height:4rem;border-bottom:solid 2rem transparent;border-left:solid 2rem transparent;border-right:solid 2rem transparent!important;border-top:solid 2rem transparent!important}.ribbon.ribbon-triangle.ribbon-bottom-end{bottom:0;right:0;width:4rem;height:4rem;border-bottom:solid 2rem transparent;border-right:solid 2rem transparent;border-left:solid 2rem transparent!important;border-top:solid 2rem transparent!important}.blockui{position:relative}.blockui .blockui-overlay{transition:all .3s ease;position:absolute;top:0;bottom:0;left:0;right:0;display:flex;justify-content:center;align-items:center;background-color:var(--bs-blockui-overlay-bg)}.blockui .blockui-overlay .spinner-border{height:1.35rem;width:1.35rem}.blockui .blockui-message{display:flex;align-items:center;border-radius:.475rem;box-shadow:var(--bs-blockui-message-box-shadow);background-color:var(--bs-blockui-message-bg);color:var(--bs-gray-700);font-weight:600;margin:0!important;width:auto;padding:.85rem 1.75rem!important}.blockui .blockui-message .spinner-border{margin-right:.65rem}[data-bs-theme=dark] .blockui{--bs-blockui-overlay-bg:rgba(255, 255, 255, 0.05);--bs-blockui-message-bg:#26272F;--bs-blockui-message-box-shadow:0px 0px 30px rgba(0, 0, 0, 0.15)}.explore-btn-toggle{color:var(--bs-gray-600);background-color:#fff}.explore-btn-toggle:active,.explore-btn-toggle:focus,.explore-btn-toggle:hover{color:#fff;background-color:#00b2ff}.explore-btn-dismiss{border:0}.explore-btn-dismiss:hover .svg-icon,.explore-btn-dismiss:hover i{color:#00b2ff}.explore-btn-primary{border:0;color:#fff;background-color:#00b2ff}.explore-btn-primary:hover{color:#fff;background-color:#0098da}.explore-btn-secondary{border:0;color:var(--bs-gray-600);background-color:var(--bs-gray-100)}.explore-btn-secondary:hover{color:var(--bs-gray-800);background-color:var(--bs-gray-200)}.explore-btn-outline{border:1px dashed var(--bs-gray-300)!important}.explore-btn-outline.active,.explore-btn-outline:hover{border:1px dashed #50cd89!important;background-color:#e8fff3}.explore-link{color:#00b2ff}.explore-link:hover{color:#0098da}.explore-link-hover:hover{color:#00b2ff!important}.explore-icon-success{color:#50cd89}.explore-icon-danger{color:#f1416c}.explore-label-free{color:#fff;background-color:#ffc700}.explore-label-pro{color:#fff;background-color:#50cd89}.app-engage{position:fixed;right:0;top:50%;transform:translateY(-50%);display:flex;flex-direction:column;align-items:flex-end;z-index:5;padding-right:12px}.app-engage .app-engage-btn{display:flex;align-items:center;justify-content:center;flex-direction:column;box-shadow:var(--bs-engage-btn-box-shadow);border-width:1px;border-style:solid;font-size:12px;font-weight:600;margin-bottom:8px;border-radius:6px;width:66px;height:70px;color:var(--bs-engage-btn-color);border-color:var(--bs-engage-btn-border-color);background-color:var(--bs-engage-btn-bg)}.app-engage .app-engage-btn .svg-icon,.app-engage .app-engage-btn i{color:var(--bs-engage-btn-icon-color)}.app-engage .app-engage-btn.dropdown-toggle:after{color:var(--bs-engage-btn-icon-color)}.app-engage .app-engage-btn.hover-dark:hover{color:var(--bs-dark-inverse);border-color:var(--bs-dark);background-color:var(--bs-dark)}.app-engage .app-engage-btn.hover-dark:hover .svg-icon,.app-engage .app-engage-btn.hover-dark:hover i{color:var(--bs-dark-inverse)}.app-engage .app-engage-btn.hover-primary:hover{color:var(--bs-primary-inverse);border-color:var(--bs-primary);background-color:var(--bs-primary)}.app-engage .app-engage-btn.hover-primary:hover .svg-icon,.app-engage .app-engage-btn.hover-primary:hover i{color:var(--bs-primary-inverse)}.app-engage .app-engage-btn.hover-success:hover{color:var(--bs-success-inverse);border-color:var(--bs-success);background-color:var(--bs-success)}.app-engage .app-engage-btn.hover-success:hover .svg-icon,.app-engage .app-engage-btn.hover-success:hover i{color:var(--bs-success-inverse)}.app-engage .app-engage-btn.app-engage-btn-toggle-off{width:35px;height:35px}.app-engage .app-engage-btn.app-engage-btn-toggle-on{width:35px;height:35px;display:none}.app-engage.app-engage-hide .app-engage-btn{visibility:hidden}.app-engage.app-engage-hide .app-engage-btn.app-engage-btn-toggle-off{display:none}.app-engage.app-engage-hide .app-engage-btn.app-engage-btn-toggle-on{visibility:visible;display:flex}.engage-btn{display:flex;align-items:center;height:35px!important;color:var(--bs-engage-btn-color);border-color:var(--bs-engage-btn-bg);background-color:var(--bs-engage-btn-bg)}.engage-btn .svg-icon,.engage-btn i{color:var(--bs-engage-btn-color)}.engage-btn.dropdown-toggle:after{color:var(--bs-engage-btn-color)}.btn-check:active+.engage-btn,.btn-check:checked+.engage-btn,.engage-btn.active,.engage-btn.show,.engage-btn:active:not(.btn-active),.engage-btn:focus:not(.btn-active),.engage-btn:hover:not(.btn-active),.show>.engage-btn{color:var(--bs-engage-btn-color-active);border-color:var(--bs-engage-btn-bg);background-color:var(--bs-engage-btn-bg)!important}.btn-check:active+.engage-btn .svg-icon,.btn-check:active+.engage-btn i,.btn-check:checked+.engage-btn .svg-icon,.btn-check:checked+.engage-btn i,.engage-btn.active .svg-icon,.engage-btn.active i,.engage-btn.show .svg-icon,.engage-btn.show i,.engage-btn:active:not(.btn-active) .svg-icon,.engage-btn:active:not(.btn-active) i,.engage-btn:focus:not(.btn-active) .svg-icon,.engage-btn:focus:not(.btn-active) i,.engage-btn:hover:not(.btn-active) .svg-icon,.engage-btn:hover:not(.btn-active) i,.show>.engage-btn .svg-icon,.show>.engage-btn i{color:var(--bs-engage-btn-color-active)}.btn-check:active+.engage-btn.dropdown-toggle:after,.btn-check:checked+.engage-btn.dropdown-toggle:after,.engage-btn.active.dropdown-toggle:after,.engage-btn.show.dropdown-toggle:after,.engage-btn:active:not(.btn-active).dropdown-toggle:after,.engage-btn:focus:not(.btn-active).dropdown-toggle:after,.engage-btn:hover:not(.btn-active).dropdown-toggle:after,.show>.engage-btn.dropdown-toggle:after{color:var(--bs-engage-btn-color-active)}.cookiealert{background:inherit;color:inherit}@media print{.print-content-only{padding:0!important;background:0 0!important}.print-content-only .container,.print-content-only .container-fluid,.print-content-only .container-lg,.print-content-only .container-md,.print-content-only .container-sm,.print-content-only .container-xl,.print-content-only .container-xxl,.print-content-only .page,.print-content-only .page-title .content,.print-content-only .wrapper{background:0 0!important;padding:0!important;margin:0!important}.print-content-only .aside,.print-content-only .btn,.print-content-only .drawer,.print-content-only .footer,.print-content-only .header,.print-content-only .scrolltop,.print-content-only .sidebar,.print-content-only .toolbar{display:none!important}}.bg-white{--bs-bg-rgb-color:var(--bs-white-bg-rgb);background-color:#fff!important}.bg-black{--bs-bg-rgb-color:var(--bs-black-bg-rgb);background-color:#000!important}.bg-body{--bs-bg-rgb-color:var(--bs-body-bg-rgb);background-color:var(--bs-body-bg)!important}.bg-hover-body{cursor:pointer}.bg-hover-body:hover{background-color:var(--bs-body-bg)!important}.bg-active-body.active{background-color:var(--bs-body-bg)!important}.bg-state-body{cursor:pointer}.bg-state-body.active,.bg-state-body:hover{background-color:var(--bs-body-bg)!important}.bg-hover-white{cursor:pointer}.bg-hover-white:hover{--bs-bg-rgb-color:var(--bs-white-bg-rgb);background-color:#fff!important}.bg-active-white.active{--bs-bg-rgb-color:var(--bs-white-bg-rgb);background-color:#fff!important}.bg-state-white{cursor:pointer}.bg-state-white.active,.bg-state-white:hover{--bs-bg-rgb-color:var(--bs-white-bg-rgb);background-color:#fff!important}.bg-light-light{background-color:var(--bs-light-light)!important}.bg-light{--bs-bg-rgb-color:var(--bs-light-rgb);background-color:var(--bs-light)!important}.bg-light-active{--bs-bg-rgb-color:var(--bs-light-active-rgb);background-color:var(--bs-light-active)!important}.bg-hover-light-light{cursor:pointer}.bg-hover-light-light:hover{background-color:var(--bs-light-light)!important}.bg-state-light-light{cursor:pointer}.bg-state-light-light.active,.bg-state-light-light:hover{background-color:var(--bs-light-light)!important}.bg-hover-light{cursor:pointer}.bg-hover-light:hover{background-color:var(--bs-light)!important}.bg-active-light.active{background-color:var(--bs-light)!important}.bg-state-light{cursor:pointer}.bg-state-light.active,.bg-state-light:hover{background-color:var(--bs-light)!important}.bg-light-primary{background-color:var(--bs-primary-light)!important}.bg-primary{--bs-bg-rgb-color:var(--bs-primary-rgb);background-color:var(--bs-primary)!important}.bg-primary-active{--bs-bg-rgb-color:var(--bs-primary-active-rgb);background-color:var(--bs-primary-active)!important}.bg-hover-light-primary{cursor:pointer}.bg-hover-light-primary:hover{background-color:var(--bs-primary-light)!important}.bg-state-light-primary{cursor:pointer}.bg-state-light-primary.active,.bg-state-light-primary:hover{background-color:var(--bs-primary-light)!important}.bg-hover-primary{cursor:pointer}.bg-hover-primary:hover{background-color:var(--bs-primary)!important}.bg-active-primary.active{background-color:var(--bs-primary)!important}.bg-state-primary{cursor:pointer}.bg-state-primary.active,.bg-state-primary:hover{background-color:var(--bs-primary)!important}.bg-light-secondary{background-color:var(--bs-secondary-light)!important}.bg-secondary{--bs-bg-rgb-color:var(--bs-secondary-rgb);background-color:var(--bs-secondary)!important}.bg-secondary-active{--bs-bg-rgb-color:var(--bs-secondary-active-rgb);background-color:var(--bs-secondary-active)!important}.bg-hover-light-secondary{cursor:pointer}.bg-hover-light-secondary:hover{background-color:var(--bs-secondary-light)!important}.bg-state-light-secondary{cursor:pointer}.bg-state-light-secondary.active,.bg-state-light-secondary:hover{background-color:var(--bs-secondary-light)!important}.bg-hover-secondary{cursor:pointer}.bg-hover-secondary:hover{background-color:var(--bs-secondary)!important}.bg-active-secondary.active{background-color:var(--bs-secondary)!important}.bg-state-secondary{cursor:pointer}.bg-state-secondary.active,.bg-state-secondary:hover{background-color:var(--bs-secondary)!important}.bg-light-success{background-color:var(--bs-success-light)!important}.bg-success{--bs-bg-rgb-color:var(--bs-success-rgb);background-color:var(--bs-success)!important}.bg-success-active{--bs-bg-rgb-color:var(--bs-success-active-rgb);background-color:var(--bs-success-active)!important}.bg-hover-light-success{cursor:pointer}.bg-hover-light-success:hover{background-color:var(--bs-success-light)!important}.bg-state-light-success{cursor:pointer}.bg-state-light-success.active,.bg-state-light-success:hover{background-color:var(--bs-success-light)!important}.bg-hover-success{cursor:pointer}.bg-hover-success:hover{background-color:var(--bs-success)!important}.bg-active-success.active{background-color:var(--bs-success)!important}.bg-state-success{cursor:pointer}.bg-state-success.active,.bg-state-success:hover{background-color:var(--bs-success)!important}.bg-light-info{background-color:var(--bs-info-light)!important}.bg-info{--bs-bg-rgb-color:var(--bs-info-rgb);background-color:var(--bs-info)!important}.bg-info-active{--bs-bg-rgb-color:var(--bs-info-active-rgb);background-color:var(--bs-info-active)!important}.bg-hover-light-info{cursor:pointer}.bg-hover-light-info:hover{background-color:var(--bs-info-light)!important}.bg-state-light-info{cursor:pointer}.bg-state-light-info.active,.bg-state-light-info:hover{background-color:var(--bs-info-light)!important}.bg-hover-info{cursor:pointer}.bg-hover-info:hover{background-color:var(--bs-info)!important}.bg-active-info.active{background-color:var(--bs-info)!important}.bg-state-info{cursor:pointer}.bg-state-info.active,.bg-state-info:hover{background-color:var(--bs-info)!important}.bg-light-warning{background-color:var(--bs-warning-light)!important}.bg-warning{--bs-bg-rgb-color:var(--bs-warning-rgb);background-color:var(--bs-warning)!important}.bg-warning-active{--bs-bg-rgb-color:var(--bs-warning-active-rgb);background-color:var(--bs-warning-active)!important}.bg-hover-light-warning{cursor:pointer}.bg-hover-light-warning:hover{background-color:var(--bs-warning-light)!important}.bg-state-light-warning{cursor:pointer}.bg-state-light-warning.active,.bg-state-light-warning:hover{background-color:var(--bs-warning-light)!important}.bg-hover-warning{cursor:pointer}.bg-hover-warning:hover{background-color:var(--bs-warning)!important}.bg-active-warning.active{background-color:var(--bs-warning)!important}.bg-state-warning{cursor:pointer}.bg-state-warning.active,.bg-state-warning:hover{background-color:var(--bs-warning)!important}.bg-light-danger{background-color:var(--bs-danger-light)!important}.bg-danger{--bs-bg-rgb-color:var(--bs-danger-rgb);background-color:var(--bs-danger)!important}.bg-danger-active{--bs-bg-rgb-color:var(--bs-danger-active-rgb);background-color:var(--bs-danger-active)!important}.bg-hover-light-danger{cursor:pointer}.bg-hover-light-danger:hover{background-color:var(--bs-danger-light)!important}.bg-state-light-danger{cursor:pointer}.bg-state-light-danger.active,.bg-state-light-danger:hover{background-color:var(--bs-danger-light)!important}.bg-hover-danger{cursor:pointer}.bg-hover-danger:hover{background-color:var(--bs-danger)!important}.bg-active-danger.active{background-color:var(--bs-danger)!important}.bg-state-danger{cursor:pointer}.bg-state-danger.active,.bg-state-danger:hover{background-color:var(--bs-danger)!important}.bg-light-dark{background-color:var(--bs-dark-light)!important}.bg-dark{--bs-bg-rgb-color:var(--bs-dark-rgb);background-color:var(--bs-dark)!important}.bg-dark-active{--bs-bg-rgb-color:var(--bs-dark-active-rgb);background-color:var(--bs-dark-active)!important}.bg-hover-light-dark{cursor:pointer}.bg-hover-light-dark:hover{background-color:var(--bs-dark-light)!important}.bg-state-light-dark{cursor:pointer}.bg-state-light-dark.active,.bg-state-light-dark:hover{background-color:var(--bs-dark-light)!important}.bg-hover-dark{cursor:pointer}.bg-hover-dark:hover{background-color:var(--bs-dark)!important}.bg-active-dark.active{background-color:var(--bs-dark)!important}.bg-state-dark{cursor:pointer}.bg-state-dark.active,.bg-state-dark:hover{background-color:var(--bs-dark)!important}.bg-gray-100{--bs-bg-rgb-color:var(--bs-gray-100-rgb);background-color:var(--bs-gray-100)}.bg-hover-gray-100:hover{--bs-bg-rgb-color:var(--bs-gray-100-rgb);background-color:var(--bs-gray-100)}.bg-gray-100i{--bs-bg-rgb-color:var(--bs-gray-100-rgb);background-color:var(--bs-gray-100)!important}.bg-gray-200{--bs-bg-rgb-color:var(--bs-gray-200-rgb);background-color:var(--bs-gray-200)}.bg-hover-gray-200:hover{--bs-bg-rgb-color:var(--bs-gray-200-rgb);background-color:var(--bs-gray-200)}.bg-gray-200i{--bs-bg-rgb-color:var(--bs-gray-200-rgb);background-color:var(--bs-gray-200)!important}.bg-gray-300{--bs-bg-rgb-color:var(--bs-gray-300-rgb);background-color:var(--bs-gray-300)}.bg-hover-gray-300:hover{--bs-bg-rgb-color:var(--bs-gray-300-rgb);background-color:var(--bs-gray-300)}.bg-gray-300i{--bs-bg-rgb-color:var(--bs-gray-300-rgb);background-color:var(--bs-gray-300)!important}.bg-gray-400{--bs-bg-rgb-color:var(--bs-gray-400-rgb);background-color:var(--bs-gray-400)}.bg-hover-gray-400:hover{--bs-bg-rgb-color:var(--bs-gray-400-rgb);background-color:var(--bs-gray-400)}.bg-gray-400i{--bs-bg-rgb-color:var(--bs-gray-400-rgb);background-color:var(--bs-gray-400)!important}.bg-gray-500{--bs-bg-rgb-color:var(--bs-gray-500-rgb);background-color:var(--bs-gray-500)}.bg-hover-gray-500:hover{--bs-bg-rgb-color:var(--bs-gray-500-rgb);background-color:var(--bs-gray-500)}.bg-gray-500i{--bs-bg-rgb-color:var(--bs-gray-500-rgb);background-color:var(--bs-gray-500)!important}.bg-gray-600{--bs-bg-rgb-color:var(--bs-gray-600-rgb);background-color:var(--bs-gray-600)}.bg-hover-gray-600:hover{--bs-bg-rgb-color:var(--bs-gray-600-rgb);background-color:var(--bs-gray-600)}.bg-gray-600i{--bs-bg-rgb-color:var(--bs-gray-600-rgb);background-color:var(--bs-gray-600)!important}.bg-gray-700{--bs-bg-rgb-color:var(--bs-gray-700-rgb);background-color:var(--bs-gray-700)}.bg-hover-gray-700:hover{--bs-bg-rgb-color:var(--bs-gray-700-rgb);background-color:var(--bs-gray-700)}.bg-gray-700i{--bs-bg-rgb-color:var(--bs-gray-700-rgb);background-color:var(--bs-gray-700)!important}.bg-gray-800{--bs-bg-rgb-color:var(--bs-gray-800-rgb);background-color:var(--bs-gray-800)}.bg-hover-gray-800:hover{--bs-bg-rgb-color:var(--bs-gray-800-rgb);background-color:var(--bs-gray-800)}.bg-gray-800i{--bs-bg-rgb-color:var(--bs-gray-800-rgb);background-color:var(--bs-gray-800)!important}.bg-gray-900{--bs-bg-rgb-color:var(--bs-gray-900-rgb);background-color:var(--bs-gray-900)}.bg-hover-gray-900:hover{--bs-bg-rgb-color:var(--bs-gray-900-rgb);background-color:var(--bs-gray-900)}.bg-gray-900i{--bs-bg-rgb-color:var(--bs-gray-900-rgb);background-color:var(--bs-gray-900)!important}.bg-opacity-0{background-color:rgba(var(--bs-bg-rgb-color),0)!important}.bg-hover-opacity-0:hover{background-color:rgba(var(--bs-bg-rgb-color),0)!important}.bg-active-opacity-0.active{background-color:rgba(var(--bs-bg-rgb-color),0)!important}.bg-state-opacity-0 .active,.bg-state-opacity-0:hover{background-color:rgba(var(--bs-bg-rgb-color),0)!important}.bg-opacity-5{background-color:rgba(var(--bs-bg-rgb-color),.05)!important}.bg-hover-opacity-5:hover{background-color:rgba(var(--bs-bg-rgb-color),.05)!important}.bg-active-opacity-5.active{background-color:rgba(var(--bs-bg-rgb-color),.05)!important}.bg-state-opacity-5 .active,.bg-state-opacity-5:hover{background-color:rgba(var(--bs-bg-rgb-color),.05)!important}.bg-opacity-10{background-color:rgba(var(--bs-bg-rgb-color),.1)!important}.bg-hover-opacity-10:hover{background-color:rgba(var(--bs-bg-rgb-color),.1)!important}.bg-active-opacity-10.active{background-color:rgba(var(--bs-bg-rgb-color),.1)!important}.bg-state-opacity-10 .active,.bg-state-opacity-10:hover{background-color:rgba(var(--bs-bg-rgb-color),.1)!important}.bg-opacity-15{background-color:rgba(var(--bs-bg-rgb-color),.15)!important}.bg-hover-opacity-15:hover{background-color:rgba(var(--bs-bg-rgb-color),.15)!important}.bg-active-opacity-15.active{background-color:rgba(var(--bs-bg-rgb-color),.15)!important}.bg-state-opacity-15 .active,.bg-state-opacity-15:hover{background-color:rgba(var(--bs-bg-rgb-color),.15)!important}.bg-opacity-20{background-color:rgba(var(--bs-bg-rgb-color),.2)!important}.bg-hover-opacity-20:hover{background-color:rgba(var(--bs-bg-rgb-color),.2)!important}.bg-active-opacity-20.active{background-color:rgba(var(--bs-bg-rgb-color),.2)!important}.bg-state-opacity-20 .active,.bg-state-opacity-20:hover{background-color:rgba(var(--bs-bg-rgb-color),.2)!important}.bg-opacity-25{background-color:rgba(var(--bs-bg-rgb-color),.25)!important}.bg-hover-opacity-25:hover{background-color:rgba(var(--bs-bg-rgb-color),.25)!important}.bg-active-opacity-25.active{background-color:rgba(var(--bs-bg-rgb-color),.25)!important}.bg-state-opacity-25 .active,.bg-state-opacity-25:hover{background-color:rgba(var(--bs-bg-rgb-color),.25)!important}.bg-opacity-50{background-color:rgba(var(--bs-bg-rgb-color),.5)!important}.bg-hover-opacity-50:hover{background-color:rgba(var(--bs-bg-rgb-color),.5)!important}.bg-active-opacity-50.active{background-color:rgba(var(--bs-bg-rgb-color),.5)!important}.bg-state-opacity-50 .active,.bg-state-opacity-50:hover{background-color:rgba(var(--bs-bg-rgb-color),.5)!important}.bg-opacity-75{background-color:rgba(var(--bs-bg-rgb-color),.75)!important}.bg-hover-opacity-75:hover{background-color:rgba(var(--bs-bg-rgb-color),.75)!important}.bg-active-opacity-75.active{background-color:rgba(var(--bs-bg-rgb-color),.75)!important}.bg-state-opacity-75 .active,.bg-state-opacity-75:hover{background-color:rgba(var(--bs-bg-rgb-color),.75)!important}.bg-opacity-100{background-color:rgba(var(--bs-bg-rgb-color),1)!important}.bg-hover-opacity-100:hover{background-color:rgba(var(--bs-bg-rgb-color),1)!important}.bg-active-opacity-100.active{background-color:rgba(var(--bs-bg-rgb-color),1)!important}.bg-state-opacity-100 .active,.bg-state-opacity-100:hover{background-color:rgba(var(--bs-bg-rgb-color),1)!important}.bgi-no-repeat{background-repeat:no-repeat}.bgi-position-y-top{background-position-y:top}.bgi-position-y-bottom{background-position-y:bottom}.bgi-position-y-center{background-position-y:center}.bgi-position-x-start{background-position-x:left}.bgi-position-x-end{background-position-x:right}.bgi-position-x-center{background-position-x:center}.bgi-position-top{background-position:0 top}.bgi-position-bottom{background-position:0 bottom}.bgi-position-center{background-position:center}.bgi-size-auto{background-size:auto}.bgi-size-cover{background-size:cover}.bgi-size-contain{background-size:contain}.bgi-attachment-fixed{background-attachment:fixed}.bgi-attachment-scroll{background-attachment:scroll}@media (min-width:576px){.bgi-size-sm-auto{background-size:auto}.bgi-size-sm-cover{background-size:cover}.bgi-size-sm-contain{background-size:contain}.bgi-attachment-sm-fixed{background-attachment:fixed}.bgi-attachment-sm-scroll{background-attachment:scroll}}@media (min-width:768px){.bgi-size-md-auto{background-size:auto}.bgi-size-md-cover{background-size:cover}.bgi-size-md-contain{background-size:contain}.bgi-attachment-md-fixed{background-attachment:fixed}.bgi-attachment-md-scroll{background-attachment:scroll}}@media (min-width:992px){.bgi-size-lg-auto{background-size:auto}.bgi-size-lg-cover{background-size:cover}.bgi-size-lg-contain{background-size:contain}.bgi-attachment-lg-fixed{background-attachment:fixed}.bgi-attachment-lg-scroll{background-attachment:scroll}}@media (min-width:1200px){.bgi-size-xl-auto{background-size:auto}.bgi-size-xl-cover{background-size:cover}.bgi-size-xl-contain{background-size:contain}.bgi-attachment-xl-fixed{background-attachment:fixed}.bgi-attachment-xl-scroll{background-attachment:scroll}}@media (min-width:1400px){.bgi-size-xxl-auto{background-size:auto}.bgi-size-xxl-cover{background-size:cover}.bgi-size-xxl-contain{background-size:contain}.bgi-attachment-xxl-fixed{background-attachment:fixed}.bgi-attachment-xxl-scroll{background-attachment:scroll}}.border-active:not(.active):not(:active):not(:hover):not(:focus){border-color:transparent!important}.border-hover:not(:hover):not(:focus):not(.active):not(:active){cursor:pointer;border-color:transparent!important}.border-gray-100{border-color:var(--bs-gray-100)!important}.border-gray-200{border-color:var(--bs-gray-200)!important}.border-gray-300{border-color:var(--bs-gray-300)!important}.border-gray-400{border-color:var(--bs-gray-400)!important}.border-gray-500{border-color:var(--bs-gray-500)!important}.border-gray-600{border-color:var(--bs-gray-600)!important}.border-gray-700{border-color:var(--bs-gray-700)!important}.border-gray-800{border-color:var(--bs-gray-800)!important}.border-gray-900{border-color:var(--bs-gray-900)!important}.border-light-clarity{border-color:var(--bs-light-clarity)!important}.border-hover-light:hover{border-color:var(--bs-light)!important}.border-active-light.active{border-color:var(--bs-light)!important}.border-primary-clarity{border-color:var(--bs-primary-clarity)!important}.border-hover-primary:hover{border-color:var(--bs-primary)!important}.border-active-primary.active{border-color:var(--bs-primary)!important}.border-secondary-clarity{border-color:var(--bs-secondary-clarity)!important}.border-hover-secondary:hover{border-color:var(--bs-secondary)!important}.border-active-secondary.active{border-color:var(--bs-secondary)!important}.border-success-clarity{border-color:var(--bs-success-clarity)!important}.border-hover-success:hover{border-color:var(--bs-success)!important}.border-active-success.active{border-color:var(--bs-success)!important}.border-info-clarity{border-color:var(--bs-info-clarity)!important}.border-hover-info:hover{border-color:var(--bs-info)!important}.border-active-info.active{border-color:var(--bs-info)!important}.border-warning-clarity{border-color:var(--bs-warning-clarity)!important}.border-hover-warning:hover{border-color:var(--bs-warning)!important}.border-active-warning.active{border-color:var(--bs-warning)!important}.border-danger-clarity{border-color:var(--bs-danger-clarity)!important}.border-hover-danger:hover{border-color:var(--bs-danger)!important}.border-active-danger.active{border-color:var(--bs-danger)!important}.border-dark-clarity{border-color:var(--bs-dark-clarity)!important}.border-hover-dark:hover{border-color:var(--bs-dark)!important}.border-active-dark.active{border-color:var(--bs-dark)!important}.border-active-primary-clarity.active,.border-hover-primary-clarity:hover{border-color:var(--bs-primary-clarity)!important}.border-hover-transparent:hover{border-color:transparent!important}.border-dashed{border-style:dashed!important;border-color:var(--bs-border-dashed-color)}.border-top-dashed{border-top-style:dashed!important}.border-bottom-dashed{border-bottom-style:dashed!important}.border-start-dashed{border-left-style:dashed!important}.border-end-dashed{border-right-style:dashed!important}.border-dotted{border-style:dotted!important}.border-top-dotted{border-top-style:dotted!important}.border-bottom-dotted{border-bottom-style:dotted!important}.border-start-dotted{border-left-style:dotted!important}.border-end-dotted{border-right-style:dotted!important}.border-transparent{border-color:transparent!important}.border-body{border-color:var(--bs-body-bg)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-bottom-0{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.rounded-start-0{border-top-left-radius:0!important;border-bottom-left-radius:0!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-circle{border-radius:50%!important}.flex-root{flex:1}.flex-column-auto{flex:none}.flex-column-fluid{flex:1 0 auto}.flex-row-auto{flex:0 0 auto}.flex-row-fluid{flex:1 auto;min-width:0}.flex-center{justify-content:center;align-items:center}.flex-start{justify-content:start;align-items:start}.flex-end{justify-content:flex-end;align-items:flex-end}.flex-stack{justify-content:space-between;align-items:center}@media (min-width:576px){.flex-sm-root{flex:1}.flex-sm-column-auto{flex:none}.flex-sm-column-fluid{flex:1 0 auto}.flex-sm-row-auto{flex:0 0 auto}.flex-sm-row-fluid{flex:1 auto;min-width:0}.flex-sm-center{justify-content:center;align-items:center}.flex-sm-start{justify-content:start;align-items:start}.flex-sm-end{justify-content:flex-end;align-items:flex-end}.flex-sm-stack{justify-content:space-between;align-items:center}}@media (min-width:768px){.flex-md-root{flex:1}.flex-md-column-auto{flex:none}.flex-md-column-fluid{flex:1 0 auto}.flex-md-row-auto{flex:0 0 auto}.flex-md-row-fluid{flex:1 auto;min-width:0}.flex-md-center{justify-content:center;align-items:center}.flex-md-start{justify-content:start;align-items:start}.flex-md-end{justify-content:flex-end;align-items:flex-end}.flex-md-stack{justify-content:space-between;align-items:center}}@media (min-width:992px){.flex-lg-root{flex:1}.flex-lg-column-auto{flex:none}.flex-lg-column-fluid{flex:1 0 auto}.flex-lg-row-auto{flex:0 0 auto}.flex-lg-row-fluid{flex:1 auto;min-width:0}.flex-lg-center{justify-content:center;align-items:center}.flex-lg-start{justify-content:start;align-items:start}.flex-lg-end{justify-content:flex-end;align-items:flex-end}.flex-lg-stack{justify-content:space-between;align-items:center}}@media (min-width:1200px){.flex-xl-root{flex:1}.flex-xl-column-auto{flex:none}.flex-xl-column-fluid{flex:1 0 auto}.flex-xl-row-auto{flex:0 0 auto}.flex-xl-row-fluid{flex:1 auto;min-width:0}.flex-xl-center{justify-content:center;align-items:center}.flex-xl-start{justify-content:start;align-items:start}.flex-xl-end{justify-content:flex-end;align-items:flex-end}.flex-xl-stack{justify-content:space-between;align-items:center}}@media (min-width:1400px){.flex-xxl-root{flex:1}.flex-xxl-column-auto{flex:none}.flex-xxl-column-fluid{flex:1 0 auto}.flex-xxl-row-auto{flex:0 0 auto}.flex-xxl-row-fluid{flex:1 auto;min-width:0}.flex-xxl-center{justify-content:center;align-items:center}.flex-xxl-start{justify-content:start;align-items:start}.flex-xxl-end{justify-content:flex-end;align-items:flex-end}.flex-xxl-stack{justify-content:space-between;align-items:center}}.flex-equal{flex-grow:1;flex-basis:0;flex-shrink:0}.shadow-xs{box-shadow:var(--bs-box-shadow-xs)}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)}.shadow{box-shadow:var(--bs-box-shadow)}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)}.text-white{color:var(--bs-text-white)!important}.text-hover-white{transition:color .2s ease}.text-hover-white i{transition:color .2s ease}.text-hover-white:hover{transition:color .2s ease;color:var(--bs-text-white)!important}.text-hover-white:hover i{transition:color .2s ease;color:var(--bs-text-white)!important}.text-hover-white:hover .svg-icon{color:var(--bs-text-white)!important}.text-active-white{transition:color .2s ease}.text-active-white i{transition:color .2s ease}.text-active-white.active{transition:color .2s ease;color:var(--bs-text-white)!important}.text-active-white.active i{transition:color .2s ease;color:var(--bs-text-white)!important}.text-active-white.active .svg-icon{color:var(--bs-text-white)!important}.text-primary{color:var(--bs-text-primary)!important}.text-inverse-primary{color:var(--bs-primary-inverse)!important}.text-light-primary{color:var(--bs-primary-light)!important}.text-hover-primary{transition:color .2s ease}.text-hover-primary i{transition:color .2s ease}.text-hover-primary:hover{transition:color .2s ease;color:var(--bs-text-primary)!important}.text-hover-primary:hover i{transition:color .2s ease;color:var(--bs-text-primary)!important}.text-hover-primary:hover .svg-icon{color:var(--bs-text-primary)!important}.text-active-primary{transition:color .2s ease}.text-active-primary i{transition:color .2s ease}.text-active-primary.active{transition:color .2s ease;color:var(--bs-text-primary)!important}.text-active-primary.active i{transition:color .2s ease;color:var(--bs-text-primary)!important}.text-active-primary.active .svg-icon{color:var(--bs-text-primary)!important}.text-secondary{color:var(--bs-text-secondary)!important}.text-inverse-secondary{color:var(--bs-secondary-inverse)!important}.text-light-secondary{color:var(--bs-secondary-light)!important}.text-hover-secondary{transition:color .2s ease}.text-hover-secondary i{transition:color .2s ease}.text-hover-secondary:hover{transition:color .2s ease;color:var(--bs-text-secondary)!important}.text-hover-secondary:hover i{transition:color .2s ease;color:var(--bs-text-secondary)!important}.text-hover-secondary:hover .svg-icon{color:var(--bs-text-secondary)!important}.text-active-secondary{transition:color .2s ease}.text-active-secondary i{transition:color .2s ease}.text-active-secondary.active{transition:color .2s ease;color:var(--bs-text-secondary)!important}.text-active-secondary.active i{transition:color .2s ease;color:var(--bs-text-secondary)!important}.text-active-secondary.active .svg-icon{color:var(--bs-text-secondary)!important}.text-light{color:var(--bs-text-light)!important}.text-inverse-light{color:var(--bs-light-inverse)!important}.text-light-light{color:var(--bs-light-light)!important}.text-hover-light{transition:color .2s ease}.text-hover-light i{transition:color .2s ease}.text-hover-light:hover{transition:color .2s ease;color:var(--bs-text-light)!important}.text-hover-light:hover i{transition:color .2s ease;color:var(--bs-text-light)!important}.text-hover-light:hover .svg-icon{color:var(--bs-text-light)!important}.text-active-light{transition:color .2s ease}.text-active-light i{transition:color .2s ease}.text-active-light.active{transition:color .2s ease;color:var(--bs-text-light)!important}.text-active-light.active i{transition:color .2s ease;color:var(--bs-text-light)!important}.text-active-light.active .svg-icon{color:var(--bs-text-light)!important}.text-success{color:var(--bs-text-success)!important}.text-inverse-success{color:var(--bs-success-inverse)!important}.text-light-success{color:var(--bs-success-light)!important}.text-hover-success{transition:color .2s ease}.text-hover-success i{transition:color .2s ease}.text-hover-success:hover{transition:color .2s ease;color:var(--bs-text-success)!important}.text-hover-success:hover i{transition:color .2s ease;color:var(--bs-text-success)!important}.text-hover-success:hover .svg-icon{color:var(--bs-text-success)!important}.text-active-success{transition:color .2s ease}.text-active-success i{transition:color .2s ease}.text-active-success.active{transition:color .2s ease;color:var(--bs-text-success)!important}.text-active-success.active i{transition:color .2s ease;color:var(--bs-text-success)!important}.text-active-success.active .svg-icon{color:var(--bs-text-success)!important}.text-info{color:var(--bs-text-info)!important}.text-inverse-info{color:var(--bs-info-inverse)!important}.text-light-info{color:var(--bs-info-light)!important}.text-hover-info{transition:color .2s ease}.text-hover-info i{transition:color .2s ease}.text-hover-info:hover{transition:color .2s ease;color:var(--bs-text-info)!important}.text-hover-info:hover i{transition:color .2s ease;color:var(--bs-text-info)!important}.text-hover-info:hover .svg-icon{color:var(--bs-text-info)!important}.text-active-info{transition:color .2s ease}.text-active-info i{transition:color .2s ease}.text-active-info.active{transition:color .2s ease;color:var(--bs-text-info)!important}.text-active-info.active i{transition:color .2s ease;color:var(--bs-text-info)!important}.text-active-info.active .svg-icon{color:var(--bs-text-info)!important}.text-warning{color:var(--bs-text-warning)!important}.text-inverse-warning{color:var(--bs-warning-inverse)!important}.text-light-warning{color:var(--bs-warning-light)!important}.text-hover-warning{transition:color .2s ease}.text-hover-warning i{transition:color .2s ease}.text-hover-warning:hover{transition:color .2s ease;color:var(--bs-text-warning)!important}.text-hover-warning:hover i{transition:color .2s ease;color:var(--bs-text-warning)!important}.text-hover-warning:hover .svg-icon{color:var(--bs-text-warning)!important}.text-active-warning{transition:color .2s ease}.text-active-warning i{transition:color .2s ease}.text-active-warning.active{transition:color .2s ease;color:var(--bs-text-warning)!important}.text-active-warning.active i{transition:color .2s ease;color:var(--bs-text-warning)!important}.text-active-warning.active .svg-icon{color:var(--bs-text-warning)!important}.text-danger{color:var(--bs-text-danger)!important}.text-inverse-danger{color:var(--bs-danger-inverse)!important}.text-light-danger{color:var(--bs-danger-light)!important}.text-hover-danger{transition:color .2s ease}.text-hover-danger i{transition:color .2s ease}.text-hover-danger:hover{transition:color .2s ease;color:var(--bs-text-danger)!important}.text-hover-danger:hover i{transition:color .2s ease;color:var(--bs-text-danger)!important}.text-hover-danger:hover .svg-icon{color:var(--bs-text-danger)!important}.text-active-danger{transition:color .2s ease}.text-active-danger i{transition:color .2s ease}.text-active-danger.active{transition:color .2s ease;color:var(--bs-text-danger)!important}.text-active-danger.active i{transition:color .2s ease;color:var(--bs-text-danger)!important}.text-active-danger.active .svg-icon{color:var(--bs-text-danger)!important}.text-dark{color:var(--bs-text-dark)!important}.text-inverse-dark{color:var(--bs-dark-inverse)!important}.text-light-dark{color:var(--bs-dark-light)!important}.text-hover-dark{transition:color .2s ease}.text-hover-dark i{transition:color .2s ease}.text-hover-dark:hover{transition:color .2s ease;color:var(--bs-text-dark)!important}.text-hover-dark:hover i{transition:color .2s ease;color:var(--bs-text-dark)!important}.text-hover-dark:hover .svg-icon{color:var(--bs-text-dark)!important}.text-active-dark{transition:color .2s ease}.text-active-dark i{transition:color .2s ease}.text-active-dark.active{transition:color .2s ease;color:var(--bs-text-dark)!important}.text-active-dark.active i{transition:color .2s ease;color:var(--bs-text-dark)!important}.text-active-dark.active .svg-icon{color:var(--bs-text-dark)!important}.text-muted{color:var(--bs-text-muted)!important}.text-hover-muted{transition:color .2s ease}.text-hover-muted i{transition:color .2s ease}.text-hover-muted:hover{transition:color .2s ease;color:var(--bs-text-muted)!important}.text-hover-muted:hover i{transition:color .2s ease;color:var(--bs-text-muted)!important}.text-hover-muted:hover .svg-icon{color:var(--bs-text-muted)!important}.text-active-muted{transition:color .2s ease}.text-active-muted i{transition:color .2s ease}.text-active-muted.active{transition:color .2s ease;color:var(--bs-text-muted)!important}.text-active-muted.active i{transition:color .2s ease;color:var(--bs-text-muted)!important}.text-active-muted.active .svg-icon{color:var(--bs-text-muted)!important}.text-gray-100{color:var(--bs-text-gray-100)!important}.text-hover-gray-100{transition:color .2s ease}.text-hover-gray-100 i{transition:color .2s ease}.text-hover-gray-100:hover{transition:color .2s ease;color:var(--bs-text-gray-100)!important}.text-hover-gray-100:hover i{transition:color .2s ease;color:var(--bs-text-gray-100)!important}.text-hover-gray-100:hover .svg-icon{color:var(--bs-text-gray-100)!important}.text-active-gray-100{transition:color .2s ease}.text-active-gray-100 i{transition:color .2s ease}.text-active-gray-100.active{transition:color .2s ease;color:var(--bs-text-gray-100)!important}.text-active-gray-100.active i{transition:color .2s ease;color:var(--bs-text-gray-100)!important}.text-active-gray-100.active .svg-icon{color:var(--bs-text-gray-100)!important}.text-gray-200{color:var(--bs-text-gray-200)!important}.text-hover-gray-200{transition:color .2s ease}.text-hover-gray-200 i{transition:color .2s ease}.text-hover-gray-200:hover{transition:color .2s ease;color:var(--bs-text-gray-200)!important}.text-hover-gray-200:hover i{transition:color .2s ease;color:var(--bs-text-gray-200)!important}.text-hover-gray-200:hover .svg-icon{color:var(--bs-text-gray-200)!important}.text-active-gray-200{transition:color .2s ease}.text-active-gray-200 i{transition:color .2s ease}.text-active-gray-200.active{transition:color .2s ease;color:var(--bs-text-gray-200)!important}.text-active-gray-200.active i{transition:color .2s ease;color:var(--bs-text-gray-200)!important}.text-active-gray-200.active .svg-icon{color:var(--bs-text-gray-200)!important}.text-gray-300{color:var(--bs-text-gray-300)!important}.text-hover-gray-300{transition:color .2s ease}.text-hover-gray-300 i{transition:color .2s ease}.text-hover-gray-300:hover{transition:color .2s ease;color:var(--bs-text-gray-300)!important}.text-hover-gray-300:hover i{transition:color .2s ease;color:var(--bs-text-gray-300)!important}.text-hover-gray-300:hover .svg-icon{color:var(--bs-text-gray-300)!important}.text-active-gray-300{transition:color .2s ease}.text-active-gray-300 i{transition:color .2s ease}.text-active-gray-300.active{transition:color .2s ease;color:var(--bs-text-gray-300)!important}.text-active-gray-300.active i{transition:color .2s ease;color:var(--bs-text-gray-300)!important}.text-active-gray-300.active .svg-icon{color:var(--bs-text-gray-300)!important}.text-gray-400{color:var(--bs-text-gray-400)!important}.text-hover-gray-400{transition:color .2s ease}.text-hover-gray-400 i{transition:color .2s ease}.text-hover-gray-400:hover{transition:color .2s ease;color:var(--bs-text-gray-400)!important}.text-hover-gray-400:hover i{transition:color .2s ease;color:var(--bs-text-gray-400)!important}.text-hover-gray-400:hover .svg-icon{color:var(--bs-text-gray-400)!important}.text-active-gray-400{transition:color .2s ease}.text-active-gray-400 i{transition:color .2s ease}.text-active-gray-400.active{transition:color .2s ease;color:var(--bs-text-gray-400)!important}.text-active-gray-400.active i{transition:color .2s ease;color:var(--bs-text-gray-400)!important}.text-active-gray-400.active .svg-icon{color:var(--bs-text-gray-400)!important}.text-gray-500{color:var(--bs-text-gray-500)!important}.text-hover-gray-500{transition:color .2s ease}.text-hover-gray-500 i{transition:color .2s ease}.text-hover-gray-500:hover{transition:color .2s ease;color:var(--bs-text-gray-500)!important}.text-hover-gray-500:hover i{transition:color .2s ease;color:var(--bs-text-gray-500)!important}.text-hover-gray-500:hover .svg-icon{color:var(--bs-text-gray-500)!important}.text-active-gray-500{transition:color .2s ease}.text-active-gray-500 i{transition:color .2s ease}.text-active-gray-500.active{transition:color .2s ease;color:var(--bs-text-gray-500)!important}.text-active-gray-500.active i{transition:color .2s ease;color:var(--bs-text-gray-500)!important}.text-active-gray-500.active .svg-icon{color:var(--bs-text-gray-500)!important}.text-gray-600{color:var(--bs-text-gray-600)!important}.text-hover-gray-600{transition:color .2s ease}.text-hover-gray-600 i{transition:color .2s ease}.text-hover-gray-600:hover{transition:color .2s ease;color:var(--bs-text-gray-600)!important}.text-hover-gray-600:hover i{transition:color .2s ease;color:var(--bs-text-gray-600)!important}.text-hover-gray-600:hover .svg-icon{color:var(--bs-text-gray-600)!important}.text-active-gray-600{transition:color .2s ease}.text-active-gray-600 i{transition:color .2s ease}.text-active-gray-600.active{transition:color .2s ease;color:var(--bs-text-gray-600)!important}.text-active-gray-600.active i{transition:color .2s ease;color:var(--bs-text-gray-600)!important}.text-active-gray-600.active .svg-icon{color:var(--bs-text-gray-600)!important}.text-gray-700{color:var(--bs-text-gray-700)!important}.text-hover-gray-700{transition:color .2s ease}.text-hover-gray-700 i{transition:color .2s ease}.text-hover-gray-700:hover{transition:color .2s ease;color:var(--bs-text-gray-700)!important}.text-hover-gray-700:hover i{transition:color .2s ease;color:var(--bs-text-gray-700)!important}.text-hover-gray-700:hover .svg-icon{color:var(--bs-text-gray-700)!important}.text-active-gray-700{transition:color .2s ease}.text-active-gray-700 i{transition:color .2s ease}.text-active-gray-700.active{transition:color .2s ease;color:var(--bs-text-gray-700)!important}.text-active-gray-700.active i{transition:color .2s ease;color:var(--bs-text-gray-700)!important}.text-active-gray-700.active .svg-icon{color:var(--bs-text-gray-700)!important}.text-gray-800{color:var(--bs-text-gray-800)!important}.text-hover-gray-800{transition:color .2s ease}.text-hover-gray-800 i{transition:color .2s ease}.text-hover-gray-800:hover{transition:color .2s ease;color:var(--bs-text-gray-800)!important}.text-hover-gray-800:hover i{transition:color .2s ease;color:var(--bs-text-gray-800)!important}.text-hover-gray-800:hover .svg-icon{color:var(--bs-text-gray-800)!important}.text-active-gray-800{transition:color .2s ease}.text-active-gray-800 i{transition:color .2s ease}.text-active-gray-800.active{transition:color .2s ease;color:var(--bs-text-gray-800)!important}.text-active-gray-800.active i{transition:color .2s ease;color:var(--bs-text-gray-800)!important}.text-active-gray-800.active .svg-icon{color:var(--bs-text-gray-800)!important}.text-gray-900{color:var(--bs-text-gray-900)!important}.text-hover-gray-900{transition:color .2s ease}.text-hover-gray-900 i{transition:color .2s ease}.text-hover-gray-900:hover{transition:color .2s ease;color:var(--bs-text-gray-900)!important}.text-hover-gray-900:hover i{transition:color .2s ease;color:var(--bs-text-gray-900)!important}.text-hover-gray-900:hover .svg-icon{color:var(--bs-text-gray-900)!important}.text-active-gray-900{transition:color .2s ease}.text-active-gray-900 i{transition:color .2s ease}.text-active-gray-900.active{transition:color .2s ease;color:var(--bs-text-gray-900)!important}.text-active-gray-900.active i{transition:color .2s ease;color:var(--bs-text-gray-900)!important}.text-active-gray-900.active .svg-icon{color:var(--bs-text-gray-900)!important}.parent-hover .parent-hover-white{transition:color .2s ease}.parent-hover:hover .parent-hover-white{transition:color .2s ease;color:var(--bs-text-white)!important}.parent-hover .parent-hover-primary{transition:color .2s ease}.parent-hover:hover .parent-hover-primary{transition:color .2s ease;color:var(--bs-text-primary)!important}.parent-hover .parent-hover-secondary{transition:color .2s ease}.parent-hover:hover .parent-hover-secondary{transition:color .2s ease;color:var(--bs-text-secondary)!important}.parent-hover .parent-hover-light{transition:color .2s ease}.parent-hover:hover .parent-hover-light{transition:color .2s ease;color:var(--bs-text-light)!important}.parent-hover .parent-hover-success{transition:color .2s ease}.parent-hover:hover .parent-hover-success{transition:color .2s ease;color:var(--bs-text-success)!important}.parent-hover .parent-hover-info{transition:color .2s ease}.parent-hover:hover .parent-hover-info{transition:color .2s ease;color:var(--bs-text-info)!important}.parent-hover .parent-hover-warning{transition:color .2s ease}.parent-hover:hover .parent-hover-warning{transition:color .2s ease;color:var(--bs-text-warning)!important}.parent-hover .parent-hover-danger{transition:color .2s ease}.parent-hover:hover .parent-hover-danger{transition:color .2s ease;color:var(--bs-text-danger)!important}.parent-hover .parent-hover-dark{transition:color .2s ease}.parent-hover:hover .parent-hover-dark{transition:color .2s ease;color:var(--bs-text-dark)!important}.parent-hover .parent-hover-muted{transition:color .2s ease}.parent-hover:hover .parent-hover-muted{transition:color .2s ease;color:var(--bs-text-muted)!important}.parent-hover .parent-hover-gray-100{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-100{transition:color .2s ease;color:var(--bs-text-gray-100)!important}.parent-hover .parent-hover-gray-200{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-200{transition:color .2s ease;color:var(--bs-text-gray-200)!important}.parent-hover .parent-hover-gray-300{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-300{transition:color .2s ease;color:var(--bs-text-gray-300)!important}.parent-hover .parent-hover-gray-400{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-400{transition:color .2s ease;color:var(--bs-text-gray-400)!important}.parent-hover .parent-hover-gray-500{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-500{transition:color .2s ease;color:var(--bs-text-gray-500)!important}.parent-hover .parent-hover-gray-600{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-600{transition:color .2s ease;color:var(--bs-text-gray-600)!important}.parent-hover .parent-hover-gray-700{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-700{transition:color .2s ease;color:var(--bs-text-gray-700)!important}.parent-hover .parent-hover-gray-800{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-800{transition:color .2s ease;color:var(--bs-text-gray-800)!important}.parent-hover .parent-hover-gray-900{transition:color .2s ease}.parent-hover:hover .parent-hover-gray-900{transition:color .2s ease;color:var(--bs-text-gray-900)!important}.parent-active .parent-active-white{transition:color .2s ease}.parent-active.active .parent-active-white{transition:color .2s ease;color:var(--bs-text-white)!important}.parent-active .parent-active-primary{transition:color .2s ease}.parent-active.active .parent-active-primary{transition:color .2s ease;color:var(--bs-text-primary)!important}.parent-active .parent-active-secondary{transition:color .2s ease}.parent-active.active .parent-active-secondary{transition:color .2s ease;color:var(--bs-text-secondary)!important}.parent-active .parent-active-light{transition:color .2s ease}.parent-active.active .parent-active-light{transition:color .2s ease;color:var(--bs-text-light)!important}.parent-active .parent-active-success{transition:color .2s ease}.parent-active.active .parent-active-success{transition:color .2s ease;color:var(--bs-text-success)!important}.parent-active .parent-active-info{transition:color .2s ease}.parent-active.active .parent-active-info{transition:color .2s ease;color:var(--bs-text-info)!important}.parent-active .parent-active-warning{transition:color .2s ease}.parent-active.active .parent-active-warning{transition:color .2s ease;color:var(--bs-text-warning)!important}.parent-active .parent-active-danger{transition:color .2s ease}.parent-active.active .parent-active-danger{transition:color .2s ease;color:var(--bs-text-danger)!important}.parent-active .parent-active-dark{transition:color .2s ease}.parent-active.active .parent-active-dark{transition:color .2s ease;color:var(--bs-text-dark)!important}.parent-active .parent-active-muted{transition:color .2s ease}.parent-active.active .parent-active-muted{transition:color .2s ease;color:var(--bs-text-muted)!important}.parent-active .parent-active-gray-100{transition:color .2s ease}.parent-active.active .parent-active-gray-100{transition:color .2s ease;color:var(--bs-text-gray-100)!important}.parent-active .parent-active-gray-200{transition:color .2s ease}.parent-active.active .parent-active-gray-200{transition:color .2s ease;color:var(--bs-text-gray-200)!important}.parent-active .parent-active-gray-300{transition:color .2s ease}.parent-active.active .parent-active-gray-300{transition:color .2s ease;color:var(--bs-text-gray-300)!important}.parent-active .parent-active-gray-400{transition:color .2s ease}.parent-active.active .parent-active-gray-400{transition:color .2s ease;color:var(--bs-text-gray-400)!important}.parent-active .parent-active-gray-500{transition:color .2s ease}.parent-active.active .parent-active-gray-500{transition:color .2s ease;color:var(--bs-text-gray-500)!important}.parent-active .parent-active-gray-600{transition:color .2s ease}.parent-active.active .parent-active-gray-600{transition:color .2s ease;color:var(--bs-text-gray-600)!important}.parent-active .parent-active-gray-700{transition:color .2s ease}.parent-active.active .parent-active-gray-700{transition:color .2s ease;color:var(--bs-text-gray-700)!important}.parent-active .parent-active-gray-800{transition:color .2s ease}.parent-active.active .parent-active-gray-800{transition:color .2s ease;color:var(--bs-text-gray-800)!important}.parent-active .parent-active-gray-900{transition:color .2s ease}.parent-active.active .parent-active-gray-900{transition:color .2s ease;color:var(--bs-text-gray-900)!important}.text-transparent{color:transparent}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.cursor-move{cursor:move}i.bi,i[class*=" fonticon-"],i[class*=" la-"],i[class^=fonticon-],i[class^=la-]{line-height:1;font-size:1rem;color:var(--bs-text-muted)}a{transition:color .2s ease}a:hover{transition:color .2s ease}.opacity-active-0.active{opacity:0!important}.opacity-state-0.active,.opacity-state-0:hover{opacity:0!important}.opacity-active-5.active{opacity:.05!important}.opacity-state-5.active,.opacity-state-5:hover{opacity:.05!important}.opacity-active-10.active{opacity:.1!important}.opacity-state-10.active,.opacity-state-10:hover{opacity:.1!important}.opacity-active-15.active{opacity:.15!important}.opacity-state-15.active,.opacity-state-15:hover{opacity:.15!important}.opacity-active-20.active{opacity:.2!important}.opacity-state-20.active,.opacity-state-20:hover{opacity:.2!important}.opacity-active-25.active{opacity:.25!important}.opacity-state-25.active,.opacity-state-25:hover{opacity:.25!important}.opacity-active-50.active{opacity:.5!important}.opacity-state-50.active,.opacity-state-50:hover{opacity:.5!important}.opacity-active-75.active{opacity:.75!important}.opacity-state-75.active,.opacity-state-75:hover{opacity:.75!important}.opacity-active-100.active{opacity:1!important}.opacity-state-100.active,.opacity-state-100:hover{opacity:1!important}.transform-90{transform:rotate(90deg);transform-origin:right top}.tree{--bs-tree-icon-size:16px;--bs-tree-icon-gap:14px;--bs-tree-icon-color-open:var(--bs-success);--bs-tree-icon-color-default:var(--bs-gray-500);--bs-tree-icon-color-close:var(--bs-gray-500);--bs-tree-line-color:var(--bs-gray-200)}.tree .tree-node{padding-left:1.25rem;display:flex;flex-direction:column;align-items:start}.tree .tree-sub{padding:.35rem 0}.tree .tree-content{display:flex;align-items:center;padding:.35rem 0}.tree .tree-wrapper{padding-left:calc(var(--bs-tree-icon-size) + var(--bs-tree-icon-size))}.tree .tree-section{display:flex;align-items:baseline;padding-left:var(--bs-tree-icon-gap)}.tree .tree-toggle{display:flex;align-items:center;width:var(--bs-tree-icon-size)}.tree .tree-toggle .tree-icon-default{font-size:1.5rem;color:var(--bs-tree-icon-color-default)}.tree .tree-toggle .tree-icon-open{font-size:1.5rem;color:var(--bs-tree-icon-color-open)}.tree .tree-toggle .tree-icon-close{font-size:1.5rem;color:var(--bs-tree-icon-color-close)}.tree .tree-toggle.collapsed .tree-icon-close{display:flex}.tree .tree-toggle.collapsed .tree-icon-open{display:none}.tree .tree-toggle:not(.collapsed) .tree-icon-close{display:none}.tree .tree-toggle:not(.collapsed) .tree-icon-open{display:flex}.tree>.tree-node{padding-left:0!important}.tree.tree-line .tree-sub{border-left:1px solid var(--bs-tree-line-color);margin-left:calc(var(--bs-tree-icon-size)/ 2)}@media (min-width:992px){.testimonials-slider-highlight{transition:all ease .3}.testimonials-slider-highlight .testimonials-author,.testimonials-slider-highlight .testimonials-body,.testimonials-slider-highlight .testimonials-photo,.testimonials-slider-highlight .testimonials-positon,.testimonials-slider-highlight .testimonials-title{transition:all ease .3s}.testimonials-slider-highlight .tns-item:not(.tns-slide-active)+.tns-item.tns-slide-active .testimonials-photo{height:200px;width:200px;transition:all ease .3s}.testimonials-slider-highlight .tns-item:not(.tns-slide-active)+.tns-item.tns-slide-active .testimonials-title{color:var(--bs-gray-900)!important;font-size:1.54rem!important;transition:all ease .3s;margin-bottom:1.3rem!important}.testimonials-slider-highlight .tns-item:not(.tns-slide-active)+.tns-item.tns-slide-active .testimonials-description{color:var(--bs-gray-700)!important;font-size:1.38rem!important;transition:all ease .3s;margin-bottom:1.7rem!important}.testimonials-slider-highlight .tns-item:not(.tns-slide-active)+.tns-item.tns-slide-active .testimonials-author{color:var(--bs-primary)!important;font-size:1.1rem!important;transition:all ease .3s}.testimonials-slider-highlight .tns-item:not(.tns-slide-active)+.tns-item.tns-slide-active .testimonials-positon{color:var(--bs-gray-500)!important;font-size:.9rem!important;transition:all ease .3s}}.testimonials-slider-quote .testimonials-quote{opacity:.2}.testimonials-slider-quote .tns-item:not(.tns-slide-active)+.tns-slide-active+.tns-slide-active .testimonials-quote{opacity:.5;color:var(--bs-primary)!important}@media (min-width:992px){.btn.btn-secondary{color:var(--bs-body-bg);background-color:var(--bs-gray-800)}.btn.btn-secondary .svg-icon,.btn.btn-secondary i{color:var(--bs-body-bg)}.btn.btn-secondary.dropdown-toggle:after{color:var(--bs-body-bg)}.btn-check:active+.btn.btn-secondary,.btn-check:checked+.btn.btn-secondary,.btn.btn-secondary.active,.btn.btn-secondary.show,.btn.btn-secondary:active:not(.btn-active),.btn.btn-secondary:focus:not(.btn-active),.btn.btn-secondary:hover:not(.btn-active),.show>.btn.btn-secondary{color:var(--bs-body-bg);background-color:var(--bs-gray-700)!important}.btn-check:active+.btn.btn-secondary .svg-icon,.btn-check:active+.btn.btn-secondary i,.btn-check:checked+.btn.btn-secondary .svg-icon,.btn-check:checked+.btn.btn-secondary i,.btn.btn-secondary.active .svg-icon,.btn.btn-secondary.active i,.btn.btn-secondary.show .svg-icon,.btn.btn-secondary.show i,.btn.btn-secondary:active:not(.btn-active) .svg-icon,.btn.btn-secondary:active:not(.btn-active) i,.btn.btn-secondary:focus:not(.btn-active) .svg-icon,.btn.btn-secondary:focus:not(.btn-active) i,.btn.btn-secondary:hover:not(.btn-active) .svg-icon,.btn.btn-secondary:hover:not(.btn-active) i,.show>.btn.btn-secondary .svg-icon,.show>.btn.btn-secondary i{color:var(--bs-body-bg)}.btn-check:active+.btn.btn-secondary.dropdown-toggle:after,.btn-check:checked+.btn.btn-secondary.dropdown-toggle:after,.btn.btn-secondary.active.dropdown-toggle:after,.btn.btn-secondary.show.dropdown-toggle:after,.btn.btn-secondary:active:not(.btn-active).dropdown-toggle:after,.btn.btn-secondary:focus:not(.btn-active).dropdown-toggle:after,.btn.btn-secondary:hover:not(.btn-active).dropdown-toggle:after,.show>.btn.btn-secondary.dropdown-toggle:after{color:var(--bs-body-bg)}}[data-bs-theme=dark] .btn.btn-secondary{color:var(--bs-gray-700);background-color:#2a2a3c}[data-bs-theme=dark] .btn.btn-secondary .svg-icon,[data-bs-theme=dark] .btn.btn-secondary i{color:#fff}[data-bs-theme=dark] .btn.btn-secondary.dropdown-toggle:after{color:#fff}.btn-check:active+[data-bs-theme=dark] .btn.btn-secondary,.btn-check:checked+[data-bs-theme=dark] .btn.btn-secondary,.show>[data-bs-theme=dark] .btn.btn-secondary,[data-bs-theme=dark] .btn.btn-secondary.active,[data-bs-theme=dark] .btn.btn-secondary.show,[data-bs-theme=dark] .btn.btn-secondary:active:not(.btn-active),[data-bs-theme=dark] .btn.btn-secondary:focus:not(.btn-active),[data-bs-theme=dark] .btn.btn-secondary:hover:not(.btn-active){color:var(--bs-gray-700);background-color:#282838!important}[data-bs-theme=light]{--bs-app-bg-color:#ffffff;--bs-app-blank-bg-color:#ffffff;--bs-app-header-base-bg-color:#ffffff;--bs-app-header-minimize-bg-color:rgba(255, 255, 255, 0.5);--bs-app-sidebar-base-bg-color:#0B0C10;--bs-app-sidebar-base-box-shadow:none}[data-bs-theme=dark]{--bs-app-bg-color:#0F1014;--bs-app-blank-bg-color:#151521;--bs-app-header-base-bg-color:#0F1014;--bs-app-header-minimize-bg-color:rgba(21, 23, 28, 0.5);--bs-app-sidebar-base-bg-color:#0B0C10;--bs-app-sidebar-base-box-shadow:none;--bs-app-sidebar-base-border-end:1px solid #1B1C22}html{font-family:sans-serif;text-size-adjust:100%}body,html{height:100%;margin:0;padding:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:13px!important;font-weight:400;font-family:Inter,Helvetica,sans-serif}@media (max-width:991.98px){body,html{font-size:12px!important}}@media (max-width:767.98px){body,html{font-size:12px!important}}body{display:flex;flex-direction:column}body a:active,body a:focus,body a:hover{text-decoration:none!important}canvas{user-select:none}router-outlet{display:none}.app-default,body{background-color:var(--bs-app-bg-color)}.app-blank{background-color:var(--bs-app-blank-bg-color)}[data-kt-app-reset-transition=true] *{transition:none!important}.app-page{display:flex}[data-kt-app-page-loading=on]{overflow:hidden}[data-kt-app-page-loading=on] *{transition:none!important}.app-page-loader{background:var(--bs-body-bg);color:var(--bs-body-color);position:fixed;top:0;bottom:0;left:0;right:0;z-index:10000;display:none}[data-kt-app-page-loading=on] .app-page-loader{display:flex;justify-content:center;align-items:center}@media (min-width:992px){.app-container{padding-left:30px!important;padding-right:30px!important}.app-container-fit-desktop{padding-left:0!important;padding-right:0!important}}@media (max-width:991.98px){.app-container{max-width:none;padding-left:20px!important;padding-right:20px!important}.app-container-fit-mobile{padding-left:0!important;padding-right:0!important}}@media print{.app-print-content-only{padding:0!important;background:0 0!important}.app-print-content-only .app-container,.app-print-content-only .app-content,.app-print-content-only .app-page,.app-print-content-only .app-page-title,.app-print-content-only .app-wrapper{background:0 0!important;padding:0!important;margin:0!important}.app-print-content-only .app-aside,.app-print-content-only .app-aside-panel,.app-print-content-only .app-footer,.app-print-content-only .app-header,.app-print-content-only .app-sidebar,.app-print-content-only .app-sidebar-panel,.app-print-content-only .app-toolbar,.app-print-content-only .btn,.app-print-content-only .drawer,.app-print-content-only .scrolltop{display:none!important}}.app-navbar{display:flex;align-items:stretch}.app-navbar .app-navbar-item{display:flex;align-items:center}.app-navbar.app-navbar-stretch .app-navbar-item{align-items:stretch}.app-header{transition:none;display:flex;align-items:stretch;background-color:var(--bs-app-header-base-bg-color);box-shadow:var(--bs-app-header-base-box-shadow);border-bottom:var(--bs-app-header-base-border-bottom)}@media (min-width:992px){:root{--bs-app-header-height:90px;--bs-app-header-height-actual:90px}[data-kt-app-header-fixed=true][data-kt-app-header-stacked=true]{--bs-app-header-height:calc(var(--bs-app-header-primary-height, 0px) + var(--bs-app-header-secondary-height, 0px) + var(--bs-app-header-tertiary-height, 0px));--bs-app-header-height-actual:calc(70px + 70px + 70px)}[data-kt-app-header-sticky=on]{--bs-app-header-height:70px;--bs-app-header-height-actual:90px}[data-kt-app-header-sticky=on][data-kt-app-header-stacked=true]{--bs-app-header-height:calc(var(--bs-app-header-primary-height, 0px) + var(--bs-app-header-secondary-height, 0px) + var(--bs-app-header-tertiary-height, 0px));--bs-app-header-height-actual:calc(70px + 70px + 70px)}[data-kt-app-header-minimize=on]{--bs-app-header-height:90px}.app-header{height:var(--bs-app-header-height)}[data-kt-app-header-fixed=true] .app-header{z-index:100;position:fixed;left:0;right:0;top:0}[data-kt-app-header-static=true] .app-header{position:relative}[data-kt-app-header-stacked=true] .app-header{flex-direction:column;height:calc(var(--bs-app-header-primary-height) + var(--bs-app-header-secondary-height,0px) + var(--bs-app-header-tertiary-height,0px))}[data-kt-app-header-sticky=on] .app-header{position:fixed;left:0;right:0;top:0;z-index:100;background-color:var(--bs-app-header-sticky-bg-color);box-shadow:var(--bs-app-header-sticky-box-shadow);border-bottom:var(--bs-app-header-sticky-border-bottom)}[data-kt-app-header-minimize=on] .app-header{transition:none;z-index:100;backdrop-filter:blur(6px);background-color:var(--bs-app-header-minimize-bg-color);box-shadow:var(--bs-app-header-minimize-box-shadow);border-bottom:var(--bs-app-header-minimize-border-bottom)}.app-header .app-header-mobile-drawer{display:flex}[data-kt-app-header-fixed=true][data-kt-app-sidebar-fixed=true][data-kt-app-sidebar-push-header=true] .app-header,[data-kt-app-header-fixed=true][data-kt-app-sidebar-sticky=on][data-kt-app-sidebar-push-header=true] .app-header{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px))}body:not([data-kt-app-header-fixed=true])[data-kt-app-sidebar-fixed=true][data-kt-app-sidebar-push-header=true] .app-header,body:not([data-kt-app-header-fixed=true])[data-kt-app-sidebar-sticky=on][data-kt-app-sidebar-push-header=true] .app-header{margin-left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px))}[data-kt-app-header-fixed=true][data-kt-app-sidebar-panel-fixed=true][data-kt-app-sidebar-panel-push-header=true] .app-header,[data-kt-app-header-fixed=true][data-kt-app-sidebar-panel-sticky=on][data-kt-app-sidebar-panel-push-header=true] .app-header{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px) + var(--bs-app-sidebar-panel-width) + var(--bs-app-sidebar-panel-gap-start,0px) + var(--bs-app-sidebar-panel-gap-end,0px))}body:not([data-kt-app-header-fixed=true])[data-kt-app-sidebar-panel-fixed=true][data-kt-app-sidebar-panel-push-header=true] .app-header,body:not([data-kt-app-header-fixed=true])[data-kt-app-sidebar-panel-sticky=on][data-kt-app-sidebar-panel-push-header=true] .app-header{margin-left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px) + var(--bs-app-sidebar-panel-width) + var(--bs-app-sidebar-panel-gap-start,0px) + var(--bs-app-sidebar-panel-gap-end,0px))}[data-kt-app-header-fixed=true][data-kt-app-aside-fixed=true][data-kt-app-aside-push-header=true] .app-header,[data-kt-app-header-fixed=true][data-kt-app-aside-sticky=on][data-kt-app-aside-push-header=true] .app-header{right:calc(var(--bs-app-aside-width) + var(--bs-app-aside-gap-start,0px) + var(--bs-app-aside-gap-end,0px))}[data-kt-app-header-fixed=true][data-kt-app-toolbar-fixed=true] .app-header{box-shadow:none}}@media (max-width:991.98px){:root{--bs-app-header-height:60px}[data-kt-app-header-sticky=on]{--bs-app-header-height:70px;--bs-app-header-height-actual:70px}[data-kt-app-header-minimize=on]{--bs-app-header-height:60px;--bs-app-header-height-actual:60px}.app-header{height:var(--bs-app-header-height);align-items:stretch}.app-header .app-header-mobile-drawer{display:none}[data-kt-app-header-stacked=true] .app-header{flex-direction:column;height:calc(var(--bs-app-header-primary-height) + var(--bs-app-header-secondary-height,0px) + var(--bs-app-header-tertiary-height,0px))}[data-kt-app-header-fixed-mobile=true] .app-header{z-index:100;transition:none;position:fixed;left:0;right:0;top:0}[data-kt-app-header-sticky=on] .app-header{position:fixed;left:0;right:0;top:0;z-index:100;background-color:var(--bs-app-header-sticky-bg-color);box-shadow:var(--bs-app-header-sticky-box-shadow);border-bottom:var(--bs-app-header-sticky-border-bottom)}[data-kt-app-header-minimize=on] .app-header{z-index:100;backdrop-filter:blur(6px);transition:none;background-color:var(--bs-app-header-minimize-bg-color);box-shadow:var(--bs-app-header-minimize-box-shadow);border-bottom:var(--bs-app-header-minimize-border-bottom)}[data-kt-app-header-fixed-mobile=true][data-kt-app-toolbar-fixed-mobile=true] .app-header{box-shadow:none}[data-kt-app-header-fixed-mobile=true][data-kt-app-toolbar-sticky=on] .app-header{box-shadow:none}}.app-header-primary{transition:none;display:flex;align-items:stretch}@media (min-width:992px){.app-header-primary{background-color:var(--bs-app-header-primary-base-bg-color);box-shadow:var(--bs-app-header-primary-base-box-shadow);border-bottom:var(--bs-app-header-primary-base-border-bottom)}[data-kt-app-header-primary-enabled=true]{--bs-app-header-primary-height:70px}[data-kt-app-header-primary-enabled=true][data-kt-app-header-sticky=on]{--bs-app-header-primary-height:70px}[data-kt-app-header-primary-enabled=true][data-kt-app-header-minimize=on]{--bs-app-header-primary-height:70px}[data-kt-app-header-primary-enabled=true][data-kt-app-header-sticky=on][data-kt-app-header-primary-sticky-hide=true]{--bs-app-header-primary-height:0}.app-header-primary{height:var(--bs-app-header-primary-height)}[data-kt-app-header-primary-fixed=true] .app-header-primary{z-index:100;position:fixed;left:0;right:0;top:0}[data-kt-app-header-primary-static=true] .app-header-primary{position:relative}[data-kt-app-header-primary-sticky=on] .app-header-primary{position:fixed;left:0;right:0;top:0;height:70px;z-index:100;background-color:var(--bs-app-header-primary-sticky-bg-color);box-shadow:var(--bs-app-header-primary-sticky-box-shadow);border-bottom:var(--bs-app-header-primary-sticky-border-bottom)}[data-kt-app-header-primary-minimize=on] .app-header-primary{transition:none;height:70px;z-index:100;background-color:var(--bs-app-header-primary-minimize-bg-color);box-shadow:var(--bs-app-header-primary-minimize-box-shadow);border-bottom:var(--bs-app-header-primary-minimize-border-bottom)}[data-kt-app-header-sticky=on][data-kt-app-header-primary-sticky-hide=true] .app-header-primary{display:none!important}[data-kt-app-header-primary-enabled=true][data-kt-app-sidebar-fixed=true][data-kt-app-sidebar-push-header=true] .app-header-primary{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px))}[data-kt-app-header-primary-enabled=true][data-kt-app-sidebar-panel-fixed=true][data-kt-app-sidebar-panel-push-header=true] .app-header-primary{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px) + var(--bs-app-sidebar-panel-width) + var(--bs-app-sidebar-panel-gap-start,0px) + var(--bs-app-sidebar-panel-gap-end,0px))}}@media (max-width:991.98px){.app-header .app-header-primary{flex-grow:1;height:var(--bs-app-header-primary-height);border-bottom:var(--bs-app-header-primary-base-border-bottom);box-shadow:var(--bs-app-header-primary-base-box-shadow)}.app-header-primary{background-color:var(--bs-app-header-primary-base-bg-color)}[data-kt-app-header-primary-enabled=true]{--bs-app-header-primary-height:60px}[data-kt-app-header-primary-enabled=true][data-kt-app-header-sticky=on]{--bs-app-header-primary-height:60px}[data-kt-app-header-primary-enabled=true][data-kt-app-header-minimize=on]{--bs-app-header-primary-height:60px}}.app-header-secondary{transition:none;display:flex;align-items:stretch}@media (min-width:992px){.app-header-secondary{background-color:var(--bs-app-header-secondary-base-bg-color);box-shadow:var(--bs-app-header-secondary-base-box-shadow);border-top:var(--bs-app-header-secondary-base-border-top);border-bottom:var(--bs-app-header-secondary-base-border-bottom)}[data-kt-app-header-secondary-enabled=true]{--bs-app-header-secondary-height:70px}[data-kt-app-header-secondary-enabled=true][data-kt-app-header-sticky=on]{--bs-app-header-secondary-height:70px}[data-kt-app-header-secondary-enabled=true][data-kt-app-header-minimize=on]{--bs-app-header-secondary-height:70px}[data-kt-app-header-secondary-enabled=true][data-kt-app-header-sticky=on][data-kt-app-header-secondary-sticky-hide=true]{--bs-app-header-secondary-height:0}.app-header-secondary{height:var(--bs-app-header-secondary-height)}[data-kt-app-header-secondary-fixed=true] .app-header-secondary{z-index:100;position:fixed;left:0;right:0;top:0}[data-kt-app-header-secondary-static=true] .app-header-secondary{position:static}[data-kt-app-header-secondary-sticky=on] .app-header-secondary{transition:none;position:fixed;left:0;right:0;top:0;height:70px;z-index:100;background-color:var(--bs-app-header-secondary-sticky-bg-color);box-shadow:var(--bs-app-header-secondary-sticky-box-shadow);border-bottom:var(--bs-app-header-secondary-sticky-border-bottom)}[data-kt-app-header-secondary-minimize=on] .app-header-secondary{transition:none;height:70px;z-index:100;background-color:var(--bs-app-header-secondary-minimize-bg-color);box-shadow:var(--bs-app-header-secondary-minimize-box-shadow);border-bottom:var(--bs-app-header-secondary-minimize-border-bottom)}[data-kt-app-header-sticky=on][data-kt-app-header-secondary-sticky-hide=true] .app-header-secondary{display:none!important}[data-kt-app-header-secondary-enabled=true][data-kt-app-sidebar-fixed=true][data-kt-app-sidebar-push-header=true] .app-header-secondary{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px))}[data-kt-app-header-secondary-enabled=true][data-kt-app-sidebar-panel-fixed=true][data-kt-app-sidebar-panel-push-header=true] .app-header-secondary{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px) + var(--bs-app-sidebar-panel-width) + var(--bs-app-sidebar-panel-gap-start,0px) + var(--bs-app-sidebar-panel-gap-end,0px))}}@media (max-width:991.98px){.app-header .app-header-secondary{flex-grow:1;height:var(--bs-app-header-secondary-height);box-shadow:var(--bs-app-header-secondary-base-box-shadow);border-top:var(--bs-app-header-secondary-base-border-top);border-bottom:var(--bs-app-header-secondary-base-border-bottom)}.app-header-secondary{background-color:var(--bs-app-header-secondary-base-bg-color)}[data-kt-app-header-secondary-enabled=true]{--bs-app-header-secondary-height:60px}[data-kt-app-header-secondary-enabled=true][data-kt-app-header-sticky=on]{--bs-app-header-secondary-height:60px}[data-kt-app-header-secondary-enabled=true][data-kt-app-header-minimize=on]{--bs-app-header-secondary-height:60px}}.app-header-tertiary{transition:none;display:flex;align-items:stretch}@media (min-width:992px){.app-header-tertiary{background-color:var(--bs-app-header-tertiary-base-bg-color);box-shadow:var(--bs-app-header-tertiary-base-box-shadow);border-top:var(--bs-app-header-tertiary-base-border-top);border-bottom:var(--bs-app-header-tertiary-base-border-bottom)}[data-kt-app-header-tertiary-enabled=true]{--bs-app-header-tertiary-height:70px}[data-kt-app-header-tertiary-enabled=true][data-kt-app-header-sticky=on]{--bs-app-header-tertiary-height:70px}[data-kt-app-header-tertiary-enabled=true][data-kt-app-header-minimize=on]{--bs-app-header-tertiary-height:70px}[data-kt-app-header-tertiary-enabled=true][data-kt-app-header-sticky=on][data-kt-app-header-tertiary-sticky-hide=true]{--bs-app-header-tertiary-height:0}.app-header-tertiary{height:var(--bs-app-header-tertiary-height)}[data-kt-app-header-tertiary-fixed=true] .app-header-tertiary{z-index:100;position:fixed;left:0;right:0;top:0}[data-kt-app-header-tertiary-static=true] .app-header-tertiary{position:static}[data-kt-app-header-tertiary-sticky=on] .app-header-tertiary{transition:none;position:fixed;left:0;right:0;top:0;height:70px;z-index:100;background-color:var(--bs-app-header-tertiary-sticky-bg-color);box-shadow:var(--bs-app-header-tertiary-sticky-box-shadow);border-bottom:var(--bs-app-header-tertiary-sticky-border-bottom)}[data-kt-app-header-tertiary-minimize=on] .app-header-tertiary{transition:none;height:70px;z-index:100;background-color:var(--bs-app-header-tertiary-minimize-bg-color);box-shadow:var(--bs-app-header-tertiary-minimize-box-shadow);border-bottom:var(--bs-app-header-tertiary-minimize-border-bottom)}[data-kt-app-header-sticky=on][data-kt-app-header-tertiary-sticky-hide=true] .app-header-tertiary{display:none!important}[data-kt-app-header-tertiary-enabled=true][data-kt-app-sidebar-fixed=true][data-kt-app-sidebar-push-header=true] .app-header-tertiary{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px))}[data-kt-app-header-tertiary-enabled=true][data-kt-app-sidebar-panel-fixed=true][data-kt-app-sidebar-panel-push-header=true] .app-header-tertiary{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px) + var(--bs-app-sidebar-panel-width) + var(--bs-app-sidebar-panel-gap-start,0px) + var(--bs-app-sidebar-panel-gap-end,0px))}}@media (max-width:991.98px){.app-header .app-header-tertiary{flex-grow:1;height:var(--bs-app-header-tertiary-height);border-top:var(--bs-app-header-tertiary-base-border-top);box-shadow:var(--bs-app-header-tertiary-base-box-shadow)}.app-header-tertiary{background-color:var(--bs-app-header-tertiary-base-bg-color)}[data-kt-app-header-tertiary-enabled=true]{--bs-app-header-tertiary-height:70px}[data-kt-app-header-tertiary-enabled=true][data-kt-app-header-sticky=on]{--bs-app-header-tertiary-height:60px}[data-kt-app-header-secondary-enabled=true][data-kt-app-header-minimize=on]{--bs-app-header-tertiary-height:60px}}.app-toolbar{display:flex;align-items:stretch;background-color:var(--bs-app-toolbar-base-bg-color);box-shadow:var(--bs-app-toolbar-base-box-shadow);border-top:var(--bs-app-toolbar-base-border-top);border-bottom:var(--bs-app-toolbar-base-border-bottom)}.app-toolbar.app-toolbar-minimize{transition:none}@media (min-width:992px){:root{--bs-app-toolbar-height:auto;--bs-app-toolbar-height-actual:auto}[data-kt-app-toolbar-sticky=on]{--bs-app-toolbar-height:70px}[data-kt-app-toolbar-minimize=on]{--bs-app-toolbar-height:70px}.app-toolbar{height:var(--bs-app-toolbar-height)}[data-kt-app-header-fixed=true][data-kt-app-toolbar-fixed=true] .app-toolbar{z-index:99;position:fixed;left:0;right:0;top:0}[data-kt-app-toolbar-sticky=on] .app-toolbar{position:fixed;left:0;right:0;top:0;box-shadow:var(--bs-app-toolbar-sticky-box-shadow);background-color:var(--bs-app-toolbar-sticky-bg-color);border-top:var(--bs-app-toolbar-sticky-border-top);border-bottom:var(--bs-app-toolbar-sticky-border-bottom);z-index:99}[data-kt-app-toolbar-minimize=on] .app-toolbar{transition:none;box-shadow:var(--bs-app-toolbar-minimize-box-shadow);background-color:var(--bs-app-toolbar-minimize-bg-color);border-top:var(--bs-app-toolbar-minimize-border-top);border-bottom:var(--bs-app-toolbar-minimize-border-bottom);z-index:99}[data-kt-app-toolbar-fixed=true][data-kt-app-header-fixed=true] .app-toolbar{top:var(--bs-app-header-height)}[data-kt-app-toolbar-fixed=true][data-kt-app-sidebar-fixed=true][data-kt-app-sidebar-push-toolbar=true] .app-toolbar,[data-kt-app-toolbar-sticky=on][data-kt-app-sidebar-fixed=true][data-kt-app-sidebar-push-toolbar=true] .app-toolbar{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px))}[data-kt-app-toolbar-fixed=true][data-kt-app-sidebar-panel-fixed=true][data-kt-app-sidebar-panel-push-toolbar=true] .app-toolbar,[data-kt-app-toolbar-sticky=on][data-kt-app-sidebar-panel-fixed=true][data-kt-app-sidebar-panel-push-toolbar=true] .app-toolbar{left:calc(var(--bs-app-sidebar-width) + var(--bs-app-sidebar-gap-start,0px) + var(--bs-app-sidebar-gap-end,0px) + var(--bs-app-sidebar-panel-width) + var(--bs-app-sidebar-panel-gap-start,0px) + var(--bs-app-sidebar-panel-gap-end,0px))}[data-kt-app-toolbar-fixed=true][data-kt-app-aside-fixed=true][data-kt-app-aside-push-toolbar=true] .app-toolbar,[data-kt-app-toolbar-sticky=on][data-kt-app-aside-fixed=true][data-kt-app-aside-push-toolbar=true] .app-toolbar{right:calc(var(--bs-app-aside-width) + var(--bs-app-aside-gap-start,0px) + var(--bs-app-aside-gap-end,0px))}}@media (max-width:991.98px){:root{--bs-app-toolbar-height:auto}[data-kt-app-toolbar-sticky=on]{--bs-app-toolbar-height:70px}[data-kt-app-toolbar-minimize=on]{--bs-app-toolbar-height:70px}.app-toolbar{height:var(--bs-app-toolbar-height)}[data-kt-app-header-fixed-mobile=true][data-kt-app-toolbar-fixed-mobile=true] .app-toolbar{z-index:99;position:fixed;top:calc(var(--bs-app-header-height,0px) + var(--bs-app-header-mobile-height,0px));left:0;right:0}[data-kt-app-toolbar-sticky=on] .app-toolbar{position:fixed;left:0;right:0;top:var(--bs-app-header-height,0);box-shadow:var(--bs-app-toolbar-sticky-box-shadow);background-color:var(--bs-app-toolbar-sticky-bg-color);border-top:var(--bs-app-toolbar-sticky-border-top);border-bottom:var(--bs-app-toolbar-sticky-border-bottom);z-index:99}[data-kt-app-toolbar-minimize=on] .app-toolbar{transition:none;box-shadow:var(--bs-app-toolbar-minimize-box-shadow);background-color:var(--bs-app-toolbar-minimize-bg-color);border-top:var(--bs-app-toolbar-minimize-border-top);border-bottom:var(--bs-app-toolbar-minimize-border-bottom);z-index:99}}.app-hero{display:flex;align-items:stretch;background-color:var(--bs-app-hero-bg-color);box-shadow:var(--bs-app-hero-box-shadow);border-top:var(--bs-app-hero-border-top);border-bottom:var(--bs-app-hero-border-bottom)}.app-sidebar{transition:width .3s ease;background-color:var(--bs-app-sidebar-base-bg-color);box-shadow:var(--bs-app-sidebar-base-box-shadow);border-left:var(--bs-app-sidebar-base-border-start);border-right:var(--bs-app-sidebar-base-border-end)}.app-sidebar-collapse-d-flex,.app-sidebar-collapse-mobile-d-flex,.app-sidebar-minimize-d-flex,.app-sidebar-minimize-mobile-d-flex,.app-sidebar-sticky-d-flex{display:none}@media (min-width:992px){.app-sidebar{display:flex;flex-shrink:0;width:var(--bs-app-sidebar-width);margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}:root{--bs-app-sidebar-width:300px;--bs-app-sidebar-width-actual:300px;--bs-app-sidebar-gap-start:0px;--bs-app-sidebar-gap-end:0px;--bs-app-sidebar-gap-top:0px;--bs-app-sidebar-gap-bottom:0px}[data-kt-app-sidebar-stacked=true]{--bs-app-sidebar-width:calc(var(--bs-app-sidebar-primary-width) + var(--bs-app-sidebar-secondary-width, 0px))}[data-kt-app-sidebar-minimize=on]{--bs-app-sidebar-width:75px;--bs-app-sidebar-gap-start:0px;--bs-app-sidebar-gap-end:0px;--bs-app-sidebar-gap-top:0px;--bs-app-sidebar-gap-bottom:0px}[data-kt-app-sidebar-sticky=on]{--bs-app-sidebar-width:300px;--bs-app-sidebar-gap-start:0px;--bs-app-sidebar-gap-end:0px;--bs-app-sidebar-gap-top:0px;--bs-app-sidebar-gap-bottom:0px}[data-kt-app-sidebar-collapse=on]{--bs-app-sidebar-width:0px}[data-kt-app-sidebar-static=true] .app-sidebar{position:relative}[data-kt-app-sidebar-offcanvas=true] .app-sidebar{display:none}[data-kt-app-sidebar-fixed=true] .app-sidebar{position:fixed;z-index:105;top:0;bottom:0;left:0}[data-kt-app-sidebar-stacked=true] .app-sidebar{align-items:stretch}[data-kt-app-sidebar-sticky=on] .app-sidebar{position:fixed;transition:width .3s ease;top:auto;bottom:auto;left:auto;z-index:105;box-shadow:var(--bs-app-sidebar-sticky-box-shadow);border-left:var(--bs-app-sidebar-sticky-border-start);border-right:var(--bs-app-sidebar-sticky-border-end);margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}[data-kt-app-sidebar-minimize=on] .app-sidebar{transition:width .3s ease;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}[data-kt-app-sidebar-hoverable=true] .app-sidebar .app-sidebar-wrapper{width:var(--bs-app-sidebar-width-actual)}[data-kt-app-sidebar-hoverable=true][data-kt-app-sidebar-minimize=on] .app-sidebar:hover:not(.animating){transition:width .3s ease;width:var(--bs-app-sidebar-width-actual)}[data-kt-app-sidebar-collapse=on] .app-sidebar{transition:width .3s ease;width:var(--bs-app-sidebar-width-actual);margin-left:calc(-1 * var(--bs-app-sidebar-width-actual))}[data-kt-app-sidebar-minimize=on] .app-sidebar-minimize-d-none{display:none!important}[data-kt-app-sidebar-minimize=on] .app-sidebar-minimize-d-flex{display:flex!important}[data-kt-app-sidebar-sticky=on] .app-sidebar-sticky-d-none{display:none!important}[data-kt-app-sidebar-sticky=on] .app-sidebar-sticky-d-flex{display:flex!important}[data-kt-app-sidebar-collapse=on] .app-sidebar-collapse-d-none{display:none!important}[data-kt-app-sidebar-collapse=on] .app-sidebar-collapse-d-flex{display:flex!important}[data-kt-app-sidebar-fixed=true][data-kt-app-header-fixed=true]:not([data-kt-app-sidebar-push-header=true]) .app-sidebar{top:var(--bs-app-header-height)}[data-kt-app-sidebar-fixed=true][data-kt-app-header-fixed=true][data-kt-app-toolbar-fixed=true]:not([data-kt-app-sidebar-push-toolbar=true]) .app-sidebar{top:calc(var(--bs-app-header-height) + var(--bs-app-toolbar-height,0px))}}@media (max-width:991.98px){.app-sidebar{display:none;width:var(--bs-app-sidebar-width);z-index:106;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}:root{--bs-app-sidebar-width:275px;--bs-app-sidebar-width-actual:275px;--bs-app-sidebar-gap-start:0px;--bs-app-sidebar-gap-end:0px;--bs-app-sidebar-gap-top:0px;--bs-app-sidebar-gap-bottom:0px}[data-kt-app-sidebar-stacked=true]{--bs-app-sidebar-width:calc(var(--bs-app-sidebar-primary-width) + var(--bs-app-sidebar-secondary-width, 0))}[data-kt-app-sidebar-minimize-mobile=on]{--bs-app-sidebar-width:75px;--bs-app-sidebar-gap-start:0px;--bs-app-sidebar-gap-end:0px;--bs-app-sidebar-gap-top:0px;--bs-app-sidebar-gap-bottom:0px}[data-kt-app-sidebar-collapse-mobile=on]{--bs-app-sidebar-width:0px}[data-kt-app-sidebar-stacked=true] .app-sidebar{align-items:stretch}[data-kt-app-sidebar-minimize-mobile=on] .app-sidebar{transition:width .3s ease;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}[data-kt-app-sidebar-hoverable-mobile=true] .app-sidebar .app-sidebar-wrapper{width:var(--bs-app-sidebar-width-actual)}[data-kt-app-sidebar-hoverable-mobile=true][data-kt-app-sidebar-minimize-mobile=on] .app-sidebar:hover:not(.animating){transition:width .3s ease;width:var(--bs-app-sidebar-width-actual);box-shadow:var(--bs-app-sidebar-minimize-hover-box-shadow-mobile)}[data-kt-app-sidebar-collapse-mobile=on] .app-sidebar{transition:width .3s ease;width:var(--bs-app-sidebar-width-actual);margin-left:calc(-1 * var(--bs-app-sidebar-width-actual))}[data-kt-app-sidebar-minimize-mobile=on] .app-sidebar-minimize-mobile-d-none{display:none!important}[data-kt-app-sidebar-minimize-mobile=on] .app-sidebar-minimize-mobile-d-flex{display:flex!important}[data-kt-app-sidebar-collapse-mobile=on] .app-sidebar-collapse-mobile-d-none{display:none!important}[data-kt-app-sidebar-collapse-mobile=on] .app-sidebar-collapse-mobile-d-flex{display:flex!important}}.app-sidebar-primary{transition:none;position:relative;flex-shrink:0;background-color:var(--bs-app-sidebar-primary-base-bg-color);box-shadow:var(--bs-app-sidebar-primary-base-box-shadow);border-left:var(--bs-app-sidebar-primary-base-border-start);border-right:var(--bs-app-sidebar-primary-base-border-end)}.app-sidebar-primary-collapse-d-flex,.app-sidebar-primary-collapse-mobile-d-flex,.app-sidebar-primary-minimize-d-flex,.app-sidebar-primary-minimize-mobile-d-flex{display:none}@media (min-width:992px){.app-sidebar-primary{z-index:1;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}:root{--bs-app-sidebar-primary-width-actual:100px}[data-kt-app-sidebar-stacked=true]{--bs-app-sidebar-primary-width:100px;--bs-app-sidebar-primary-gap-start:0px;--bs-app-sidebar-primary-gap-end:0px;--bs-app-sidebar-primary-gap-top:0px;--bs-app-sidebar-primary-gap-bottom:0px}[data-kt-app-sidebar-primary-minimize=on]{--bs-app-sidebar-primary-width:75px;--bs-app-sidebar-primary-gap-start:0px;--bs-app-sidebar-primary-gap-end:0px;--bs-app-sidebar-primary-gap-top:0px;--bs-app-sidebar-primary-gap-bottom:0px}[data-kt-app-sidebar-primary-collapse=on]{--bs-app-sidebar-primary-width:0px}.app-sidebar-primary{width:var(--bs-app-sidebar-primary-width)}[data-kt-app-sidebar-primary-collapse=on] .app-sidebar-primary{transition:none;width:var(--bs-app-sidebar-primary-width-actual);margin-left:calc(-1 * var(--bs-app-sidebar-primary-width-actual))}[data-kt-app-sidebar-primary-minimize=on] .app-sidebar-primary{transition:none;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}[data-kt-app-sidebar-primary-hoverable=true] .app-sidebar-primary .app-sidebar-primary-hoverable{width:var(--bs-app-sidebar-primary-width-actual)}[data-kt-app-sidebar-primary-hoverable=true][data-kt-app-sidebar-primary-minimize=on] .app-sidebar-primary:hover:not(.animating){transition:none;width:var(--bs-app-sidebar-primary-width-actual);box-shadow:var(--bs-app-sidebar-primary-minimize-hover-box-shadow)}[data-kt-app-sidebar-fixed=true][data-kt-app-header-fixed=true][data-kt-app-sidebar-primary-below-header=true] .app-sidebar-primary{top:var(--bs-app-header-height)}[data-kt-app-sidebar-fixed=true][data-kt-app-header-fixed=true][data-kt-app-toolbar-fixed=true][data-kt-app-sidebar-primary-below-toolbar=true] .app-sidebar-primary{top:calc(var(--bs-app-header-height) + var(--bs-app-toolbar-height,0))}[data-kt-app-sidebar-primary-minimize=on] .app-sidebar-primary-minimize-d-none{display:none!important}[data-kt-app-sidebar-primary-minimize=on] .app-sidebar-primary-minimize-d-flex{display:flex!important}[data-kt-app-sidebar-primary-collapse=on] .app-sidebar-primary-collapse-d-none{display:none!important}[data-kt-app-sidebar-primary-collapse=on] .app-sidebar-primary-collapse-d-flex{display:flex!important}}@media (max-width:991.98px){.app-sidebar-primary{z-index:1;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}:root{--bs-app-sidebar-primary-width-actual:100px}[data-kt-app-sidebar-stacked=true]{--bs-app-sidebar-primary-width:100px;--bs-app-sidebar-primary-gap-start:0px;--bs-app-sidebar-primary-gap-end:0px;--bs-app-sidebar-primary-gap-top:0px;--bs-app-sidebar-primary-gap-bottom:0px}[data-kt-app-sidebar-primary-minimize-mobile=on]{--bs-app-sidebar-primary-width:75px;--bs-app-sidebar-primary-gap-start:0px;--bs-app-sidebar-primary-gap-end:0px;--bs-app-sidebar-primary-gap-top:0px;--bs-app-sidebar-primary-gap-bottom:0px}[data-kt-app-sidebar-primary-collapse-mobile=on]{--bs-app-sidebar-primary-width:0px}.app-sidebar-primary{width:var(--bs-app-sidebar-primary-width)}[data-kt-app-sidebar-primary-collapse-mobile=on] .app-sidebar-primary{transition:none;width:var(--bs-app-sidebar-primary-width-actual);margin-left:calc(-1 * var(--bs-app-sidebar-primary-width-actual))}[data-kt-app-sidebar-primary-minimize-mobile=on] .app-sidebar-primary{transition:none;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}[data-kt-app-sidebar-primary-hoverable-mobile=true] .app-sidebar-primary .app-sidebar-primary-hoverable{width:var(--bs-app-sidebar-primary-width-actual)}[data-kt-app-sidebar-primary-hoverable-mobile=true][data-kt-app-sidebar-primary-minimize-mobile=on] .app-sidebar-primary:hover:not(.animating){transition:none;width:var(--bs-app-sidebar-primary-width-actual);box-shadow:var(--bs-app-sidebar-primary-minimize-hover-box-shadow-mobile)}[data-kt-app-sidebar-primary-minimize-mobile=on] .app-sidebar-primary-minimize-mobile-d-none{display:none!important}[data-kt-app-sidebar-primary-minimize-mobile=on] .app-sidebar-primary-minimize-mobile-d-flex{display:flex!important}[data-kt-app-sidebar-primary-collapse-mobile=on] .app-sidebar-primary-collapse-mobile-d-none{display:none!important}[data-kt-app-sidebar-primary-collapse-mobile=on] .app-sidebar-primary-collapse-mobile-d-flex{display:flex!important}}.app-sidebar-secondary{transition:width .3s ease,margin .3s ease;position:relative;flex-shrink:0;background-color:var(--bs-app-sidebar-secondary-base-bg-color);box-shadow:var(--bs-app-sidebar-secondary-base-box-shadow);border-left:var(--bs-app-sidebar-secondary-base-border-start);border-right:var(--bs-app-sidebar-secondary-base-border-end)}.app-sidebar-secondary-collapse-d-flex,.app-sidebar-secondary-collapse-mobile-d-flex,.app-sidebar-secondary-minimize-d-flex,.app-sidebar-secondary-minimize-mobile-d-flex{display:none}@media (min-width:992px){.app-sidebar-secondary{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}[data-kt-app-sidebar-secondary-enabled=true]{--bs-app-sidebar-secondary-width-actual:calc( 300px - 100px - 0px - diff --git a/static/assets/js/scripts.bundle.js b/static/assets/js/scripts.bundle.js index 00abec69..804eab29 100644 --- a/static/assets/js/scripts.bundle.js +++ b/static/assets/js/scripts.bundle.js @@ -1,7 +1,7 @@ -var KTComponents={init:function(){KTApp.init(),KTDrawer.init(),KTMenu.init(),KTScroll.init(),KTSticky.init(),KTSwapper.init(),KTToggle.init(),KTScrolltop.init(),KTDialer.init(),KTImageInput.init(),KTPasswordMeter.init()}};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",(function(){KTComponents.init()})):KTComponents.init(),window.addEventListener("load",(function(){KTApp.hidePageLoading()})),"undefined"!=typeof module&&void 0!==module.exports&&(window.KTComponents=module.exports=KTComponents);var KTApp=function(){var e=!1,t=!1,n=function(e,t){if("1"!==e.getAttribute("data-kt-initialized")){var n={};e.hasAttribute("data-bs-delay-hide")&&(n.hide=e.getAttribute("data-bs-delay-hide")),e.hasAttribute("data-bs-delay-show")&&(n.show=e.getAttribute("data-bs-delay-show")),n&&(t.delay=n),e.hasAttribute("data-bs-dismiss")&&"click"==e.getAttribute("data-bs-dismiss")&&(t.dismiss="click");var i=new bootstrap.Tooltip(e,t);return t.dismiss&&"click"===t.dismiss&&e.addEventListener("click",(function(e){i.hide()})),e.setAttribute("data-kt-initialized","1"),i}},i=function(e,t){if("1"!==e.getAttribute("data-kt-initialized")){var n={};e.hasAttribute("data-bs-delay-hide")&&(n.hide=e.getAttribute("data-bs-delay-hide")),e.hasAttribute("data-bs-delay-show")&&(n.show=e.getAttribute("data-bs-delay-show")),n&&(t.delay=n),"true"==e.getAttribute("data-bs-dismiss")&&(t.dismiss=!0),!0===t.dismiss&&(t.template='');var i=new bootstrap.Popover(e,t);if(!0===t.dismiss){var r=function(e){i.hide()};e.addEventListener("shown.bs.popover",(function(){document.getElementById(e.getAttribute("aria-describedby")).addEventListener("click",r)})),e.addEventListener("hide.bs.popover",(function(){document.getElementById(e.getAttribute("aria-describedby")).removeEventListener("click",r)}))}return e.setAttribute("data-kt-initialized","1"),i}},r=function(){"undefined"!=typeof countUp&&[].slice.call(document.querySelectorAll('[data-kt-countup="true"]:not(.counted)')).map((function(e){if(KTUtil.isInViewport(e)&&KTUtil.visible(e)){if("1"===e.getAttribute("data-kt-initialized"))return;var t={},n=e.getAttribute("data-kt-countup-value");n=parseFloat(n.replace(/,/g,"")),e.hasAttribute("data-kt-countup-start-val")&&(t.startVal=parseFloat(e.getAttribute("data-kt-countup-start-val"))),e.hasAttribute("data-kt-countup-duration")&&(t.duration=parseInt(e.getAttribute("data-kt-countup-duration"))),e.hasAttribute("data-kt-countup-decimal-places")&&(t.decimalPlaces=parseInt(e.getAttribute("data-kt-countup-decimal-places"))),e.hasAttribute("data-kt-countup-prefix")&&(t.prefix=e.getAttribute("data-kt-countup-prefix")),e.hasAttribute("data-kt-countup-separator")&&(t.separator=e.getAttribute("data-kt-countup-separator")),e.hasAttribute("data-kt-countup-suffix")&&(t.suffix=e.getAttribute("data-kt-countup-suffix")),new countUp.CountUp(e,n,t).start(),e.classList.add("counted"),e.setAttribute("data-kt-initialized","1")}}))},o=function(e){if(!e)return;const t={};e.getAttributeNames().forEach((function(n){if(/^data-tns-.*/g.test(n)){let r=n.replace("data-tns-","").toLowerCase().replace(/(?:[\s-])\w/g,(function(e){return e.replace("-","").toUpperCase()}));if("data-tns-responsive"===n){const i=e.getAttribute(n).replace(/(\w+:)|(\w+ :)/g,(function(e){return'"'+e.substring(0,e.length-1)+'":'}));try{t[r]=JSON.parse(i)}catch(e){}}else t[r]="true"===(i=e.getAttribute(n))||"false"!==i&&i}var i}));const n=Object.assign({},{container:e,slideBy:"page",autoplay:!0,center:!0,autoplayButtonOutput:!1},t);return e.closest(".tns")&&KTUtil.addClass(e.closest(".tns"),"tns-initiazlied"),tns(n)};return{init:function(){var a;!function(){if("undefined"==typeof lozad)return;lozad().observe()}(),!0!==e&&"undefined"!=typeof SmoothScroll&&new SmoothScroll('a[data-kt-scroll-toggle][href*="#"]',{speed:1e3,speedAsDuration:!0,offset:function(e,t){return e.hasAttribute("data-kt-scroll-offset")?KTUtil.getResponsiveValue(e.getAttribute("data-kt-scroll-offset")):0}}),KTUtil.on(document.body,'[data-kt-card-action="remove"]',"click",(function(e){e.preventDefault();const t=this.closest(".card");if(!t)return;const n=this.getAttribute("data-kt-card-confirm-message");"true"===this.getAttribute("data-kt-card-confirm")?Swal.fire({text:n||"Are you sure to remove ?",icon:"warning",buttonsStyling:!1,confirmButtonText:"Confirm",denyButtonText:"Cancel",customClass:{confirmButton:"btn btn-primary",denyButton:"btn btn-danger"}}).then((function(e){e.isConfirmed&&t.remove()})):t.remove()})),(a=Array.prototype.slice.call(document.querySelectorAll("[data-bs-stacked-modal]")))&&a.length>0&&a.forEach((e=>{"1"!==e.getAttribute("data-kt-initialized")&&(e.setAttribute("data-kt-initialized","1"),e.addEventListener("click",(function(e){e.preventDefault();const t=document.querySelector(this.getAttribute("data-bs-stacked-modal"));t&&new bootstrap.Modal(t,{backdrop:!1}).show()})))})),!0!==e&&KTUtil.on(document.body,'[data-kt-check="true"]',"change",(function(e){var t=this,n=document.querySelectorAll(t.getAttribute("data-kt-check-target"));KTUtil.each(n,(function(e){"checkbox"==e.type?e.checked=t.checked:e.classList.toggle("active")}))})),!0!==e&&KTUtil.on(document.body,'.collapsible[data-bs-toggle="collapse"]',"click",(function(e){if(this.classList.contains("collapsed")?(this.classList.remove("active"),this.blur()):this.classList.add("active"),this.hasAttribute("data-kt-toggle-text")){var t=this.getAttribute("data-kt-toggle-text"),n=(n=this.querySelector('[data-kt-toggle-text-target="true"]'))||this;this.setAttribute("data-kt-toggle-text",n.innerText),n.innerText=t}})),!0!==e&&KTUtil.on(document.body,'[data-kt-rotate="true"]',"click",(function(e){this.classList.contains("active")?(this.classList.remove("active"),this.blur()):this.classList.add("active")})),[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(e){n(e,{})})),[].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]')).map((function(e){i(e,{})})),[].slice.call(document.querySelectorAll(".toast")).map((function(e){if("1"!==e.getAttribute("data-kt-initialized"))return e.setAttribute("data-kt-initialized","1"),new bootstrap.Toast(e,{})})),function(){if("undefined"!=typeof jQuery&&void 0!==$.fn.daterangepicker){var e=[].slice.call(document.querySelectorAll('[data-kt-daterangepicker="true"]')),t=moment().subtract(29,"days"),n=moment();e.map((function(e){if("1"!==e.getAttribute("data-kt-initialized")){var i=e.querySelector("div"),r=e.hasAttribute("data-kt-daterangepicker-opens")?e.getAttribute("data-kt-daterangepicker-opens"):"left",o=function(e,t){var n=moment();i&&(n.isSame(e,"day")&&n.isSame(t,"day")?i.innerHTML=e.format("D MMM YYYY"):i.innerHTML=e.format("D MMM YYYY")+" - "+t.format("D MMM YYYY"))};"today"===e.getAttribute("data-kt-daterangepicker-range")&&(t=moment(),n=moment()),$(e).daterangepicker({startDate:t,endDate:n,opens:r,ranges:{Today:[moment(),moment()],Yesterday:[moment().subtract(1,"days"),moment().subtract(1,"days")],"Last 7 Days":[moment().subtract(6,"days"),moment()],"Last 30 Days":[moment().subtract(29,"days"),moment()],"This Month":[moment().startOf("month"),moment().endOf("month")],"Last Month":[moment().subtract(1,"month").startOf("month"),moment().subtract(1,"month").endOf("month")]}},o),o(t,n),e.setAttribute("data-kt-initialized","1")}}))}}(),[].slice.call(document.querySelectorAll('[data-kt-buttons="true"]')).map((function(e){if("1"!==e.getAttribute("data-kt-initialized")){var t=e.hasAttribute("data-kt-buttons-target")?e.getAttribute("data-kt-buttons-target"):".btn",n=[].slice.call(e.querySelectorAll(t));KTUtil.on(e,t,"click",(function(e){n.map((function(e){e.classList.remove("active")})),this.classList.add("active")})),e.setAttribute("data-kt-initialized","1")}})),"undefined"!=typeof jQuery&&void 0!==$.fn.select2&&[].slice.call(document.querySelectorAll('[data-control="select2"], [data-kt-select2="true"]')).map((function(e){if("1"!==e.getAttribute("data-kt-initialized")){var t={dir:document.body.getAttribute("direction")};if("true"==e.getAttribute("data-hide-search")&&(t.minimumResultsForSearch=1/0),$(e).select2(t),e.hasAttribute("data-dropdown-parent")&&e.hasAttribute("multiple")){var n=document.querySelector(e.getAttribute("data-dropdown-parent"));if(n&&n.hasAttribute("data-kt-menu")){var i=KTMenu.getInstance(n);i||(i=new KTMenu(n)),i&&($(e).on("select2:unselect",(function(t){e.setAttribute("data-multiple-unselect","1")})),i.on("kt.menu.dropdown.hide",(function(t){if("1"===e.getAttribute("data-multiple-unselect"))return e.removeAttribute("data-multiple-unselect"),!1})))}}e.setAttribute("data-kt-initialized","1")}})),r(),"undefined"!=typeof countUp&&(!1===t&&(r(),window.addEventListener("scroll",r)),[].slice.call(document.querySelectorAll('[data-kt-countup-tabs="true"][data-bs-toggle="tab"]')).map((function(e){"1"!==e.getAttribute("data-kt-initialized")&&(e.addEventListener("shown.bs.tab",r),e.setAttribute("data-kt-initialized","1"))})),t=!0),"undefined"!=typeof autosize&&[].slice.call(document.querySelectorAll('[data-kt-autosize="true"]')).map((function(e){"1"!==e.getAttribute("data-kt-initialized")&&(autosize(e),e.setAttribute("data-kt-initialized","1"))})),function(){if("undefined"==typeof tns)return;const e=Array.prototype.slice.call(document.querySelectorAll('[data-tns="true"]'),0);(e||0!==e.length)&&e.forEach((function(e){"1"!==e.getAttribute("data-kt-initialized")&&(o(e),KTUtil.data(e).set("tns",tns),e.setAttribute("data-kt-initialized","1"))}))}(),e=!0},initTinySlider:function(e){o(e)},showPageLoading:function(){document.body.classList.add("page-loading"),document.body.setAttribute("data-kt-app-page-loading","on")},hidePageLoading:function(){document.body.classList.remove("page-loading"),document.body.removeAttribute("data-kt-app-page-loading")},createBootstrapPopover:function(e,t){return i(e,t)},createBootstrapTooltip:function(e,t){return n(e,t)}}}();"undefined"!=typeof module&&void 0!==module.exports&&(module.exports=KTApp);var KTBlockUI=function(e,t){var n=this;if(null!=e){var i={zIndex:!1,overlayClass:"",overflow:"hidden",message:''},r=function(){n.options=KTUtil.deepExtend({},i,t),n.element=e,n.overlayElement=null,n.blocked=!1,n.positionChanged=!1,n.overflowChanged=!1,KTUtil.data(n.element).set("blockui",n)};KTUtil.data(e).has("blockui")?n=KTUtil.data(e).get("blockui"):r(),n.block=function(){!function(){if(!1!==KTEventHandler.trigger(n.element,"kt.blockui.block",n)){var e="BODY"===n.element.tagName,t=KTUtil.css(n.element,"position"),i=KTUtil.css(n.element,"overflow"),r=e?1e4:1;n.options.zIndex>0?r=n.options.zIndex:"auto"!=KTUtil.css(n.element,"z-index")&&(r=KTUtil.css(n.element,"z-index")),n.element.classList.add("blockui"),"absolute"!==t&&"relative"!==t&&"fixed"!==t||(KTUtil.css(n.element,"position","relative"),n.positionChanged=!0),"hidden"===n.options.overflow&&"visible"===i&&(KTUtil.css(n.element,"overflow","hidden"),n.overflowChanged=!0),n.overlayElement=document.createElement("DIV"),n.overlayElement.setAttribute("class","blockui-overlay "+n.options.overlayClass),n.overlayElement.innerHTML=n.options.message,KTUtil.css(n.overlayElement,"z-index",r),n.element.append(n.overlayElement),n.blocked=!0,KTEventHandler.trigger(n.element,"kt.blockui.after.blocked",n)}}()},n.release=function(){!1!==KTEventHandler.trigger(n.element,"kt.blockui.release",n)&&(n.element.classList.add("blockui"),n.positionChanged&&KTUtil.css(n.element,"position",""),n.overflowChanged&&KTUtil.css(n.element,"overflow",""),n.overlayElement&&KTUtil.remove(n.overlayElement),n.blocked=!1,KTEventHandler.trigger(n.element,"kt.blockui.released",n))},n.isBlocked=function(){return n.blocked},n.destroy=function(){KTUtil.data(n.element).remove("blockui")},n.on=function(e,t){return KTEventHandler.on(n.element,e,t)},n.one=function(e,t){return KTEventHandler.one(n.element,e,t)},n.off=function(e,t){return KTEventHandler.off(n.element,e,t)},n.trigger=function(e,t){return KTEventHandler.trigger(n.element,e,t,n,t)}}};KTBlockUI.getInstance=function(e){return null!==e&&KTUtil.data(e).has("blockui")?KTUtil.data(e).get("blockui"):null},"undefined"!=typeof module&&void 0!==module.exports&&(module.exports=KTBlockUI);var KTCookie={get:function(e){var t=document.cookie.match(new RegExp("(?:^|; )"+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)"));return t?decodeURIComponent(t[1]):null},set:function(e,t,n){null==n&&(n={}),(n=Object.assign({},{path:"/"},n)).expires instanceof Date&&(n.expires=n.expires.toUTCString());var i=encodeURIComponent(e)+"="+encodeURIComponent(t);for(var r in n)if(!1!==n.hasOwnProperty(r)){i+="; "+r;var o=n[r];!0!==o&&(i+="="+o)}document.cookie=i},remove:function(e){this.set(e,"",{"max-age":-1})}};"undefined"!=typeof module&&void 0!==module.exports&&(module.exports=KTCookie);var KTDialer=function(e,t){var n=this;if(e){var i={min:null,max:null,step:1,currency:!1,decimals:0,prefix:"",suffix:""},r=function(){n.options=KTUtil.deepExtend({},i,t),n.element=e,n.incElement=n.element.querySelector('[data-kt-dialer-control="increase"]'),n.decElement=n.element.querySelector('[data-kt-dialer-control="decrease"]'),n.inputElement=n.element.querySelector("input[type]"),"true"===c("currency")&&(n.options.currency=!0),c("decimals")&&(n.options.decimals=parseInt(c("decimals"))),c("prefix")&&(n.options.prefix=c("prefix")),c("suffix")&&(n.options.suffix=c("suffix")),c("step")&&(n.options.step=parseFloat(c("step"))),c("min")&&(n.options.min=parseFloat(c("min"))),c("max")&&(n.options.max=parseFloat(c("max"))),n.value=parseFloat(n.inputElement.value.replace(/[^\d.]/g,"")),s(),o(),KTUtil.data(n.element).set("dialer",n)},o=function(){KTUtil.addEvent(n.incElement,"click",(function(e){e.preventDefault(),a()})),KTUtil.addEvent(n.decElement,"click",(function(e){e.preventDefault(),l()})),KTUtil.addEvent(n.inputElement,"input",(function(e){e.preventDefault(),s()}))},a=function(){return KTEventHandler.trigger(n.element,"kt.dialer.increase",n),n.inputElement.value=n.value+n.options.step,s(),KTEventHandler.trigger(n.element,"kt.dialer.increased",n),n},l=function(){return KTEventHandler.trigger(n.element,"kt.dialer.decrease",n),n.inputElement.value=n.value-n.options.step,s(),KTEventHandler.trigger(n.element,"kt.dialer.decreased",n),n},s=function(e){KTEventHandler.trigger(n.element,"kt.dialer.change",n),n.value=void 0!==e?e:u(n.inputElement.value),null!==n.options.min&&n.valuen.options.max&&(n.value=n.options.max),n.inputElement.value=d(n.value),n.inputElement.dispatchEvent(new Event("change")),KTEventHandler.trigger(n.element,"kt.dialer.changed",n)},u=function(e){return e=e.replace(/[^0-9.-]/g,"").replace(/(\..*)\./g,"$1").replace(/(?!^)-/g,"").replace(/^0+(\d)/gm,"$1"),e=parseFloat(e),isNaN(e)&&(e=0),e},d=function(e){return e=parseFloat(e).toFixed(n.options.decimals),n.options.currency&&(e=e.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")),n.options.prefix+e+n.options.suffix},c=function(e){return!0===n.element.hasAttribute("data-kt-dialer-"+e)?n.element.getAttribute("data-kt-dialer-"+e):null};!0===KTUtil.data(e).has("dialer")?n=KTUtil.data(e).get("dialer"):r(),n.setMinValue=function(e){n.options.min=e},n.setMaxValue=function(e){n.options.max=e},n.setValue=function(e){s(e)},n.getValue=function(){return n.inputElement.value},n.update=function(){s()},n.increase=function(){return a()},n.decrease=function(){return l()},n.getElement=function(){return n.element},n.destroy=function(){KTUtil.data(n.element).remove("dialer")},n.on=function(e,t){return KTEventHandler.on(n.element,e,t)},n.one=function(e,t){return KTEventHandler.one(n.element,e,t)},n.off=function(e,t){return KTEventHandler.off(n.element,e,t)},n.trigger=function(e,t){return KTEventHandler.trigger(n.element,e,t,n,t)}}};KTDialer.getInstance=function(e){return null!==e&&KTUtil.data(e).has("dialer")?KTUtil.data(e).get("dialer"):null},KTDialer.createInstances=function(e='[data-kt-dialer="true"]'){var t=document.querySelectorAll(e);if(t&&t.length>0)for(var n=0,i=t.length;n0&&KTUtil.on(document.body,e,"click",(function(e){e.preventDefault(),n.toggleElement=this,a()})),null!==t&&t.length>0&&KTUtil.on(document.body,t,"click",(function(e){e.preventDefault(),n.closeElement=this,l()}))},a=function(){!1!==KTEventHandler.trigger(n.element,"kt.drawer.toggle",n)&&(!0===n.shown?l():s(),KTEventHandler.trigger(n.element,"kt.drawer.toggled",n))},l=function(){!1!==KTEventHandler.trigger(n.element,"kt.drawer.hide",n)&&(n.shown=!1,c(),document.body.removeAttribute("data-kt-drawer-"+n.name,"on"),document.body.removeAttribute("data-kt-drawer"),KTUtil.removeClass(n.element,n.options.baseClass+"-on"),null!==n.toggleElement&&KTUtil.removeClass(n.toggleElement,"active"),KTEventHandler.trigger(n.element,"kt.drawer.after.hidden",n))},s=function(){!1!==KTEventHandler.trigger(n.element,"kt.drawer.show",n)&&(n.shown=!0,d(),document.body.setAttribute("data-kt-drawer-"+n.name,"on"),document.body.setAttribute("data-kt-drawer","on"),KTUtil.addClass(n.element,n.options.baseClass+"-on"),null!==n.toggleElement&&KTUtil.addClass(n.toggleElement,"active"),KTEventHandler.trigger(n.element,"kt.drawer.shown",n))},u=function(){var e=f(),t=p(),i=m("direction"),r=m("top"),o=m("bottom"),a=m("start"),s=m("end");!0===KTUtil.hasClass(n.element,n.options.baseClass+"-on")&&"on"===String(document.body.getAttribute("data-kt-drawer-"+n.name+"-"))?n.shown=!0:n.shown=!1,!0===m("activate")?(KTUtil.addClass(n.element,n.options.baseClass),KTUtil.addClass(n.element,n.options.baseClass+"-"+i),e&&(KTUtil.css(n.element,"width",e,!0),n.lastWidth=e),t&&(KTUtil.css(n.element,"height",t,!0),n.lastHeight=t),r&&KTUtil.css(n.element,"top",r),o&&KTUtil.css(n.element,"bottom",o),a&&(KTUtil.isRTL()?KTUtil.css(n.element,"right",a):KTUtil.css(n.element,"left",a)),s&&(KTUtil.isRTL()?KTUtil.css(n.element,"left",s):KTUtil.css(n.element,"right",s))):(KTUtil.removeClass(n.element,n.options.baseClass),KTUtil.removeClass(n.element,n.options.baseClass+"-"+i),KTUtil.css(n.element,"width",""),KTUtil.css(n.element,"height",""),r&&KTUtil.css(n.element,"top",""),o&&KTUtil.css(n.element,"bottom",""),a&&(KTUtil.isRTL()?KTUtil.css(n.element,"right",""):KTUtil.css(n.element,"left","")),s&&(KTUtil.isRTL()?KTUtil.css(n.element,"left",""):KTUtil.css(n.element,"right","")),l())},d=function(){!0===m("overlay")&&(n.overlayElement=document.createElement("DIV"),KTUtil.css(n.overlayElement,"z-index",KTUtil.css(n.element,"z-index")-1),document.body.append(n.overlayElement),KTUtil.addClass(n.overlayElement,m("overlay-class")),KTUtil.addEvent(n.overlayElement,"click",(function(e){e.preventDefault(),!0!==m("permanent")&&l()})))},c=function(){null!==n.overlayElement&&KTUtil.remove(n.overlayElement)},m=function(e){if(!0===n.element.hasAttribute("data-kt-drawer-"+e)){var t=n.element.getAttribute("data-kt-drawer-"+e),i=KTUtil.getResponsiveValue(t);return null!==i&&"true"===String(i)?i=!0:null!==i&&"false"===String(i)&&(i=!1),i}var r=KTUtil.snakeToCamel(e);return n.options[r]?KTUtil.getResponsiveValue(n.options[r]):null},f=function(){var e=m("width");return"auto"===e&&(e=KTUtil.css(n.element,"width")),e},p=function(){var e=m("height");return"auto"===e&&(e=KTUtil.css(n.element,"height")),e};KTUtil.data(e).has("drawer")?n=KTUtil.data(e).get("drawer"):r(),n.toggle=function(){return a()},n.show=function(){return s()},n.hide=function(){return l()},n.isShown=function(){return n.shown},n.update=function(){u()},n.goElement=function(){return n.element},n.destroy=function(){KTUtil.data(n.element).remove("drawer")},n.on=function(e,t){return KTEventHandler.on(n.element,e,t)},n.one=function(e,t){return KTEventHandler.one(n.element,e,t)},n.off=function(e,t){return KTEventHandler.off(n.element,e,t)},n.trigger=function(e,t){return KTEventHandler.trigger(n.element,e,t,n,t)}}};KTDrawer.getInstance=function(e){return null!==e&&KTUtil.data(e).has("drawer")?KTUtil.data(e).get("drawer"):null},KTDrawer.hideAll=function(e=null,t='[data-kt-drawer="true"]'){var n=document.querySelectorAll(t);if(n&&n.length>0)for(var i=0,r=n.length;i0)for(var n=0,i=t.length;n0)for(var n=0,i=t.length;n{if("Escape"===e.key){if(!(e.ctrlKey||e.altKey||e.shiftKey)){var t,n=document.querySelectorAll('.drawer-on[data-kt-drawer="true"]:not([data-kt-drawer-escape="false"])');if(n&&n.length>0)for(var i=0,r=n.length;i0)for(var t=0,n=e.length;t0)for(var n=0,i=t.length;n0)for(var t=0,i=e.length;t0?"dropdown":"accordion"},T=function(e){var t,n;return c(e)||e.hasAttribute("data-kt-menu-trigger")?e:KTUtil.data(e).has("item")?KTUtil.data(e).get("item"):(t=e.closest(".menu-item"))?t:(n=e.closest(".menu-sub"))&&!0===KTUtil.data(n).has("item")?KTUtil.data(n).get("item"):void 0},h=function(e){var t,n=e.closest(".menu-sub");return n&&KTUtil.data(n).has("item")?KTUtil.data(n).get("item"):n&&(t=n.closest(".menu-item[data-kt-menu-trigger]"))?t:null},K=function(e){var t,i=[],r=0;do{(t=h(e))&&(i.push(t),e=t),r++}while(null!==t&&r<20);return n.triggerElement&&i.unshift(n.triggerElement),i},b=function(e){var t=e;return KTUtil.data(e).get("sub")&&(t=KTUtil.data(e).get("sub")),null!==t&&t.querySelector(".menu-item[data-kt-menu-trigger]")||null},k=function(e){var t,n=[],i=0;do{(t=b(e))&&(n.push(t),e=t),i++}while(null!==t&&i<20);return n},y=function(e){if(!1!==KTEventHandler.trigger(n.element,"kt.menu.dropdown.show",e)){KTMenu.hideDropdowns(e);c(e)||p(e);var t=g(e),i=L(e,"width"),r=L(e,"height"),o=n.options.dropdown.zindex,a=KTUtil.getHighestZindex(e);null!==a&&a>=o&&(o=a+1),o>0&&KTUtil.css(t,"z-index",o),null!==i&&KTUtil.css(t,"width",i),null!==r&&KTUtil.css(t,"height",r),KTUtil.css(t,"display",""),KTUtil.css(t,"overflow",""),U(e,t),KTUtil.addClass(e,"show"),KTUtil.addClass(e,"menu-dropdown"),KTUtil.addClass(t,"show"),!0===L(e,"overflow")?(document.body.appendChild(t),KTUtil.data(e).set("sub",t),KTUtil.data(t).set("item",e),KTUtil.data(t).set("menu",n)):KTUtil.data(t).set("item",e),KTEventHandler.trigger(n.element,"kt.menu.dropdown.shown",e)}},w=function(e){if(!1!==KTEventHandler.trigger(n.element,"kt.menu.dropdown.hide",e)){var t=g(e);KTUtil.css(t,"z-index",""),KTUtil.css(t,"width",""),KTUtil.css(t,"height",""),KTUtil.removeClass(e,"show"),KTUtil.removeClass(e,"menu-dropdown"),KTUtil.removeClass(t,"show"),!0===L(e,"overflow")&&(e.classList.contains("menu-item")?e.appendChild(t):KTUtil.insertAfter(n.element,e),KTUtil.data(e).remove("sub"),KTUtil.data(t).remove("item"),KTUtil.data(t).remove("menu")),E(e),KTEventHandler.trigger(n.element,"kt.menu.dropdown.hidden",e)}},U=function(e,t){var n,i=L(e,"attach");n=i?"parent"===i?e.parentNode:document.querySelector(i):e;var r=Popper.createPopper(n,t,S(e));KTUtil.data(e).set("popper",r)},E=function(e){!0===KTUtil.data(e).has("popper")&&(KTUtil.data(e).get("popper").destroy(),KTUtil.data(e).remove("popper"))},S=function(e){var t=L(e,"placement");t||(t="right");var n=L(e,"offset"),i=n?n.split(","):[];return 2===i.length&&(i[0]=parseInt(i[0]),i[1]=parseInt(i[1])),{placement:t,strategy:!0===L(e,"overflow")?"absolute":"fixed",modifiers:[{name:"offset",options:{offset:i}},{name:"preventOverflow",options:{altAxis:!1!==L(e,"flip")}},{name:"flip",options:{flipVariations:!1}}]}},A=function(e){if(!1!==KTEventHandler.trigger(n.element,"kt.menu.accordion.show",e)){var t=g(e),i=n.options.accordion.expand;!0===L(e,"expand")?i=!0:!1===L(e,"expand")?i=!1:!0===L(n.element,"expand")&&(i=!0),!1===i&&I(e),!0===KTUtil.data(e).has("popper")&&w(e),KTUtil.addClass(e,"hover"),KTUtil.addClass(e,"showing"),KTUtil.slideDown(t,n.options.accordion.slideSpeed,(function(){KTUtil.removeClass(e,"showing"),KTUtil.addClass(e,"show"),KTUtil.addClass(t,"show"),KTEventHandler.trigger(n.element,"kt.menu.accordion.shown",e)}))}},x=function(e){if(!1!==KTEventHandler.trigger(n.element,"kt.menu.accordion.hide",e)){var t=g(e);KTUtil.addClass(e,"hiding"),KTUtil.slideUp(t,n.options.accordion.slideSpeed,(function(){KTUtil.removeClass(e,"hiding"),KTUtil.removeClass(e,"show"),KTUtil.removeClass(t,"show"),KTUtil.removeClass(e,"hover"),KTEventHandler.trigger(n.element,"kt.menu.accordion.hidden",e)}))}},I=function(e){var t,i=KTUtil.findAll(n.element,".show[data-kt-menu-trigger]");if(i&&i.length>0)for(var r=0,o=i.length;r0))for(var r=0,o=i.length;r0)for(var l=0,s=i.length;l0}(e)},n.getTriggerElement=function(){return n.triggerElement},n.isItemDropdownPermanent=function(e){return function(e){return!0===L(e,"permanent")}(e)},n.destroy=function(){KTUtil.data(n.element).remove("menu")},n.disable=function(){n.disabled=!0},n.enable=function(){n.disabled=!1},n.hideAccordions=function(e){return I(e)},n.on=function(e,t){return KTEventHandler.on(n.element,e,t)},n.one=function(e,t){return KTEventHandler.one(n.element,e,t)},n.off=function(e,t){return KTEventHandler.off(n.element,e,t)}}};KTMenu.getInstance=function(e){var t;if(!e)return null;if(KTUtil.data(e).has("menu"))return KTUtil.data(e).get("menu");if((t=e.closest(".menu"))&&KTUtil.data(t).has("menu"))return KTUtil.data(t).get("menu");if(KTUtil.hasClass(e,"menu-link")){var n=e.closest(".menu-sub");if(KTUtil.data(n).has("menu"))return KTUtil.data(n).get("menu")}return null},KTMenu.hideDropdowns=function(e){var t=document.querySelectorAll(".show.menu-dropdown[data-kt-menu-trigger]");if(t&&t.length>0)for(var n=0,i=t.length;n0)for(var t=0,n=e.length;t0)for(var o=0,a=r.length;o .menu-link, [data-kt-menu-trigger]:not(.menu-item):not([data-kt-menu-trigger="auto"])',"click",(function(e){var t=KTMenu.getInstance(this);if(null!==t)return t.click(this,e)})),KTUtil.on(document.body,".menu-item:not([data-kt-menu-trigger]) > .menu-link","click",(function(e){var t=KTMenu.getInstance(this);if(null!==t)return t.link(this,e)})),KTUtil.on(document.body,'[data-kt-menu-dismiss="true"]',"click",(function(e){var t=KTMenu.getInstance(this);if(null!==t)return t.dismiss(this,e)})),KTUtil.on(document.body,"[data-kt-menu-trigger], .menu-sub","mouseover",(function(e){var t=KTMenu.getInstance(this);if(null!==t&&"dropdown"===t.getItemSubType(this))return t.mouseover(this,e)})),KTUtil.on(document.body,"[data-kt-menu-trigger], .menu-sub","mouseout",(function(e){var t=KTMenu.getInstance(this);if(null!==t&&"dropdown"===t.getItemSubType(this))return t.mouseout(this,e)})),window.addEventListener("resize",(function(){var e;KTUtil.throttle(undefined,(function(){var t=document.querySelectorAll('[data-kt-menu="true"]');if(t&&t.length>0)for(var n=0,i=t.length;n0)for(var i=0,r=n.length;i0)for(var n=0,i=t.length;n=n.options.minLength},s=function(){return/[a-z]/.test(n.inputElement.value)},u=function(){return/[A-Z]/.test(n.inputElement.value)},d=function(){return/[0-9]/.test(n.inputElement.value)},c=function(){return/[~`!#@$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g.test(n.inputElement.value)},m=function(){var e=1;return!0===n.options.checkUppercase&&e++,!0===n.options.checkLowercase&&e++,!0===n.options.checkDigit&&e++,!0===n.options.checkChar&&e++,n.checkSteps=e,100/n.checkSteps},f=function(){var e=[].slice.call(n.highlightElement.querySelectorAll("div")),t=e.length,i=0,r=m(),o=g();e.map((function(e){i++,r*i*(n.checkSteps/t)<=o?e.classList.add("active"):e.classList.remove("active")}))},p=function(){var e=n.visibilityElement.querySelector(":scope > i:not(.d-none)"),t=n.visibilityElement.querySelector(":scope > i.d-none");"password"===n.inputElement.getAttribute("type").toLowerCase()?n.inputElement.setAttribute("type","text"):n.inputElement.setAttribute("type","password"),e.classList.add("d-none"),t.classList.remove("d-none"),n.inputElement.focus()},g=function(){return n.score};!0===KTUtil.data(e).has("password-meter")?n=KTUtil.data(e).get("password-meter"):r(),n.check=function(){return a()},n.getScore=function(){return g()},n.reset=function(){return n.score=0,void f()},n.destroy=function(){KTUtil.data(n.element).remove("password-meter")}}};KTPasswordMeter.getInstance=function(e){return null!==e&&KTUtil.data(e).has("password-meter")?KTUtil.data(e).get("password-meter"):null},KTPasswordMeter.createInstances=function(e="[data-kt-password-meter]"){var t=document.body.querySelectorAll(e);if(t&&t.length>0)for(var n=0,i=t.length;n0?KTUtil.css(n.element,e,t):KTUtil.css(n.element,e,""),s(),!0===f("save-state")&&n.id?n.element.addEventListener("scroll",a):n.element.removeEventListener("scroll",a),function(){var e=o();if(!0===f("save-state")&&n.id&&localStorage.getItem(e+n.id+"st")){var t=parseInt(localStorage.getItem(e+n.id+"st"));t>0&&n.element.scroll({top:t,behavior:"instant"})}}()):(KTUtil.css(n.element,p(),""),n.element.removeEventListener("scroll",a))},s=function(){var e=f("stretch");if(null!==e){var t=document.querySelectorAll(e);if(t&&2==t.length){var i=t[0],r=t[1],o=c(r)-c(i);if(o>0){var a=parseInt(KTUtil.css(n.element,p()))+o;KTUtil.css(n.element,p(),String(a)+"px")}}}},u=function(){var e=f(p());return e instanceof Function?e.call():null!==e&&"string"==typeof e&&"auto"===e.toLowerCase()?d():e},d=function(){var e,t=KTUtil.getViewPort().height,i=f("dependencies"),r=f("wrappers"),o=f("offset");if((t-=m(n.element),null!==i)&&((e=document.querySelectorAll(i))&&e.length>0))for(var a=0,l=e.length;a0))for(a=0,l=e.length;a0)for(var n=0,i=t.length;n0)for(var t=0,n=e.length;te?!1===document.body.hasAttribute("data-kt-scrolltop")&&document.body.setAttribute("data-kt-scrolltop","on"):!0===document.body.hasAttribute("data-kt-scrolltop")&&document.body.removeAttribute("data-kt-scrolltop")},l=function(){parseInt(s("speed"));window.scrollTo({top:0,behavior:"smooth"})},s=function(e){if(!0===n.element.hasAttribute("data-kt-scrolltop-"+e)){var t=n.element.getAttribute("data-kt-scrolltop-"+e),i=KTUtil.getResponsiveValue(t);return null!==i&&"true"===String(i)?i=!0:null!==i&&"false"===String(i)&&(i=!1),i}var r=KTUtil.snakeToCamel(e);return n.options[r]?KTUtil.getResponsiveValue(n.options[r]):null};KTUtil.data(e).has("scrolltop")?n=KTUtil.data(e).get("scrolltop"):r(),n.go=function(){return l()},n.getElement=function(){return n.element},n.destroy=function(){KTUtil.data(n.element).remove("scrolltop")}}};KTScrolltop.getInstance=function(e){return e&&KTUtil.data(e).has("scrolltop")?KTUtil.data(e).get("scrolltop"):null},KTScrolltop.createInstances=function(e='[data-kt-scrolltop="true"]'){var t=document.body.querySelectorAll(e);if(t&&t.length>0)for(var n=0,i=t.length;n=n.minLength)&&f()},l=function(){n.element.classList.remove("focus")},s=function(e){13==(e.charCode||e.keyCode||0)&&(e.preventDefault(),d())},u=function(){g("min-length")&&(n.inputElement.value.length>=n.minLength?d():0===n.inputElement.value.length&&c())},d=function(){!1===n.processing&&(n.spinnerElement&&n.spinnerElement.classList.remove("d-none"),n.clearElement&&n.clearElement.classList.add("d-none"),n.toolbarElement&&n.formElement.contains(n.toolbarElement)&&n.toolbarElement.classList.add("d-none"),n.inputElement.focus(),n.processing=!0,KTEventHandler.trigger(n.element,"kt.search.process",n))},c=function(){!1!==KTEventHandler.trigger(n.element,"kt.search.clear",n)&&(n.inputElement.value="",n.inputElement.focus(),n.clearElement&&n.clearElement.classList.add("d-none"),n.toolbarElement&&n.formElement.contains(n.toolbarElement)&&n.toolbarElement.classList.remove("d-none"),!1===g("show-on-focus")&&p(),KTEventHandler.trigger(n.element,"kt.search.cleared",n))},m=function(){if("menu"===n.layout){var e=T();"on"===e&&!1===n.contentElement.contains(n.formElement)?(n.contentElement.prepend(n.formElement),n.formElement.classList.remove("d-none")):"off"===e&&!0===n.contentElement.contains(n.formElement)&&(n.element.prepend(n.formElement),n.formElement.classList.add("d-none"))}},f=function(){n.menuObject&&(m(),n.menuObject.show(n.element))},p=function(){n.menuObject&&(m(),n.menuObject.hide(n.element))},g=function(e){if(!0===n.element.hasAttribute("data-kt-search-"+e)){var t=n.element.getAttribute("data-kt-search-"+e),i=KTUtil.getResponsiveValue(t);return null!==i&&"true"===String(i)?i=!0:null!==i&&"false"===String(i)&&(i=!1),i}var r=KTUtil.snakeToCamel(e);return n.options[r]?KTUtil.getResponsiveValue(n.options[r]):null},v=function(e){return n.element.querySelector('[data-kt-search-element="'+e+'"]')},T=function(){var e=g("responsive"),t=KTUtil.getViewPort().width;if(!e)return null;var n=KTUtil.getBreakpoint(e);return n||(n=parseInt(e)),t1&&o(n.options.startIndex),n.nextListener=function(e){e.preventDefault(),KTEventHandler.trigger(n.element,"kt.stepper.next",n)},n.previousListener=function(e){e.preventDefault(),KTEventHandler.trigger(n.element,"kt.stepper.previous",n)},n.stepListener=function(e){if(e.preventDefault(),n.steps&&n.steps.length>0)for(var t=0,i=n.steps.length;tn.totalStepsNumber||e<0))return e=parseInt(e),n.passedStepIndex=n.currentStepIndex,n.currentStepIndex=e,a(),KTEventHandler.trigger(n.element,"kt.stepper.changed",n),n},a=function(){var e="";e=l()?"last":s()?"first":"between",KTUtil.removeClass(n.element,"last"),KTUtil.removeClass(n.element,"first"),KTUtil.removeClass(n.element,"between"),KTUtil.addClass(n.element,e);var t=KTUtil.findAll(n.element,'[data-kt-stepper-element="nav"], [data-kt-stepper-element="content"], [data-kt-stepper-element="info"]');if(t&&t.length>0)for(var i=0,r=t.length;i=n.currentStepIndex+1?n.currentStepIndex+1:n.totalStepsNumber},d=function(){return n.currentStepIndex-1>1?n.currentStepIndex-1:1},c=function(){return 1},m=function(){return n.totalStepsNumber},f=function(e){return e>n.currentStepIndex?"next":"previous"};!0===KTUtil.data(e).has("stepper")?n=KTUtil.data(e).get("stepper"):r(),n.getElement=function(e){return n.element},n.goTo=function(e){return o(e)},n.goPrevious=function(){return o(d())},n.goNext=function(){return o(u())},n.goFirst=function(){return o(c())},n.goLast=function(){return o(m())},n.getCurrentStepIndex=function(){return n.currentStepIndex},n.getNextStepIndex=function(){return u()},n.getPassedStepIndex=function(){return n.passedStepIndex},n.getClickedStepIndex=function(){return n.clickedStepIndex},n.getPreviousStepIndex=function(){return d()},n.destroy=function(){return KTUtil.removeEvent(n.btnNext,"click",n.nextListener),KTUtil.removeEvent(n.btnPrevious,"click",n.previousListener),KTUtil.off(n.element,"click",n.stepListenerId),void KTUtil.data(n.element).remove("stepper")},n.on=function(e,t){return KTEventHandler.on(n.element,e,t)},n.one=function(e,t){return KTEventHandler.one(n.element,e,t)},n.off=function(e,t){return KTEventHandler.off(n.element,e,t)},n.trigger=function(e,t){return KTEventHandler.trigger(n.element,e,t,n,t)}}};KTStepper.getInstance=function(e){return null!==e&&KTUtil.data(e).has("stepper")?KTUtil.data(e).get("stepper"):null},"undefined"!=typeof module&&void 0!==module.exports&&(module.exports=KTStepper);var KTStickyHandlersInitialized=!1,KTSticky=function(e,t){var n=this;if(null!=e){var i={offset:200,reverse:!1,release:null,animation:!0,animationSpeed:"0.3s",animationClass:"animation-slide-in-down"},r=function(){n.element=e,n.options=KTUtil.deepExtend({},i,t),n.uid=KTUtil.getUniqueId("sticky"),n.name=n.element.getAttribute("data-kt-sticky-name"),n.attributeName="data-kt-sticky-"+n.name,n.attributeName2="data-kt-"+n.name,n.eventTriggerState=!0,n.lastScrollTop=0,n.scrollHandler,n.element.setAttribute("data-kt-sticky","true"),window.addEventListener("scroll",o),o(),KTUtil.data(n.element).set("sticky",n)},o=function(e){var t,i=u("offset"),r=u("release"),o=u("reverse");if(!1!==i){i=parseInt(i),r=r?document.querySelector(r):null,t=KTUtil.getScrollTop(),document.documentElement.scrollHeight-window.innerHeight-KTUtil.getScrollTop();var s=!r||r.offsetTop-r.clientHeight>t;if(!0===o){if(t>i&&s){if(!1===document.body.hasAttribute(n.attributeName)){if(!1===a())return;document.body.setAttribute(n.attributeName,"on"),document.body.setAttribute(n.attributeName2,"on"),n.element.setAttribute("data-kt-sticky-enabled","true")}!0===n.eventTriggerState&&(KTEventHandler.trigger(n.element,"kt.sticky.on",n),KTEventHandler.trigger(n.element,"kt.sticky.change",n),n.eventTriggerState=!1)}else!0===document.body.hasAttribute(n.attributeName)&&(l(),document.body.removeAttribute(n.attributeName),document.body.removeAttribute(n.attributeName2),n.element.removeAttribute("data-kt-sticky-enabled")),!1===n.eventTriggerState&&(KTEventHandler.trigger(n.element,"kt.sticky.off",n),KTEventHandler.trigger(n.element,"kt.sticky.change",n),n.eventTriggerState=!0);n.lastScrollTop=t}else if(t>i&&s){if(!1===document.body.hasAttribute(n.attributeName)){if(!1===a())return;document.body.setAttribute(n.attributeName,"on"),document.body.setAttribute(n.attributeName2,"on"),n.element.setAttribute("data-kt-sticky-enabled","true")}!0===n.eventTriggerState&&(KTEventHandler.trigger(n.element,"kt.sticky.on",n),KTEventHandler.trigger(n.element,"kt.sticky.change",n),n.eventTriggerState=!1)}else!0===document.body.hasAttribute(n.attributeName)&&(l(),document.body.removeAttribute(n.attributeName),document.body.removeAttribute(n.attributeName2),n.element.removeAttribute("data-kt-sticky-enabled")),!1===n.eventTriggerState&&(KTEventHandler.trigger(n.element,"kt.sticky.off",n),KTEventHandler.trigger(n.element,"kt.sticky.change",n),n.eventTriggerState=!0);r&&(r.offsetTop-r.clientHeight>t?n.element.setAttribute("data-kt-sticky-released","true"):n.element.removeAttribute("data-kt-sticky-released"))}else l()},a=function(e){var t=u("top");t=t?parseInt(t):0;var i=u("left"),r=u("right"),o=u("width"),a=u("zindex"),l=u("dependencies"),d=u("class"),c=s(),m=u("height-offset");if(c+(m=m?parseInt(m):0)+t>KTUtil.getViewPort().height)return!1;if(!0!==e&&!0===u("animation")&&(KTUtil.css(n.element,"animationDuration",u("animationSpeed")),KTUtil.animateClass(n.element,"animation "+u("animationClass"))),null!==d&&KTUtil.addClass(n.element,d),null!==a&&(KTUtil.css(n.element,"z-index",a),KTUtil.css(n.element,"position","fixed")),t>=0&&KTUtil.css(n.element,"top",String(t)+"px"),null!==o){if(o.target){var f=document.querySelector(o.target);f&&(o=KTUtil.css(f,"width"))}KTUtil.css(n.element,"width",o)}if(null!==i)if("auto"===String(i).toLowerCase()){var p=KTUtil.offset(n.element).left;p>=0&&KTUtil.css(n.element,"left",String(p)+"px")}else KTUtil.css(n.element,"left",i);if(null!==r&&KTUtil.css(n.element,"right",r),null!==l){var g=document.querySelectorAll(l);if(g&&g.length>0)for(var v=0,T=g.length;v0)for(var r=0,o=i.length;r0)for(var n=0,i=t.length;n0)for(var t=0,n=e.length;t0)for(var n=0,i=t.length;n0)for(var t=0,n=e.length;t0&&n.element.classList.add(n.state),void 0!==KTCookie&&!0===n.options.saveState&&KTCookie.set(n.attribute,"on"),KTEventHandler.trigger(n.element,"kt.toggle.enabled",n),n},s=function(){if(!1!==u())return KTEventHandler.trigger(n.element,"kt.toggle.disable",n),n.target.removeAttribute(n.attribute),n.state.length>0&&n.element.classList.remove(n.state),void 0!==KTCookie&&!0===n.options.saveState&&KTCookie.remove(n.attribute),KTEventHandler.trigger(n.element,"kt.toggle.disabled",n),n},u=function(){return"on"===String(n.target.getAttribute(n.attribute)).toLowerCase()};!0===KTUtil.data(e).has("toggle")?n=KTUtil.data(e).get("toggle"):r(),n.toggle=function(){return a()},n.enable=function(){return l()},n.disable=function(){return s()},n.isEnabled=function(){return u()},n.goElement=function(){return n.element},n.destroy=function(){KTUtil.data(n.element).remove("toggle")},n.on=function(e,t){return KTEventHandler.on(n.element,e,t)},n.one=function(e,t){return KTEventHandler.one(n.element,e,t)},n.off=function(e,t){return KTEventHandler.off(n.element,e,t)},n.trigger=function(e,t){return KTEventHandler.trigger(n.element,e,t,n,t)}}};KTToggle.getInstance=function(e){return null!==e&&KTUtil.data(e).has("toggle")?KTUtil.data(e).get("toggle"):null},KTToggle.createInstances=function(e="[data-kt-toggle]"){var t=document.body.querySelectorAll(e);if(t&&t.length>0)for(var n=0,i=t.length;n=0&&t.item(n)!==this;);return n>-1}),Element.prototype.closest||(Element.prototype.closest=function(e){var t=this;if(!document.documentElement.contains(this))return null;do{if(t.matches(e))return t;t=t.parentElement}while(null!==t);return null}) +var KTComponents={init:function(){KTApp.init(),KTDrawer.init(),KTMenu.init(),KTScroll.init(),KTSticky.init(),KTSwapper.init(),KTToggle.init(),KTScrolltop.init(),KTDialer.init(),KTImageInput.init(),KTPasswordMeter.init()}};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",function(){KTComponents.init()}):KTComponents.init(),window.addEventListener("load",function(){KTApp.hidePageLoading()}),"undefined"!=typeof module&&void 0!==module.exports&&(window.KTComponents=module.exports=KTComponents);var KTApp=function(){var e=!1,t=!1,n=function(e,t){if("1"!==e.getAttribute("data-kt-initialized")){var n={};e.hasAttribute("data-bs-delay-hide")&&(n.hide=e.getAttribute("data-bs-delay-hide")),e.hasAttribute("data-bs-delay-show")&&(n.show=e.getAttribute("data-bs-delay-show")),n&&(t.delay=n),e.hasAttribute("data-bs-dismiss")&&"click"==e.getAttribute("data-bs-dismiss")&&(t.dismiss="click");var i=new bootstrap.Tooltip(e,t);return t.dismiss&&"click"===t.dismiss&&e.addEventListener("click",function(t){e.blur(),i.hide()}),e.setAttribute("data-kt-initialized","1"),i}},i=function(e,t){if("1"!==e.getAttribute("data-kt-initialized")){var n={};e.hasAttribute("data-bs-delay-hide")&&(n.hide=e.getAttribute("data-bs-delay-hide")),e.hasAttribute("data-bs-delay-show")&&(n.show=e.getAttribute("data-bs-delay-show")),n&&(t.delay=n),"true"==e.getAttribute("data-bs-dismiss")&&(t.dismiss=!0),!0===t.dismiss&&(t.template='');var i=new bootstrap.Popover(e,t);if(!0===t.dismiss){var r=function(e){i.hide()};e.addEventListener("shown.bs.popover",function(){document.getElementById(e.getAttribute("aria-describedby")).addEventListener("click",r)}),e.addEventListener("hide.bs.popover",function(){document.getElementById(e.getAttribute("aria-describedby")).removeEventListener("click",r)})}return e.setAttribute("data-kt-initialized","1"),i}},r=function(){"undefined"!=typeof countUp&&[].slice.call(document.querySelectorAll('[data-kt-countup="true"]:not(.counted)')).map(function(e){if(KTUtil.isInViewport(e)&&KTUtil.visible(e)){if("1"===e.getAttribute("data-kt-initialized"))return;var t={},n=e.getAttribute("data-kt-countup-value");n=parseFloat(n.replace(/,/g,"")),e.hasAttribute("data-kt-countup-start-val")&&(t.startVal=parseFloat(e.getAttribute("data-kt-countup-start-val"))),e.hasAttribute("data-kt-countup-duration")&&(t.duration=parseInt(e.getAttribute("data-kt-countup-duration"))),e.hasAttribute("data-kt-countup-decimal-places")&&(t.decimalPlaces=parseInt(e.getAttribute("data-kt-countup-decimal-places"))),e.hasAttribute("data-kt-countup-prefix")&&(t.prefix=e.getAttribute("data-kt-countup-prefix")),e.hasAttribute("data-kt-countup-separator")&&(t.separator=e.getAttribute("data-kt-countup-separator")),e.hasAttribute("data-kt-countup-suffix")&&(t.suffix=e.getAttribute("data-kt-countup-suffix")),new countUp.CountUp(e,n,t).start(),e.classList.add("counted"),e.setAttribute("data-kt-initialized","1")}})},o=function(e){if(!e)return;const t={};e.getAttributeNames().forEach(function(n){if(/^data-tns-.*/g.test(n)){let r=n.replace("data-tns-","").toLowerCase().replace(/(?:[\s-])\w/g,function(e){return e.replace("-","").toUpperCase()});if("data-tns-responsive"===n){const i=e.getAttribute(n).replace(/(\w+:)|(\w+ :)/g,function(e){return'"'+e.substring(0,e.length-1)+'":'});try{t[r]=JSON.parse(i)}catch(e){}}else t[r]="true"===(i=e.getAttribute(n))||"false"!==i&&i}var i});const n=Object.assign({},{container:e,slideBy:"page",autoplay:!0,center:!0,autoplayButtonOutput:!1},t);return e.closest(".tns")&&KTUtil.addClass(e.closest(".tns"),"tns-initiazlied"),tns(n)};return{init:function(){var a;!function(){if("undefined"==typeof lozad)return;lozad().observe()}(),!0!==e&&"undefined"!=typeof SmoothScroll&&new SmoothScroll('a[data-kt-scroll-toggle][href*="#"]',{speed:1e3,speedAsDuration:!0,offset:function(e,t){return e.hasAttribute("data-kt-scroll-offset")?KTUtil.getResponsiveValue(e.getAttribute("data-kt-scroll-offset")):0}}),KTUtil.on(document.body,'[data-kt-card-action="remove"]',"click",function(e){e.preventDefault();const t=this.closest(".card");if(!t)return;const n=this.getAttribute("data-kt-card-confirm-message");"true"===this.getAttribute("data-kt-card-confirm")?Swal.fire({text:n||"Are you sure to remove ?",icon:"warning",buttonsStyling:!1,confirmButtonText:"Confirm",denyButtonText:"Cancel",customClass:{confirmButton:"btn btn-primary",denyButton:"btn btn-danger"}}).then(function(e){e.isConfirmed&&t.remove()}):t.remove()}),(a=Array.prototype.slice.call(document.querySelectorAll("[data-bs-stacked-modal]")))&&a.length>0&&a.forEach(e=>{"1"!==e.getAttribute("data-kt-initialized")&&(e.setAttribute("data-kt-initialized","1"),e.addEventListener("click",function(e){e.preventDefault();const t=document.querySelector(this.getAttribute("data-bs-stacked-modal"));t&&new bootstrap.Modal(t,{backdrop:!1}).show()}))}),!0!==e&&KTUtil.on(document.body,'[data-kt-check="true"]',"change",function(e){var t=this,n=document.querySelectorAll(t.getAttribute("data-kt-check-target"));KTUtil.each(n,function(e){"checkbox"==e.type?e.checked=t.checked:e.classList.toggle("active")})}),!0!==e&&KTUtil.on(document.body,'.collapsible[data-bs-toggle="collapse"]',"click",function(e){if(this.classList.contains("collapsed")?(this.classList.remove("active"),this.blur()):this.classList.add("active"),this.hasAttribute("data-kt-toggle-text")){var t=this.getAttribute("data-kt-toggle-text"),n=(n=this.querySelector('[data-kt-toggle-text-target="true"]'))||this;this.setAttribute("data-kt-toggle-text",n.innerText),n.innerText=t}}),!0!==e&&KTUtil.on(document.body,'[data-kt-rotate="true"]',"click",function(e){this.classList.contains("active")?(this.classList.remove("active"),this.blur()):this.classList.add("active")}),[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map(function(e){n(e,{})}),[].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]')).map(function(e){i(e,{})}),[].slice.call(document.querySelectorAll(".toast")).map(function(e){if("1"!==e.getAttribute("data-kt-initialized"))return e.setAttribute("data-kt-initialized","1"),new bootstrap.Toast(e,{})}),function(){if("undefined"!=typeof jQuery&&void 0!==$.fn.daterangepicker){var e=[].slice.call(document.querySelectorAll('[data-kt-daterangepicker="true"]')),t=moment().subtract(29,"days"),n=moment();e.map(function(e){if("1"!==e.getAttribute("data-kt-initialized")){var i=e.querySelector("div"),r=e.hasAttribute("data-kt-daterangepicker-opens")?e.getAttribute("data-kt-daterangepicker-opens"):"left",o=function(e,t){var n=moment();i&&(n.isSame(e,"day")&&n.isSame(t,"day")?i.innerHTML=e.format("D MMM YYYY"):i.innerHTML=e.format("D MMM YYYY")+" - "+t.format("D MMM YYYY"))};"today"===e.getAttribute("data-kt-daterangepicker-range")&&(t=moment(),n=moment()),$(e).daterangepicker({startDate:t,endDate:n,opens:r,ranges:{Today:[moment(),moment()],Yesterday:[moment().subtract(1,"days"),moment().subtract(1,"days")],"Last 7 Days":[moment().subtract(6,"days"),moment()],"Last 30 Days":[moment().subtract(29,"days"),moment()],"This Month":[moment().startOf("month"),moment().endOf("month")],"Last Month":[moment().subtract(1,"month").startOf("month"),moment().subtract(1,"month").endOf("month")]}},o),o(t,n),e.setAttribute("data-kt-initialized","1")}})}}(),[].slice.call(document.querySelectorAll('[data-kt-buttons="true"]')).map(function(e){if("1"!==e.getAttribute("data-kt-initialized")){var t=e.hasAttribute("data-kt-buttons-target")?e.getAttribute("data-kt-buttons-target"):".btn",n=[].slice.call(e.querySelectorAll(t));KTUtil.on(e,t,"click",function(e){n.map(function(e){e.classList.remove("active")}),this.classList.add("active")}),e.setAttribute("data-kt-initialized","1")}}),"undefined"!=typeof jQuery&&void 0!==$.fn.select2&&[].slice.call(document.querySelectorAll('[data-control="select2"], [data-kt-select2="true"]')).map(function(e){if("1"!==e.getAttribute("data-kt-initialized")){var t={dir:document.body.getAttribute("direction")};if("true"==e.getAttribute("data-hide-search")&&(t.minimumResultsForSearch=1/0),$(e).select2(t),e.hasAttribute("data-dropdown-parent")&&e.hasAttribute("multiple")){var n=document.querySelector(e.getAttribute("data-dropdown-parent"));if(n&&n.hasAttribute("data-kt-menu")){var i=KTMenu.getInstance(n);i||(i=new KTMenu(n)),i&&($(e).on("select2:unselect",function(t){e.setAttribute("data-multiple-unselect","1")}),i.on("kt.menu.dropdown.hide",function(t){if("1"===e.getAttribute("data-multiple-unselect"))return e.removeAttribute("data-multiple-unselect"),!1}))}}e.setAttribute("data-kt-initialized","1")}}),r(),"undefined"!=typeof countUp&&(!1===t&&(r(),window.addEventListener("scroll",r)),[].slice.call(document.querySelectorAll('[data-kt-countup-tabs="true"][data-bs-toggle="tab"]')).map(function(e){"1"!==e.getAttribute("data-kt-initialized")&&(e.addEventListener("shown.bs.tab",r),e.setAttribute("data-kt-initialized","1"))}),t=!0),"undefined"!=typeof autosize&&[].slice.call(document.querySelectorAll('[data-kt-autosize="true"]')).map(function(e){"1"!==e.getAttribute("data-kt-initialized")&&(autosize(e),e.setAttribute("data-kt-initialized","1"))}),function(){if("undefined"==typeof tns)return;const e=Array.prototype.slice.call(document.querySelectorAll('[data-tns="true"]'),0);(e||0!==e.length)&&e.forEach(function(e){"1"!==e.getAttribute("data-kt-initialized")&&(o(e),KTUtil.data(e).set("tns",tns),e.setAttribute("data-kt-initialized","1"))})}(),e=!0},initTinySlider:function(e){o(e)},showPageLoading:function(){document.body.classList.add("page-loading"),document.body.setAttribute("data-kt-app-page-loading","on")},hidePageLoading:function(){document.body.classList.remove("page-loading"),document.body.removeAttribute("data-kt-app-page-loading")},createBootstrapPopover:function(e,t){return i(e,t)},createBootstrapTooltip:function(e,t){return n(e,t)}}}();"undefined"!=typeof module&&void 0!==module.exports&&(module.exports=KTApp);var KTBlockUI=function(e,t){var n=this;if(null!=e){var i={zIndex:!1,overlayClass:"",overflow:"hidden",message:''},r=function(){n.options=KTUtil.deepExtend({},i,t),n.element=e,n.overlayElement=null,n.blocked=!1,n.positionChanged=!1,n.overflowChanged=!1,KTUtil.data(n.element).set("blockui",n)};KTUtil.data(e).has("blockui")?n=KTUtil.data(e).get("blockui"):r(),n.block=function(){!function(){if(!1!==KTEventHandler.trigger(n.element,"kt.blockui.block",n)){var e="BODY"===n.element.tagName,t=KTUtil.css(n.element,"position"),i=KTUtil.css(n.element,"overflow"),r=e?1e4:1;n.options.zIndex>0?r=n.options.zIndex:"auto"!=KTUtil.css(n.element,"z-index")&&(r=KTUtil.css(n.element,"z-index")),n.element.classList.add("blockui"),"absolute"!==t&&"relative"!==t&&"fixed"!==t||(KTUtil.css(n.element,"position","relative"),n.positionChanged=!0),"hidden"===n.options.overflow&&"visible"===i&&(KTUtil.css(n.element,"overflow","hidden"),n.overflowChanged=!0),n.overlayElement=document.createElement("DIV"),n.overlayElement.setAttribute("class","blockui-overlay "+n.options.overlayClass),n.overlayElement.innerHTML=n.options.message,KTUtil.css(n.overlayElement,"z-index",r),n.element.append(n.overlayElement),n.blocked=!0,KTEventHandler.trigger(n.element,"kt.blockui.after.blocked",n)}}()},n.release=function(){!1!==KTEventHandler.trigger(n.element,"kt.blockui.release",n)&&(n.element.classList.add("blockui"),n.positionChanged&&KTUtil.css(n.element,"position",""),n.overflowChanged&&KTUtil.css(n.element,"overflow",""),n.overlayElement&&KTUtil.remove(n.overlayElement),n.blocked=!1,KTEventHandler.trigger(n.element,"kt.blockui.released",n))},n.isBlocked=function(){return n.blocked},n.destroy=function(){KTUtil.data(n.element).remove("blockui")},n.on=function(e,t){return KTEventHandler.on(n.element,e,t)},n.one=function(e,t){return KTEventHandler.one(n.element,e,t)},n.off=function(e,t){return KTEventHandler.off(n.element,e,t)},n.trigger=function(e,t){return KTEventHandler.trigger(n.element,e,t,n,t)}}};KTBlockUI.getInstance=function(e){return null!==e&&KTUtil.data(e).has("blockui")?KTUtil.data(e).get("blockui"):null},"undefined"!=typeof module&&void 0!==module.exports&&(module.exports=KTBlockUI);var KTCookie={get:function(e){var t=document.cookie.match(new RegExp("(?:^|; )"+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)"));return t?decodeURIComponent(t[1]):null},set:function(e,t,n){null==n&&(n={}),(n=Object.assign({},{path:"/"},n)).expires instanceof Date&&(n.expires=n.expires.toUTCString());var i=encodeURIComponent(e)+"="+encodeURIComponent(t);for(var r in n)if(!1!==n.hasOwnProperty(r)){i+="; "+r;var o=n[r];!0!==o&&(i+="="+o)}document.cookie=i},remove:function(e){this.set(e,"",{"max-age":-1})}};"undefined"!=typeof module&&void 0!==module.exports&&(module.exports=KTCookie);var KTDialer=function(e,t){var n=this;if(e){var i={min:null,max:null,step:1,currency:!1,decimals:0,prefix:"",suffix:""},r=function(){n.options=KTUtil.deepExtend({},i,t),n.element=e,n.incElement=n.element.querySelector('[data-kt-dialer-control="increase"]'),n.decElement=n.element.querySelector('[data-kt-dialer-control="decrease"]'),n.inputElement=n.element.querySelector("input[type]"),"true"===c("currency")&&(n.options.currency=!0),c("decimals")&&(n.options.decimals=parseInt(c("decimals"))),c("prefix")&&(n.options.prefix=c("prefix")),c("suffix")&&(n.options.suffix=c("suffix")),c("step")&&(n.options.step=parseFloat(c("step"))),c("min")&&(n.options.min=parseFloat(c("min"))),c("max")&&(n.options.max=parseFloat(c("max"))),n.value=parseFloat(n.inputElement.value.replace(/[^\d.]/g,"")),s(),o(),KTUtil.data(n.element).set("dialer",n)},o=function(){KTUtil.addEvent(n.incElement,"click",function(e){e.preventDefault(),a()}),KTUtil.addEvent(n.decElement,"click",function(e){e.preventDefault(),l()}),KTUtil.addEvent(n.inputElement,"input",function(e){e.preventDefault(),s()})},a=function(){return KTEventHandler.trigger(n.element,"kt.dialer.increase",n),n.inputElement.value=n.value+n.options.step,s(),KTEventHandler.trigger(n.element,"kt.dialer.increased",n),n},l=function(){return KTEventHandler.trigger(n.element,"kt.dialer.decrease",n),n.inputElement.value=n.value-n.options.step,s(),KTEventHandler.trigger(n.element,"kt.dialer.decreased",n),n},s=function(e){KTEventHandler.trigger(n.element,"kt.dialer.change",n),n.value=void 0!==e?e:u(n.inputElement.value),null!==n.options.min&&n.valuen.options.max&&(n.value=n.options.max),n.inputElement.value=d(n.value),n.inputElement.dispatchEvent(new Event("change")),KTEventHandler.trigger(n.element,"kt.dialer.changed",n)},u=function(e){return e=e.replace(/[^0-9.-]/g,"").replace(/(\..*)\./g,"$1").replace(/(?!^)-/g,"").replace(/^0+(\d)/gm,"$1"),e=parseFloat(e),isNaN(e)&&(e=0),e},d=function(e){return e=parseFloat(e).toFixed(n.options.decimals),n.options.currency&&(e=e.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")),n.options.prefix+e+n.options.suffix},c=function(e){return!0===n.element.hasAttribute("data-kt-dialer-"+e)?n.element.getAttribute("data-kt-dialer-"+e):null};!0===KTUtil.data(e).has("dialer")?n=KTUtil.data(e).get("dialer"):r(),n.setMinValue=function(e){n.options.min=e},n.setMaxValue=function(e){n.options.max=e},n.setValue=function(e){s(e)},n.getValue=function(){return n.inputElement.value},n.update=function(){s()},n.increase=function(){return a()},n.decrease=function(){return l()},n.getElement=function(){return n.element},n.destroy=function(){KTUtil.data(n.element).remove("dialer")},n.on=function(e,t){return KTEventHandler.on(n.element,e,t)},n.one=function(e,t){return KTEventHandler.one(n.element,e,t)},n.off=function(e,t){return KTEventHandler.off(n.element,e,t)},n.trigger=function(e,t){return KTEventHandler.trigger(n.element,e,t,n,t)}}};KTDialer.getInstance=function(e){return null!==e&&KTUtil.data(e).has("dialer")?KTUtil.data(e).get("dialer"):null},KTDialer.createInstances=function(e='[data-kt-dialer="true"]'){var t=document.querySelectorAll(e);if(t&&t.length>0)for(var n=0,i=t.length;n0&&KTUtil.on(document.body,e,"click",function(e){e.preventDefault(),n.toggleElement=this,a()}),null!==t&&t.length>0&&KTUtil.on(document.body,t,"click",function(e){e.preventDefault(),n.closeElement=this,l()})},a=function(){!1!==KTEventHandler.trigger(n.element,"kt.drawer.toggle",n)&&!1!==m("activate")&&(!0===n.shown?l():s(),KTEventHandler.trigger(n.element,"kt.drawer.toggled",n))},l=function(){!1!==KTEventHandler.trigger(n.element,"kt.drawer.hide",n)&&(n.shown=!1,c(),document.body.removeAttribute("data-kt-drawer-"+n.name,"on"),document.body.removeAttribute("data-kt-drawer"),KTUtil.removeClass(n.element,n.options.baseClass+"-on"),null!==n.toggleElement&&KTUtil.removeClass(n.toggleElement,"active"),KTEventHandler.trigger(n.element,"kt.drawer.after.hidden",n))},s=function(){!1!==KTEventHandler.trigger(n.element,"kt.drawer.show",n)&&(n.shown=!0,d(),document.body.setAttribute("data-kt-drawer-"+n.name,"on"),document.body.setAttribute("data-kt-drawer","on"),KTUtil.addClass(n.element,n.options.baseClass+"-on"),null!==n.toggleElement&&KTUtil.addClass(n.toggleElement,"active"),KTEventHandler.trigger(n.element,"kt.drawer.shown",n))},u=function(){var e=f(),t=p(),i=m("direction"),r=m("top"),o=m("bottom"),a=m("start"),s=m("end");!0===KTUtil.hasClass(n.element,n.options.baseClass+"-on")&&"on"===String(document.body.getAttribute("data-kt-drawer-"+n.name+"-"))?n.shown=!0:n.shown=!1,!0===m("activate")?(KTUtil.addClass(n.element,n.options.baseClass),KTUtil.addClass(n.element,n.options.baseClass+"-"+i),e&&(KTUtil.css(n.element,"width",e,!0),n.lastWidth=e),t&&(KTUtil.css(n.element,"height",t,!0),n.lastHeight=t),r&&KTUtil.css(n.element,"top",r),o&&KTUtil.css(n.element,"bottom",o),a&&(KTUtil.isRTL()?KTUtil.css(n.element,"right",a):KTUtil.css(n.element,"left",a)),s&&(KTUtil.isRTL()?KTUtil.css(n.element,"left",s):KTUtil.css(n.element,"right",s))):(KTUtil.removeClass(n.element,n.options.baseClass),KTUtil.removeClass(n.element,n.options.baseClass+"-"+i),KTUtil.css(n.element,"width",""),KTUtil.css(n.element,"height",""),r&&KTUtil.css(n.element,"top",""),o&&KTUtil.css(n.element,"bottom",""),a&&(KTUtil.isRTL()?KTUtil.css(n.element,"right",""):KTUtil.css(n.element,"left","")),s&&(KTUtil.isRTL()?KTUtil.css(n.element,"left",""):KTUtil.css(n.element,"right","")),l())},d=function(){!0===m("overlay")&&(n.overlayElement=document.createElement("DIV"),KTUtil.css(n.overlayElement,"z-index",KTUtil.css(n.element,"z-index")-1),document.body.append(n.overlayElement),KTUtil.addClass(n.overlayElement,m("overlay-class")),KTUtil.addEvent(n.overlayElement,"click",function(e){e.preventDefault(),!0!==m("permanent")&&l()}))},c=function(){null!==n.overlayElement&&KTUtil.remove(n.overlayElement)},m=function(e){if(!0===n.element.hasAttribute("data-kt-drawer-"+e)){var t=n.element.getAttribute("data-kt-drawer-"+e),i=KTUtil.getResponsiveValue(t);return null!==i&&"true"===String(i)?i=!0:null!==i&&"false"===String(i)&&(i=!1),i}var r=KTUtil.snakeToCamel(e);return n.options[r]?KTUtil.getResponsiveValue(n.options[r]):null},f=function(){var e=m("width");return"auto"===e&&(e=KTUtil.css(n.element,"width")),e},p=function(){var e=m("height");return"auto"===e&&(e=KTUtil.css(n.element,"height")),e};KTUtil.data(e).has("drawer")?n=KTUtil.data(e).get("drawer"):r(),n.toggle=function(){return a()},n.show=function(){return s()},n.hide=function(){return l()},n.isShown=function(){return n.shown},n.update=function(){u()},n.goElement=function(){return n.element},n.destroy=function(){KTUtil.data(n.element).remove("drawer")},n.on=function(e,t){return KTEventHandler.on(n.element,e,t)},n.one=function(e,t){return KTEventHandler.one(n.element,e,t)},n.off=function(e,t){return KTEventHandler.off(n.element,e,t)},n.trigger=function(e,t){return KTEventHandler.trigger(n.element,e,t,n,t)}}};KTDrawer.getInstance=function(e){return null!==e&&KTUtil.data(e).has("drawer")?KTUtil.data(e).get("drawer"):null},KTDrawer.hideAll=function(e=null,t='[data-kt-drawer="true"]'){var n=document.querySelectorAll(t);if(n&&n.length>0)for(var i=0,r=n.length;i0)for(var n=0,i=t.length;n0)for(var n=0,i=t.length;n{if("Escape"===e.key){if(!(e.ctrlKey||e.altKey||e.shiftKey)){var t,n=document.querySelectorAll('.drawer-on[data-kt-drawer="true"]:not([data-kt-drawer-escape="false"])');if(n&&n.length>0)for(var i=0,r=n.length;i0)for(var t=0,n=e.length;t0)for(var n=0,i=t.length;n0)for(var t=0,i=e.length;t0?"dropdown":"accordion"},T=function(e){var t,n;return c(e)||e.hasAttribute("data-kt-menu-trigger")?e:KTUtil.data(e).has("item")?KTUtil.data(e).get("item"):(t=e.closest(".menu-item"))?t:(n=e.closest(".menu-sub"))&&!0===KTUtil.data(n).has("item")?KTUtil.data(n).get("item"):void 0},h=function(e){var t,n=e.closest(".menu-sub");return n&&KTUtil.data(n).has("item")?KTUtil.data(n).get("item"):n&&(t=n.closest(".menu-item[data-kt-menu-trigger]"))?t:null},K=function(e){var t,i=[],r=0;do{(t=h(e))&&(i.push(t),e=t),r++}while(null!==t&&r<20);return n.triggerElement&&i.unshift(n.triggerElement),i},b=function(e){var t=e;return KTUtil.data(e).get("sub")&&(t=KTUtil.data(e).get("sub")),null!==t&&t.querySelector(".menu-item[data-kt-menu-trigger]")||null},k=function(e){var t,n=[],i=0;do{(t=b(e))&&(n.push(t),e=t),i++}while(null!==t&&i<20);return n},y=function(e){if(!1!==KTEventHandler.trigger(n.element,"kt.menu.dropdown.show",e)){KTMenu.hideDropdowns(e);c(e)||p(e);var t=g(e),i=L(e,"width"),r=L(e,"height"),o=n.options.dropdown.zindex,a=KTUtil.getHighestZindex(e);null!==a&&a>=o&&(o=a+1),o>0&&KTUtil.css(t,"z-index",o),null!==i&&KTUtil.css(t,"width",i),null!==r&&KTUtil.css(t,"height",r),KTUtil.css(t,"display",""),KTUtil.css(t,"overflow",""),U(e,t),KTUtil.addClass(e,"show"),KTUtil.addClass(e,"menu-dropdown"),KTUtil.addClass(t,"show"),!0===L(e,"overflow")?(document.body.appendChild(t),KTUtil.data(e).set("sub",t),KTUtil.data(t).set("item",e),KTUtil.data(t).set("menu",n)):KTUtil.data(t).set("item",e),KTEventHandler.trigger(n.element,"kt.menu.dropdown.shown",e)}},w=function(e){if(!1!==KTEventHandler.trigger(n.element,"kt.menu.dropdown.hide",e)){var t=g(e);KTUtil.css(t,"z-index",""),KTUtil.css(t,"width",""),KTUtil.css(t,"height",""),KTUtil.removeClass(e,"show"),KTUtil.removeClass(e,"menu-dropdown"),KTUtil.removeClass(t,"show"),!0===L(e,"overflow")&&(e.classList.contains("menu-item")?e.appendChild(t):KTUtil.insertAfter(n.element,e),KTUtil.data(e).remove("sub"),KTUtil.data(t).remove("item"),KTUtil.data(t).remove("menu")),E(e),KTEventHandler.trigger(n.element,"kt.menu.dropdown.hidden",e)}},U=function(e,t){var n,i=L(e,"attach");n=i?"parent"===i?e.parentNode:document.querySelector(i):e;var r=Popper.createPopper(n,t,S(e));KTUtil.data(e).set("popper",r)},E=function(e){!0===KTUtil.data(e).has("popper")&&(KTUtil.data(e).get("popper").destroy(),KTUtil.data(e).remove("popper"))},S=function(e){var t=L(e,"placement");t||(t="right");var n=L(e,"offset"),i=n?n.split(","):[];return 2===i.length&&(i[0]=parseInt(i[0]),i[1]=parseInt(i[1])),{placement:t,strategy:!0===L(e,"overflow")?"absolute":"fixed",modifiers:[{name:"offset",options:{offset:i}},{name:"preventOverflow",options:{altAxis:!1!==L(e,"flip")}},{name:"flip",options:{enabled:!1,flipVariations:!1}}]}},A=function(e){if(!1!==KTEventHandler.trigger(n.element,"kt.menu.accordion.show",e)){var t=g(e),i=n.options.accordion.expand;!0===L(e,"expand")?i=!0:!1===L(e,"expand")?i=!1:!0===L(n.element,"expand")&&(i=!0),!1===i&&I(e),!0===KTUtil.data(e).has("popper")&&w(e),KTUtil.addClass(e,"hover"),KTUtil.addClass(e,"showing"),KTUtil.slideDown(t,n.options.accordion.slideSpeed,function(){KTUtil.removeClass(e,"showing"),KTUtil.addClass(e,"show"),KTUtil.addClass(t,"show"),KTEventHandler.trigger(n.element,"kt.menu.accordion.shown",e)})}},x=function(e){if(!1!==KTEventHandler.trigger(n.element,"kt.menu.accordion.hide",e)){var t=g(e);KTUtil.addClass(e,"hiding"),KTUtil.slideUp(t,n.options.accordion.slideSpeed,function(){KTUtil.removeClass(e,"hiding"),KTUtil.removeClass(e,"show"),KTUtil.removeClass(t,"show"),KTUtil.removeClass(e,"hover"),KTEventHandler.trigger(n.element,"kt.menu.accordion.hidden",e)})}},I=function(e){var t,i=KTUtil.findAll(n.element,".show[data-kt-menu-trigger]");if(i&&i.length>0)for(var r=0,o=i.length;r0))for(var i=0,r=n.length;i0)for(var l=0,s=i.length;l0}(e)},n.getTriggerElement=function(){return n.triggerElement},n.isItemDropdownPermanent=function(e){return function(e){return!0===L(e,"permanent")}(e)},n.destroy=function(){KTUtil.data(n.element).remove("menu")},n.disable=function(){n.disabled=!0},n.enable=function(){n.disabled=!1},n.hideAccordions=function(e){return I(e)},n.on=function(e,t){return KTEventHandler.on(n.element,e,t)},n.one=function(e,t){return KTEventHandler.one(n.element,e,t)},n.off=function(e,t){return KTEventHandler.off(n.element,e,t)}}};KTMenu.getInstance=function(e){var t;if(!e)return null;if(KTUtil.data(e).has("menu"))return KTUtil.data(e).get("menu");if((t=e.closest(".menu"))&&KTUtil.data(t).has("menu"))return KTUtil.data(t).get("menu");if(KTUtil.hasClass(e,"menu-link")){var n=e.closest(".menu-sub");if(KTUtil.data(n).has("menu"))return KTUtil.data(n).get("menu")}return null},KTMenu.hideDropdowns=function(e){var t=document.querySelectorAll(".show.menu-dropdown[data-kt-menu-trigger]");if(t&&t.length>0)for(var n=0,i=t.length;n0)for(var t=0,n=e.length;t0)for(var o=0,a=r.length;o .menu-link, [data-kt-menu-trigger]:not(.menu-item):not([data-kt-menu-trigger="auto"])',"click",function(e){var t=KTMenu.getInstance(this);if(null!==t)return t.click(this,e)}),KTUtil.on(document.body,".menu-item:not([data-kt-menu-trigger]) > .menu-link","click",function(e){var t=KTMenu.getInstance(this);if(null!==t)return t.link(this,e)}),KTUtil.on(document.body,'[data-kt-menu-dismiss="true"]',"click",function(e){var t=KTMenu.getInstance(this);if(null!==t)return t.dismiss(this,e)}),KTUtil.on(document.body,"[data-kt-menu-trigger], .menu-sub","mouseover",function(e){var t=KTMenu.getInstance(this);if(null!==t&&"dropdown"===t.getItemSubType(this))return t.mouseover(this,e)}),KTUtil.on(document.body,"[data-kt-menu-trigger], .menu-sub","mouseout",function(e){var t=KTMenu.getInstance(this);if(null!==t&&"dropdown"===t.getItemSubType(this))return t.mouseout(this,e)}),window.addEventListener("resize",function(){var e;KTUtil.throttle(undefined,function(){var t=document.querySelectorAll('[data-kt-menu="true"]');if(t&&t.length>0)for(var n=0,i=t.length;n0)for(var i=0,r=n.length;i0)for(var n=0,i=t.length;n=n.options.minLength},s=function(){return/[a-z]/.test(n.inputElement.value)},u=function(){return/[A-Z]/.test(n.inputElement.value)},d=function(){return/[0-9]/.test(n.inputElement.value)},c=function(){return/[~`!#@$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g.test(n.inputElement.value)},m=function(){var e=1;return!0===n.options.checkUppercase&&e++,!0===n.options.checkLowercase&&e++,!0===n.options.checkDigit&&e++,!0===n.options.checkChar&&e++,n.checkSteps=e,100/n.checkSteps},f=function(){var e=[].slice.call(n.highlightElement.querySelectorAll("div")),t=e.length,i=0,r=m(),o=g();e.map(function(e){i++,r*i*(n.checkSteps/t)<=o?e.classList.add("active"):e.classList.remove("active")})},p=function(){var e=n.visibilityElement.querySelector(":scope > i:not(.d-none)"),t=n.visibilityElement.querySelector(":scope > i.d-none");"password"===n.inputElement.getAttribute("type").toLowerCase()?n.inputElement.setAttribute("type","text"):n.inputElement.setAttribute("type","password"),e.classList.add("d-none"),t.classList.remove("d-none"),n.inputElement.focus()},g=function(){return n.score};!0===KTUtil.data(e).has("password-meter")?n=KTUtil.data(e).get("password-meter"):r(),n.check=function(){return a()},n.getScore=function(){return g()},n.reset=function(){return n.score=0,void f()},n.destroy=function(){KTUtil.data(n.element).remove("password-meter")}}};KTPasswordMeter.getInstance=function(e){return null!==e&&KTUtil.data(e).has("password-meter")?KTUtil.data(e).get("password-meter"):null},KTPasswordMeter.createInstances=function(e="[data-kt-password-meter]"){var t=document.body.querySelectorAll(e);if(t&&t.length>0)for(var n=0,i=t.length;n0?KTUtil.css(n.element,e,t):KTUtil.css(n.element,e,""),s(),!0===f("save-state")&&n.id?n.element.addEventListener("scroll",a):n.element.removeEventListener("scroll",a),function(){var e=o();if(!0===f("save-state")&&n.id&&localStorage.getItem(e+n.id+"st")){var t=parseInt(localStorage.getItem(e+n.id+"st"));t>0&&n.element.scroll({top:t,behavior:"instant"})}}()):(KTUtil.css(n.element,p(),""),n.element.removeEventListener("scroll",a))},s=function(){var e=f("stretch");if(null!==e){var t=document.querySelectorAll(e);if(t&&2==t.length){var i=t[0],r=t[1],o=c(r)-c(i);if(o>0){var a=parseInt(KTUtil.css(n.element,p()))+o;KTUtil.css(n.element,p(),String(a)+"px")}}}},u=function(){var e=f(p());return e instanceof Function?e.call():null!==e&&"string"==typeof e&&"auto"===e.toLowerCase()?d():e},d=function(){var e,t=KTUtil.getViewPort().height,i=f("dependencies"),r=f("wrappers"),o=f("offset");if((t-=m(n.element),null!==i)&&((e=document.querySelectorAll(i))&&e.length>0))for(var a=0,l=e.length;a0))for(a=0,l=e.length;a0)for(var n=0,i=t.length;n0)for(var t=0,n=e.length;te?!1===document.body.hasAttribute("data-kt-scrolltop")&&document.body.setAttribute("data-kt-scrolltop","on"):!0===document.body.hasAttribute("data-kt-scrolltop")&&document.body.removeAttribute("data-kt-scrolltop")},l=function(){parseInt(s("speed"));window.scrollTo({top:0,behavior:"smooth"})},s=function(e){if(!0===n.element.hasAttribute("data-kt-scrolltop-"+e)){var t=n.element.getAttribute("data-kt-scrolltop-"+e),i=KTUtil.getResponsiveValue(t);return null!==i&&"true"===String(i)?i=!0:null!==i&&"false"===String(i)&&(i=!1),i}var r=KTUtil.snakeToCamel(e);return n.options[r]?KTUtil.getResponsiveValue(n.options[r]):null};KTUtil.data(e).has("scrolltop")?n=KTUtil.data(e).get("scrolltop"):r(),n.go=function(){return l()},n.getElement=function(){return n.element},n.destroy=function(){KTUtil.data(n.element).remove("scrolltop")}}};KTScrolltop.getInstance=function(e){return e&&KTUtil.data(e).has("scrolltop")?KTUtil.data(e).get("scrolltop"):null},KTScrolltop.createInstances=function(e='[data-kt-scrolltop="true"]'){var t=document.body.querySelectorAll(e);if(t&&t.length>0)for(var n=0,i=t.length;n=n.minLength)&&f()},l=function(){n.element.classList.remove("focus")},s=function(e){13==(e.charCode||e.keyCode||0)&&(e.preventDefault(),d())},u=function(){g("min-length")&&(n.inputElement.value.length>=n.minLength?d():0===n.inputElement.value.length&&c())},d=function(){!1===n.processing&&(n.spinnerElement&&n.spinnerElement.classList.remove("d-none"),n.clearElement&&n.clearElement.classList.add("d-none"),n.toolbarElement&&n.formElement.contains(n.toolbarElement)&&n.toolbarElement.classList.add("d-none"),n.inputElement.focus(),n.processing=!0,KTEventHandler.trigger(n.element,"kt.search.process",n))},c=function(){!1!==KTEventHandler.trigger(n.element,"kt.search.clear",n)&&(n.inputElement.value="",n.inputElement.focus(),n.clearElement&&n.clearElement.classList.add("d-none"),n.toolbarElement&&n.formElement.contains(n.toolbarElement)&&n.toolbarElement.classList.remove("d-none"),!1===g("show-on-focus")&&p(),KTEventHandler.trigger(n.element,"kt.search.cleared",n))},m=function(){if("menu"===n.layout){var e=T();"on"===e&&!1===n.contentElement.contains(n.formElement)?(n.contentElement.prepend(n.formElement),n.formElement.classList.remove("d-none")):"off"===e&&!0===n.contentElement.contains(n.formElement)&&(n.element.prepend(n.formElement),n.formElement.classList.add("d-none"))}},f=function(){n.menuObject&&(m(),n.menuObject.show(n.element))},p=function(){n.menuObject&&(m(),n.menuObject.hide(n.element))},g=function(e){if(!0===n.element.hasAttribute("data-kt-search-"+e)){var t=n.element.getAttribute("data-kt-search-"+e),i=KTUtil.getResponsiveValue(t);return null!==i&&"true"===String(i)?i=!0:null!==i&&"false"===String(i)&&(i=!1),i}var r=KTUtil.snakeToCamel(e);return null!=n.options[r]?KTUtil.getResponsiveValue(n.options[r]):null},v=function(e){return n.element.querySelector('[data-kt-search-element="'+e+'"]')},T=function(){var e=g("responsive"),t=KTUtil.getViewPort().width;if(!e)return null;var n=KTUtil.getBreakpoint(e);return n||(n=parseInt(e)),t1&&o(n.options.startIndex),n.nextListener=function(e){e.preventDefault(),KTEventHandler.trigger(n.element,"kt.stepper.next",n)},n.previousListener=function(e){e.preventDefault(),KTEventHandler.trigger(n.element,"kt.stepper.previous",n)},n.submitListener=function(e){e.preventDefault(),KTEventHandler.trigger(n.element,"kt.stepper.submit",n)},n.stepListener=function(e){if(e.preventDefault(),n.steps&&n.steps.length>0)for(var t=0,i=n.steps.length;tn.totalStepsNumber||e<0))return e=parseInt(e),n.passedStepIndex=n.currentStepIndex,n.currentStepIndex=e,a(),KTEventHandler.trigger(n.element,"kt.stepper.changed",n),n},a=function(){var e="";e=l()?"last":s()?"first":"between",KTUtil.removeClass(n.element,"last"),KTUtil.removeClass(n.element,"first"),KTUtil.removeClass(n.element,"between"),KTUtil.addClass(n.element,e);var t=KTUtil.findAll(n.element,'[data-kt-stepper-element="nav"], [data-kt-stepper-element="content"], [data-kt-stepper-element="info"]');if(t&&t.length>0)for(var i=0,r=t.length;i=n.currentStepIndex+1?n.currentStepIndex+1:n.totalStepsNumber},d=function(){return n.currentStepIndex-1>1?n.currentStepIndex-1:1},c=function(){return 1},m=function(){return n.totalStepsNumber},f=function(e){return e>n.currentStepIndex?"next":"previous"};!0===KTUtil.data(e).has("stepper")?n=KTUtil.data(e).get("stepper"):r(),n.getElement=function(e){return n.element},n.goTo=function(e){return o(e)},n.goPrevious=function(){return o(d())},n.goNext=function(){return o(u())},n.goFirst=function(){return o(c())},n.goLast=function(){return o(m())},n.getCurrentStepIndex=function(){return n.currentStepIndex},n.getNextStepIndex=function(){return u()},n.getPassedStepIndex=function(){return n.passedStepIndex},n.getClickedStepIndex=function(){return n.clickedStepIndex},n.getPreviousStepIndex=function(){return d()},n.destroy=function(){return KTUtil.removeEvent(n.btnNext,"click",n.nextListener),KTUtil.removeEvent(n.btnPrevious,"click",n.previousListener),KTUtil.off(n.element,"click",n.stepListenerId),void KTUtil.data(n.element).remove("stepper")},n.on=function(e,t){return KTEventHandler.on(n.element,e,t)},n.one=function(e,t){return KTEventHandler.one(n.element,e,t)},n.off=function(e,t){return KTEventHandler.off(n.element,e,t)},n.trigger=function(e,t){return KTEventHandler.trigger(n.element,e,t,n,t)}}};KTStepper.getInstance=function(e){return null!==e&&KTUtil.data(e).has("stepper")?KTUtil.data(e).get("stepper"):null},"undefined"!=typeof module&&void 0!==module.exports&&(module.exports=KTStepper);var KTStickyHandlersInitialized=!1,KTSticky=function(e,t){var n=this;if(null!=e){var i={offset:200,reverse:!1,release:null,animation:!0,animationSpeed:"0.3s",animationClass:"animation-slide-in-down"},r=function(){n.element=e,n.options=KTUtil.deepExtend({},i,t),n.uid=KTUtil.getUniqueId("sticky"),n.name=n.element.getAttribute("data-kt-sticky-name"),n.attributeName="data-kt-sticky-"+n.name,n.attributeName2="data-kt-"+n.name,n.eventTriggerState=!0,n.lastScrollTop=0,n.scrollHandler,n.element.setAttribute("data-kt-sticky","true"),window.addEventListener("scroll",o),o(),KTUtil.data(n.element).set("sticky",n)},o=function(e){var t,i=u("offset"),r=u("release"),o=u("reverse");if(!1!==i){i=parseInt(i),r=r?document.querySelector(r):null,t=KTUtil.getScrollTop(),document.documentElement.scrollHeight-window.innerHeight-KTUtil.getScrollTop();var s=!r||r.offsetTop-r.clientHeight>t;if(!0===o){if(t>i&&s){if(!1===document.body.hasAttribute(n.attributeName)){if(!1===a())return;document.body.setAttribute(n.attributeName,"on"),document.body.setAttribute(n.attributeName2,"on"),n.element.setAttribute("data-kt-sticky-enabled","true")}!0===n.eventTriggerState&&(KTEventHandler.trigger(n.element,"kt.sticky.on",n),KTEventHandler.trigger(n.element,"kt.sticky.change",n),n.eventTriggerState=!1)}else!0===document.body.hasAttribute(n.attributeName)&&(l(),document.body.removeAttribute(n.attributeName),document.body.removeAttribute(n.attributeName2),n.element.removeAttribute("data-kt-sticky-enabled")),!1===n.eventTriggerState&&(KTEventHandler.trigger(n.element,"kt.sticky.off",n),KTEventHandler.trigger(n.element,"kt.sticky.change",n),n.eventTriggerState=!0);n.lastScrollTop=t}else if(t>i&&s){if(!1===document.body.hasAttribute(n.attributeName)){if(!1===a())return;document.body.setAttribute(n.attributeName,"on"),document.body.setAttribute(n.attributeName2,"on"),n.element.setAttribute("data-kt-sticky-enabled","true")}!0===n.eventTriggerState&&(KTEventHandler.trigger(n.element,"kt.sticky.on",n),KTEventHandler.trigger(n.element,"kt.sticky.change",n),n.eventTriggerState=!1)}else!0===document.body.hasAttribute(n.attributeName)&&(l(),document.body.removeAttribute(n.attributeName),document.body.removeAttribute(n.attributeName2),n.element.removeAttribute("data-kt-sticky-enabled")),!1===n.eventTriggerState&&(KTEventHandler.trigger(n.element,"kt.sticky.off",n),KTEventHandler.trigger(n.element,"kt.sticky.change",n),n.eventTriggerState=!0);r&&(r.offsetTop-r.clientHeight>t?n.element.setAttribute("data-kt-sticky-released","true"):n.element.removeAttribute("data-kt-sticky-released"))}else l()},a=function(e){var t=u("top");t=t?parseInt(t):0;var i=u("left"),r=u("right"),o=u("width"),a=u("zindex"),l=u("dependencies"),d=u("class"),c=s(),m=u("height-offset");if(c+(m=m?parseInt(m):0)+t>KTUtil.getViewPort().height)return!1;if(!0!==e&&!0===u("animation")&&(KTUtil.css(n.element,"animationDuration",u("animationSpeed")),KTUtil.animateClass(n.element,"animation "+u("animationClass"))),null!==d&&KTUtil.addClass(n.element,d),null!==a&&(KTUtil.css(n.element,"z-index",a),KTUtil.css(n.element,"position","fixed")),t>=0&&KTUtil.css(n.element,"top",String(t)+"px"),null!==o){if(o.target){var f=document.querySelector(o.target);f&&(o=KTUtil.css(f,"width"))}KTUtil.css(n.element,"width",o)}if(null!==i)if("auto"===String(i).toLowerCase()){var p=KTUtil.offset(n.element).left;p>=0&&KTUtil.css(n.element,"left",String(p)+"px")}else KTUtil.css(n.element,"left",i);if(null!==r&&KTUtil.css(n.element,"right",r),null!==l){var g=document.querySelectorAll(l);if(g&&g.length>0)for(var v=0,T=g.length;v0)for(var r=0,o=i.length;r0)for(var n=0,i=t.length;n0)for(var t=0,n=e.length;t0)for(var n=0,i=t.length;n0)for(var t=0,n=e.length;t0&&n.element.classList.add(n.state),void 0!==KTCookie&&!0===n.options.saveState&&KTCookie.set(n.attribute,"on"),KTEventHandler.trigger(n.element,"kt.toggle.enabled",n),n},s=function(){if(!1!==u())return KTEventHandler.trigger(n.element,"kt.toggle.disable",n),n.target.removeAttribute(n.attribute),n.state.length>0&&n.element.classList.remove(n.state),void 0!==KTCookie&&!0===n.options.saveState&&KTCookie.remove(n.attribute),KTEventHandler.trigger(n.element,"kt.toggle.disabled",n),n},u=function(){return"on"===String(n.target.getAttribute(n.attribute)).toLowerCase()};!0===KTUtil.data(e).has("toggle")?n=KTUtil.data(e).get("toggle"):r(),n.toggle=function(){return a()},n.enable=function(){return l()},n.disable=function(){return s()},n.isEnabled=function(){return u()},n.goElement=function(){return n.element},n.destroy=function(){KTUtil.data(n.element).remove("toggle")},n.on=function(e,t){return KTEventHandler.on(n.element,e,t)},n.one=function(e,t){return KTEventHandler.one(n.element,e,t)},n.off=function(e,t){return KTEventHandler.off(n.element,e,t)},n.trigger=function(e,t){return KTEventHandler.trigger(n.element,e,t,n,t)}}};KTToggle.getInstance=function(e){return null!==e&&KTUtil.data(e).has("toggle")?KTUtil.data(e).get("toggle"):null},KTToggle.createInstances=function(e="[data-kt-toggle]"){var t=document.body.querySelectorAll(e);if(t&&t.length>0)for(var n=0,i=t.length;n=0&&t.item(n)!==this;);return n>-1}),Element.prototype.closest||(Element.prototype.closest=function(e){var t=this;if(!document.documentElement.contains(this))return null;do{if(t.matches(e))return t;t=t.parentElement}while(null!==t);return null}) /** * ChildNode.remove() polyfill * https://gomakethings.com/removing-an-element-from-the-dom-the-es6-way/ * @author Chris Ferdinandi * @license MIT - */,function(e){for(var t=0;t=this.getBreakpoint(e)},isBreakpointDown:function(e){return this.getViewPort().widthe);n++);},getRandomInt:function(e,t){return Math.floor(Math.random()*(t-e+1))+e},isAngularVersion:function(){return void 0!==window.Zone},deepExtend:function(e){e=e||{};for(var t=1;t0&&e.classList.add(KTUtil.trim(n[i]));else if(!KTUtil.hasClass(e,t))for(var r=0;r=o&&r<=a},getRelativeTopPosition:function(e,t){return e.offsetTop-t.offsetTop},attr:function(e,t,n){if(null!=e)return void 0===n?e.getAttribute(t):void e.setAttribute(t,n)},hasAttr:function(e,t){if(null!=e)return!!e.getAttribute(t)},removeAttr:function(e,t){null!=e&&e.removeAttribute(t)},animate:function(e,t,n,i,r,o){var a={};if(a.linear=function(e,t,n,i){return n*e/i+t},r=a.linear,"number"==typeof e&&"number"==typeof t&&"number"==typeof n&&"function"==typeof i){"function"!=typeof o&&(o=function(){});var l=window.requestAnimationFrame||function(e){window.setTimeout(e,20)},s=t-e;i(e);var u=window.performance&&window.performance.now?window.performance.now():+new Date;l((function a(d){var c=(d||+new Date)-u;c>=0&&i(r(c,e,s,n)),c>=0&&c>=n?(i(t),o()):l(a)}))}},actualCss:function(e,t,n){var i,r="";if(e instanceof HTMLElement!=!1)return e.getAttribute("kt-hidden-"+t)&&!1!==n?parseFloat(e.getAttribute("kt-hidden-"+t)):(r=e.style.cssText,e.style.cssText="position: absolute; visibility: hidden; display: block;","width"==t?i=e.offsetWidth:"height"==t&&(i=e.offsetHeight),e.style.cssText=r,e.setAttribute("kt-hidden-"+t,i),parseFloat(i))},actualHeight:function(e,t){return KTUtil.actualCss(e,"height",t)},actualWidth:function(e,t){return KTUtil.actualCss(e,"width",t)},getScroll:function(e,t){return t="scroll"+t,e==window||e==document?self["scrollTop"==t?"pageYOffset":"pageXOffset"]||browserSupportsBoxModel&&document.documentElement[t]||document.body[t]:e[t]},css:function(e,t,n,i){if(e)if(void 0!==n)!0===i?e.style.setProperty(t,n,"important"):e.style[t]=n;else{var r=(e.ownerDocument||document).defaultView;if(r&&r.getComputedStyle)return t=t.replace(/([A-Z])/g,"-$1").toLowerCase(),r.getComputedStyle(e,null).getPropertyValue(t);if(e.currentStyle)return t=t.replace(/\-(\w)/g,(function(e,t){return t.toUpperCase()})),n=e.currentStyle[t],/^\d+(em|pt|%|ex)?$/i.test(n)?function(t){var n=e.style.left,i=e.runtimeStyle.left;return e.runtimeStyle.left=e.currentStyle.left,e.style.left=t||0,t=e.style.pixelLeft+"px",e.style.left=n,e.runtimeStyle.left=i,t}(n):n}},slide:function(e,t,n,i,r){if(!(!e||"up"==t&&!1===KTUtil.visible(e)||"down"==t&&!0===KTUtil.visible(e))){n=n||600;var o=KTUtil.actualHeight(e),a=!1,l=!1;KTUtil.css(e,"padding-top")&&!0!==KTUtil.data(e).has("slide-padding-top")&&KTUtil.data(e).set("slide-padding-top",KTUtil.css(e,"padding-top")),KTUtil.css(e,"padding-bottom")&&!0!==KTUtil.data(e).has("slide-padding-bottom")&&KTUtil.data(e).set("slide-padding-bottom",KTUtil.css(e,"padding-bottom")),KTUtil.data(e).has("slide-padding-top")&&(a=parseInt(KTUtil.data(e).get("slide-padding-top"))),KTUtil.data(e).has("slide-padding-bottom")&&(l=parseInt(KTUtil.data(e).get("slide-padding-bottom"))),"up"==t?(e.style.cssText="display: block; overflow: hidden;",a&&KTUtil.animate(0,a,n,(function(t){e.style.paddingTop=a-t+"px"}),"linear"),l&&KTUtil.animate(0,l,n,(function(t){e.style.paddingBottom=l-t+"px"}),"linear"),KTUtil.animate(0,o,n,(function(t){e.style.height=o-t+"px"}),"linear",(function(){e.style.height="",e.style.display="none","function"==typeof i&&i()}))):"down"==t&&(e.style.cssText="display: block; overflow: hidden;",a&&KTUtil.animate(0,a,n,(function(t){e.style.paddingTop=t+"px"}),"linear",(function(){e.style.paddingTop=""})),l&&KTUtil.animate(0,l,n,(function(t){e.style.paddingBottom=t+"px"}),"linear",(function(){e.style.paddingBottom=""})),KTUtil.animate(0,o,n,(function(t){e.style.height=t+"px"}),"linear",(function(){e.style.height="",e.style.display="",e.style.overflow="","function"==typeof i&&i()})))}},slideUp:function(e,t,n){KTUtil.slide(e,"up",t,n)},slideDown:function(e,t,n){KTUtil.slide(e,"down",t,n)},show:function(e,t){void 0!==e&&(e.style.display=t||"block")},hide:function(e){void 0!==e&&(e.style.display="none")},addEvent:function(e,t,n,i){null!=e&&e.addEventListener(t,n)},removeEvent:function(e,t,n){null!==e&&e.removeEventListener(t,n)},on:function(e,t,n,i){if(null!==e){var r=KTUtil.getUniqueId("event");return window.KTUtilDelegatedEventHandlers[r]=function(n){for(var r=e.querySelectorAll(t),o=n.target;o&&o!==e;){for(var a=0,l=r.length;a1?"."+t[1]:"",r=/(\d+)(\d{3})/;r.test(n);)n=n.replace(r,"$1,$2");return n+i},isRTL:function(){return"rtl"===document.querySelector("html").getAttribute("direction")},snakeToCamel:function(e){return e.replace(/(\-\w)/g,(function(e){return e[1].toUpperCase()}))},filterBoolean:function(e){return!0===e||"true"===e||!1!==e&&"false"!==e&&e},setHTML:function(e,t){e.innerHTML=t},getHTML:function(e){if(e)return e.innerHTML},getDocumentHeight:function(){var e=document.body,t=document.documentElement;return Math.max(e.scrollHeight,e.offsetHeight,t.clientHeight,t.scrollHeight,t.offsetHeight)},getScrollTop:function(){return(document.scrollingElement||document.documentElement).scrollTop},colorLighten:function(e,t){const n=function(e,t){let n=parseInt(e,16)+t,i=n>255?255:n;return i=i.toString(16).length>1?i.toString(16):`0${i.toString(16)}`,i};return e=e.indexOf("#")>=0?e.substring(1,e.length):e,t=parseInt(255*t/100),`#${n(e.substring(0,2),t)}${n(e.substring(2,4),t)}${n(e.substring(4,6),t)}`},colorDarken:function(e,t){const n=function(e,t){let n=parseInt(e,16)-t,i=n<0?0:n;return i=i.toString(16).length>1?i.toString(16):`0${i.toString(16)}`,i};return e=e.indexOf("#")>=0?e.substring(1,e.length):e,t=parseInt(255*t/100),`#${n(e.substring(0,2),t)}${n(e.substring(2,4),t)}${n(e.substring(4,6),t)}`},throttle:function(e,t,n){e||(e=setTimeout((function(){t(),e=void 0}),n))},debounce:function(e,t,n){clearTimeout(e),e=setTimeout(t,n)},parseJson:function(e){if("string"==typeof e){var t=(e=e.replace(/'/g,'"')).replace(/(\w+:)|(\w+ :)/g,(function(e){return'"'+e.substring(0,e.length-1)+'":'}));try{e=JSON.parse(t)}catch(e){}}return e},getResponsiveValue:function(e,t){var n=this.getViewPort().width,i=null;if("object"==typeof(e=KTUtil.parseJson(e))){var r,o,a=-1;for(var l in e)(o="default"===l?0:this.getBreakpoint(l)?this.getBreakpoint(l):parseInt(l))<=n&&o>a&&(r=l,a=o);i=r?e[r]:e}else i=e;return i},each:function(e,t){return[].slice.call(e).map(t)},getSelectorMatchValue:function(e){var t=null;if("object"==typeof(e=KTUtil.parseJson(e))){if(void 0!==e.match){var n=Object.keys(e.match)[0];e=Object.values(e.match)[0],null!==document.querySelector(n)&&(t=e)}}else t=e;return t},getConditionalValue:function(e){e=KTUtil.parseJson(e);var t=KTUtil.getResponsiveValue(e);return null!==t&&void 0!==t.match&&(t=KTUtil.getSelectorMatchValue(t)),null===t&&null!==e&&void 0!==e.default&&(t=e.default),t},getCssVariableValue:function(e){var t=getComputedStyle(document.documentElement).getPropertyValue(e);return t&&t.length>0&&(t=t.trim()),t},isInViewport:function(e){var t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)},isPartiallyInViewport:function(e){let t=e.getBoundingClientRect().left,n=e.getBoundingClientRect().top,i=Math.max(document.documentElement.clientWidth,window.innerWidth||0),r=Math.max(document.documentElement.clientHeight,window.innerHeight||0),o=e.clientWidth,a=e.clientHeight;return n0&&t0},onDOMContentLoaded:function(e){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e):e()},inIframe:function(){try{return window.self!==window.top}catch(e){return!0}},isHexColor:e=>/^#[0-9A-F]{6}$/i.test(e)}}();"undefined"!=typeof module&&void 0!==module.exports&&(module.exports=KTUtil);var KTAppLayoutBuilder=function(){var e,t,n,i,r,o,a,l,s,u;return{init:function(){var d,c,m;(a=document.querySelector("#kt_app_engage"),s=document.querySelector("#kt_app_engage_toggle_on"),l=document.querySelector("#kt_app_engage_toggle_off"),u=document.querySelector("#kt_app_engage_prebuilts_modal"),a&&u&&(null!==u&&"1"!==KTCookie.get("app_engage_prebuilts_modal_displayed")&&setTimeout((function(){new bootstrap.Modal(u).show();const e=new Date(Date.now()+2592e6);KTCookie.set("app_engage_prebuilts_modal_displayed","1",{expires:e})}),3e3),function(){u.querySelector('[data-kt-element="selected"]');const e=u.querySelector('[data-kt-element="title"]'),t=u.querySelector('[data-kt-menu="true"]');KTUtil.on(u,"[data-kt-mode]","click",(function(n){const i=this.innerText,r=this.getAttribute("data-kt-mode"),o=t.querySelector(".menu-link.active"),a=document.querySelector("#kt_app_engage_prebuilts_view_image"),l=document.querySelector("#kt_app_engage_prebuilts_view_text");e.innerText=i,o&&o.classList.remove("active"),this.classList.add("active"),"image"===r?(a.classList.remove("d-none"),a.classList.add("d-block"),l.classList.remove("d-block"),l.classList.add("d-none")):(l.classList.remove("d-none"),l.classList.add("d-block"),a.classList.remove("d-block"),a.classList.add("d-none"))}))}()),a&&s&&l&&(l.addEventListener("click",(function(e){e.preventDefault();const t=new Date(Date.now()+864e5);KTCookie.set("app_engage_hide","1",{expires:t}),a.classList.add("app-engage-hide")})),s.addEventListener("click",(function(e){e.preventDefault(),KTCookie.remove("app_engage_hide"),a.classList.remove("app-engage-hide")}))),e=document.querySelector("#kt_app_layout_builder_form"))&&(n=e.getAttribute("action"),t=document.querySelector("#kt_app_layout_builder_action"),i=document.querySelector("#kt_app_layout_builder_preview"),r=document.querySelector("#kt_app_layout_builder_export"),o=document.querySelector("#kt_app_layout_builder_reset"),i&&i.addEventListener("click",(function(r){r.preventDefault(),t.value="preview",i.setAttribute("data-kt-indicator","on");var o=$(e).serialize();$.ajax({type:"POST",dataType:"html",url:n,data:o,success:function(e,t,n){history.scrollRestoration&&(history.scrollRestoration="manual"),location.reload()},error:function(e){toastr.error("Please try it again later.","Something went wrong!",{timeOut:0,extendedTimeOut:0,closeButton:!0,closeDuration:0})},complete:function(){i.removeAttribute("data-kt-indicator")}})})),r&&r.addEventListener("click",(function(i){i.preventDefault(),toastr.success("Process has been started and it may take a while.","Generating HTML!",{timeOut:0,extendedTimeOut:0,closeButton:!0,closeDuration:0}),r.setAttribute("data-kt-indicator","on"),t.value="export";var o=$(e).serialize();$.ajax({type:"POST",dataType:"html",url:n,data:o,success:function(e,t,i){var o=setInterval((function(){$("